1c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott/* 2c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * Copyright 2001 Niels Provos <provos@citi.umich.edu> 3c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * All rights reserved. 4c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * 5c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * This header file contains definitions for dealing with HTTP requests 6c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * that are internal to libevent. As user of the library, you should not 7c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * need to know about these. 8c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott */ 9c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 10c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifndef _HTTP_H_ 11c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define _HTTP_H_ 12c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 13c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define HTTP_CONNECT_TIMEOUT 45 14c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define HTTP_WRITE_TIMEOUT 50 15c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define HTTP_READ_TIMEOUT 50 16c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 17c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define HTTP_PREFIX "http://" 18c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define HTTP_DEFAULTPORT 80 19c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 20c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottenum message_read_status { 21c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ALL_DATA_READ = 1, 22c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott MORE_DATA_EXPECTED = 0, 23c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott DATA_CORRUPTED = -1, 24c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott REQUEST_CANCELED = -2 25c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}; 26c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 27c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottenum evhttp_connection_error { 28c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EVCON_HTTP_TIMEOUT, 29c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EVCON_HTTP_EOF, 30c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EVCON_HTTP_INVALID_HEADER 31c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}; 32c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 33c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottstruct evbuffer; 34c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottstruct addrinfo; 35c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottstruct evhttp_request; 36c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 37c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott/* A stupid connection object - maybe make this a bufferevent later */ 38c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 39c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottenum evhttp_connection_state { 40c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EVCON_DISCONNECTED, /**< not currently connected not trying either*/ 41c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EVCON_CONNECTING, /**< tries to currently connect */ 42c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EVCON_IDLE, /**< connection is established */ 43c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EVCON_READING_FIRSTLINE,/**< reading Request-Line (incoming conn) or 44c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott **< Status-Line (outgoing conn) */ 45c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EVCON_READING_HEADERS, /**< reading request/response headers */ 46c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EVCON_READING_BODY, /**< reading request/response body */ 47c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EVCON_READING_TRAILER, /**< reading request/response chunked trailer */ 48c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EVCON_WRITING /**< writing request/response headers/body */ 49c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}; 50c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 51c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottstruct event_base; 52c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 53c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottstruct evhttp_connection { 54c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott /* we use tailq only if they were created for an http server */ 55c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott TAILQ_ENTRY(evhttp_connection) (next); 56c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 57c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott int fd; 58c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott struct event ev; 59c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott struct event close_ev; 60c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott struct evbuffer *input_buffer; 61c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott struct evbuffer *output_buffer; 62c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 63c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott char *bind_address; /* address to use for binding the src */ 64c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott u_short bind_port; /* local port for binding the src */ 65c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 66c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott char *address; /* address to connect to */ 67c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott u_short port; 68c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 69c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott int flags; 70c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define EVHTTP_CON_INCOMING 0x0001 /* only one request on it ever */ 71c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define EVHTTP_CON_OUTGOING 0x0002 /* multiple requests possible */ 72c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define EVHTTP_CON_CLOSEDETECT 0x0004 /* detecting if persistent close */ 73c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 74c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott int timeout; /* timeout in seconds for events */ 75c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott int retry_cnt; /* retry count */ 76c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott int retry_max; /* maximum number of retries */ 77c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 78c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott enum evhttp_connection_state state; 79c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 80c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott /* for server connections, the http server they are connected with */ 81c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott struct evhttp *http_server; 82c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 83c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott TAILQ_HEAD(evcon_requestq, evhttp_request) requests; 84c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 85c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott void (*cb)(struct evhttp_connection *, void *); 86c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott void *cb_arg; 87c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 88c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott void (*closecb)(struct evhttp_connection *, void *); 89c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott void *closecb_arg; 90c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 91c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott struct event_base *base; 92c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}; 93c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 94c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottstruct evhttp_cb { 95c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott TAILQ_ENTRY(evhttp_cb) next; 96c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 97c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott char *what; 98c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 99c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott void (*cb)(struct evhttp_request *req, void *); 100c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott void *cbarg; 101c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}; 102c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 103c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott/* both the http server as well as the rpc system need to queue connections */ 104c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTAILQ_HEAD(evconq, evhttp_connection); 105c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 106c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott/* each bound socket is stored in one of these */ 107c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottstruct evhttp_bound_socket { 108c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott TAILQ_ENTRY(evhttp_bound_socket) (next); 109c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 110c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott struct event bind_ev; 111c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}; 112c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 113c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottstruct evhttp { 114c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott TAILQ_HEAD(boundq, evhttp_bound_socket) sockets; 115c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 116c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott TAILQ_HEAD(httpcbq, evhttp_cb) callbacks; 117c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott struct evconq connections; 118c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 119c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott int timeout; 120c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 121c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott void (*gencb)(struct evhttp_request *req, void *); 122c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott void *gencbarg; 123c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 124c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott struct event_base *base; 125c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}; 126c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 127c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott/* resets the connection; can be reused for more requests */ 128c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottvoid evhttp_connection_reset(struct evhttp_connection *); 129c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 130c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott/* connects if necessary */ 131c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottint evhttp_connection_connect(struct evhttp_connection *); 132c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 133c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott/* notifies the current request that it failed; resets connection */ 134c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottvoid evhttp_connection_fail(struct evhttp_connection *, 135c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott enum evhttp_connection_error error); 136c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 137c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottvoid evhttp_get_request(struct evhttp *, int, struct sockaddr *, socklen_t); 138c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 139c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottint evhttp_hostportfile(char *, char **, u_short *, char **); 140c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 141c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottint evhttp_parse_firstline(struct evhttp_request *, struct evbuffer*); 142c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottint evhttp_parse_headers(struct evhttp_request *, struct evbuffer*); 143c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 144c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottvoid evhttp_start_read(struct evhttp_connection *); 145c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottvoid evhttp_make_header(struct evhttp_connection *, struct evhttp_request *); 146c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 147c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottvoid evhttp_write_buffer(struct evhttp_connection *, 148c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott void (*)(struct evhttp_connection *, void *), void *); 149c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 150c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott/* response sending HTML the data in the buffer */ 151c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottvoid evhttp_response_code(struct evhttp_request *, int, const char *); 152c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottvoid evhttp_send_page(struct evhttp_request *, struct evbuffer *); 153c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 154c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif /* _HTTP_H */ 155