1*663afb9bSAndroid Build Coastguard Worker /* 2*663afb9bSAndroid Build Coastguard Worker * Copyright 2001-2007 Niels Provos <[email protected]> 3*663afb9bSAndroid Build Coastguard Worker * Copyright 2007-2012 Niels Provos and Nick Mathewson 4*663afb9bSAndroid Build Coastguard Worker * 5*663afb9bSAndroid Build Coastguard Worker * This header file contains definitions for dealing with HTTP requests 6*663afb9bSAndroid Build Coastguard Worker * that are internal to libevent. As user of the library, you should not 7*663afb9bSAndroid Build Coastguard Worker * need to know about these. 8*663afb9bSAndroid Build Coastguard Worker */ 9*663afb9bSAndroid Build Coastguard Worker 10*663afb9bSAndroid Build Coastguard Worker #ifndef HTTP_INTERNAL_H_INCLUDED_ 11*663afb9bSAndroid Build Coastguard Worker #define HTTP_INTERNAL_H_INCLUDED_ 12*663afb9bSAndroid Build Coastguard Worker 13*663afb9bSAndroid Build Coastguard Worker #include "event2/event_struct.h" 14*663afb9bSAndroid Build Coastguard Worker #include "util-internal.h" 15*663afb9bSAndroid Build Coastguard Worker #include "defer-internal.h" 16*663afb9bSAndroid Build Coastguard Worker 17*663afb9bSAndroid Build Coastguard Worker #define HTTP_CONNECT_TIMEOUT 45 18*663afb9bSAndroid Build Coastguard Worker #define HTTP_WRITE_TIMEOUT 50 19*663afb9bSAndroid Build Coastguard Worker #define HTTP_READ_TIMEOUT 50 20*663afb9bSAndroid Build Coastguard Worker 21*663afb9bSAndroid Build Coastguard Worker enum message_read_status { 22*663afb9bSAndroid Build Coastguard Worker ALL_DATA_READ = 1, 23*663afb9bSAndroid Build Coastguard Worker MORE_DATA_EXPECTED = 0, 24*663afb9bSAndroid Build Coastguard Worker DATA_CORRUPTED = -1, 25*663afb9bSAndroid Build Coastguard Worker REQUEST_CANCELED = -2, 26*663afb9bSAndroid Build Coastguard Worker DATA_TOO_LONG = -3 27*663afb9bSAndroid Build Coastguard Worker }; 28*663afb9bSAndroid Build Coastguard Worker 29*663afb9bSAndroid Build Coastguard Worker struct evbuffer; 30*663afb9bSAndroid Build Coastguard Worker struct addrinfo; 31*663afb9bSAndroid Build Coastguard Worker struct evhttp_request; 32*663afb9bSAndroid Build Coastguard Worker 33*663afb9bSAndroid Build Coastguard Worker /* Indicates an unknown request method. */ 34*663afb9bSAndroid Build Coastguard Worker #define EVHTTP_REQ_UNKNOWN_ (1<<15) 35*663afb9bSAndroid Build Coastguard Worker 36*663afb9bSAndroid Build Coastguard Worker enum evhttp_connection_state { 37*663afb9bSAndroid Build Coastguard Worker EVCON_DISCONNECTED, /**< not currently connected not trying either*/ 38*663afb9bSAndroid Build Coastguard Worker EVCON_CONNECTING, /**< tries to currently connect */ 39*663afb9bSAndroid Build Coastguard Worker EVCON_IDLE, /**< connection is established */ 40*663afb9bSAndroid Build Coastguard Worker EVCON_READING_FIRSTLINE,/**< reading Request-Line (incoming conn) or 41*663afb9bSAndroid Build Coastguard Worker **< Status-Line (outgoing conn) */ 42*663afb9bSAndroid Build Coastguard Worker EVCON_READING_HEADERS, /**< reading request/response headers */ 43*663afb9bSAndroid Build Coastguard Worker EVCON_READING_BODY, /**< reading request/response body */ 44*663afb9bSAndroid Build Coastguard Worker EVCON_READING_TRAILER, /**< reading request/response chunked trailer */ 45*663afb9bSAndroid Build Coastguard Worker EVCON_WRITING /**< writing request/response headers/body */ 46*663afb9bSAndroid Build Coastguard Worker }; 47*663afb9bSAndroid Build Coastguard Worker 48*663afb9bSAndroid Build Coastguard Worker struct event_base; 49*663afb9bSAndroid Build Coastguard Worker 50*663afb9bSAndroid Build Coastguard Worker /* A client or server connection. */ 51*663afb9bSAndroid Build Coastguard Worker struct evhttp_connection { 52*663afb9bSAndroid Build Coastguard Worker /* we use this tailq only if this connection was created for an http 53*663afb9bSAndroid Build Coastguard Worker * server */ 54*663afb9bSAndroid Build Coastguard Worker TAILQ_ENTRY(evhttp_connection) next; 55*663afb9bSAndroid Build Coastguard Worker 56*663afb9bSAndroid Build Coastguard Worker evutil_socket_t fd; 57*663afb9bSAndroid Build Coastguard Worker struct bufferevent *bufev; 58*663afb9bSAndroid Build Coastguard Worker 59*663afb9bSAndroid Build Coastguard Worker struct event retry_ev; /* for retrying connects */ 60*663afb9bSAndroid Build Coastguard Worker 61*663afb9bSAndroid Build Coastguard Worker char *bind_address; /* address to use for binding the src */ 62*663afb9bSAndroid Build Coastguard Worker ev_uint16_t bind_port; /* local port for binding the src */ 63*663afb9bSAndroid Build Coastguard Worker 64*663afb9bSAndroid Build Coastguard Worker char *address; /* address to connect to */ 65*663afb9bSAndroid Build Coastguard Worker ev_uint16_t port; 66*663afb9bSAndroid Build Coastguard Worker 67*663afb9bSAndroid Build Coastguard Worker size_t max_headers_size; 68*663afb9bSAndroid Build Coastguard Worker ev_uint64_t max_body_size; 69*663afb9bSAndroid Build Coastguard Worker 70*663afb9bSAndroid Build Coastguard Worker int flags; 71*663afb9bSAndroid Build Coastguard Worker #define EVHTTP_CON_INCOMING 0x0001 /* only one request on it ever */ 72*663afb9bSAndroid Build Coastguard Worker #define EVHTTP_CON_OUTGOING 0x0002 /* multiple requests possible */ 73*663afb9bSAndroid Build Coastguard Worker #define EVHTTP_CON_CLOSEDETECT 0x0004 /* detecting if persistent close */ 74*663afb9bSAndroid Build Coastguard Worker /* set when we want to auto free the connection */ 75*663afb9bSAndroid Build Coastguard Worker #define EVHTTP_CON_AUTOFREE EVHTTP_CON_PUBLIC_FLAGS_END 76*663afb9bSAndroid Build Coastguard Worker /* Installed when attempt to read HTTP error after write failed, see 77*663afb9bSAndroid Build Coastguard Worker * EVHTTP_CON_READ_ON_WRITE_ERROR */ 78*663afb9bSAndroid Build Coastguard Worker #define EVHTTP_CON_READING_ERROR (EVHTTP_CON_AUTOFREE << 1) 79*663afb9bSAndroid Build Coastguard Worker 80*663afb9bSAndroid Build Coastguard Worker struct timeval timeout; /* timeout for events */ 81*663afb9bSAndroid Build Coastguard Worker int retry_cnt; /* retry count */ 82*663afb9bSAndroid Build Coastguard Worker int retry_max; /* maximum number of retries */ 83*663afb9bSAndroid Build Coastguard Worker struct timeval initial_retry_timeout; /* Timeout for low long to wait 84*663afb9bSAndroid Build Coastguard Worker * after first failing attempt 85*663afb9bSAndroid Build Coastguard Worker * before retry */ 86*663afb9bSAndroid Build Coastguard Worker 87*663afb9bSAndroid Build Coastguard Worker enum evhttp_connection_state state; 88*663afb9bSAndroid Build Coastguard Worker 89*663afb9bSAndroid Build Coastguard Worker /* for server connections, the http server they are connected with */ 90*663afb9bSAndroid Build Coastguard Worker struct evhttp *http_server; 91*663afb9bSAndroid Build Coastguard Worker 92*663afb9bSAndroid Build Coastguard Worker TAILQ_HEAD(evcon_requestq, evhttp_request) requests; 93*663afb9bSAndroid Build Coastguard Worker 94*663afb9bSAndroid Build Coastguard Worker void (*cb)(struct evhttp_connection *, void *); 95*663afb9bSAndroid Build Coastguard Worker void *cb_arg; 96*663afb9bSAndroid Build Coastguard Worker 97*663afb9bSAndroid Build Coastguard Worker void (*closecb)(struct evhttp_connection *, void *); 98*663afb9bSAndroid Build Coastguard Worker void *closecb_arg; 99*663afb9bSAndroid Build Coastguard Worker 100*663afb9bSAndroid Build Coastguard Worker struct event_callback read_more_deferred_cb; 101*663afb9bSAndroid Build Coastguard Worker 102*663afb9bSAndroid Build Coastguard Worker struct event_base *base; 103*663afb9bSAndroid Build Coastguard Worker struct evdns_base *dns_base; 104*663afb9bSAndroid Build Coastguard Worker int ai_family; 105*663afb9bSAndroid Build Coastguard Worker }; 106*663afb9bSAndroid Build Coastguard Worker 107*663afb9bSAndroid Build Coastguard Worker /* A callback for an http server */ 108*663afb9bSAndroid Build Coastguard Worker struct evhttp_cb { 109*663afb9bSAndroid Build Coastguard Worker TAILQ_ENTRY(evhttp_cb) next; 110*663afb9bSAndroid Build Coastguard Worker 111*663afb9bSAndroid Build Coastguard Worker char *what; 112*663afb9bSAndroid Build Coastguard Worker 113*663afb9bSAndroid Build Coastguard Worker void (*cb)(struct evhttp_request *req, void *); 114*663afb9bSAndroid Build Coastguard Worker void *cbarg; 115*663afb9bSAndroid Build Coastguard Worker }; 116*663afb9bSAndroid Build Coastguard Worker 117*663afb9bSAndroid Build Coastguard Worker /* both the http server as well as the rpc system need to queue connections */ 118*663afb9bSAndroid Build Coastguard Worker TAILQ_HEAD(evconq, evhttp_connection); 119*663afb9bSAndroid Build Coastguard Worker 120*663afb9bSAndroid Build Coastguard Worker /* each bound socket is stored in one of these */ 121*663afb9bSAndroid Build Coastguard Worker struct evhttp_bound_socket { 122*663afb9bSAndroid Build Coastguard Worker TAILQ_ENTRY(evhttp_bound_socket) next; 123*663afb9bSAndroid Build Coastguard Worker 124*663afb9bSAndroid Build Coastguard Worker struct evconnlistener *listener; 125*663afb9bSAndroid Build Coastguard Worker }; 126*663afb9bSAndroid Build Coastguard Worker 127*663afb9bSAndroid Build Coastguard Worker /* server alias list item. */ 128*663afb9bSAndroid Build Coastguard Worker struct evhttp_server_alias { 129*663afb9bSAndroid Build Coastguard Worker TAILQ_ENTRY(evhttp_server_alias) next; 130*663afb9bSAndroid Build Coastguard Worker 131*663afb9bSAndroid Build Coastguard Worker char *alias; /* the server alias. */ 132*663afb9bSAndroid Build Coastguard Worker }; 133*663afb9bSAndroid Build Coastguard Worker 134*663afb9bSAndroid Build Coastguard Worker struct evhttp { 135*663afb9bSAndroid Build Coastguard Worker /* Next vhost, if this is a vhost. */ 136*663afb9bSAndroid Build Coastguard Worker TAILQ_ENTRY(evhttp) next_vhost; 137*663afb9bSAndroid Build Coastguard Worker 138*663afb9bSAndroid Build Coastguard Worker /* All listeners for this host */ 139*663afb9bSAndroid Build Coastguard Worker TAILQ_HEAD(boundq, evhttp_bound_socket) sockets; 140*663afb9bSAndroid Build Coastguard Worker 141*663afb9bSAndroid Build Coastguard Worker TAILQ_HEAD(httpcbq, evhttp_cb) callbacks; 142*663afb9bSAndroid Build Coastguard Worker 143*663afb9bSAndroid Build Coastguard Worker /* All live connections on this host. */ 144*663afb9bSAndroid Build Coastguard Worker struct evconq connections; 145*663afb9bSAndroid Build Coastguard Worker 146*663afb9bSAndroid Build Coastguard Worker TAILQ_HEAD(vhostsq, evhttp) virtualhosts; 147*663afb9bSAndroid Build Coastguard Worker 148*663afb9bSAndroid Build Coastguard Worker TAILQ_HEAD(aliasq, evhttp_server_alias) aliases; 149*663afb9bSAndroid Build Coastguard Worker 150*663afb9bSAndroid Build Coastguard Worker /* NULL if this server is not a vhost */ 151*663afb9bSAndroid Build Coastguard Worker char *vhost_pattern; 152*663afb9bSAndroid Build Coastguard Worker 153*663afb9bSAndroid Build Coastguard Worker struct timeval timeout; 154*663afb9bSAndroid Build Coastguard Worker 155*663afb9bSAndroid Build Coastguard Worker size_t default_max_headers_size; 156*663afb9bSAndroid Build Coastguard Worker ev_uint64_t default_max_body_size; 157*663afb9bSAndroid Build Coastguard Worker int flags; 158*663afb9bSAndroid Build Coastguard Worker const char *default_content_type; 159*663afb9bSAndroid Build Coastguard Worker 160*663afb9bSAndroid Build Coastguard Worker /* Bitmask of all HTTP methods that we accept and pass to user 161*663afb9bSAndroid Build Coastguard Worker * callbacks. */ 162*663afb9bSAndroid Build Coastguard Worker ev_uint16_t allowed_methods; 163*663afb9bSAndroid Build Coastguard Worker 164*663afb9bSAndroid Build Coastguard Worker /* Fallback callback if all the other callbacks for this connection 165*663afb9bSAndroid Build Coastguard Worker don't match. */ 166*663afb9bSAndroid Build Coastguard Worker void (*gencb)(struct evhttp_request *req, void *); 167*663afb9bSAndroid Build Coastguard Worker void *gencbarg; 168*663afb9bSAndroid Build Coastguard Worker struct bufferevent* (*bevcb)(struct event_base *, void *); 169*663afb9bSAndroid Build Coastguard Worker void *bevcbarg; 170*663afb9bSAndroid Build Coastguard Worker 171*663afb9bSAndroid Build Coastguard Worker struct event_base *base; 172*663afb9bSAndroid Build Coastguard Worker }; 173*663afb9bSAndroid Build Coastguard Worker 174*663afb9bSAndroid Build Coastguard Worker /* XXX most of these functions could be static. */ 175*663afb9bSAndroid Build Coastguard Worker 176*663afb9bSAndroid Build Coastguard Worker /* resets the connection; can be reused for more requests */ 177*663afb9bSAndroid Build Coastguard Worker void evhttp_connection_reset_(struct evhttp_connection *); 178*663afb9bSAndroid Build Coastguard Worker 179*663afb9bSAndroid Build Coastguard Worker /* connects if necessary */ 180*663afb9bSAndroid Build Coastguard Worker int evhttp_connection_connect_(struct evhttp_connection *); 181*663afb9bSAndroid Build Coastguard Worker 182*663afb9bSAndroid Build Coastguard Worker enum evhttp_request_error; 183*663afb9bSAndroid Build Coastguard Worker /* notifies the current request that it failed; resets connection */ 184*663afb9bSAndroid Build Coastguard Worker EVENT2_EXPORT_SYMBOL 185*663afb9bSAndroid Build Coastguard Worker void evhttp_connection_fail_(struct evhttp_connection *, 186*663afb9bSAndroid Build Coastguard Worker enum evhttp_request_error error); 187*663afb9bSAndroid Build Coastguard Worker 188*663afb9bSAndroid Build Coastguard Worker enum message_read_status; 189*663afb9bSAndroid Build Coastguard Worker 190*663afb9bSAndroid Build Coastguard Worker EVENT2_EXPORT_SYMBOL 191*663afb9bSAndroid Build Coastguard Worker enum message_read_status evhttp_parse_firstline_(struct evhttp_request *, struct evbuffer*); 192*663afb9bSAndroid Build Coastguard Worker EVENT2_EXPORT_SYMBOL 193*663afb9bSAndroid Build Coastguard Worker enum message_read_status evhttp_parse_headers_(struct evhttp_request *, struct evbuffer*); 194*663afb9bSAndroid Build Coastguard Worker 195*663afb9bSAndroid Build Coastguard Worker void evhttp_start_read_(struct evhttp_connection *); 196*663afb9bSAndroid Build Coastguard Worker void evhttp_start_write_(struct evhttp_connection *); 197*663afb9bSAndroid Build Coastguard Worker 198*663afb9bSAndroid Build Coastguard Worker /* response sending HTML the data in the buffer */ 199*663afb9bSAndroid Build Coastguard Worker void evhttp_response_code_(struct evhttp_request *, int, const char *); 200*663afb9bSAndroid Build Coastguard Worker void evhttp_send_page_(struct evhttp_request *, struct evbuffer *); 201*663afb9bSAndroid Build Coastguard Worker 202*663afb9bSAndroid Build Coastguard Worker EVENT2_EXPORT_SYMBOL 203*663afb9bSAndroid Build Coastguard Worker int evhttp_decode_uri_internal(const char *uri, size_t length, 204*663afb9bSAndroid Build Coastguard Worker char *ret, int decode_plus); 205*663afb9bSAndroid Build Coastguard Worker 206*663afb9bSAndroid Build Coastguard Worker #endif /* HTTP_INTERNAL_H_INCLUDED_ */ 207