Annotation of embedaddon/libevent/evhttp.h, revision 1.1.1.1

1.1       misho       1: /*
                      2:  * Copyright (c) 2000-2004 Niels Provos <provos@citi.umich.edu>
                      3:  * All rights reserved.
                      4:  *
                      5:  * Redistribution and use in source and binary forms, with or without
                      6:  * modification, are permitted provided that the following conditions
                      7:  * are met:
                      8:  * 1. Redistributions of source code must retain the above copyright
                      9:  *    notice, this list of conditions and the following disclaimer.
                     10:  * 2. Redistributions in binary form must reproduce the above copyright
                     11:  *    notice, this list of conditions and the following disclaimer in the
                     12:  *    documentation and/or other materials provided with the distribution.
                     13:  * 3. The name of the author may not be used to endorse or promote products
                     14:  *    derived from this software without specific prior written permission.
                     15:  *
                     16:  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
                     17:  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
                     18:  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
                     19:  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
                     20:  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
                     21:  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
                     22:  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
                     23:  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
                     24:  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
                     25:  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
                     26:  */
                     27: #ifndef _EVHTTP_H_
                     28: #define _EVHTTP_H_
                     29: 
                     30: #include <event.h>
                     31: 
                     32: #ifdef __cplusplus
                     33: extern "C" {
                     34: #endif
                     35: 
                     36: #ifdef WIN32
                     37: #define WIN32_LEAN_AND_MEAN
                     38: #include <winsock2.h>
                     39: #include <windows.h>
                     40: #undef WIN32_LEAN_AND_MEAN
                     41: #endif
                     42: 
                     43: /** @file evhttp.h
                     44:  *
                     45:  * Basic support for HTTP serving.
                     46:  *
                     47:  * As libevent is a library for dealing with event notification and most
                     48:  * interesting applications are networked today, I have often found the
                     49:  * need to write HTTP code.  The following prototypes and definitions provide
                     50:  * an application with a minimal interface for making HTTP requests and for
                     51:  * creating a very simple HTTP server.
                     52:  */
                     53: 
                     54: /* Response codes */
                     55: #define HTTP_OK                        200
                     56: #define HTTP_NOCONTENT         204
                     57: #define HTTP_MOVEPERM          301
                     58: #define HTTP_MOVETEMP          302
                     59: #define HTTP_NOTMODIFIED       304
                     60: #define HTTP_BADREQUEST                400
                     61: #define HTTP_NOTFOUND          404
                     62: #define HTTP_SERVUNAVAIL       503
                     63: 
                     64: struct evhttp;
                     65: struct evhttp_request;
                     66: struct evkeyvalq;
                     67: 
                     68: /** Create a new HTTP server
                     69:  *
                     70:  * @param base (optional) the event base to receive the HTTP events
                     71:  * @return a pointer to a newly initialized evhttp server structure
                     72:  */
                     73: struct evhttp *evhttp_new(struct event_base *base);
                     74: 
                     75: /**
                     76:  * Binds an HTTP server on the specified address and port.
                     77:  *
                     78:  * Can be called multiple times to bind the same http server
                     79:  * to multiple different ports.
                     80:  *
                     81:  * @param http a pointer to an evhttp object
                     82:  * @param address a string containing the IP address to listen(2) on
                     83:  * @param port the port number to listen on
                     84:  * @return a newly allocated evhttp struct
                     85:  * @see evhttp_free()
                     86:  */
                     87: int evhttp_bind_socket(struct evhttp *http, const char *address, u_short port);
                     88: 
                     89: /**
                     90:  * Makes an HTTP server accept connections on the specified socket
                     91:  *
                     92:  * This may be useful to create a socket and then fork multiple instances
                     93:  * of an http server, or when a socket has been communicated via file
                     94:  * descriptor passing in situations where an http servers does not have
                     95:  * permissions to bind to a low-numbered port.
                     96:  *
                     97:  * Can be called multiple times to have the http server listen to
                     98:  * multiple different sockets.
                     99:  *
                    100:  * @param http a pointer to an evhttp object
                    101:  * @param fd a socket fd that is ready for accepting connections
                    102:  * @return 0 on success, -1 on failure.
                    103:  * @see evhttp_free(), evhttp_bind_socket()
                    104:  */
                    105: int evhttp_accept_socket(struct evhttp *http, int fd);
                    106: 
                    107: /**
                    108:  * Free the previously created HTTP server.
                    109:  *
                    110:  * Works only if no requests are currently being served.
                    111:  *
                    112:  * @param http the evhttp server object to be freed
                    113:  * @see evhttp_start()
                    114:  */
                    115: void evhttp_free(struct evhttp* http);
                    116: 
                    117: /** Set a callback for a specified URI */
                    118: void evhttp_set_cb(struct evhttp *, const char *,
                    119:     void (*)(struct evhttp_request *, void *), void *);
                    120: 
                    121: /** Removes the callback for a specified URI */
                    122: int evhttp_del_cb(struct evhttp *, const char *);
                    123: 
                    124: /** Set a callback for all requests that are not caught by specific callbacks
                    125:  */
                    126: void evhttp_set_gencb(struct evhttp *,
                    127:     void (*)(struct evhttp_request *, void *), void *);
                    128: 
                    129: /**
                    130:  * Set the timeout for an HTTP request.
                    131:  *
                    132:  * @param http an evhttp object
                    133:  * @param timeout_in_secs the timeout, in seconds
                    134:  */
                    135: void evhttp_set_timeout(struct evhttp *, int timeout_in_secs);
                    136: 
                    137: /* Request/Response functionality */
                    138: 
                    139: /**
                    140:  * Send an HTML error message to the client.
                    141:  *
                    142:  * @param req a request object
                    143:  * @param error the HTTP error code
                    144:  * @param reason a brief explanation of the error
                    145:  */
                    146: void evhttp_send_error(struct evhttp_request *req, int error,
                    147:     const char *reason);
                    148: 
                    149: /**
                    150:  * Send an HTML reply to the client.
                    151:  *
                    152:  * @param req a request object
                    153:  * @param code the HTTP response code to send
                    154:  * @param reason a brief message to send with the response code
                    155:  * @param databuf the body of the response
                    156:  */
                    157: void evhttp_send_reply(struct evhttp_request *req, int code,
                    158:     const char *reason, struct evbuffer *databuf);
                    159: 
                    160: /* Low-level response interface, for streaming/chunked replies */
                    161: void evhttp_send_reply_start(struct evhttp_request *, int, const char *);
                    162: void evhttp_send_reply_chunk(struct evhttp_request *, struct evbuffer *);
                    163: void evhttp_send_reply_end(struct evhttp_request *);
                    164: 
                    165: /**
                    166:  * Start an HTTP server on the specified address and port
                    167:  *
                    168:  * DEPRECATED: it does not allow an event base to be specified
                    169:  *
                    170:  * @param address the address to which the HTTP server should be bound
                    171:  * @param port the port number on which the HTTP server should listen
                    172:  * @return an struct evhttp object
                    173:  */
                    174: struct evhttp *evhttp_start(const char *address, u_short port);
                    175: 
                    176: /*
                    177:  * Interfaces for making requests
                    178:  */
                    179: enum evhttp_cmd_type { EVHTTP_REQ_GET, EVHTTP_REQ_POST, EVHTTP_REQ_HEAD };
                    180: 
                    181: enum evhttp_request_kind { EVHTTP_REQUEST, EVHTTP_RESPONSE };
                    182: 
                    183: /**
                    184:  * the request structure that a server receives.
                    185:  * WARNING: expect this structure to change.  I will try to provide
                    186:  * reasonable accessors.
                    187:  */
                    188: struct evhttp_request {
                    189: #if defined(TAILQ_ENTRY)
                    190:        TAILQ_ENTRY(evhttp_request) next;
                    191: #else
                    192: struct {
                    193:        struct evhttp_request *tqe_next;
                    194:        struct evhttp_request **tqe_prev;
                    195: }       next;
                    196: #endif
                    197: 
                    198:        /* the connection object that this request belongs to */
                    199:        struct evhttp_connection *evcon;
                    200:        int flags;
                    201: #define EVHTTP_REQ_OWN_CONNECTION      0x0001
                    202: #define EVHTTP_PROXY_REQUEST           0x0002
                    203: 
                    204:        struct evkeyvalq *input_headers;
                    205:        struct evkeyvalq *output_headers;
                    206: 
                    207:        /* address of the remote host and the port connection came from */
                    208:        char *remote_host;
                    209:        u_short remote_port;
                    210: 
                    211:        enum evhttp_request_kind kind;
                    212:        enum evhttp_cmd_type type;
                    213: 
                    214:        char *uri;                      /* uri after HTTP request was parsed */
                    215: 
                    216:        char major;                     /* HTTP Major number */
                    217:        char minor;                     /* HTTP Minor number */
                    218: 
                    219:        int response_code;              /* HTTP Response code */
                    220:        char *response_code_line;       /* Readable response */
                    221: 
                    222:        struct evbuffer *input_buffer;  /* read data */
                    223:        ev_int64_t ntoread;
                    224:        int chunked:1,                  /* a chunked request */
                    225:            userdone:1;                 /* the user has sent all data */
                    226: 
                    227:        struct evbuffer *output_buffer; /* outgoing post or data */
                    228: 
                    229:        /* Callback */
                    230:        void (*cb)(struct evhttp_request *, void *);
                    231:        void *cb_arg;
                    232: 
                    233:        /*
                    234:         * Chunked data callback - call for each completed chunk if
                    235:         * specified.  If not specified, all the data is delivered via
                    236:         * the regular callback.
                    237:         */
                    238:        void (*chunk_cb)(struct evhttp_request *, void *);
                    239: };
                    240: 
                    241: /**
                    242:  * Creates a new request object that needs to be filled in with the request
                    243:  * parameters.  The callback is executed when the request completed or an
                    244:  * error occurred.
                    245:  */
                    246: struct evhttp_request *evhttp_request_new(
                    247:        void (*cb)(struct evhttp_request *, void *), void *arg);
                    248: 
                    249: /** enable delivery of chunks to requestor */
                    250: void evhttp_request_set_chunked_cb(struct evhttp_request *,
                    251:     void (*cb)(struct evhttp_request *, void *));
                    252: 
                    253: /** Frees the request object and removes associated events. */
                    254: void evhttp_request_free(struct evhttp_request *req);
                    255: 
                    256: /** Returns the connection object associated with the request or NULL */
                    257: struct evhttp_connection *evhttp_request_get_connection(struct evhttp_request *req);
                    258: 
                    259: /**
                    260:  * A connection object that can be used to for making HTTP requests.  The
                    261:  * connection object tries to establish the connection when it is given an
                    262:  * http request object.
                    263:  */
                    264: struct evhttp_connection *evhttp_connection_new(
                    265:        const char *address, unsigned short port);
                    266: 
                    267: /** Frees an http connection */
                    268: void evhttp_connection_free(struct evhttp_connection *evcon);
                    269: 
                    270: /** sets the ip address from which http connections are made */
                    271: void evhttp_connection_set_local_address(struct evhttp_connection *evcon,
                    272:     const char *address);
                    273: 
                    274: /** sets the local port from which http connections are made */
                    275: void evhttp_connection_set_local_port(struct evhttp_connection *evcon,
                    276:     unsigned short port);
                    277: 
                    278: /** Sets the timeout for events related to this connection */
                    279: void evhttp_connection_set_timeout(struct evhttp_connection *evcon,
                    280:     int timeout_in_secs);
                    281: 
                    282: /** Sets the retry limit for this connection - -1 repeats indefnitely */
                    283: void evhttp_connection_set_retries(struct evhttp_connection *evcon,
                    284:     int retry_max);
                    285: 
                    286: /** Set a callback for connection close. */
                    287: void evhttp_connection_set_closecb(struct evhttp_connection *evcon,
                    288:     void (*)(struct evhttp_connection *, void *), void *);
                    289: 
                    290: /**
                    291:  * Associates an event base with the connection - can only be called
                    292:  * on a freshly created connection object that has not been used yet.
                    293:  */
                    294: void evhttp_connection_set_base(struct evhttp_connection *evcon,
                    295:     struct event_base *base);
                    296: 
                    297: /** Get the remote address and port associated with this connection. */
                    298: void evhttp_connection_get_peer(struct evhttp_connection *evcon,
                    299:     char **address, u_short *port);
                    300: 
                    301: /** The connection gets ownership of the request */
                    302: int evhttp_make_request(struct evhttp_connection *evcon,
                    303:     struct evhttp_request *req,
                    304:     enum evhttp_cmd_type type, const char *uri);
                    305: 
                    306: const char *evhttp_request_uri(struct evhttp_request *req);
                    307: 
                    308: /* Interfaces for dealing with HTTP headers */
                    309: 
                    310: const char *evhttp_find_header(const struct evkeyvalq *, const char *);
                    311: int evhttp_remove_header(struct evkeyvalq *, const char *);
                    312: int evhttp_add_header(struct evkeyvalq *, const char *, const char *);
                    313: void evhttp_clear_headers(struct evkeyvalq *);
                    314: 
                    315: /* Miscellaneous utility functions */
                    316: 
                    317: 
                    318: /**
                    319:   Helper function to encode a URI.
                    320: 
                    321:   The returned string must be freed by the caller.
                    322: 
                    323:   @param uri an unencoded URI
                    324:   @return a newly allocated URI-encoded string
                    325:  */
                    326: char *evhttp_encode_uri(const char *uri);
                    327: 
                    328: 
                    329: /**
                    330:   Helper function to decode a URI.
                    331: 
                    332:   The returned string must be freed by the caller.
                    333: 
                    334:   @param uri an encoded URI
                    335:   @return a newly allocated unencoded URI
                    336:  */
                    337: char *evhttp_decode_uri(const char *uri);
                    338: 
                    339: 
                    340: /**
                    341:  * Helper function to parse out arguments in a query.
                    342:  *
                    343:  * Parsing a uri like
                    344:  *
                    345:  *    http://foo.com/?q=test&s=some+thing
                    346:  *
                    347:  * will result in two entries in the key value queue.
                    348: 
                    349:  * The first entry is: key="q", value="test"
                    350:  * The second entry is: key="s", value="some thing"
                    351:  *
                    352:  * @param uri the request URI
                    353:  * @param headers the head of the evkeyval queue
                    354:  */
                    355: void evhttp_parse_query(const char *uri, struct evkeyvalq *headers);
                    356: 
                    357: 
                    358: /**
                    359:  * Escape HTML character entities in a string.
                    360:  *
                    361:  * Replaces <, >, ", ' and & with &lt;, &gt;, &quot;,
                    362:  * &#039; and &amp; correspondingly.
                    363:  *
                    364:  * The returned string needs to be freed by the caller.
                    365:  *
                    366:  * @param html an unescaped HTML string
                    367:  * @return an escaped HTML string
                    368:  */
                    369: char *evhttp_htmlescape(const char *html);
                    370: 
                    371: #ifdef __cplusplus
                    372: }
                    373: #endif
                    374: 
                    375: #endif /* _EVHTTP_H_ */

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>