evhttp.h

Go to the documentation of this file.
00001 /*
00002  * Copyright (c) 2000-2004 Niels Provos <provos@citi.umich.edu>
00003  * All rights reserved.
00004  *
00005  * Redistribution and use in source and binary forms, with or without
00006  * modification, are permitted provided that the following conditions
00007  * are met:
00008  * 1. Redistributions of source code must retain the above copyright
00009  *    notice, this list of conditions and the following disclaimer.
00010  * 2. Redistributions in binary form must reproduce the above copyright
00011  *    notice, this list of conditions and the following disclaimer in the
00012  *    documentation and/or other materials provided with the distribution.
00013  * 3. The name of the author may not be used to endorse or promote products
00014  *    derived from this software without specific prior written permission.
00015  *
00016  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
00017  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
00018  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
00019  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
00020  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
00021  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
00022  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
00023  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
00024  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
00025  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
00026  */
00027 #ifndef _EVHTTP_H_
00028 #define _EVHTTP_H_
00029 
00030 #include <event.h>
00031 
00032 #ifdef __cplusplus
00033 extern "C" {
00034 #endif
00035 
00036 #ifdef WIN32
00037 #define WIN32_LEAN_AND_MEAN
00038 #include <winsock2.h>
00039 #include <windows.h>
00040 #undef WIN32_LEAN_AND_MEAN
00041 #endif
00042 
00054 /* Response codes */
00055 #define HTTP_OK                 200
00056 #define HTTP_NOCONTENT          204
00057 #define HTTP_MOVEPERM           301
00058 #define HTTP_MOVETEMP           302
00059 #define HTTP_NOTMODIFIED        304
00060 #define HTTP_BADREQUEST         400
00061 #define HTTP_NOTFOUND           404
00062 #define HTTP_SERVUNAVAIL        503
00063 
00064 struct evhttp;
00065 struct evhttp_request;
00066 struct evkeyvalq;
00067 
00073 struct evhttp *evhttp_new(struct event_base *base);
00074 
00087 int evhttp_bind_socket(struct evhttp *http, const char *address, u_short port);
00088 
00105 int evhttp_accept_socket(struct evhttp *http, int fd);
00106 
00115 void evhttp_free(struct evhttp* http);
00116 
00118 void evhttp_set_cb(struct evhttp *, const char *,
00119     void (*)(struct evhttp_request *, void *), void *);
00120 
00122 int evhttp_del_cb(struct evhttp *, const char *);
00123 
00126 void evhttp_set_gencb(struct evhttp *,
00127     void (*)(struct evhttp_request *, void *), void *);
00128 
00135 void evhttp_set_timeout(struct evhttp *, int timeout_in_secs);
00136 
00137 /* Request/Response functionality */
00138 
00146 void evhttp_send_error(struct evhttp_request *req, int error,
00147     const char *reason);
00148 
00157 void evhttp_send_reply(struct evhttp_request *req, int code,
00158     const char *reason, struct evbuffer *databuf);
00159 
00160 /* Low-level response interface, for streaming/chunked replies */
00161 void evhttp_send_reply_start(struct evhttp_request *, int, const char *);
00162 void evhttp_send_reply_chunk(struct evhttp_request *, struct evbuffer *);
00163 void evhttp_send_reply_end(struct evhttp_request *);
00164 
00174 struct evhttp *evhttp_start(const char *address, u_short port);
00175 
00176 /*
00177  * Interfaces for making requests
00178  */
00179 enum evhttp_cmd_type { EVHTTP_REQ_GET, EVHTTP_REQ_POST, EVHTTP_REQ_HEAD };
00180 
00181 enum evhttp_request_kind { EVHTTP_REQUEST, EVHTTP_RESPONSE };
00182 
00188 struct evhttp_request {
00189 #if defined(TAILQ_ENTRY)
00190         TAILQ_ENTRY(evhttp_request) next;
00191 #else
00192 struct {
00193         struct evhttp_request *tqe_next;
00194         struct evhttp_request **tqe_prev;
00195 }       next;
00196 #endif
00197 
00198         /* the connection object that this request belongs to */
00199         struct evhttp_connection *evcon;
00200         int flags;
00201 #define EVHTTP_REQ_OWN_CONNECTION       0x0001
00202 #define EVHTTP_PROXY_REQUEST            0x0002
00203 
00204         struct evkeyvalq *input_headers;
00205         struct evkeyvalq *output_headers;
00206 
00207         /* address of the remote host and the port connection came from */
00208         char *remote_host;
00209         u_short remote_port;
00210 
00211         enum evhttp_request_kind kind;
00212         enum evhttp_cmd_type type;
00213 
00214         char *uri;                      /* uri after HTTP request was parsed */
00215 
00216         char major;                     /* HTTP Major number */
00217         char minor;                     /* HTTP Minor number */
00218 
00219         int response_code;              /* HTTP Response code */
00220         char *response_code_line;       /* Readable response */
00221 
00222         struct evbuffer *input_buffer;  /* read data */
00223         ev_int64_t ntoread;
00224         int chunked:1,                  /* a chunked request */
00225             userdone:1;                 /* the user has sent all data */
00226 
00227         struct evbuffer *output_buffer; /* outgoing post or data */
00228 
00229         /* Callback */
00230         void (*cb)(struct evhttp_request *, void *);
00231         void *cb_arg;
00232 
00233         /*
00234          * Chunked data callback - call for each completed chunk if
00235          * specified.  If not specified, all the data is delivered via
00236          * the regular callback.
00237          */
00238         void (*chunk_cb)(struct evhttp_request *, void *);
00239 };
00240 
00246 struct evhttp_request *evhttp_request_new(
00247         void (*cb)(struct evhttp_request *, void *), void *arg);
00248 
00250 void evhttp_request_set_chunked_cb(struct evhttp_request *,
00251     void (*cb)(struct evhttp_request *, void *));
00252 
00254 void evhttp_request_free(struct evhttp_request *req);
00255 
00257 struct evhttp_connection *evhttp_request_get_connection(struct evhttp_request *req);
00258 
00264 struct evhttp_connection *evhttp_connection_new(
00265         const char *address, unsigned short port);
00266 
00268 void evhttp_connection_free(struct evhttp_connection *evcon);
00269 
00271 void evhttp_connection_set_local_address(struct evhttp_connection *evcon,
00272     const char *address);
00273 
00275 void evhttp_connection_set_local_port(struct evhttp_connection *evcon,
00276     unsigned short port);
00277 
00279 void evhttp_connection_set_timeout(struct evhttp_connection *evcon,
00280     int timeout_in_secs);
00281 
00283 void evhttp_connection_set_retries(struct evhttp_connection *evcon,
00284     int retry_max);
00285 
00287 void evhttp_connection_set_closecb(struct evhttp_connection *evcon,
00288     void (*)(struct evhttp_connection *, void *), void *);
00289 
00294 void evhttp_connection_set_base(struct evhttp_connection *evcon,
00295     struct event_base *base);
00296 
00298 void evhttp_connection_get_peer(struct evhttp_connection *evcon,
00299     char **address, u_short *port);
00300 
00302 int evhttp_make_request(struct evhttp_connection *evcon,
00303     struct evhttp_request *req,
00304     enum evhttp_cmd_type type, const char *uri);
00305 
00306 const char *evhttp_request_uri(struct evhttp_request *req);
00307 
00308 /* Interfaces for dealing with HTTP headers */
00309 
00310 const char *evhttp_find_header(const struct evkeyvalq *, const char *);
00311 int evhttp_remove_header(struct evkeyvalq *, const char *);
00312 int evhttp_add_header(struct evkeyvalq *, const char *, const char *);
00313 void evhttp_clear_headers(struct evkeyvalq *);
00314 
00315 /* Miscellaneous utility functions */
00316 
00317 
00326 char *evhttp_encode_uri(const char *uri);
00327 
00328 
00337 char *evhttp_decode_uri(const char *uri);
00338 
00339 
00355 void evhttp_parse_query(const char *uri, struct evkeyvalq *headers);
00356 
00357 
00369 char *evhttp_htmlescape(const char *html);
00370 
00371 #ifdef __cplusplus
00372 }
00373 #endif
00374 
00375 #endif /* _EVHTTP_H_ */

Generated on Wed Aug 25 13:03:28 2010 for libevent by  doxygen 1.5.1