internal.h
Go to the documentation of this file.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.h"
00034 #endif
00035
00036 #define EXTRA_CHECKS MHD_YES
00037
00038 #define MHD_MAX(a,b) ((a)<(b)) ? (b) : (a)
00039 #define MHD_MIN(a,b) ((a)<(b)) ? (a) : (b)
00040
00046 #define MHD_BUF_INC_SIZE 2048
00047
00048 #if HAVE_MESSAGES
00049
00053 void MHD_DLOG (const struct MHD_Daemon *daemon, const char *format, ...);
00054
00055 #endif
00056 void MHD_tls_log_func (int level, const char *str);
00057
00065 size_t MHD_http_unescape (char *val);
00066
00070 struct MHD_HTTP_Header
00071 {
00075 struct MHD_HTTP_Header *next;
00076
00081 char *header;
00082
00086 char *value;
00087
00092 enum MHD_ValueKind kind;
00093
00094 };
00095
00099 struct MHD_Response
00100 {
00101
00107 struct MHD_HTTP_Header *first_header;
00108
00113 char *data;
00114
00119 void *crc_cls;
00120
00125 MHD_ContentReaderCallback crc;
00126
00131 MHD_ContentReaderFreeCallback crfc;
00132
00137 pthread_mutex_t mutex;
00138
00143 unsigned int reference_count;
00144
00148 uint64_t total_size;
00149
00153 size_t data_size;
00154
00158 size_t data_buffer_size;
00159
00164 uint64_t data_start;
00165
00166 };
00167
00182 enum MHD_CONNECTION_STATE
00183 {
00188 MHD_CONNECTION_INIT = 0,
00189
00193 MHD_CONNECTION_URL_RECEIVED = MHD_CONNECTION_INIT + 1,
00194
00198 MHD_CONNECTION_HEADER_PART_RECEIVED = MHD_CONNECTION_URL_RECEIVED + 1,
00199
00203 MHD_CONNECTION_HEADERS_RECEIVED = MHD_CONNECTION_HEADER_PART_RECEIVED + 1,
00204
00208 MHD_CONNECTION_HEADERS_PROCESSED = MHD_CONNECTION_HEADERS_RECEIVED + 1,
00209
00213 MHD_CONNECTION_CONTINUE_SENDING = MHD_CONNECTION_HEADERS_PROCESSED + 1,
00214
00218 MHD_CONNECTION_CONTINUE_SENT = MHD_CONNECTION_CONTINUE_SENDING + 1,
00219
00223 MHD_CONNECTION_BODY_RECEIVED = MHD_CONNECTION_CONTINUE_SENT + 1,
00224
00229 MHD_CONNECTION_FOOTER_PART_RECEIVED = MHD_CONNECTION_BODY_RECEIVED + 1,
00230
00235 MHD_CONNECTION_FOOTERS_RECEIVED = MHD_CONNECTION_FOOTER_PART_RECEIVED + 1,
00236
00241 MHD_CONNECTION_HEADERS_SENDING = MHD_CONNECTION_FOOTERS_RECEIVED + 1,
00242
00246 MHD_CONNECTION_HEADERS_SENT = MHD_CONNECTION_HEADERS_SENDING + 1,
00247
00251 MHD_CONNECTION_NORMAL_BODY_READY = MHD_CONNECTION_HEADERS_SENT + 1,
00252
00257 MHD_CONNECTION_NORMAL_BODY_UNREADY = MHD_CONNECTION_NORMAL_BODY_READY + 1,
00258
00262 MHD_CONNECTION_CHUNKED_BODY_READY = MHD_CONNECTION_NORMAL_BODY_UNREADY + 1,
00263
00267 MHD_CONNECTION_CHUNKED_BODY_UNREADY = MHD_CONNECTION_CHUNKED_BODY_READY + 1,
00268
00272 MHD_CONNECTION_BODY_SENT = MHD_CONNECTION_CHUNKED_BODY_UNREADY + 1,
00273
00277 MHD_CONNECTION_FOOTERS_SENDING = MHD_CONNECTION_BODY_SENT + 1,
00278
00282 MHD_CONNECTION_FOOTERS_SENT = MHD_CONNECTION_FOOTERS_SENDING + 1,
00283
00288 MHD_CONNECTION_CLOSED = MHD_CONNECTION_FOOTERS_SENT + 1,
00289
00290
00291
00292
00293
00299 MHD_TLS_CONNECTION_INIT = MHD_CONNECTION_CLOSED + 1,
00300
00308 MHD_TLS_HELLO_REQUEST,
00309
00310 MHD_TLS_HANDSHAKE_FAILED,
00311
00312 MHD_TLS_HANDSHAKE_COMPLETE
00313
00314 };
00315
00319 #define DEBUG_STATES MHD_NO
00320
00321 #if HAVE_MESSAGES
00322 char *MHD_state_to_string (enum MHD_CONNECTION_STATE state);
00323 #endif
00324
00333 typedef ssize_t (*ReceiveCallback) (struct MHD_Connection * conn,
00334 void *write_to, size_t max_bytes);
00335
00336
00345 typedef ssize_t (*TransmitCallback) (struct MHD_Connection * conn,
00346 const void *write_to, size_t max_bytes);
00347
00348
00352 struct MHD_Connection
00353 {
00354
00358 struct MHD_Connection *next;
00359
00363 struct MHD_Daemon *daemon;
00364
00368 struct MHD_HTTP_Header *headers_received;
00369
00373 struct MHD_Response *response;
00374
00385 struct MemoryPool *pool;
00386
00393 void *client_context;
00394
00399 char *method;
00400
00405 char *url;
00406
00411 char *version;
00412
00419 char *read_buffer;
00420
00425 char *write_buffer;
00426
00432 char *last;
00433
00440 char *colon;
00441
00446 struct sockaddr_in *addr;
00447
00452 pthread_t pid;
00453
00460 size_t read_buffer_size;
00461
00466 size_t read_buffer_offset;
00467
00471 size_t write_buffer_size;
00472
00476 size_t write_buffer_send_offset;
00477
00482 size_t write_buffer_append_offset;
00483
00488 uint64_t remaining_upload_size;
00489
00495 uint64_t response_write_position;
00496
00501 size_t continue_message_write_offset;
00502
00506 socklen_t addr_len;
00507
00512 time_t last_activity;
00513
00519 int client_aware;
00520
00526 int socket_fd;
00527
00535 int read_closed;
00536
00540 enum MHD_CONNECTION_STATE state;
00541
00546 unsigned int responseCode;
00547
00555 int response_unready;
00556
00560 int have_chunked_response;
00561
00569 int have_chunked_upload;
00570
00577 unsigned int current_chunk_size;
00578
00583 unsigned int current_chunk_offset;
00584
00588 int (*read_handler) (struct MHD_Connection * connection);
00589
00593 int (*write_handler) (struct MHD_Connection * connection);
00594
00598 int (*idle_handler) (struct MHD_Connection * connection);
00599
00603 ReceiveCallback recv_cls;
00604
00608 TransmitCallback send_cls;
00609
00610 #if HTTPS_SUPPORT
00611
00614 MHD_gtls_session_t tls_session;
00615 #endif
00616 };
00617
00618 typedef void * (*LogCallback)(void * cls, const char * uri);
00619
00623 struct MHD_Daemon
00624 {
00625
00629 MHD_AccessHandlerCallback default_handler;
00630
00634 void *default_handler_cls;
00635
00639 struct MHD_Connection *connections;
00640
00646 MHD_AcceptPolicyCallback apc;
00647
00651 void *apc_cls;
00652
00657 MHD_RequestCompletedCallback notify_completed;
00658
00662 void *notify_completed_cls;
00663
00671 LogCallback uri_log_callback;
00672
00676 void *uri_log_callback_cls;
00677
00678 #if HAVE_MESSAGES
00679
00683 void (*custom_error_log) (void *cls, const char *fmt, va_list va);
00684
00688 void *custom_error_log_cls;
00689 #endif
00690
00694 pthread_t pid;
00695
00699 int socket_fd;
00700
00704 int shutdown;
00705
00709 size_t pool_size;
00710
00714 unsigned int max_connections;
00715
00720 unsigned int connection_timeout;
00721
00726 unsigned int per_ip_connection_limit;
00727
00731 void *per_ip_connection_count;
00732
00736 pthread_mutex_t per_ip_connection_mutex;
00737
00741 enum MHD_OPTION options;
00742
00746 unsigned short port;
00747
00748 #if HTTPS_SUPPORT
00749
00753 enum MHD_GNUTLS_CredentialsType cred_type;
00754
00758 MHD_gtls_cert_credentials_t x509_cred;
00759
00763 MHD_gnutls_priority_t priority_cache;
00764
00768 MHD_gtls_dh_params_t dh_params;
00769
00773 const char *https_mem_key;
00774
00778 const char *https_mem_cert;
00779 #endif
00780
00784 struct MHD_Daemon *master;
00785
00789 struct MHD_Daemon *worker_pool;
00790
00794 unsigned int worker_pool_size;
00795 };
00796
00797
00798 #if EXTRA_CHECKS
00799 #define EXTRA_CHECK(a) if (!(a)) abort();
00800 #else
00801 #define EXTRA_CHECK(a)
00802 #endif
00803
00804
00805
00806 #endif