LRN: Use GNUNET_EXTRA_LOGGING to manage compile-time logging calls
[oweals/gnunet.git] / src / transport / plugin_transport_http.h
1 /*
2      This file is part of GNUnet
3      (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 Christian Grothoff (and other contributing authors)
4
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.
9
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.
14
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.
19 */
20
21 /**
22  * @file transport/plugin_transport_http.h
23  * @brief http transport service plugin
24  * @author Matthias Wachs
25  */
26
27 #include "platform.h"
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>
43
44
45 #define DEBUG_HTTP GNUNET_YES
46 #define VERBOSE_SERVER GNUNET_YES
47 #define VERBOSE_CLIENT GNUNET_YES
48 #define VERBOSE_CURL GNUNET_EXTRA_LOGGING
49
50 #if BUILD_HTTPS
51 #define LIBGNUNET_PLUGIN_TRANSPORT_INIT libgnunet_plugin_transport_https_init
52 #define LIBGNUNET_PLUGIN_TRANSPORT_DONE libgnunet_plugin_transport_https_done
53 #else
54 #define LIBGNUNET_PLUGIN_TRANSPORT_INIT libgnunet_plugin_transport_http_init
55 #define LIBGNUNET_PLUGIN_TRANSPORT_DONE libgnunet_plugin_transport_http_done
56 #endif
57
58 #define INBOUND  GNUNET_YES
59 #define OUTBOUND GNUNET_NO
60
61
62 #define HTTP_NOT_VALIDATED_TIMEOUT GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS, 3)
63
64 /**
65  * Encapsulation of all of the state of the plugin.
66  */
67 struct Plugin
68 {
69   /**
70    * General handles
71    * ---------------
72    */
73
74   /**
75    * Our environment.
76    */
77   struct GNUNET_TRANSPORT_PluginEnvironment *env;
78
79   /**
80    * Linked list of open sessions.
81    */
82
83   struct Session *head;
84
85   struct Session *tail;
86
87   /**
88    * NAT handle & address management
89    */
90   struct GNUNET_NAT_Handle *nat;
91
92   /**
93    * List of own addresses
94    */
95
96   /**
97    * IPv4 addresses DLL head
98    */
99   struct IPv4HttpAddressWrapper *ipv4_addr_head;
100
101   /**
102    * IPv4 addresses DLL tail
103    */
104   struct IPv4HttpAddressWrapper *ipv4_addr_tail;
105
106   /**
107    * IPv6 addresses DLL head
108    */
109   struct IPv6HttpAddressWrapper *ipv6_addr_head;
110
111   /**
112    * IPv6 addresses DLL tail
113    */
114   struct IPv6HttpAddressWrapper *ipv6_addr_tail;
115
116   /**
117    * Plugin configuration
118    * --------------------
119    */
120
121   /**
122    * Plugin name
123    * Equals configuration section: transport-http, transport-https
124    */
125   char *name;
126
127   /**
128    * Plugin protocol
129    * http, https
130    */
131   char *protocol;
132
133   /**
134    * Use IPv4?
135    * GNUNET_YES or GNUNET_NO
136    */
137   int ipv4;
138
139   /**
140    * Use IPv6?
141    * GNUNET_YES or GNUNET_NO
142    */
143   int ipv6;
144
145   /**
146    * Port used
147    */
148   uint16_t port;
149
150   /**
151    * Maximum number of sockets the plugin can use
152    * Each http inbound /outbound connections are two connections
153    */
154   int max_connections;
155
156   /**
157    * Plugin HTTPS SSL/TLS options
158    * ----------------------------
159    */
160
161   /**
162    * libCurl TLS crypto init string, can be set to enhance performance
163    *
164    * Example:
165    *
166    * Use RC4-128 instead of AES:
167    * NONE:+VERS-TLS1.0:+ARCFOUR-128:+SHA1:+RSA:+COMP-NULL
168    *
169    */
170   char *crypto_init;
171
172   /**
173    * TLS key
174    */
175   char *key;
176
177   /**
178    * TLS certificate
179    */
180   char *cert;
181
182   /**
183    * Plugin values
184    * -------------
185    */
186
187   /**
188    * Current number of establishes connections
189    */
190   int cur_connections;
191
192   /**
193    * Last used unique HTTP connection tag
194    */
195   uint32_t last_tag;
196
197   /**
198    * Server handles
199    * --------------
200    */
201
202   /**
203    * MHD IPv4 daemon
204    */
205   struct MHD_Daemon *server_v4;
206
207   /**
208    * MHD IPv4 task
209    */
210   GNUNET_SCHEDULER_TaskIdentifier server_v4_task;
211
212   /**
213    * MHD IPv6 daemon
214    */
215   struct MHD_Daemon *server_v6;
216
217   /**
218    * MHD IPv4 task
219    */
220   GNUNET_SCHEDULER_TaskIdentifier server_v6_task;
221
222   /**
223    * IPv4 server socket to bind to
224    */
225   struct sockaddr_in * server_addr_v4;
226
227   /**
228    * IPv6 server socket to bind to
229    */
230   struct sockaddr_in6 * server_addr_v6;
231
232   /**
233    * Server semi connections
234    * A full session consists of 2 semi-connections: send and receive
235    * If not both directions are established the server keeps this sessions here
236    */
237   struct Session *server_semi_head;
238
239   struct Session *server_semi_tail;
240
241   /*
242    * Client handles
243    */
244
245   /**
246    * cURL Multihandle
247    */
248   CURLM *client_mh;
249
250   /**
251    * curl perform task
252    */
253   GNUNET_SCHEDULER_TaskIdentifier client_perform_task;
254
255 };
256
257 /**
258  * Session handle for connections.
259  */
260 struct Session
261 {
262
263   /**
264    * Stored in a linked list.
265    */
266   struct Session *next;
267
268   /**
269    * Stored in a linked list.
270    */
271   struct Session *prev;
272
273   /**
274    * Pointer to the global plugin struct.
275    */
276   struct Plugin *plugin;
277
278   /**
279    * Address
280    */
281   void *addr;
282
283   /**
284    * Address length
285    */
286   size_t addrlen;
287
288   /**
289    * To whom are we talking to
290    */
291   struct GNUNET_PeerIdentity target;
292
293   /**
294    * next pointer for double linked list
295    */
296   struct HTTP_Message *msg_head;
297
298   /**
299    * previous pointer for double linked list
300    */
301   struct HTTP_Message *msg_tail;
302
303
304   /**
305    * Message stream tokenizer for incoming data
306    */
307   struct GNUNET_SERVER_MessageStreamTokenizer *msg_tk;
308
309   /**
310    * Absolute time when to receive data again
311    * Used for receive throttling
312    */
313   struct GNUNET_TIME_Absolute next_receive;
314
315   /**
316    * Inbound or outbound connection
317    * Outbound: GNUNET_NO (client is used to send and receive)
318    * Inbound : GNUNET_YES (server is used to send and receive)
319    */
320   int inbound;
321
322   /**
323    * Unique HTTP/S connection tag for this connection
324    */
325   uint32_t tag;
326
327   /**
328    * Client handles
329    */
330
331   /**
332    * Client send handle
333    */
334   void *client_put;
335
336   /**
337    * Client receive handle
338    */
339   void *client_get;
340
341   /**
342    * Task to wake up client receive handle when receiving is allowed again
343    */
344   GNUNET_SCHEDULER_TaskIdentifier recv_wakeup_task;
345
346   /**
347    * Is client send handle paused since there are no data to send?
348    * GNUNET_YES/NO
349    */
350   int client_put_paused;
351
352   /**
353    * Server handles
354    */
355
356   /**
357    * Client send handle
358    */
359   void *server_recv;
360
361   /**
362    * Client send handle
363    */
364   void *server_send;
365 };
366
367 /**
368  *  Message to send using http
369  */
370 struct HTTP_Message
371 {
372   /**
373    * next pointer for double linked list
374    */
375   struct HTTP_Message *next;
376
377   /**
378    * previous pointer for double linked list
379    */
380   struct HTTP_Message *prev;
381
382   /**
383    * buffer containing data to send
384    */
385   char *buf;
386
387   /**
388    * amount of data already sent
389    */
390   size_t pos;
391
392   /**
393    * buffer length
394    */
395   size_t size;
396
397   /**
398    * Continuation function to call once the transmission buffer
399    * has again space available.  NULL if there is no
400    * continuation to call.
401    */
402   GNUNET_TRANSPORT_TransmitContinuation transmit_cont;
403
404   /**
405    * Closure for transmit_cont.
406    */
407   void *transmit_cont_cls;
408 };
409
410 void
411 delete_session (struct Session *s);
412
413 struct Session *
414 create_session (struct Plugin *plugin, const struct GNUNET_PeerIdentity *target,
415                 const void *addr, size_t addrlen,
416                 GNUNET_TRANSPORT_TransmitContinuation cont, void *cont_cls);
417
418 struct GNUNET_TIME_Relative
419 http_plugin_receive (void *cls, const struct GNUNET_PeerIdentity * peer,
420     const struct  GNUNET_MessageHeader * message,
421     struct Session * session,
422     const char *sender_address,
423     uint16_t sender_address_len);
424
425 const char *
426 http_plugin_address_to_string (void *cls, const void *addr, size_t addrlen);
427
428 int
429 client_disconnect (struct Session *s);
430
431 int
432 client_connect (struct Session *s);
433
434 int
435 client_send (struct Session *s, struct HTTP_Message *msg);
436
437 int
438 client_start (struct Plugin *plugin);
439
440 void
441 client_stop (struct Plugin *plugin);
442
443 int
444 server_disconnect (struct Session *s);
445
446 int
447 server_send (struct Session *s, struct HTTP_Message * msg);
448
449 int
450 server_start (struct Plugin *plugin);
451
452 void
453 server_stop (struct Plugin *plugin);
454
455 void
456 notify_session_end (void *cls,
457                     const struct GNUNET_PeerIdentity *
458                     peer, struct Session * s);
459
460 /* end of plugin_transport_http.h */