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