File:  [ELWIX - Embedded LightWeight unIX -] / embedaddon / libevent / evhttp.h
Revision 1.1.1.1 (vendor branch): download - view: text, annotated - select for diffs - revision graph
Tue Feb 21 23:02:54 2012 UTC (12 years, 3 months ago) by misho
Branches: libevent, MAIN
CVS tags: v1_4_14bp0, v1_4_14b, HEAD
libevent

    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>