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