X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=src%2Ftransport%2Fplugin_transport_http.h;h=94952173c6879ca9c8486a71b1b22450dbb63167;hb=f0a8d26b26cda04518e3555373172f6b4940e489;hp=16da05c327d7fe0c14e8c24af91657157542e151;hpb=0663a057d7611270d5f41ae8b345125d737387f2;p=oweals%2Fgnunet.git diff --git a/src/transport/plugin_transport_http.h b/src/transport/plugin_transport_http.h index 16da05c32..94952173c 100644 --- a/src/transport/plugin_transport_http.h +++ b/src/transport/plugin_transport_http.h @@ -1,6 +1,6 @@ /* This file is part of GNUnet - (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 Christian Grothoff (and other contributing authors) + Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 Christian Grothoff (and other contributing authors) GNUnet is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published @@ -14,8 +14,8 @@ You should have received a copy of the GNU General Public License along with GNUnet; see the file COPYING. If not, write to the - Free Software Foundation, Inc., 59 Temple Place - Suite 330, - Boston, MA 02111-1307, USA. + Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. */ /** @@ -23,6 +23,8 @@ * @brief http transport service plugin * @author Matthias Wachs */ +#ifndef PLUGIN_TRANSPORT_HTTP_H +#define PLUGIN_TRANSPORT_HTTP_H #include "platform.h" #include "gnunet_common.h" @@ -39,10 +41,14 @@ #include "gnunet_os_lib.h" #include "gnunet_nat_lib.h" #include "microhttpd.h" +#if HAVE_CURL_CURL_H #include +#elif HAVE_GNURL_CURL_H +#include +#endif -#define DEBUG_HTTP GNUNET_YES +#define DEBUG_HTTP GNUNET_EXTRA_LOGGING #define VERBOSE_SERVER GNUNET_EXTRA_LOGGING #define VERBOSE_CLIENT GNUNET_EXTRA_LOGGING #define VERBOSE_CURL GNUNET_NO @@ -59,29 +65,26 @@ #define OUTBOUND GNUNET_NO -#define HTTP_NOT_VALIDATED_TIMEOUT GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS, 3) +#define HTTP_NOT_VALIDATED_TIMEOUT GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS, 15) /** * Encapsulation of all of the state of the plugin. */ struct Plugin { - /** - * General handles - * --------------- - */ - /** * Our environment. */ struct GNUNET_TRANSPORT_PluginEnvironment *env; /** - * Linked list of open sessions. + * Head of linked list of open sessions. */ - struct Session *head; + /** + * Tail of linked list of open sessions. + */ struct Session *tail; /** @@ -90,36 +93,39 @@ struct Plugin struct GNUNET_NAT_Handle *nat; /** - * List of own addresses + * Our own IPv4 addresses DLL head */ + struct HttpAddressWrapper *addr_head; /** - * IPv4 addresses DLL head + * Our own IPv4 addresses DLL tail */ - struct IPv4HttpAddressWrapper *ipv4_addr_head; + struct HttpAddressWrapper *addr_tail; /** - * IPv4 addresses DLL tail + * External hostname the plugin can be connected to, can be different to + * the host's FQDN, used e.g. for reverse proxying */ - struct IPv4HttpAddressWrapper *ipv4_addr_tail; + char *external_hostname; /** - * IPv6 addresses DLL head + * External hostname the plugin can be connected to, can be different to + * the host's FQDN, used e.g. for reverse proxying */ - struct IPv6HttpAddressWrapper *ipv6_addr_head; + struct HttpAddress *ext_addr; /** - * IPv6 addresses DLL tail + * External address length */ - struct IPv6HttpAddressWrapper *ipv6_addr_tail; + size_t ext_addr_len; /** - * Plugin configuration - * -------------------- + * Task calling transport service about external address */ + struct GNUNET_SCHEDULER_Task * notify_ext_task; /** - * Plugin name + * Plugin name. * Equals configuration section: transport-http, transport-https */ char *name; @@ -131,21 +137,18 @@ struct Plugin char *protocol; /** - * Use IPv4? - * GNUNET_YES or GNUNET_NO + * Use IPv4? #GNUNET_YES or #GNUNET_NO */ int ipv4; /** - * Use IPv6? - * GNUNET_YES or GNUNET_NO + * Use IPv6? #GNUNET_YES or #GNUNET_NO */ int ipv6; /** * Does plugin just use outbound connections and not accept inbound? */ - int client_only; /** @@ -160,9 +163,14 @@ struct Plugin int max_connections; /** - * Plugin HTTPS SSL/TLS options - * ---------------------------- + * Number of outbound sessions */ + unsigned int outbound_sessions; + + /** + * Number of inbound sessions + */ + unsigned int inbound_sessions; /** * libCurl TLS crypto init string, can be set to enhance performance @@ -171,7 +179,6 @@ struct Plugin * * Use RC4-128 instead of AES: * NONE:+VERS-TLS1.0:+ARCFOUR-128:+SHA1:+RSA:+COMP-NULL - * */ char *crypto_init; @@ -185,11 +192,6 @@ struct Plugin */ char *cert; - /** - * Plugin values - * ------------- - */ - /** * Current number of establishes connections */ @@ -200,11 +202,6 @@ struct Plugin */ uint32_t last_tag; - /** - * Server handles - * -------------- - */ - /** * MHD IPv4 daemon */ @@ -213,7 +210,12 @@ struct Plugin /** * MHD IPv4 task */ - GNUNET_SCHEDULER_TaskIdentifier server_v4_task; + struct GNUNET_SCHEDULER_Task * server_v4_task; + + /** + * The IPv4 server is scheduled to run asap + */ + int server_v4_immediately; /** * MHD IPv6 daemon @@ -223,30 +225,36 @@ struct Plugin /** * MHD IPv4 task */ - GNUNET_SCHEDULER_TaskIdentifier server_v6_task; + struct GNUNET_SCHEDULER_Task * server_v6_task; + + /** + * The IPv6 server is scheduled to run asap + */ + int server_v6_immediately; /** * IPv4 server socket to bind to */ - struct sockaddr_in * server_addr_v4; + struct sockaddr_in *server_addr_v4; /** * IPv6 server socket to bind to */ - struct sockaddr_in6 * server_addr_v6; + struct sockaddr_in6 *server_addr_v6; /** - * Server semi connections + * Head of server semi connections * A full session consists of 2 semi-connections: send and receive * If not both directions are established the server keeps this sessions here */ struct Session *server_semi_head; - struct Session *server_semi_tail; - - /* - * Client handles + /** + * Tail of server semi connections + * A full session consists of 2 semi-connections: send and receive + * If not both directions are established the server keeps this sessions here */ + struct Session *server_semi_tail; /** * cURL Multihandle @@ -256,15 +264,95 @@ struct Plugin /** * curl perform task */ - GNUNET_SCHEDULER_TaskIdentifier client_perform_task; + struct GNUNET_SCHEDULER_Task * client_perform_task; + +}; + +GNUNET_NETWORK_STRUCT_BEGIN + +/** + * HTTP addresses including a full URI + */ +struct HttpAddress +{ + /** + * Length of the address following in NBO + */ + uint32_t addr_len GNUNET_PACKED; + + /** + * Address following + */ + void *addr GNUNET_PACKED; +}; + +/** + * IPv4 addresses + */ +struct IPv4HttpAddress +{ + /** + * IPv4 address, in network byte order. + */ + uint32_t ipv4_addr GNUNET_PACKED; + + /** + * Port number, in network byte order. + */ + uint16_t u4_port GNUNET_PACKED; +}; + +/** + * IPv4 addresses + */ +struct IPv6HttpAddress +{ + /** + * IPv6 address. + */ + struct in6_addr ipv6_addr GNUNET_PACKED; + /** + * Port number, in network byte order. + */ + uint16_t u6_port GNUNET_PACKED; }; +GNUNET_NETWORK_STRUCT_END + + +struct ServerRequest +{ + /** + * _RECV or _SEND + */ + int direction; + + /** + * Should this connection get disconnected? #GNUNET_YES / #GNUNET_NO + */ + int disconnect; + + /** + * The session this server connection belongs to + */ + struct Session *session; + + /** + * The MHD connection + */ + struct MHD_Connection *mhd_conn; +}; + /** * Session handle for connections. */ struct Session { + /** + * To whom are we talking to + */ + struct GNUNET_PeerIdentity target; /** * Stored in a linked list. @@ -292,9 +380,9 @@ struct Session size_t addrlen; /** - * To whom are we talking to + * ATS network type in NBO */ - struct GNUNET_PeerIdentity target; + uint32_t ats_address_network_type; /** * next pointer for double linked list @@ -306,7 +394,6 @@ struct Session */ struct HTTP_Message *msg_tail; - /** * Message stream tokenizer for incoming data */ @@ -320,8 +407,8 @@ struct Session /** * Inbound or outbound connection - * Outbound: GNUNET_NO (client is used to send and receive) - * Inbound : GNUNET_YES (server is used to send and receive) + * Outbound: #GNUNET_NO (client is used to send and receive) + * Inbound : #GNUNET_YES (server is used to send and receive) */ int inbound; @@ -330,10 +417,6 @@ struct Session */ uint32_t tag; - /** - * Client handles - */ - /** * Client send handle */ @@ -347,29 +430,31 @@ struct Session /** * Task to wake up client receive handle when receiving is allowed again */ - GNUNET_SCHEDULER_TaskIdentifier recv_wakeup_task; + struct GNUNET_SCHEDULER_Task * recv_wakeup_task; /** - * Is client send handle paused since there are no data to send? - * GNUNET_YES/NO + * Session timeout task */ - int client_put_paused; + struct GNUNET_SCHEDULER_Task * timeout_task; /** - * Server handles + * Is client send handle paused since there are no data to send? + * #GNUNET_YES or #GNUNET_NO */ + int client_put_paused; /** * Client send handle */ - void *server_recv; + struct ServerRequest *server_recv; /** * Client send handle */ - void *server_send; + struct ServerRequest *server_send; }; + /** * Message to send using http */ @@ -408,59 +493,90 @@ struct HTTP_Message GNUNET_TRANSPORT_TransmitContinuation transmit_cont; /** - * Closure for transmit_cont. + * Closure for @e transmit_cont. */ void *transmit_cont_cls; }; + +struct Session * +create_session (struct Plugin *plugin, + const struct GNUNET_PeerIdentity *target, + const void *addr, + size_t addrlen); + + +int +exist_session (struct Plugin *plugin, + struct Session *s); + + void delete_session (struct Session *s); -struct Session * -create_session (struct Plugin *plugin, const struct GNUNET_PeerIdentity *target, - const void *addr, size_t addrlen, - GNUNET_TRANSPORT_TransmitContinuation cont, void *cont_cls); + +int +exist_session (struct Plugin *plugin, + struct Session *s); + struct GNUNET_TIME_Relative -http_plugin_receive (void *cls, const struct GNUNET_PeerIdentity * peer, - const struct GNUNET_MessageHeader * message, - struct Session * session, - const char *sender_address, - uint16_t sender_address_len); +http_plugin_receive (void *cls, + const struct GNUNET_PeerIdentity *peer, + const struct GNUNET_MessageHeader *message, + struct Session *session, + const char *sender_address, + uint16_t sender_address_len); + const char * -http_plugin_address_to_string (void *cls, const void *addr, size_t addrlen); +http_plugin_address_to_string (void *cls, + const void *addr, + size_t addrlen); + int client_disconnect (struct Session *s); + int client_connect (struct Session *s); + int client_send (struct Session *s, struct HTTP_Message *msg); + int client_start (struct Plugin *plugin); + void client_stop (struct Plugin *plugin); + int server_disconnect (struct Session *s); + int -server_send (struct Session *s, struct HTTP_Message * msg); +server_send (struct Session *s, struct HTTP_Message *msg); + int server_start (struct Plugin *plugin); + void server_stop (struct Plugin *plugin); + void notify_session_end (void *cls, - const struct GNUNET_PeerIdentity * - peer, struct Session * s); + const struct GNUNET_PeerIdentity *peer, + struct Session *s); + +/*#ifndef PLUGIN_TRANSPORT_HTTP_H*/ +#endif /* end of plugin_transport_http.h */