diff options
Diffstat (limited to 'src/transport/plugin_transport_http.h')
-rw-r--r-- | src/transport/plugin_transport_http.h | 504 |
1 files changed, 504 insertions, 0 deletions
diff --git a/src/transport/plugin_transport_http.h b/src/transport/plugin_transport_http.h new file mode 100644 index 0000000..be8f93d --- /dev/null +++ b/src/transport/plugin_transport_http.h @@ -0,0 +1,504 @@ +/* + This file is part of GNUnet + (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 + by the Free Software Foundation; either version 3, or (at your + option) any later version. + + GNUnet is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + 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. +*/ + +/** + * @file transport/plugin_transport_http.h + * @brief http transport service plugin + * @author Matthias Wachs + */ + +#include "platform.h" +#include "gnunet_common.h" +#include "gnunet_constants.h" +#include "gnunet_protocols.h" +#include "gnunet_connection_lib.h" +#include "gnunet_service_lib.h" +#include "gnunet_statistics_service.h" +#include "gnunet_transport_service.h" +#include "gnunet_resolver_service.h" +#include "gnunet_server_lib.h" +#include "gnunet_container_lib.h" +#include "gnunet_transport_plugin.h" +#include "gnunet_os_lib.h" +#include "gnunet_nat_lib.h" +#include "microhttpd.h" +#include <curl/curl.h> + + +#define DEBUG_HTTP GNUNET_EXTRA_LOGGING +#define VERBOSE_SERVER GNUNET_EXTRA_LOGGING +#define VERBOSE_CLIENT GNUNET_EXTRA_LOGGING +#define VERBOSE_CURL GNUNET_EXTRA_LOGGING + +#if BUILD_HTTPS +#define LIBGNUNET_PLUGIN_TRANSPORT_INIT libgnunet_plugin_transport_https_init +#define LIBGNUNET_PLUGIN_TRANSPORT_DONE libgnunet_plugin_transport_https_done +#else +#define LIBGNUNET_PLUGIN_TRANSPORT_INIT libgnunet_plugin_transport_http_init +#define LIBGNUNET_PLUGIN_TRANSPORT_DONE libgnunet_plugin_transport_http_done +#endif + +#define INBOUND GNUNET_YES +#define OUTBOUND GNUNET_NO + + +#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. + */ + + struct Session *head; + + struct Session *tail; + + /** + * NAT handle & address management + */ + struct GNUNET_NAT_Handle *nat; + + /** + * List of own addresses + */ + + /** + * IPv4 addresses DLL head + */ + struct IPv4HttpAddressWrapper *ipv4_addr_head; + + /** + * IPv4 addresses DLL tail + */ + struct IPv4HttpAddressWrapper *ipv4_addr_tail; + + /** + * IPv6 addresses DLL head + */ + struct IPv6HttpAddressWrapper *ipv6_addr_head; + + /** + * IPv6 addresses DLL tail + */ + struct IPv6HttpAddressWrapper *ipv6_addr_tail; + + /** + * Plugin configuration + * -------------------- + */ + + /** + * Plugin name + * Equals configuration section: transport-http, transport-https + */ + char *name; + + /** + * Plugin protocol + * http, https + */ + char *protocol; + + /** + * Use IPv4? + * GNUNET_YES or GNUNET_NO + */ + int ipv4; + + /** + * Use IPv6? + * GNUNET_YES or GNUNET_NO + */ + int ipv6; + + /** + * Does plugin just use outbound connections and not accept inbound? + */ + + int client_only; + + /** + * Port used + */ + uint16_t port; + + /** + * Maximum number of sockets the plugin can use + * Each http inbound /outbound connections are two connections + */ + int max_connections; + + /** + * Plugin HTTPS SSL/TLS options + * ---------------------------- + */ + + /** + * libCurl TLS crypto init string, can be set to enhance performance + * + * Example: + * + * Use RC4-128 instead of AES: + * NONE:+VERS-TLS1.0:+ARCFOUR-128:+SHA1:+RSA:+COMP-NULL + * + */ + char *crypto_init; + + /** + * TLS key + */ + char *key; + + /** + * TLS certificate + */ + char *cert; + + /** + * Plugin values + * ------------- + */ + + /** + * Current number of establishes connections + */ + int cur_connections; + + /** + * Last used unique HTTP connection tag + */ + uint32_t last_tag; + + /** + * Server handles + * -------------- + */ + + /** + * MHD IPv4 daemon + */ + struct MHD_Daemon *server_v4; + + /** + * MHD IPv4 task + */ + GNUNET_SCHEDULER_TaskIdentifier server_v4_task; + + /** + * MHD IPv6 daemon + */ + struct MHD_Daemon *server_v6; + + /** + * MHD IPv4 task + */ + GNUNET_SCHEDULER_TaskIdentifier server_v6_task; + + /** + * IPv4 server socket to bind to + */ + struct sockaddr_in *server_addr_v4; + + /** + * IPv6 server socket to bind to + */ + struct sockaddr_in6 *server_addr_v6; + + /** + * 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 + */ + + /** + * cURL Multihandle + */ + CURLM *client_mh; + + /** + * curl perform task + */ + GNUNET_SCHEDULER_TaskIdentifier client_perform_task; + +}; + +GNUNET_NETWORK_STRUCT_BEGIN + +/** + * 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 + +/** + * Session handle for connections. + */ +struct Session +{ + + /** + * Stored in a linked list. + */ + struct Session *next; + + /** + * Stored in a linked list. + */ + struct Session *prev; + + /** + * Pointer to the global plugin struct. + */ + struct Plugin *plugin; + + /** + * Address + */ + void *addr; + + /** + * Address length + */ + size_t addrlen; + + /** + * ATS network type in NBO + */ + uint32_t ats_address_network_type; + + /** + * To whom are we talking to + */ + struct GNUNET_PeerIdentity target; + + /** + * next pointer for double linked list + */ + struct HTTP_Message *msg_head; + + /** + * previous pointer for double linked list + */ + struct HTTP_Message *msg_tail; + + + /** + * Message stream tokenizer for incoming data + */ + struct GNUNET_SERVER_MessageStreamTokenizer *msg_tk; + + /** + * Absolute time when to receive data again + * Used for receive throttling + */ + struct GNUNET_TIME_Absolute next_receive; + + /** + * Inbound or outbound connection + * Outbound: GNUNET_NO (client is used to send and receive) + * Inbound : GNUNET_YES (server is used to send and receive) + */ + int inbound; + + /** + * Unique HTTP/S connection tag for this connection + */ + uint32_t tag; + + /** + * Client handles + */ + + /** + * Client send handle + */ + void *client_put; + + /** + * Client receive handle + */ + void *client_get; + + /** + * Task to wake up client receive handle when receiving is allowed again + */ + GNUNET_SCHEDULER_TaskIdentifier recv_wakeup_task; + + /** + * Is client send handle paused since there are no data to send? + * GNUNET_YES/NO + */ + int client_put_paused; + + /** + * Server handles + */ + + /** + * Client send handle + */ + void *server_recv; + + /** + * Client send handle + */ + void *server_send; +}; + +/** + * Message to send using http + */ +struct HTTP_Message +{ + /** + * next pointer for double linked list + */ + struct HTTP_Message *next; + + /** + * previous pointer for double linked list + */ + struct HTTP_Message *prev; + + /** + * buffer containing data to send + */ + char *buf; + + /** + * amount of data already sent + */ + size_t pos; + + /** + * buffer length + */ + size_t size; + + /** + * Continuation function to call once the transmission buffer + * has again space available. NULL if there is no + * continuation to call. + */ + GNUNET_TRANSPORT_TransmitContinuation transmit_cont; + + /** + * Closure for transmit_cont. + */ + void *transmit_cont_cls; +}; + +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); + +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); + +const char * +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); + +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); + +/* end of plugin_transport_http.h */ |