2 This file is part of GNUnet
3 (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 Christian Grothoff (and other contributing authors)
5 GNUnet is free software; you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published
7 by the Free Software Foundation; either version 3, or (at your
8 option) any later version.
10 GNUnet is distributed in the hope that it will be useful, but
11 WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 General Public License for more details.
15 You should have received a copy of the GNU General Public License
16 along with GNUnet; see the file COPYING. If not, write to the
17 Free Software Foundation, Inc., 59 Temple Place - Suite 330,
18 Boston, MA 02111-1307, USA.
22 * @file transport/plugin_transport_http.h
23 * @brief http transport service plugin
24 * @author Matthias Wachs
28 #include "gnunet_common.h"
29 #include "gnunet_constants.h"
30 #include "gnunet_protocols.h"
31 #include "gnunet_connection_lib.h"
32 #include "gnunet_service_lib.h"
33 #include "gnunet_statistics_service.h"
34 #include "gnunet_transport_service.h"
35 #include "gnunet_resolver_service.h"
36 #include "gnunet_server_lib.h"
37 #include "gnunet_container_lib.h"
38 #include "gnunet_transport_plugin.h"
39 #include "gnunet_os_lib.h"
40 #include "gnunet_nat_lib.h"
41 #include "microhttpd.h"
42 #include <curl/curl.h>
45 #define DEBUG_HTTP GNUNET_YES
46 #define VERBOSE_SERVER GNUNET_EXTRA_LOGGING
47 #define VERBOSE_CLIENT GNUNET_EXTRA_LOGGING
48 #define VERBOSE_CURL GNUNET_NO
51 #define LIBGNUNET_PLUGIN_TRANSPORT_INIT libgnunet_plugin_transport_https_init
52 #define LIBGNUNET_PLUGIN_TRANSPORT_DONE libgnunet_plugin_transport_https_done
54 #define LIBGNUNET_PLUGIN_TRANSPORT_INIT libgnunet_plugin_transport_http_init
55 #define LIBGNUNET_PLUGIN_TRANSPORT_DONE libgnunet_plugin_transport_http_done
58 #define INBOUND GNUNET_YES
59 #define OUTBOUND GNUNET_NO
62 #define HTTP_NOT_VALIDATED_TIMEOUT GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS, 3)
65 * Encapsulation of all of the state of the plugin.
77 struct GNUNET_TRANSPORT_PluginEnvironment *env;
80 * Linked list of open sessions.
88 * NAT handle & address management
90 struct GNUNET_NAT_Handle *nat;
93 * List of own addresses
97 * IPv4 addresses DLL head
99 struct IPv4HttpAddressWrapper *ipv4_addr_head;
102 * IPv4 addresses DLL tail
104 struct IPv4HttpAddressWrapper *ipv4_addr_tail;
107 * IPv6 addresses DLL head
109 struct IPv6HttpAddressWrapper *ipv6_addr_head;
112 * IPv6 addresses DLL tail
114 struct IPv6HttpAddressWrapper *ipv6_addr_tail;
117 * Plugin configuration
118 * --------------------
123 * Equals configuration section: transport-http, transport-https
135 * GNUNET_YES or GNUNET_NO
141 * GNUNET_YES or GNUNET_NO
146 * Does plugin just use outbound connections and not accept inbound?
157 * Maximum number of sockets the plugin can use
158 * Each http inbound /outbound connections are two connections
163 * Plugin HTTPS SSL/TLS options
164 * ----------------------------
168 * libCurl TLS crypto init string, can be set to enhance performance
172 * Use RC4-128 instead of AES:
173 * NONE:+VERS-TLS1.0:+ARCFOUR-128:+SHA1:+RSA:+COMP-NULL
194 * Current number of establishes connections
199 * Last used unique HTTP connection tag
211 struct MHD_Daemon *server_v4;
216 GNUNET_SCHEDULER_TaskIdentifier server_v4_task;
221 struct MHD_Daemon *server_v6;
226 GNUNET_SCHEDULER_TaskIdentifier server_v6_task;
229 * IPv4 server socket to bind to
231 struct sockaddr_in * server_addr_v4;
234 * IPv6 server socket to bind to
236 struct sockaddr_in6 * server_addr_v6;
239 * Server semi connections
240 * A full session consists of 2 semi-connections: send and receive
241 * If not both directions are established the server keeps this sessions here
243 struct Session *server_semi_head;
245 struct Session *server_semi_tail;
259 GNUNET_SCHEDULER_TaskIdentifier client_perform_task;
266 struct IPv4HttpAddress
269 * IPv4 address, in network byte order.
271 uint32_t ipv4_addr GNUNET_PACKED;
274 * Port number, in network byte order.
276 uint16_t u4_port GNUNET_PACKED;
282 struct IPv6HttpAddress
287 struct in6_addr ipv6_addr GNUNET_PACKED;
290 * Port number, in network byte order.
292 uint16_t u6_port GNUNET_PACKED;
297 * Session handle for connections.
303 * Stored in a linked list.
305 struct Session *next;
308 * Stored in a linked list.
310 struct Session *prev;
313 * Pointer to the global plugin struct.
315 struct Plugin *plugin;
328 * To whom are we talking to
330 struct GNUNET_PeerIdentity target;
333 * next pointer for double linked list
335 struct HTTP_Message *msg_head;
338 * previous pointer for double linked list
340 struct HTTP_Message *msg_tail;
344 * Message stream tokenizer for incoming data
346 struct GNUNET_SERVER_MessageStreamTokenizer *msg_tk;
349 * Absolute time when to receive data again
350 * Used for receive throttling
352 struct GNUNET_TIME_Absolute next_receive;
355 * Inbound or outbound connection
356 * Outbound: GNUNET_NO (client is used to send and receive)
357 * Inbound : GNUNET_YES (server is used to send and receive)
362 * Unique HTTP/S connection tag for this connection
376 * Client receive handle
381 * Task to wake up client receive handle when receiving is allowed again
383 GNUNET_SCHEDULER_TaskIdentifier recv_wakeup_task;
386 * Is client send handle paused since there are no data to send?
389 int client_put_paused;
407 * Message to send using http
412 * next pointer for double linked list
414 struct HTTP_Message *next;
417 * previous pointer for double linked list
419 struct HTTP_Message *prev;
422 * buffer containing data to send
427 * amount of data already sent
437 * Continuation function to call once the transmission buffer
438 * has again space available. NULL if there is no
439 * continuation to call.
441 GNUNET_TRANSPORT_TransmitContinuation transmit_cont;
444 * Closure for transmit_cont.
446 void *transmit_cont_cls;
450 delete_session (struct Session *s);
453 create_session (struct Plugin *plugin, const struct GNUNET_PeerIdentity *target,
454 const void *addr, size_t addrlen,
455 GNUNET_TRANSPORT_TransmitContinuation cont, void *cont_cls);
457 struct GNUNET_TIME_Relative
458 http_plugin_receive (void *cls, const struct GNUNET_PeerIdentity * peer,
459 const struct GNUNET_MessageHeader * message,
460 struct Session * session,
461 const char *sender_address,
462 uint16_t sender_address_len);
465 http_plugin_address_to_string (void *cls, const void *addr, size_t addrlen);
468 client_disconnect (struct Session *s);
471 client_connect (struct Session *s);
474 client_send (struct Session *s, struct HTTP_Message *msg);
477 client_start (struct Plugin *plugin);
480 client_stop (struct Plugin *plugin);
483 server_disconnect (struct Session *s);
486 server_send (struct Session *s, struct HTTP_Message * msg);
489 server_start (struct Plugin *plugin);
492 server_stop (struct Plugin *plugin);
495 notify_session_end (void *cls,
496 const struct GNUNET_PeerIdentity *
497 peer, struct Session * s);
499 /* end of plugin_transport_http.h */