1/*
2  This file is part of libmicrohttpd
3  Copyright (C) 2007-2015 Daniel Pittman and Christian Grothoff
4
5  This library is free software; you can redistribute it and/or
6  modify it under the terms of the GNU Lesser General Public
7  License as published by the Free Software Foundation; either
8  version 2.1 of the License, or (at your option) any later version.
9
10  This library is distributed in the hope that it will be useful,
11  but WITHOUT ANY WARRANTY; without even the implied warranty of
12  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13  Lesser General Public License for more details.
14
15  You should have received a copy of the GNU Lesser General Public
16  License along with this library; if not, write to the Free Software
17  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
18*/
19
20/**
21 * @file microhttpd/internal.h
22 * @brief  internal shared structures
23 * @author Daniel Pittman
24 * @author Christian Grothoff
25 */
26
27#ifndef INTERNAL_H
28#define INTERNAL_H
29
30#include "platform.h"
31#include "microhttpd.h"
32#include "platform_interface.h"
33#if HTTPS_SUPPORT
34#include <openssl/ssl.h>
35#endif
36#if EPOLL_SUPPORT
37#include <sys/epoll.h>
38#endif
39#if HAVE_NETINET_TCP_H
40/* for TCP_FASTOPEN */
41#include <netinet/tcp.h>
42#endif
43
44
45/**
46 * Should we perform additional sanity checks at runtime (on our internal
47 * invariants)?  This may lead to aborts, but can be useful for debugging.
48 */
49#define EXTRA_CHECKS MHD_NO
50
51#define MHD_MAX(a,b) ((a)<(b)) ? (b) : (a)
52#define MHD_MIN(a,b) ((a)<(b)) ? (a) : (b)
53
54
55/**
56 * Minimum size by which MHD tries to increment read/write buffers.
57 * We usually begin with half the available pool space for the
58 * IO-buffer, but if absolutely needed we additively grow by the
59 * number of bytes given here (up to -- theoretically -- the full pool
60 * space).
61 */
62#define MHD_BUF_INC_SIZE 1024
63
64
65/**
66 * Handler for fatal errors.
67 */
68extern MHD_PanicCallback mhd_panic;
69
70/**
71 * Closure argument for "mhd_panic".
72 */
73extern void *mhd_panic_cls;
74
75/* If we have Clang or gcc >= 4.5, use __buildin_unreachable() */
76#if defined(__clang__) || (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 5)
77#define BUILTIN_NOT_REACHED __builtin_unreachable()
78#else
79#define BUILTIN_NOT_REACHED
80#endif
81
82
83#if HAVE_MESSAGES
84/**
85 * Trigger 'panic' action based on fatal errors.
86 *
87 * @param msg error message (const char *)
88 */
89#define MHD_PANIC(msg) do { mhd_panic (mhd_panic_cls, __FILE__, __LINE__, msg); BUILTIN_NOT_REACHED; } while (0)
90#else
91/**
92 * Trigger 'panic' action based on fatal errors.
93 *
94 * @param msg error message (const char *)
95 */
96#define MHD_PANIC(msg) do { mhd_panic (mhd_panic_cls, __FILE__, __LINE__, NULL); BUILTIN_NOT_REACHED; } while (0)
97#endif
98
99
100/**
101 * State of the socket with respect to epoll (bitmask).
102 */
103enum MHD_EpollState
104  {
105
106    /**
107     * The socket is not involved with a defined state in epoll right
108     * now.
109     */
110    MHD_EPOLL_STATE_UNREADY = 0,
111
112    /**
113     * epoll told us that data was ready for reading, and we did
114     * not consume all of it yet.
115     */
116    MHD_EPOLL_STATE_READ_READY = 1,
117
118    /**
119     * epoll told us that space was available for writing, and we did
120     * not consume all of it yet.
121     */
122    MHD_EPOLL_STATE_WRITE_READY = 2,
123
124    /**
125     * Is this connection currently in the 'eready' EDLL?
126     */
127    MHD_EPOLL_STATE_IN_EREADY_EDLL = 4,
128
129    /**
130     * Is this connection currently in the 'epoll' set?
131     */
132    MHD_EPOLL_STATE_IN_EPOLL_SET = 8,
133
134    /**
135     * Is this connection currently suspended?
136     */
137    MHD_EPOLL_STATE_SUSPENDED = 16
138  };
139
140
141/**
142 * What is this connection waiting for?
143 */
144enum MHD_ConnectionEventLoopInfo
145  {
146    /**
147     * We are waiting to be able to read.
148     */
149    MHD_EVENT_LOOP_INFO_READ = 0,
150
151    /**
152     * We are waiting to be able to write.
153     */
154    MHD_EVENT_LOOP_INFO_WRITE = 1,
155
156    /**
157     * We are waiting for the application to provide data.
158     */
159    MHD_EVENT_LOOP_INFO_BLOCK = 2,
160
161    /**
162     * We are finished and are awaiting cleanup.
163     */
164    MHD_EVENT_LOOP_INFO_CLEANUP = 3
165  };
166
167
168/**
169 * Maximum length of a nonce in digest authentication.  32(MD5 Hex) +
170 * 8(Timestamp Hex) + 1(NULL); hence 41 should suffice, but Opera
171 * (already) takes more (see Mantis #1633), so we've increased the
172 * value to support something longer...
173 */
174#define MAX_NONCE_LENGTH 129
175
176
177/**
178 * A structure representing the internal holder of the
179 * nonce-nc map.
180 */
181struct MHD_NonceNc
182{
183
184  /**
185   * Nonce counter, a value that increases for each subsequent
186   * request for the same nonce.
187   */
188  unsigned long int nc;
189
190  /**
191   * Nonce value:
192   */
193  char nonce[MAX_NONCE_LENGTH];
194
195};
196
197#if HAVE_MESSAGES
198/**
199 * fprintf-like helper function for logging debug
200 * messages.
201 */
202void
203MHD_DLOG (const struct MHD_Daemon *daemon,
204	  const char *format, ...);
205#endif
206
207
208/**
209 * Header or cookie in HTTP request or response.
210 */
211struct MHD_HTTP_Header
212{
213  /**
214   * Headers are kept in a linked list.
215   */
216  struct MHD_HTTP_Header *next;
217
218  /**
219   * The name of the header (key), without
220   * the colon.
221   */
222  char *header;
223
224  /**
225   * The value of the header.
226   */
227  char *value;
228
229  /**
230   * Type of the header (where in the HTTP
231   * protocol is this header from).
232   */
233  enum MHD_ValueKind kind;
234
235};
236
237
238/**
239 * Representation of a response.
240 */
241struct MHD_Response
242{
243
244  /**
245   * Headers to send for the response.  Initially
246   * the linked list is created in inverse order;
247   * the order should be inverted before sending!
248   */
249  struct MHD_HTTP_Header *first_header;
250
251  /**
252   * Buffer pointing to data that we are supposed
253   * to send as a response.
254   */
255  char *data;
256
257  /**
258   * Closure to give to the content reader @e crc
259   * and content reader free callback @e crfc.
260   */
261  void *crc_cls;
262
263  /**
264   * How do we get more data?  NULL if we are
265   * given all of the data up front.
266   */
267  MHD_ContentReaderCallback crc;
268
269  /**
270   * NULL if data must not be freed, otherwise
271   * either user-specified callback or "&free".
272   */
273  MHD_ContentReaderFreeCallback crfc;
274
275  /**
276   * Mutex to synchronize access to @e data, @e size and
277   * @e reference_count.
278   */
279  MHD_mutex_ mutex;
280
281  /**
282   * Set to #MHD_SIZE_UNKNOWN if size is not known.
283   */
284  uint64_t total_size;
285
286  /**
287   * At what offset in the stream is the
288   * beginning of @e data located?
289   */
290  uint64_t data_start;
291
292  /**
293   * Offset to start reading from when using @e fd.
294   */
295  off_t fd_off;
296
297  /**
298   * Number of bytes ready in @e data (buffer may be larger
299   * than what is filled with payload).
300   */
301  size_t data_size;
302
303  /**
304   * Size of the data buffer @e data.
305   */
306  size_t data_buffer_size;
307
308  /**
309   * Reference count for this response.  Free
310   * once the counter hits zero.
311   */
312  unsigned int reference_count;
313
314  /**
315   * File-descriptor if this response is FD-backed.
316   */
317  int fd;
318
319  /**
320   * Flags set for the MHD response.
321   */
322  enum MHD_ResponseFlags flags;
323
324};
325
326
327/**
328 * States in a state machine for a connection.
329 *
330 * Transitions are any-state to CLOSED, any state to state+1,
331 * FOOTERS_SENT to INIT.  CLOSED is the terminal state and
332 * INIT the initial state.
333 *
334 * Note that transitions for *reading* happen only after
335 * the input has been processed; transitions for
336 * *writing* happen after the respective data has been
337 * put into the write buffer (the write does not have
338 * to be completed yet).  A transition to CLOSED or INIT
339 * requires the write to be complete.
340 */
341enum MHD_CONNECTION_STATE
342{
343  /**
344   * Connection just started (no headers received).
345   * Waiting for the line with the request type, URL and version.
346   */
347  MHD_CONNECTION_INIT = 0,
348
349  /**
350   * 1: We got the URL (and request type and version).  Wait for a header line.
351   */
352  MHD_CONNECTION_URL_RECEIVED = MHD_CONNECTION_INIT + 1,
353
354  /**
355   * 2: We got part of a multi-line request header.  Wait for the rest.
356   */
357  MHD_CONNECTION_HEADER_PART_RECEIVED = MHD_CONNECTION_URL_RECEIVED + 1,
358
359  /**
360   * 3: We got the request headers.  Process them.
361   */
362  MHD_CONNECTION_HEADERS_RECEIVED = MHD_CONNECTION_HEADER_PART_RECEIVED + 1,
363
364  /**
365   * 4: We have processed the request headers.  Send 100 continue.
366   */
367  MHD_CONNECTION_HEADERS_PROCESSED = MHD_CONNECTION_HEADERS_RECEIVED + 1,
368
369  /**
370   * 5: We have processed the headers and need to send 100 CONTINUE.
371   */
372  MHD_CONNECTION_CONTINUE_SENDING = MHD_CONNECTION_HEADERS_PROCESSED + 1,
373
374  /**
375   * 6: We have sent 100 CONTINUE (or do not need to).  Read the message body.
376   */
377  MHD_CONNECTION_CONTINUE_SENT = MHD_CONNECTION_CONTINUE_SENDING + 1,
378
379  /**
380   * 7: We got the request body.  Wait for a line of the footer.
381   */
382  MHD_CONNECTION_BODY_RECEIVED = MHD_CONNECTION_CONTINUE_SENT + 1,
383
384  /**
385   * 8: We got part of a line of the footer.  Wait for the
386   * rest.
387   */
388  MHD_CONNECTION_FOOTER_PART_RECEIVED = MHD_CONNECTION_BODY_RECEIVED + 1,
389
390  /**
391   * 9: We received the entire footer.  Wait for a response to be queued
392   * and prepare the response headers.
393   */
394  MHD_CONNECTION_FOOTERS_RECEIVED = MHD_CONNECTION_FOOTER_PART_RECEIVED + 1,
395
396  /**
397   * 10: We have prepared the response headers in the writ buffer.
398   * Send the response headers.
399   */
400  MHD_CONNECTION_HEADERS_SENDING = MHD_CONNECTION_FOOTERS_RECEIVED + 1,
401
402  /**
403   * 11: We have sent the response headers.  Get ready to send the body.
404   */
405  MHD_CONNECTION_HEADERS_SENT = MHD_CONNECTION_HEADERS_SENDING + 1,
406
407  /**
408   * 12: We are ready to send a part of a non-chunked body.  Send it.
409   */
410  MHD_CONNECTION_NORMAL_BODY_READY = MHD_CONNECTION_HEADERS_SENT + 1,
411
412  /**
413   * 13: We are waiting for the client to provide more
414   * data of a non-chunked body.
415   */
416  MHD_CONNECTION_NORMAL_BODY_UNREADY = MHD_CONNECTION_NORMAL_BODY_READY + 1,
417
418  /**
419   * 14: We are ready to send a chunk.
420   */
421  MHD_CONNECTION_CHUNKED_BODY_READY = MHD_CONNECTION_NORMAL_BODY_UNREADY + 1,
422
423  /**
424   * 15: We are waiting for the client to provide a chunk of the body.
425   */
426  MHD_CONNECTION_CHUNKED_BODY_UNREADY = MHD_CONNECTION_CHUNKED_BODY_READY + 1,
427
428  /**
429   * 16: We have sent the response body. Prepare the footers.
430   */
431  MHD_CONNECTION_BODY_SENT = MHD_CONNECTION_CHUNKED_BODY_UNREADY + 1,
432
433  /**
434   * 17: We have prepared the response footer.  Send it.
435   */
436  MHD_CONNECTION_FOOTERS_SENDING = MHD_CONNECTION_BODY_SENT + 1,
437
438  /**
439   * 18: We have sent the response footer.  Shutdown or restart.
440   */
441  MHD_CONNECTION_FOOTERS_SENT = MHD_CONNECTION_FOOTERS_SENDING + 1,
442
443  /**
444   * 19: This connection is to be closed.
445   */
446  MHD_CONNECTION_CLOSED = MHD_CONNECTION_FOOTERS_SENT + 1,
447
448  /**
449   * 20: This connection is finished (only to be freed)
450   */
451  MHD_CONNECTION_IN_CLEANUP = MHD_CONNECTION_CLOSED + 1,
452
453  /*
454   *  SSL/TLS connection states
455   */
456
457  /**
458   * The initial connection state for all secure connectoins
459   * Handshake messages will be processed in this state & while
460   * in the 'MHD_TLS_HELLO_REQUEST' state
461   */
462  MHD_TLS_CONNECTION_INIT = MHD_CONNECTION_IN_CLEANUP + 1
463
464};
465
466/**
467 * Should all state transitions be printed to stderr?
468 */
469#define DEBUG_STATES MHD_NO
470
471
472#if HAVE_MESSAGES
473#if DEBUG_STATES
474const char *
475MHD_state_to_string (enum MHD_CONNECTION_STATE state);
476#endif
477#endif
478
479/**
480 * Function to receive plaintext data.
481 *
482 * @param conn the connection struct
483 * @param write_to where to write received data
484 * @param max_bytes maximum number of bytes to receive
485 * @return number of bytes written to write_to
486 */
487typedef ssize_t
488(*ReceiveCallback) (struct MHD_Connection *conn,
489                    void *write_to,
490                    size_t max_bytes);
491
492
493/**
494 * Function to transmit plaintext data.
495 *
496 * @param conn the connection struct
497 * @param read_from where to read data to transmit
498 * @param max_bytes maximum number of bytes to transmit
499 * @return number of bytes transmitted
500 */
501typedef ssize_t
502(*TransmitCallback) (struct MHD_Connection *conn,
503                     const void *write_to,
504                     size_t max_bytes);
505
506
507/**
508 * State kept for each HTTP request.
509 */
510struct MHD_Connection
511{
512
513#if EPOLL_SUPPORT
514  /**
515   * Next pointer for the EDLL listing connections that are epoll-ready.
516   */
517  struct MHD_Connection *nextE;
518
519  /**
520   * Previous pointer for the EDLL listing connections that are epoll-ready.
521   */
522  struct MHD_Connection *prevE;
523#endif
524
525  /**
526   * Next pointer for the DLL describing our IO state.
527   */
528  struct MHD_Connection *next;
529
530  /**
531   * Previous pointer for the DLL describing our IO state.
532   */
533  struct MHD_Connection *prev;
534
535  /**
536   * Next pointer for the XDLL organizing connections by timeout.
537   * This DLL can be either the
538   * 'manual_timeout_head/manual_timeout_tail' or the
539   * 'normal_timeout_head/normal_timeout_tail', depending on whether a
540   * custom timeout is set for the connection.
541   */
542  struct MHD_Connection *nextX;
543
544  /**
545   * Previous pointer for the XDLL organizing connections by timeout.
546   */
547  struct MHD_Connection *prevX;
548
549  /**
550   * Reference to the MHD_Daemon struct.
551   */
552  struct MHD_Daemon *daemon;
553
554  /**
555   * Linked list of parsed headers.
556   */
557  struct MHD_HTTP_Header *headers_received;
558
559  /**
560   * Tail of linked list of parsed headers.
561   */
562  struct MHD_HTTP_Header *headers_received_tail;
563
564  /**
565   * Response to transmit (initially NULL).
566   */
567  struct MHD_Response *response;
568
569  /**
570   * The memory pool is created whenever we first read
571   * from the TCP stream and destroyed at the end of
572   * each request (and re-created for the next request).
573   * In the meantime, this pointer is NULL.  The
574   * pool is used for all connection-related data
575   * except for the response (which maybe shared between
576   * connections) and the IP address (which persists
577   * across individual requests).
578   */
579  struct MemoryPool *pool;
580
581  /**
582   * We allow the main application to associate some pointer with the
583   * HTTP request, which is passed to each #MHD_AccessHandlerCallback
584   * and some other API calls.  Here is where we store it.  (MHD does
585   * not know or care what it is).
586   */
587  void *client_context;
588
589  /**
590   * We allow the main application to associate some pointer with the
591   * TCP connection (which may span multiple HTTP requests).  Here is
592   * where we store it.  (MHD does not know or care what it is).
593   * The location is given to the #MHD_NotifyConnectionCallback and
594   * also accessible via #MHD_CONNECTION_INFO_SOCKET_CONTEXT.
595   */
596  void *socket_context;
597
598  /**
599   * Request method.  Should be GET/POST/etc.  Allocated
600   * in pool.
601   */
602  char *method;
603
604  /**
605   * Requested URL (everything after "GET" only).  Allocated
606   * in pool.
607   */
608  char *url;
609
610  /**
611   * HTTP version string (i.e. http/1.1).  Allocated
612   * in pool.
613   */
614  char *version;
615
616  /**
617   * Buffer for reading requests.   Allocated
618   * in pool.  Actually one byte larger than
619   * @e read_buffer_size (if non-NULL) to allow for
620   * 0-termination.
621   */
622  char *read_buffer;
623
624  /**
625   * Buffer for writing response (headers only).  Allocated
626   * in pool.
627   */
628  char *write_buffer;
629
630  /**
631   * Last incomplete header line during parsing of headers.
632   * Allocated in pool.  Only valid if state is
633   * either #MHD_CONNECTION_HEADER_PART_RECEIVED or
634   * #MHD_CONNECTION_FOOTER_PART_RECEIVED.
635   */
636  char *last;
637
638  /**
639   * Position after the colon on the last incomplete header
640   * line during parsing of headers.
641   * Allocated in pool.  Only valid if state is
642   * either #MHD_CONNECTION_HEADER_PART_RECEIVED or
643   * #MHD_CONNECTION_FOOTER_PART_RECEIVED.
644   */
645  char *colon;
646
647  /**
648   * Foreign address (of length @e addr_len).  MALLOCED (not
649   * in pool!).
650   */
651  struct sockaddr *addr;
652
653  /**
654   * Thread handle for this connection (if we are using
655   * one thread per connection).
656   */
657  MHD_thread_handle_ pid;
658
659  /**
660   * Size of read_buffer (in bytes).  This value indicates
661   * how many bytes we're willing to read into the buffer;
662   * the real buffer is one byte longer to allow for
663   * adding zero-termination (when needed).
664   */
665  size_t read_buffer_size;
666
667  /**
668   * Position where we currently append data in
669   * read_buffer (last valid position).
670   */
671  size_t read_buffer_offset;
672
673  /**
674   * Size of write_buffer (in bytes).
675   */
676  size_t write_buffer_size;
677
678  /**
679   * Offset where we are with sending from write_buffer.
680   */
681  size_t write_buffer_send_offset;
682
683  /**
684   * Last valid location in write_buffer (where do we
685   * append and up to where is it safe to send?)
686   */
687  size_t write_buffer_append_offset;
688
689  /**
690   * How many more bytes of the body do we expect
691   * to read? #MHD_SIZE_UNKNOWN for unknown.
692   */
693  uint64_t remaining_upload_size;
694
695  /**
696   * Current write position in the actual response
697   * (excluding headers, content only; should be 0
698   * while sending headers).
699   */
700  uint64_t response_write_position;
701
702  /**
703   * Position in the 100 CONTINUE message that
704   * we need to send when receiving http 1.1 requests.
705   */
706  size_t continue_message_write_offset;
707
708  /**
709   * Length of the foreign address.
710   */
711  socklen_t addr_len;
712
713  /**
714   * Last time this connection had any activity
715   * (reading or writing).
716   */
717  time_t last_activity;
718
719  /**
720   * After how many seconds of inactivity should
721   * this connection time out?  Zero for no timeout.
722   */
723  unsigned int connection_timeout;
724
725  /**
726   * Did we ever call the "default_handler" on this connection?
727   * (this flag will determine if we call the 'notify_completed'
728   * handler when the connection closes down).
729   */
730  int client_aware;
731
732  /**
733   * Socket for this connection.  Set to #MHD_INVALID_SOCKET if
734   * this connection has died (daemon should clean
735   * up in that case).
736   */
737  MHD_socket socket_fd;
738
739  /**
740   * Has this socket been closed for reading (i.e.  other side closed
741   * the connection)?  If so, we must completely close the connection
742   * once we are done sending our response (and stop trying to read
743   * from this socket).
744   */
745  int read_closed;
746
747  /**
748   * Set to #MHD_YES if the thread has been joined.
749   */
750  int thread_joined;
751
752  /**
753   * Are we currently inside the "idle" handler (to avoid recursively invoking it).
754   */
755  int in_idle;
756
757#if EPOLL_SUPPORT
758  /**
759   * What is the state of this socket in relation to epoll?
760   */
761  enum MHD_EpollState epoll_state;
762#endif
763
764  /**
765   * State in the FSM for this connection.
766   */
767  enum MHD_CONNECTION_STATE state;
768
769  /**
770   * What is this connection waiting for?
771   */
772  enum MHD_ConnectionEventLoopInfo event_loop_info;
773
774  /**
775   * HTTP response code.  Only valid if response object
776   * is already set.
777   */
778  unsigned int responseCode;
779
780  /**
781   * Set to MHD_YES if the response's content reader
782   * callback failed to provide data the last time
783   * we tried to read from it.  In that case, the
784   * write socket should be marked as unready until
785   * the CRC call succeeds.
786   */
787  int response_unready;
788
789  /**
790   * Are we receiving with chunked encoding?  This will be set to
791   * MHD_YES after we parse the headers and are processing the body
792   * with chunks.  After we are done with the body and we are
793   * processing the footers; once the footers are also done, this will
794   * be set to MHD_NO again (before the final call to the handler).
795   */
796  int have_chunked_upload;
797
798  /**
799   * If we are receiving with chunked encoding, where are we right
800   * now?  Set to 0 if we are waiting to receive the chunk size;
801   * otherwise, this is the size of the current chunk.  A value of
802   * zero is also used when we're at the end of the chunks.
803   */
804  size_t current_chunk_size;
805
806  /**
807   * If we are receiving with chunked encoding, where are we currently
808   * with respect to the current chunk (at what offset / position)?
809   */
810  size_t current_chunk_offset;
811
812  /**
813   * Handler used for processing read connection operations
814   */
815  int (*read_handler) (struct MHD_Connection *connection);
816
817  /**
818   * Handler used for processing write connection operations
819   */
820  int (*write_handler) (struct MHD_Connection *connection);
821
822  /**
823   * Handler used for processing idle connection operations
824   */
825  int (*idle_handler) (struct MHD_Connection *connection);
826
827  /**
828   * Function used for reading HTTP request stream.
829   */
830  ReceiveCallback recv_cls;
831
832  /**
833   * Function used for writing HTTP response stream.
834   */
835  TransmitCallback send_cls;
836
837#if HTTPS_SUPPORT
838  /**
839   * State required for HTTPS/SSL/TLS support.
840   */
841  SSL* tls_session;
842
843  /**
844   * Memory location to return for protocol session info.
845   */
846  const char* protocol;
847
848  /**
849   * Memory location to return for protocol session info.
850   */
851  const char* cipher;
852
853  /**
854   * Could it be that we are ready to read due to TLS buffers
855   * even though the socket is not?
856   */
857  int tls_read_ready;
858#endif
859
860  /**
861   * Is the connection suspended?
862   */
863  int suspended;
864
865  /**
866   * Is the connection wanting to resume?
867   */
868  int resuming;
869};
870
871/**
872 * Signature of function called to log URI accesses.
873 *
874 * @param cls closure
875 * @param uri uri being accessed
876 * @param con connection handle
877 * @return new closure
878 */
879typedef void *
880(*LogCallback)(void * cls,
881               const char * uri,
882               struct MHD_Connection *con);
883
884/**
885 * Signature of function called to unescape URIs.  See also
886 * #MHD_http_unescape().
887 *
888 * @param cls closure
889 * @param conn connection handle
890 * @param uri 0-terminated string to unescape (should be updated)
891 * @return length of the resulting string
892 */
893typedef size_t
894(*UnescapeCallback)(void *cls,
895                    struct MHD_Connection *conn,
896                    char *uri);
897
898
899/**
900 * State kept for each MHD daemon.  All connections are kept in two
901 * doubly-linked lists.  The first one reflects the state of the
902 * connection in terms of what operations we are waiting for (read,
903 * write, locally blocked, cleanup) whereas the second is about its
904 * timeout state (default or custom).
905 */
906struct MHD_Daemon
907{
908
909  /**
910   * Callback function for all requests.
911   */
912  MHD_AccessHandlerCallback default_handler;
913
914  /**
915   * Closure argument to default_handler.
916   */
917  void *default_handler_cls;
918
919  /**
920   * Head of doubly-linked list of our current, active connections.
921   */
922  struct MHD_Connection *connections_head;
923
924  /**
925   * Tail of doubly-linked list of our current, active connections.
926   */
927  struct MHD_Connection *connections_tail;
928
929  /**
930   * Head of doubly-linked list of our current but suspended connections.
931   */
932  struct MHD_Connection *suspended_connections_head;
933
934  /**
935   * Tail of doubly-linked list of our current but suspended connections.
936   */
937  struct MHD_Connection *suspended_connections_tail;
938
939  /**
940   * Head of doubly-linked list of connections to clean up.
941   */
942  struct MHD_Connection *cleanup_head;
943
944  /**
945   * Tail of doubly-linked list of connections to clean up.
946   */
947  struct MHD_Connection *cleanup_tail;
948
949#if EPOLL_SUPPORT
950  /**
951   * Head of EDLL of connections ready for processing (in epoll mode).
952   */
953  struct MHD_Connection *eready_head;
954
955  /**
956   * Tail of EDLL of connections ready for processing (in epoll mode)
957   */
958  struct MHD_Connection *eready_tail;
959#endif
960
961  /**
962   * Head of the XDLL of ALL connections with a default ('normal')
963   * timeout, sorted by timeout (earliest at the tail, most recently
964   * used connection at the head).  MHD can just look at the tail of
965   * this list to determine the timeout for all of its elements;
966   * whenever there is an event of a connection, the connection is
967   * moved back to the tail of the list.
968   *
969   * All connections by default start in this list; if a custom
970   * timeout that does not match 'connection_timeout' is set, they
971   * are moved to the 'manual_timeout_head'-XDLL.
972   */
973  struct MHD_Connection *normal_timeout_head;
974
975  /**
976   * Tail of the XDLL of ALL connections with a default timeout,
977   * sorted by timeout (earliest timeout at the tail).
978   */
979  struct MHD_Connection *normal_timeout_tail;
980
981  /**
982   * Head of the XDLL of ALL connections with a non-default/custom
983   * timeout, unsorted.  MHD will do a O(n) scan over this list to
984   * determine the current timeout.
985   */
986  struct MHD_Connection *manual_timeout_head;
987
988  /**
989   * Tail of the XDLL of ALL connections with a non-default/custom
990   * timeout, unsorted.
991   */
992  struct MHD_Connection *manual_timeout_tail;
993
994  /**
995   * Function to call to check if we should accept or reject an
996   * incoming request.  May be NULL.
997   */
998  MHD_AcceptPolicyCallback apc;
999
1000  /**
1001   * Closure argument to apc.
1002   */
1003  void *apc_cls;
1004
1005  /**
1006   * Function to call when we are done processing
1007   * a particular request.  May be NULL.
1008   */
1009  MHD_RequestCompletedCallback notify_completed;
1010
1011  /**
1012   * Closure argument to notify_completed.
1013   */
1014  void *notify_completed_cls;
1015
1016  /**
1017   * Function to call when we are starting/stopping
1018   * a connection.  May be NULL.
1019   */
1020  MHD_NotifyConnectionCallback notify_connection;
1021
1022  /**
1023   * Closure argument to notify_connection.
1024   */
1025  void *notify_connection_cls;
1026
1027  /**
1028   * Function to call with the full URI at the
1029   * beginning of request processing.  May be NULL.
1030   * <p>
1031   * Returns the initial pointer to internal state
1032   * kept by the client for the request.
1033   */
1034  LogCallback uri_log_callback;
1035
1036  /**
1037   * Closure argument to @e uri_log_callback.
1038   */
1039  void *uri_log_callback_cls;
1040
1041  /**
1042   * Function to call when we unescape escape sequences.
1043   */
1044  UnescapeCallback unescape_callback;
1045
1046  /**
1047   * Closure for @e unescape_callback.
1048   */
1049  void *unescape_callback_cls;
1050
1051#if HAVE_MESSAGES
1052  /**
1053   * Function for logging error messages (if we
1054   * support error reporting).
1055   */
1056  void (*custom_error_log) (void *cls, const char *fmt, va_list va);
1057
1058  /**
1059   * Closure argument to custom_error_log.
1060   */
1061  void *custom_error_log_cls;
1062#endif
1063
1064  /**
1065   * Pointer to master daemon (NULL if this is the master)
1066   */
1067  struct MHD_Daemon *master;
1068
1069  /**
1070   * Worker daemons (one per thread)
1071   */
1072  struct MHD_Daemon *worker_pool;
1073
1074  /**
1075   * Table storing number of connections per IP
1076   */
1077  void *per_ip_connection_count;
1078
1079  /**
1080   * Size of the per-connection memory pools.
1081   */
1082  size_t pool_size;
1083
1084  /**
1085   * Increment for growth of the per-connection memory pools.
1086   */
1087  size_t pool_increment;
1088
1089  /**
1090   * Size of threads created by MHD.
1091   */
1092  size_t thread_stack_size;
1093
1094  /**
1095   * Number of worker daemons
1096   */
1097  unsigned int worker_pool_size;
1098
1099  /**
1100   * The select thread handle (if we have internal select)
1101   */
1102  MHD_thread_handle_ pid;
1103
1104  /**
1105   * Mutex for per-IP connection counts.
1106   */
1107  MHD_mutex_ per_ip_connection_mutex;
1108
1109  /**
1110   * Mutex for (modifying) access to the "cleanup" connection DLL.
1111   */
1112  MHD_mutex_ cleanup_connection_mutex;
1113
1114  /**
1115   * Listen socket.
1116   */
1117  MHD_socket socket_fd;
1118
1119  /**
1120   * Whether to allow/disallow/ignore reuse of listening address.
1121   * The semantics is the following:
1122   * 0: ignore (user did not ask for neither allow/disallow, use SO_REUSEADDR)
1123   * >0: allow (use SO_REUSEPORT on most platforms, SO_REUSEADDR on Windows)
1124   * <0: disallow (mostly no action, SO_EXCLUSIVEADDRUSE on Windows)
1125   */
1126  int listening_address_reuse;
1127
1128#if EPOLL_SUPPORT
1129  /**
1130   * File descriptor associated with our epoll loop.
1131   */
1132  int epoll_fd;
1133
1134  /**
1135   * MHD_YES if the listen socket is in the 'epoll' set,
1136   * MHD_NO if not.
1137   */
1138  int listen_socket_in_epoll;
1139#endif
1140
1141  /**
1142   * Pipe we use to signal shutdown, unless
1143   * 'HAVE_LISTEN_SHUTDOWN' is defined AND we have a listen
1144   * socket (which we can then 'shutdown' to stop listening).
1145   * MHD can be build with usage of socketpair instead of
1146   * pipe (forced on W32).
1147   */
1148  MHD_pipe wpipe[2];
1149
1150  /**
1151   * Are we shutting down?
1152   */
1153  int shutdown;
1154
1155  /*
1156   * Do we need to process resuming connections?
1157   */
1158  int resuming;
1159
1160  /**
1161   * Number of active parallel connections.
1162   */
1163  unsigned int connections;
1164
1165  /**
1166   * Limit on the number of parallel connections.
1167   */
1168  unsigned int connection_limit;
1169
1170  /**
1171   * After how many seconds of inactivity should
1172   * connections time out?  Zero for no timeout.
1173   */
1174  unsigned int connection_timeout;
1175
1176  /**
1177   * Maximum number of connections per IP, or 0 for
1178   * unlimited.
1179   */
1180  unsigned int per_ip_connection_limit;
1181
1182  /**
1183   * Daemon's flags (bitfield).
1184   */
1185  enum MHD_FLAG options;
1186
1187  /**
1188   * Listen port.
1189   */
1190  uint16_t port;
1191
1192#if HTTPS_SUPPORT
1193  SSL_CTX* tls_context;
1194  /**
1195   * Pointer to our SSL/TLS key (in PEM) in memory.
1196   */
1197  const char *https_mem_key;
1198
1199  /**
1200   * Pointer to our SSL/TLS certificate (in PEM) in memory.
1201   */
1202  const char *https_mem_cert;
1203
1204  /**
1205   * Pointer to 0-terminated HTTPS passphrase in memory.
1206   */
1207  const char *https_key_password;
1208
1209  /**
1210   * Pointer to our SSL/TLS certificate authority (in PEM) in memory.
1211   */
1212  const char *https_mem_trust;
1213
1214  /**
1215   * Our Diffie-Hellman parameters (in PEM) in memory.
1216   */
1217  const char *https_mem_dhparams;
1218
1219  /**
1220   * Pointer to SSL/TLS cipher string in memory.
1221   */
1222  const char *https_mem_cipher;
1223
1224  /**
1225   * For how many connections do we have 'tls_read_ready' set to MHD_YES?
1226   * Used to avoid O(n) traversal over all connections when determining
1227   * event-loop timeout (as it needs to be zero if there is any connection
1228   * which might have ready data within TLS).
1229   */
1230  unsigned int num_tls_read_ready;
1231
1232#endif
1233
1234#ifdef DAUTH_SUPPORT
1235
1236  /**
1237   * Character array of random values.
1238   */
1239  const char *digest_auth_random;
1240
1241  /**
1242   * An array that contains the map nonce-nc.
1243   */
1244  struct MHD_NonceNc *nnc;
1245
1246  /**
1247   * A rw-lock for synchronizing access to `nnc'.
1248   */
1249  MHD_mutex_ nnc_lock;
1250
1251  /**
1252   * Size of `digest_auth_random.
1253   */
1254  size_t digest_auth_rand_size;
1255
1256  /**
1257   * Size of the nonce-nc array.
1258   */
1259  unsigned int nonce_nc_size;
1260
1261#endif
1262
1263#ifdef TCP_FASTOPEN
1264  /**
1265   * The queue size for incoming SYN + DATA packets.
1266   */
1267  unsigned int fastopen_queue_size;
1268#endif
1269};
1270
1271
1272#if EXTRA_CHECKS
1273#define EXTRA_CHECK(a) do { if (!(a)) abort(); } while (0)
1274#else
1275#define EXTRA_CHECK(a)
1276#endif
1277
1278
1279/**
1280 * Insert an element at the head of a DLL. Assumes that head, tail and
1281 * element are structs with prev and next fields.
1282 *
1283 * @param head pointer to the head of the DLL
1284 * @param tail pointer to the tail of the DLL
1285 * @param element element to insert
1286 */
1287#define DLL_insert(head,tail,element) do { \
1288  EXTRA_CHECK (NULL == (element)->next); \
1289  EXTRA_CHECK (NULL == (element)->prev); \
1290  (element)->next = (head); \
1291  (element)->prev = NULL; \
1292  if ((tail) == NULL) \
1293    (tail) = element; \
1294  else \
1295    (head)->prev = element; \
1296  (head) = (element); } while (0)
1297
1298
1299/**
1300 * Remove an element from a DLL. Assumes
1301 * that head, tail and element are structs
1302 * with prev and next fields.
1303 *
1304 * @param head pointer to the head of the DLL
1305 * @param tail pointer to the tail of the DLL
1306 * @param element element to remove
1307 */
1308#define DLL_remove(head,tail,element) do { \
1309  EXTRA_CHECK ( (NULL != (element)->next) || ((element) == (tail)));  \
1310  EXTRA_CHECK ( (NULL != (element)->prev) || ((element) == (head)));  \
1311  if ((element)->prev == NULL) \
1312    (head) = (element)->next;  \
1313  else \
1314    (element)->prev->next = (element)->next; \
1315  if ((element)->next == NULL) \
1316    (tail) = (element)->prev;  \
1317  else \
1318    (element)->next->prev = (element)->prev; \
1319  (element)->next = NULL; \
1320  (element)->prev = NULL; } while (0)
1321
1322
1323
1324/**
1325 * Insert an element at the head of a XDLL. Assumes that head, tail and
1326 * element are structs with prevX and nextX fields.
1327 *
1328 * @param head pointer to the head of the XDLL
1329 * @param tail pointer to the tail of the XDLL
1330 * @param element element to insert
1331 */
1332#define XDLL_insert(head,tail,element) do { \
1333  EXTRA_CHECK (NULL == (element)->nextX); \
1334  EXTRA_CHECK (NULL == (element)->prevX); \
1335  (element)->nextX = (head); \
1336  (element)->prevX = NULL; \
1337  if (NULL == (tail)) \
1338    (tail) = element; \
1339  else \
1340    (head)->prevX = element; \
1341  (head) = (element); } while (0)
1342
1343
1344/**
1345 * Remove an element from a XDLL. Assumes
1346 * that head, tail and element are structs
1347 * with prevX and nextX fields.
1348 *
1349 * @param head pointer to the head of the XDLL
1350 * @param tail pointer to the tail of the XDLL
1351 * @param element element to remove
1352 */
1353#define XDLL_remove(head,tail,element) do { \
1354  EXTRA_CHECK ( (NULL != (element)->nextX) || ((element) == (tail)));  \
1355  EXTRA_CHECK ( (NULL != (element)->prevX) || ((element) == (head)));  \
1356  if (NULL == (element)->prevX) \
1357    (head) = (element)->nextX;  \
1358  else \
1359    (element)->prevX->nextX = (element)->nextX; \
1360  if (NULL == (element)->nextX) \
1361    (tail) = (element)->prevX;  \
1362  else \
1363    (element)->nextX->prevX = (element)->prevX; \
1364  (element)->nextX = NULL; \
1365  (element)->prevX = NULL; } while (0)
1366
1367
1368/**
1369 * Insert an element at the head of a EDLL. Assumes that head, tail and
1370 * element are structs with prevE and nextE fields.
1371 *
1372 * @param head pointer to the head of the EDLL
1373 * @param tail pointer to the tail of the EDLL
1374 * @param element element to insert
1375 */
1376#define EDLL_insert(head,tail,element) do { \
1377  (element)->nextE = (head); \
1378  (element)->prevE = NULL; \
1379  if ((tail) == NULL) \
1380    (tail) = element; \
1381  else \
1382    (head)->prevE = element; \
1383  (head) = (element); } while (0)
1384
1385
1386/**
1387 * Remove an element from a EDLL. Assumes
1388 * that head, tail and element are structs
1389 * with prevE and nextE fields.
1390 *
1391 * @param head pointer to the head of the EDLL
1392 * @param tail pointer to the tail of the EDLL
1393 * @param element element to remove
1394 */
1395#define EDLL_remove(head,tail,element) do { \
1396  if ((element)->prevE == NULL) \
1397    (head) = (element)->nextE;  \
1398  else \
1399    (element)->prevE->nextE = (element)->nextE; \
1400  if ((element)->nextE == NULL) \
1401    (tail) = (element)->prevE;  \
1402  else \
1403    (element)->nextE->prevE = (element)->prevE; \
1404  (element)->nextE = NULL; \
1405  (element)->prevE = NULL; } while (0)
1406
1407
1408/**
1409 * Equivalent to `time(NULL)` but tries to use some sort of monotonic
1410 * clock that isn't affected by someone setting the system real time
1411 * clock.
1412 *
1413 * @return 'current' time
1414 */
1415time_t
1416MHD_monotonic_time(void);
1417
1418
1419/**
1420 * Convert all occurences of '+' to ' '.
1421 *
1422 * @param arg string that is modified (in place), must be 0-terminated
1423 */
1424void
1425MHD_unescape_plus (char *arg);
1426
1427
1428#endif
1429