blob: a9acfdd7b5d585f093f0fa9ece43611bf1ee7fc2 [file] [log] [blame]
Willy Tarreaubaaee002006-06-26 02:48:02 +02001/*
2 include/types/proto_http.h
3 This file contains HTTP protocol definitions.
4
Willy Tarreau0c303ee2008-07-07 00:09:58 +02005 Copyright (C) 2000-2008 Willy Tarreau - w@1wt.eu
Willy Tarreaubaaee002006-06-26 02:48:02 +02006
7 This library is free software; you can redistribute it and/or
8 modify it under the terms of the GNU Lesser General Public
9 License as published by the Free Software Foundation, version 2.1
10 exclusively.
11
12 This library is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 Lesser General Public License for more details.
16
17 You should have received a copy of the GNU Lesser General Public
18 License along with this library; if not, write to the Free Software
19 Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20*/
21
22#ifndef _TYPES_PROTO_HTTP_H
23#define _TYPES_PROTO_HTTP_H
24
Willy Tarreaue3ba5f02006-06-29 18:54:54 +020025#include <common/config.h>
Willy Tarreaubaaee002006-06-26 02:48:02 +020026
Willy Tarreau3bac9ff2007-03-18 17:31:28 +010027#include <types/buffers.h>
28#include <types/hdr_idx.h>
29
Willy Tarreaubaaee002006-06-26 02:48:02 +020030/*
31 * FIXME: break this into HTTP state and TCP socket state.
Willy Tarreaubaaee002006-06-26 02:48:02 +020032 */
33
Willy Tarreaub6866442008-07-14 23:54:42 +020034/* different possible states for the client side */
Willy Tarreau67f0eea2008-08-10 22:55:22 +020035#define CL_STDATA 0
36#define CL_STSHUTR 1
37#define CL_STSHUTW 2
38#define CL_STCLOSE 3
Willy Tarreaub6866442008-07-14 23:54:42 +020039
Willy Tarreaubaaee002006-06-26 02:48:02 +020040/* different possible states for the server side */
41#define SV_STIDLE 0
Willy Tarreauadfb8562008-08-11 15:24:42 +020042#define SV_STCONN 1
Willy Tarreauf5483bf2008-08-14 18:35:40 +020043#define SV_STDATA 2
44#define SV_STSHUTR 3
45#define SV_STSHUTW 4
46#define SV_STCLOSE 5
Willy Tarreaubaaee002006-06-26 02:48:02 +020047
Willy Tarreau3d300592007-03-18 18:34:41 +010048/*
49 * Transaction flags moved from session
50 */
51
52
53/* action flags */
54#define TX_CLDENY 0x00000001 /* a client header matches a deny regex */
55#define TX_CLALLOW 0x00000002 /* a client header matches an allow regex */
56#define TX_SVDENY 0x00000004 /* a server header matches a deny regex */
57#define TX_SVALLOW 0x00000008 /* a server header matches an allow regex */
58#define TX_CLTARPIT 0x00000010 /* the session is tarpitted (anti-dos) */
59/* unused: 0x00000020 */
60
61/* transaction flags dedicated to cookies : bits values 0x40, 0x80 (0-3 shift 6) */
62#define TX_CK_NONE 0x00000000 /* this session had no cookie */
63#define TX_CK_INVALID 0x00000040 /* this session had a cookie which matches no server */
64#define TX_CK_DOWN 0x00000080 /* this session had cookie matching a down server */
65#define TX_CK_VALID 0x000000C0 /* this session had cookie matching a valid server */
66#define TX_CK_MASK 0x000000C0 /* mask to get this session's cookie flags */
67#define TX_CK_SHIFT 6 /* bit shift */
68
69/* cookie information, bits values 0x100 to 0x800 (0-8 shift 8) */
70#define TX_SCK_NONE 0x00000000 /* no set-cookie seen for the server cookie */
71#define TX_SCK_DELETED 0x00000100 /* existing set-cookie deleted or changed */
72#define TX_SCK_INSERTED 0x00000200 /* new set-cookie inserted or changed existing one */
73#define TX_SCK_SEEN 0x00000400 /* set-cookie seen for the server cookie */
74#define TX_SCK_MASK 0x00000700 /* mask to get the set-cookie field */
75#define TX_SCK_ANY 0x00000800 /* at least one set-cookie seen (not to be counted) */
76#define TX_SCK_SHIFT 8 /* bit shift */
77
78/* cacheability management, bits values 0x1000 to 0x3000 (0-3 shift 12) */
79#define TX_CACHEABLE 0x00001000 /* at least part of the response is cacheable */
80#define TX_CACHE_COOK 0x00002000 /* a cookie in the response is cacheable */
81#define TX_CACHE_SHIFT 12 /* bit shift */
82
Willy Tarreaubaaee002006-06-26 02:48:02 +020083
Willy Tarreau8d5d7f22007-01-21 19:16:41 +010084/* The HTTP parser is more complex than it looks like, because we have to
85 * support multi-line headers and any number of spaces between the colon and
86 * the value.
87 *
88 * All those examples must work :
89
90 Hdr1:val1\r\n
91 Hdr1: val1\r\n
92 Hdr1:\t val1\r\n
93 Hdr1: \r\n
94 val1\r\n
95 Hdr1:\r\n
96 val1\n
97 \tval2\r\n
98 val3\n
99
100 *
101 */
102
Willy Tarreau58f10d72006-12-04 02:26:12 +0100103/* Possible states while parsing HTTP messages (request|response) */
Willy Tarreau8d5d7f22007-01-21 19:16:41 +0100104#define HTTP_MSG_RQBEFORE 0 // request: leading LF, before start line
105#define HTTP_MSG_RQBEFORE_CR 1 // request: leading CRLF, before start line
106
107/* these ones define a request start line */
108#define HTTP_MSG_RQMETH 2 // parsing the Method
109#define HTTP_MSG_RQMETH_SP 3 // space(s) after the ethod
110#define HTTP_MSG_RQURI 4 // parsing the Request URI
111#define HTTP_MSG_RQURI_SP 5 // space(s) after the Request URI
112#define HTTP_MSG_RQVER 6 // parsing the Request Version
113#define HTTP_MSG_RQLINE_END 7 // end of request line (CR or LF)
114
115#define HTTP_MSG_RPBEFORE 8 // response: leading LF, before start line
116#define HTTP_MSG_RPBEFORE_CR 9 // response: leading CRLF, before start line
117
118/* these ones define a response start line */
119#define HTTP_MSG_RPVER 10 // parsing the Response Version
120#define HTTP_MSG_RPVER_SP 11 // space(s) after the Response Version
121#define HTTP_MSG_RPCODE 12 // response code
122#define HTTP_MSG_RPCODE_SP 13 // space(s) after the response code
123#define HTTP_MSG_RPREASON 14 // response reason
124#define HTTP_MSG_RPLINE_END 15 // end of response line (CR or LF)
125
126/* common header processing */
127
128#define HTTP_MSG_HDR_FIRST 16 // waiting for first header or last CRLF (no LWS possible)
129#define HTTP_MSG_HDR_NAME 17 // parsing header name
130#define HTTP_MSG_HDR_COL 18 // parsing header colon
131#define HTTP_MSG_HDR_L1_SP 19 // parsing header LWS (SP|HT) before value
132#define HTTP_MSG_HDR_L1_LF 20 // parsing header LWS (LF) before value
133#define HTTP_MSG_HDR_L1_LWS 21 // checking whether it's a new header or an LWS
134#define HTTP_MSG_HDR_VAL 22 // parsing header value
135#define HTTP_MSG_HDR_L2_LF 23 // parsing header LWS (LF) inside/after value
136#define HTTP_MSG_HDR_L2_LWS 24 // checking whether it's a new header or an LWS
137
138#define HTTP_MSG_LAST_LF 25 // parsing last LF
139#define HTTP_MSG_BODY 26 // parsing body at end of headers
140#define HTTP_MSG_ERROR 27 // an error occurred
141
Willy Tarreau58f10d72006-12-04 02:26:12 +0100142
Willy Tarreauc0dde7a2007-01-01 21:38:07 +0100143/* various data sources for the responses */
144#define DATA_SRC_NONE 0
145#define DATA_SRC_STATS 1
146
147/* data transmission states for the stats responses */
148enum {
149 DATA_ST_INIT = 0,
150 DATA_ST_HEAD,
151 DATA_ST_INFO,
152 DATA_ST_LIST,
153 DATA_ST_END,
154 DATA_ST_FIN,
155};
156
157/* data transmission states for the stats responses inside a proxy */
158enum {
159 DATA_ST_PX_INIT = 0,
160 DATA_ST_PX_TH,
161 DATA_ST_PX_FE,
Krzysztof Piotr Oledzkiaeebf9b2009-10-04 15:43:17 +0200162 DATA_ST_PX_LI,
Willy Tarreauc0dde7a2007-01-01 21:38:07 +0100163 DATA_ST_PX_SV,
164 DATA_ST_PX_BE,
165 DATA_ST_PX_END,
166 DATA_ST_PX_FIN,
167};
168
Willy Tarreau79da4692008-11-19 20:03:04 +0100169/* Redirect flags */
170enum {
171 REDIRECT_FLAG_NONE = 0,
172 REDIRECT_FLAG_DROP_QS = 1, /* drop query string */
173};
Willy Tarreaub463dfb2008-06-07 23:08:56 +0200174
175/* Redirect types (location, prefix, extended ) */
176enum {
177 REDIRECT_TYPE_NONE = 0, /* no redirection */
178 REDIRECT_TYPE_LOCATION, /* location redirect */
179 REDIRECT_TYPE_PREFIX, /* prefix redirect */
180};
181
Willy Tarreau3bac9ff2007-03-18 17:31:28 +0100182/* Known HTTP methods */
183typedef enum {
184 HTTP_METH_NONE = 0,
185 HTTP_METH_OPTIONS,
186 HTTP_METH_GET,
187 HTTP_METH_HEAD,
188 HTTP_METH_POST,
189 HTTP_METH_PUT,
190 HTTP_METH_DELETE,
191 HTTP_METH_TRACE,
192 HTTP_METH_CONNECT,
193 HTTP_METH_OTHER,
194} http_meth_t;
195
196/* This is an HTTP message, as described in RFC2616. It can be either a request
197 * message or a response message.
198 *
199 * The values there are a little bit obscure, because their meaning can change
200 * during the parsing :
201 *
202 * - som (Start of Message) : relative offset in the buffer of first byte of
203 * the request being processed or parsed. Reset to
204 * zero during accept().
205 * - eoh (End of Headers) : relative offset in the buffer of first byte that
206 * is not part of a completely processed header.
207 * During parsing, it points to last header seen
208 * for states after START.
209 * - eol (End of Line) : relative offset in the buffer of the first byte
210 * which marks the end of the line (LF or CRLF).
211 */
212struct http_msg {
matt.farnsworth@nokia.com1c2ab962008-04-14 20:47:37 +0200213 unsigned int msg_state; /* where we are in the current message parsing */
214 char *sol; /* start of line, also start of message when fully parsed */
215 char *eol; /* end of line */
216 unsigned int som; /* Start Of Message, relative to buffer */
217 unsigned int col, sov; /* current header: colon, start of value */
218 unsigned int eoh; /* End Of Headers, relative to buffer */
219 char **cap; /* array of captured headers (may be NULL) */
220 union { /* useful start line pointers, relative to buffer */
Willy Tarreau3bac9ff2007-03-18 17:31:28 +0100221 struct {
matt.farnsworth@nokia.com1c2ab962008-04-14 20:47:37 +0200222 int l; /* request line length (not including CR) */
223 int m_l; /* METHOD length (method starts at ->som) */
224 int u, u_l; /* URI, length */
225 int v, v_l; /* VERSION, length */
226 } rq; /* request line : field, length */
Willy Tarreau3bac9ff2007-03-18 17:31:28 +0100227 struct {
matt.farnsworth@nokia.com1c2ab962008-04-14 20:47:37 +0200228 int l; /* status line length (not including CR) */
229 int v_l; /* VERSION length (version starts at ->som) */
230 int c, c_l; /* CODE, length */
231 int r, r_l; /* REASON, length */
232 } st; /* status line : field, length */
233 } sl; /* start line */
234 unsigned long long hdr_content_len; /* cache for parsed header value */
Willy Tarreau32a4ec02009-04-02 11:35:18 +0200235 int err_pos; /* err handling: -2=block, -1=pass, 0+=detected */
Willy Tarreau3bac9ff2007-03-18 17:31:28 +0100236};
237
238/* This is an HTTP transaction. It contains both a request message and a
239 * response message (which can be empty).
240 */
241struct http_txn {
242 http_meth_t meth; /* HTTP method */
243 struct hdr_idx hdr_idx; /* array of header indexes (max: MAX_HTTP_HDR) */
244 struct chunk auth_hdr; /* points to 'Authorization:' header */
245 struct http_msg req, rsp; /* HTTP request and response messages */
246
247 char *uri; /* first line if log needed, NULL otherwise */
248 char *cli_cookie; /* cookie presented by the client, in capture mode */
249 char *srv_cookie; /* cookie presented by the server, in capture mode */
250 int status; /* HTTP status from the server, negative if from proxy */
Willy Tarreau3d300592007-03-18 18:34:41 +0100251 unsigned int flags; /* transaction flags */
Willy Tarreau3bac9ff2007-03-18 17:31:28 +0100252};
253
Willy Tarreau33a7e692007-06-10 19:45:56 +0200254/* This structure is used by http_find_header() to return values of headers.
255 * The header starts at <line>, the value at <line>+<val> for <vlen> bytes.
256 */
257struct hdr_ctx {
258 const char *line;
259 int idx;
260 int val; /* relative to line */
261 int vlen; /* relative to line+val */
262};
Willy Tarreau58f10d72006-12-04 02:26:12 +0100263
Willy Tarreaubaaee002006-06-26 02:48:02 +0200264#endif /* _TYPES_PROTO_HTTP_H */
265
266/*
267 * Local variables:
268 * c-indent-level: 8
269 * c-basic-offset: 8
270 * End:
271 */