00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00027 #ifndef INTERNAL_H
00028 #define INTERNAL_H
00029
00030 #include "platform.h"
00031 #include "microhttpd.h"
00032 #if HTTPS_SUPPORT
00033 #include <gnutls/gnutls.h>
00034 #endif
00035
00040 #define EXTRA_CHECKS MHD_NO
00041
00042 #define MHD_MAX(a,b) ((a)<(b)) ? (b) : (a)
00043 #define MHD_MIN(a,b) ((a)<(b)) ? (a) : (b)
00044
00050 #define MHD_BUF_INC_SIZE 2048
00051
00055 extern MHD_PanicCallback mhd_panic;
00056
00060 extern void *mhd_panic_cls;
00061
00066 enum MHD_PollActions
00067 {
00071 MHD_POLL_ACTION_NOTHING = 0,
00072
00076 MHD_POLL_ACTION_IN = 1,
00077
00081 MHD_POLL_ACTION_OUT = 2
00082 };
00083
00084
00088 struct MHD_Pollfd
00089 {
00093 int fd;
00094
00098 enum MHD_PollActions events;
00099 };
00100
00101
00108 #define MAX_NONCE_LENGTH 129
00109
00110
00115 struct MHD_NonceNc
00116 {
00117
00122 unsigned int nc;
00123
00127 char nonce[MAX_NONCE_LENGTH];
00128
00129 };
00130
00131 #if HAVE_MESSAGES
00132
00136 void MHD_DLOG (const struct MHD_Daemon *daemon, const char *format, ...);
00137
00138 #endif
00139
00150 size_t MHD_http_unescape (void *cls,
00151 struct MHD_Connection *connection,
00152 char *val);
00153
00157 struct MHD_HTTP_Header
00158 {
00162 struct MHD_HTTP_Header *next;
00163
00168 char *header;
00169
00173 char *value;
00174
00179 enum MHD_ValueKind kind;
00180
00181 };
00182
00186 struct MHD_Response
00187 {
00188
00194 struct MHD_HTTP_Header *first_header;
00195
00200 char *data;
00201
00206 void *crc_cls;
00207
00212 MHD_ContentReaderCallback crc;
00213
00218 MHD_ContentReaderFreeCallback crfc;
00219
00224 pthread_mutex_t mutex;
00225
00229 uint64_t total_size;
00230
00235 uint64_t data_start;
00236
00240 off_t fd_off;
00241
00245 size_t data_size;
00246
00250 size_t data_buffer_size;
00251
00256 unsigned int reference_count;
00257
00261 int fd;
00262
00263 };
00264
00279 enum MHD_CONNECTION_STATE
00280 {
00285 MHD_CONNECTION_INIT = 0,
00286
00290 MHD_CONNECTION_URL_RECEIVED = MHD_CONNECTION_INIT + 1,
00291
00295 MHD_CONNECTION_HEADER_PART_RECEIVED = MHD_CONNECTION_URL_RECEIVED + 1,
00296
00300 MHD_CONNECTION_HEADERS_RECEIVED = MHD_CONNECTION_HEADER_PART_RECEIVED + 1,
00301
00305 MHD_CONNECTION_HEADERS_PROCESSED = MHD_CONNECTION_HEADERS_RECEIVED + 1,
00306
00310 MHD_CONNECTION_CONTINUE_SENDING = MHD_CONNECTION_HEADERS_PROCESSED + 1,
00311
00315 MHD_CONNECTION_CONTINUE_SENT = MHD_CONNECTION_CONTINUE_SENDING + 1,
00316
00320 MHD_CONNECTION_BODY_RECEIVED = MHD_CONNECTION_CONTINUE_SENT + 1,
00321
00326 MHD_CONNECTION_FOOTER_PART_RECEIVED = MHD_CONNECTION_BODY_RECEIVED + 1,
00327
00332 MHD_CONNECTION_FOOTERS_RECEIVED = MHD_CONNECTION_FOOTER_PART_RECEIVED + 1,
00333
00338 MHD_CONNECTION_HEADERS_SENDING = MHD_CONNECTION_FOOTERS_RECEIVED + 1,
00339
00343 MHD_CONNECTION_HEADERS_SENT = MHD_CONNECTION_HEADERS_SENDING + 1,
00344
00348 MHD_CONNECTION_NORMAL_BODY_READY = MHD_CONNECTION_HEADERS_SENT + 1,
00349
00354 MHD_CONNECTION_NORMAL_BODY_UNREADY = MHD_CONNECTION_NORMAL_BODY_READY + 1,
00355
00359 MHD_CONNECTION_CHUNKED_BODY_READY = MHD_CONNECTION_NORMAL_BODY_UNREADY + 1,
00360
00364 MHD_CONNECTION_CHUNKED_BODY_UNREADY = MHD_CONNECTION_CHUNKED_BODY_READY + 1,
00365
00369 MHD_CONNECTION_BODY_SENT = MHD_CONNECTION_CHUNKED_BODY_UNREADY + 1,
00370
00374 MHD_CONNECTION_FOOTERS_SENDING = MHD_CONNECTION_BODY_SENT + 1,
00375
00379 MHD_CONNECTION_FOOTERS_SENT = MHD_CONNECTION_FOOTERS_SENDING + 1,
00380
00385 MHD_CONNECTION_CLOSED = MHD_CONNECTION_FOOTERS_SENT + 1,
00386
00387
00388
00389
00390
00396 MHD_TLS_CONNECTION_INIT = MHD_CONNECTION_CLOSED + 1
00397
00398 };
00399
00403 #define DEBUG_STATES MHD_NO
00404
00405 #if HAVE_MESSAGES
00406 #if DEBUG_STATES
00407 const char *
00408 MHD_state_to_string (enum MHD_CONNECTION_STATE state);
00409 #endif
00410 #endif
00411
00420 typedef ssize_t (*ReceiveCallback) (struct MHD_Connection * conn,
00421 void *write_to, size_t max_bytes);
00422
00423
00432 typedef ssize_t (*TransmitCallback) (struct MHD_Connection * conn,
00433 const void *write_to, size_t max_bytes);
00434
00435
00439 struct MHD_Connection
00440 {
00441
00445 struct MHD_Connection *next;
00446
00450 struct MHD_Daemon *daemon;
00451
00455 struct MHD_HTTP_Header *headers_received;
00456
00460 struct MHD_Response *response;
00461
00472 struct MemoryPool *pool;
00473
00480 void *client_context;
00481
00486 char *method;
00487
00492 char *url;
00493
00498 char *version;
00499
00506 char *read_buffer;
00507
00512 char *write_buffer;
00513
00519 char *last;
00520
00527 char *colon;
00528
00533 struct sockaddr *addr;
00534
00539 pthread_t pid;
00540
00547 size_t read_buffer_size;
00548
00553 size_t read_buffer_offset;
00554
00558 size_t write_buffer_size;
00559
00563 size_t write_buffer_send_offset;
00564
00569 size_t write_buffer_append_offset;
00570
00575 uint64_t remaining_upload_size;
00576
00582 uint64_t response_write_position;
00583
00588 size_t continue_message_write_offset;
00589
00593 socklen_t addr_len;
00594
00599 time_t last_activity;
00600
00606 int client_aware;
00607
00613 int socket_fd;
00614
00622 int read_closed;
00623
00627 enum MHD_CONNECTION_STATE state;
00628
00633 unsigned int responseCode;
00634
00642 int response_unready;
00643
00647 int have_chunked_response;
00648
00656 int have_chunked_upload;
00657
00664 unsigned int current_chunk_size;
00665
00670 unsigned int current_chunk_offset;
00671
00675 int (*read_handler) (struct MHD_Connection * connection);
00676
00680 int (*write_handler) (struct MHD_Connection * connection);
00681
00685 int (*idle_handler) (struct MHD_Connection * connection);
00686
00690 ReceiveCallback recv_cls;
00691
00695 TransmitCallback send_cls;
00696
00697 #if HTTPS_SUPPORT
00698
00701 gnutls_session_t tls_session;
00702
00706 int protocol;
00707
00711 int cipher;
00712
00713 #endif
00714 };
00715
00723 typedef void * (*LogCallback)(void * cls, const char * uri);
00724
00734 typedef size_t (*UnescapeCallback)(void *cls,
00735 struct MHD_Connection *conn,
00736 char *uri);
00737
00741 struct MHD_Daemon
00742 {
00743
00747 MHD_AccessHandlerCallback default_handler;
00748
00752 void *default_handler_cls;
00753
00757 struct MHD_Connection *connections;
00758
00764 MHD_AcceptPolicyCallback apc;
00765
00769 void *apc_cls;
00770
00775 MHD_RequestCompletedCallback notify_completed;
00776
00780 void *notify_completed_cls;
00781
00789 LogCallback uri_log_callback;
00790
00794 void *uri_log_callback_cls;
00795
00799 UnescapeCallback unescape_callback;
00800
00804 void *unescape_callback_cls;
00805
00806 #if HAVE_MESSAGES
00807
00811 void (*custom_error_log) (void *cls, const char *fmt, va_list va);
00812
00816 void *custom_error_log_cls;
00817 #endif
00818
00822 struct MHD_Daemon *master;
00823
00827 struct MHD_Daemon *worker_pool;
00828
00832 void *per_ip_connection_count;
00833
00837 size_t pool_size;
00838
00842 size_t thread_stack_size;
00843
00847 unsigned int worker_pool_size;
00848
00852 pthread_t pid;
00853
00857 pthread_mutex_t per_ip_connection_mutex;
00858
00862 int socket_fd;
00863
00867 int shutdown;
00868
00872 unsigned int max_connections;
00873
00878 unsigned int connection_timeout;
00879
00884 unsigned int per_ip_connection_limit;
00885
00889 enum MHD_OPTION options;
00890
00894 uint16_t port;
00895
00896 #if HTTPS_SUPPORT
00897
00900 gnutls_priority_t priority_cache;
00901
00906 gnutls_credentials_type_t cred_type;
00907
00911 gnutls_certificate_credentials_t x509_cred;
00912
00916 gnutls_dh_params_t dh_params;
00917
00921 const char *https_mem_key;
00922
00926 const char *https_mem_cert;
00927
00931 const char *https_mem_trust;
00932
00933 #endif
00934
00935 #ifdef DAUTH_SUPPORT
00936
00940 const char *digest_auth_random;
00941
00945 struct MHD_NonceNc *nnc;
00946
00950 pthread_mutex_t nnc_lock;
00951
00955 unsigned int digest_auth_rand_size;
00956
00960 unsigned int nonce_nc_size;
00961
00962 #endif
00963
00964 };
00965
00966
00967 #if EXTRA_CHECKS
00968 #define EXTRA_CHECK(a) if (!(a)) abort();
00969 #else
00970 #define EXTRA_CHECK(a)
00971 #endif
00972
00973
00974
00975 #endif