1*663afb9bSAndroid Build Coastguard Worker /* 2*663afb9bSAndroid Build Coastguard Worker * Copyright (c) 2000-2007 Niels Provos <[email protected]> 3*663afb9bSAndroid Build Coastguard Worker * Copyright (c) 2007-2012 Niels Provos and Nick Mathewson 4*663afb9bSAndroid Build Coastguard Worker * 5*663afb9bSAndroid Build Coastguard Worker * Redistribution and use in source and binary forms, with or without 6*663afb9bSAndroid Build Coastguard Worker * modification, are permitted provided that the following conditions 7*663afb9bSAndroid Build Coastguard Worker * are met: 8*663afb9bSAndroid Build Coastguard Worker * 1. Redistributions of source code must retain the above copyright 9*663afb9bSAndroid Build Coastguard Worker * notice, this list of conditions and the following disclaimer. 10*663afb9bSAndroid Build Coastguard Worker * 2. Redistributions in binary form must reproduce the above copyright 11*663afb9bSAndroid Build Coastguard Worker * notice, this list of conditions and the following disclaimer in the 12*663afb9bSAndroid Build Coastguard Worker * documentation and/or other materials provided with the distribution. 13*663afb9bSAndroid Build Coastguard Worker * 3. The name of the author may not be used to endorse or promote products 14*663afb9bSAndroid Build Coastguard Worker * derived from this software without specific prior written permission. 15*663afb9bSAndroid Build Coastguard Worker * 16*663afb9bSAndroid Build Coastguard Worker * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 17*663afb9bSAndroid Build Coastguard Worker * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 18*663afb9bSAndroid Build Coastguard Worker * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 19*663afb9bSAndroid Build Coastguard Worker * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 20*663afb9bSAndroid Build Coastguard Worker * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 21*663afb9bSAndroid Build Coastguard Worker * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 22*663afb9bSAndroid Build Coastguard Worker * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 23*663afb9bSAndroid Build Coastguard Worker * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 24*663afb9bSAndroid Build Coastguard Worker * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 25*663afb9bSAndroid Build Coastguard Worker * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 26*663afb9bSAndroid Build Coastguard Worker */ 27*663afb9bSAndroid Build Coastguard Worker #ifndef EVENT2_HTTP_STRUCT_H_INCLUDED_ 28*663afb9bSAndroid Build Coastguard Worker #define EVENT2_HTTP_STRUCT_H_INCLUDED_ 29*663afb9bSAndroid Build Coastguard Worker 30*663afb9bSAndroid Build Coastguard Worker /** @file event2/http_struct.h 31*663afb9bSAndroid Build Coastguard Worker 32*663afb9bSAndroid Build Coastguard Worker Data structures for http. Using these structures may hurt forward 33*663afb9bSAndroid Build Coastguard Worker compatibility with later versions of Libevent: be careful! 34*663afb9bSAndroid Build Coastguard Worker 35*663afb9bSAndroid Build Coastguard Worker */ 36*663afb9bSAndroid Build Coastguard Worker 37*663afb9bSAndroid Build Coastguard Worker #ifdef __cplusplus 38*663afb9bSAndroid Build Coastguard Worker extern "C" { 39*663afb9bSAndroid Build Coastguard Worker #endif 40*663afb9bSAndroid Build Coastguard Worker 41*663afb9bSAndroid Build Coastguard Worker #include <event2/event-config.h> 42*663afb9bSAndroid Build Coastguard Worker #ifdef EVENT__HAVE_SYS_TYPES_H 43*663afb9bSAndroid Build Coastguard Worker #include <sys/types.h> 44*663afb9bSAndroid Build Coastguard Worker #endif 45*663afb9bSAndroid Build Coastguard Worker #ifdef EVENT__HAVE_SYS_TIME_H 46*663afb9bSAndroid Build Coastguard Worker #include <sys/time.h> 47*663afb9bSAndroid Build Coastguard Worker #endif 48*663afb9bSAndroid Build Coastguard Worker 49*663afb9bSAndroid Build Coastguard Worker /* For int types. */ 50*663afb9bSAndroid Build Coastguard Worker #include <event2/util.h> 51*663afb9bSAndroid Build Coastguard Worker 52*663afb9bSAndroid Build Coastguard Worker /** 53*663afb9bSAndroid Build Coastguard Worker * the request structure that a server receives. 54*663afb9bSAndroid Build Coastguard Worker * WARNING: expect this structure to change. I will try to provide 55*663afb9bSAndroid Build Coastguard Worker * reasonable accessors. 56*663afb9bSAndroid Build Coastguard Worker */ 57*663afb9bSAndroid Build Coastguard Worker struct evhttp_request { 58*663afb9bSAndroid Build Coastguard Worker #if defined(TAILQ_ENTRY) 59*663afb9bSAndroid Build Coastguard Worker TAILQ_ENTRY(evhttp_request) next; 60*663afb9bSAndroid Build Coastguard Worker #else 61*663afb9bSAndroid Build Coastguard Worker struct { 62*663afb9bSAndroid Build Coastguard Worker struct evhttp_request *tqe_next; 63*663afb9bSAndroid Build Coastguard Worker struct evhttp_request **tqe_prev; 64*663afb9bSAndroid Build Coastguard Worker } next; 65*663afb9bSAndroid Build Coastguard Worker #endif 66*663afb9bSAndroid Build Coastguard Worker 67*663afb9bSAndroid Build Coastguard Worker /* the connection object that this request belongs to */ 68*663afb9bSAndroid Build Coastguard Worker struct evhttp_connection *evcon; 69*663afb9bSAndroid Build Coastguard Worker int flags; 70*663afb9bSAndroid Build Coastguard Worker /** The request obj owns the evhttp connection and needs to free it */ 71*663afb9bSAndroid Build Coastguard Worker #define EVHTTP_REQ_OWN_CONNECTION 0x0001 72*663afb9bSAndroid Build Coastguard Worker /** Request was made via a proxy */ 73*663afb9bSAndroid Build Coastguard Worker #define EVHTTP_PROXY_REQUEST 0x0002 74*663afb9bSAndroid Build Coastguard Worker /** The request object is owned by the user; the user must free it */ 75*663afb9bSAndroid Build Coastguard Worker #define EVHTTP_USER_OWNED 0x0004 76*663afb9bSAndroid Build Coastguard Worker /** The request will be used again upstack; freeing must be deferred */ 77*663afb9bSAndroid Build Coastguard Worker #define EVHTTP_REQ_DEFER_FREE 0x0008 78*663afb9bSAndroid Build Coastguard Worker /** The request should be freed upstack */ 79*663afb9bSAndroid Build Coastguard Worker #define EVHTTP_REQ_NEEDS_FREE 0x0010 80*663afb9bSAndroid Build Coastguard Worker 81*663afb9bSAndroid Build Coastguard Worker struct evkeyvalq *input_headers; 82*663afb9bSAndroid Build Coastguard Worker struct evkeyvalq *output_headers; 83*663afb9bSAndroid Build Coastguard Worker 84*663afb9bSAndroid Build Coastguard Worker /* address of the remote host and the port connection came from */ 85*663afb9bSAndroid Build Coastguard Worker char *remote_host; 86*663afb9bSAndroid Build Coastguard Worker ev_uint16_t remote_port; 87*663afb9bSAndroid Build Coastguard Worker 88*663afb9bSAndroid Build Coastguard Worker /* cache of the hostname for evhttp_request_get_host */ 89*663afb9bSAndroid Build Coastguard Worker char *host_cache; 90*663afb9bSAndroid Build Coastguard Worker 91*663afb9bSAndroid Build Coastguard Worker enum evhttp_request_kind kind; 92*663afb9bSAndroid Build Coastguard Worker enum evhttp_cmd_type type; 93*663afb9bSAndroid Build Coastguard Worker 94*663afb9bSAndroid Build Coastguard Worker size_t headers_size; 95*663afb9bSAndroid Build Coastguard Worker size_t body_size; 96*663afb9bSAndroid Build Coastguard Worker 97*663afb9bSAndroid Build Coastguard Worker char *uri; /* uri after HTTP request was parsed */ 98*663afb9bSAndroid Build Coastguard Worker struct evhttp_uri *uri_elems; /* uri elements */ 99*663afb9bSAndroid Build Coastguard Worker 100*663afb9bSAndroid Build Coastguard Worker char major; /* HTTP Major number */ 101*663afb9bSAndroid Build Coastguard Worker char minor; /* HTTP Minor number */ 102*663afb9bSAndroid Build Coastguard Worker 103*663afb9bSAndroid Build Coastguard Worker int response_code; /* HTTP Response code */ 104*663afb9bSAndroid Build Coastguard Worker char *response_code_line; /* Readable response */ 105*663afb9bSAndroid Build Coastguard Worker 106*663afb9bSAndroid Build Coastguard Worker struct evbuffer *input_buffer; /* read data */ 107*663afb9bSAndroid Build Coastguard Worker ev_int64_t ntoread; 108*663afb9bSAndroid Build Coastguard Worker unsigned chunked:1, /* a chunked request */ 109*663afb9bSAndroid Build Coastguard Worker userdone:1; /* the user has sent all data */ 110*663afb9bSAndroid Build Coastguard Worker 111*663afb9bSAndroid Build Coastguard Worker struct evbuffer *output_buffer; /* outgoing post or data */ 112*663afb9bSAndroid Build Coastguard Worker 113*663afb9bSAndroid Build Coastguard Worker /* Callback */ 114*663afb9bSAndroid Build Coastguard Worker void (*cb)(struct evhttp_request *, void *); 115*663afb9bSAndroid Build Coastguard Worker void *cb_arg; 116*663afb9bSAndroid Build Coastguard Worker 117*663afb9bSAndroid Build Coastguard Worker /* 118*663afb9bSAndroid Build Coastguard Worker * Chunked data callback - call for each completed chunk if 119*663afb9bSAndroid Build Coastguard Worker * specified. If not specified, all the data is delivered via 120*663afb9bSAndroid Build Coastguard Worker * the regular callback. 121*663afb9bSAndroid Build Coastguard Worker */ 122*663afb9bSAndroid Build Coastguard Worker void (*chunk_cb)(struct evhttp_request *, void *); 123*663afb9bSAndroid Build Coastguard Worker 124*663afb9bSAndroid Build Coastguard Worker /* 125*663afb9bSAndroid Build Coastguard Worker * Callback added for forked-daapd so they can collect ICY 126*663afb9bSAndroid Build Coastguard Worker * (shoutcast) metadata from the http header. If return 127*663afb9bSAndroid Build Coastguard Worker * int is negative the connection will be closed. 128*663afb9bSAndroid Build Coastguard Worker */ 129*663afb9bSAndroid Build Coastguard Worker int (*header_cb)(struct evhttp_request *, void *); 130*663afb9bSAndroid Build Coastguard Worker 131*663afb9bSAndroid Build Coastguard Worker /* 132*663afb9bSAndroid Build Coastguard Worker * Error callback - called when error is occured. 133*663afb9bSAndroid Build Coastguard Worker * @see evhttp_request_error for error types. 134*663afb9bSAndroid Build Coastguard Worker * 135*663afb9bSAndroid Build Coastguard Worker * @see evhttp_request_set_error_cb() 136*663afb9bSAndroid Build Coastguard Worker */ 137*663afb9bSAndroid Build Coastguard Worker void (*error_cb)(enum evhttp_request_error, void *); 138*663afb9bSAndroid Build Coastguard Worker 139*663afb9bSAndroid Build Coastguard Worker /* 140*663afb9bSAndroid Build Coastguard Worker * Send complete callback - called when the request is actually 141*663afb9bSAndroid Build Coastguard Worker * sent and completed. 142*663afb9bSAndroid Build Coastguard Worker */ 143*663afb9bSAndroid Build Coastguard Worker void (*on_complete_cb)(struct evhttp_request *, void *); 144*663afb9bSAndroid Build Coastguard Worker void *on_complete_cb_arg; 145*663afb9bSAndroid Build Coastguard Worker }; 146*663afb9bSAndroid Build Coastguard Worker 147*663afb9bSAndroid Build Coastguard Worker #ifdef __cplusplus 148*663afb9bSAndroid Build Coastguard Worker } 149*663afb9bSAndroid Build Coastguard Worker #endif 150*663afb9bSAndroid Build Coastguard Worker 151*663afb9bSAndroid Build Coastguard Worker #endif /* EVENT2_HTTP_STRUCT_H_INCLUDED_ */ 152*663afb9bSAndroid Build Coastguard Worker 153