blob: 58a89ffceb4c5debe699f6702b5adc693849bbd3 [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
5 Copyright (C) 2000-2006 Willy Tarreau - w@1wt.eu
6
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.
32 * See server.h for the other end.
33 */
34
35/* different possible states for the client side */
36#define CL_STHEADERS 0
37#define CL_STDATA 1
38#define CL_STSHUTR 2
39#define CL_STSHUTW 3
40#define CL_STCLOSE 4
41
42/*
43 * FIXME: break this into HTTP state and TCP socket state.
44 * See client.h for the other end.
45 */
46
47/* different possible states for the server side */
48#define SV_STIDLE 0
49#define SV_STCONN 1
50#define SV_STHEADERS 2
51#define SV_STDATA 3
52#define SV_STSHUTR 4
53#define SV_STSHUTW 5
54#define SV_STCLOSE 6
55
56
Willy Tarreau8d5d7f22007-01-21 19:16:41 +010057/* The HTTP parser is more complex than it looks like, because we have to
58 * support multi-line headers and any number of spaces between the colon and
59 * the value.
60 *
61 * All those examples must work :
62
63 Hdr1:val1\r\n
64 Hdr1: val1\r\n
65 Hdr1:\t val1\r\n
66 Hdr1: \r\n
67 val1\r\n
68 Hdr1:\r\n
69 val1\n
70 \tval2\r\n
71 val3\n
72
73 *
74 */
75
Willy Tarreau58f10d72006-12-04 02:26:12 +010076/* Possible states while parsing HTTP messages (request|response) */
Willy Tarreau8d5d7f22007-01-21 19:16:41 +010077#define HTTP_MSG_RQBEFORE 0 // request: leading LF, before start line
78#define HTTP_MSG_RQBEFORE_CR 1 // request: leading CRLF, before start line
79
80/* these ones define a request start line */
81#define HTTP_MSG_RQMETH 2 // parsing the Method
82#define HTTP_MSG_RQMETH_SP 3 // space(s) after the ethod
83#define HTTP_MSG_RQURI 4 // parsing the Request URI
84#define HTTP_MSG_RQURI_SP 5 // space(s) after the Request URI
85#define HTTP_MSG_RQVER 6 // parsing the Request Version
86#define HTTP_MSG_RQLINE_END 7 // end of request line (CR or LF)
87
88#define HTTP_MSG_RPBEFORE 8 // response: leading LF, before start line
89#define HTTP_MSG_RPBEFORE_CR 9 // response: leading CRLF, before start line
90
91/* these ones define a response start line */
92#define HTTP_MSG_RPVER 10 // parsing the Response Version
93#define HTTP_MSG_RPVER_SP 11 // space(s) after the Response Version
94#define HTTP_MSG_RPCODE 12 // response code
95#define HTTP_MSG_RPCODE_SP 13 // space(s) after the response code
96#define HTTP_MSG_RPREASON 14 // response reason
97#define HTTP_MSG_RPLINE_END 15 // end of response line (CR or LF)
98
99/* common header processing */
100
101#define HTTP_MSG_HDR_FIRST 16 // waiting for first header or last CRLF (no LWS possible)
102#define HTTP_MSG_HDR_NAME 17 // parsing header name
103#define HTTP_MSG_HDR_COL 18 // parsing header colon
104#define HTTP_MSG_HDR_L1_SP 19 // parsing header LWS (SP|HT) before value
105#define HTTP_MSG_HDR_L1_LF 20 // parsing header LWS (LF) before value
106#define HTTP_MSG_HDR_L1_LWS 21 // checking whether it's a new header or an LWS
107#define HTTP_MSG_HDR_VAL 22 // parsing header value
108#define HTTP_MSG_HDR_L2_LF 23 // parsing header LWS (LF) inside/after value
109#define HTTP_MSG_HDR_L2_LWS 24 // checking whether it's a new header or an LWS
110
111#define HTTP_MSG_LAST_LF 25 // parsing last LF
112#define HTTP_MSG_BODY 26 // parsing body at end of headers
113#define HTTP_MSG_ERROR 27 // an error occurred
114
Willy Tarreau58f10d72006-12-04 02:26:12 +0100115
Willy Tarreauc0dde7a2007-01-01 21:38:07 +0100116/* various data sources for the responses */
117#define DATA_SRC_NONE 0
118#define DATA_SRC_STATS 1
119
120/* data transmission states for the stats responses */
121enum {
122 DATA_ST_INIT = 0,
123 DATA_ST_HEAD,
124 DATA_ST_INFO,
125 DATA_ST_LIST,
126 DATA_ST_END,
127 DATA_ST_FIN,
128};
129
130/* data transmission states for the stats responses inside a proxy */
131enum {
132 DATA_ST_PX_INIT = 0,
133 DATA_ST_PX_TH,
134 DATA_ST_PX_FE,
135 DATA_ST_PX_SV,
136 DATA_ST_PX_BE,
137 DATA_ST_PX_END,
138 DATA_ST_PX_FIN,
139};
140
Willy Tarreau3bac9ff2007-03-18 17:31:28 +0100141/* Known HTTP methods */
142typedef enum {
143 HTTP_METH_NONE = 0,
144 HTTP_METH_OPTIONS,
145 HTTP_METH_GET,
146 HTTP_METH_HEAD,
147 HTTP_METH_POST,
148 HTTP_METH_PUT,
149 HTTP_METH_DELETE,
150 HTTP_METH_TRACE,
151 HTTP_METH_CONNECT,
152 HTTP_METH_OTHER,
153} http_meth_t;
154
155/* This is an HTTP message, as described in RFC2616. It can be either a request
156 * message or a response message.
157 *
158 * The values there are a little bit obscure, because their meaning can change
159 * during the parsing :
160 *
161 * - som (Start of Message) : relative offset in the buffer of first byte of
162 * the request being processed or parsed. Reset to
163 * zero during accept().
164 * - eoh (End of Headers) : relative offset in the buffer of first byte that
165 * is not part of a completely processed header.
166 * During parsing, it points to last header seen
167 * for states after START.
168 * - eol (End of Line) : relative offset in the buffer of the first byte
169 * which marks the end of the line (LF or CRLF).
170 */
171struct http_msg {
172 int msg_state; /* where we are in the current message parsing */
173 char *sol, *eol; /* start of line, end of line */
174 int som; /* Start Of Message, relative to buffer */
175 int col, sov; /* current header: colon, start of value */
176 int eoh; /* End Of Headers, relative to buffer */
177 char **cap; /* array of captured headers (may be NULL) */
178 union { /* useful start line pointers, relative to buffer */
179 struct {
180 int l; /* request line length (not including CR) */
181 int m_l; /* METHOD length (method starts at ->som) */
182 int u, u_l; /* URI, length */
183 int v, v_l; /* VERSION, length */
184 } rq; /* request line : field, length */
185 struct {
186 int l; /* status line length (not including CR) */
187 int v_l; /* VERSION length (version starts at ->som) */
188 int c, c_l; /* CODE, length */
189 int r, r_l; /* REASON, length */
190 } st; /* status line : field, length */
191 } sl; /* start line */
192};
193
194/* This is an HTTP transaction. It contains both a request message and a
195 * response message (which can be empty).
196 */
197struct http_txn {
198 http_meth_t meth; /* HTTP method */
199 struct hdr_idx hdr_idx; /* array of header indexes (max: MAX_HTTP_HDR) */
200 struct chunk auth_hdr; /* points to 'Authorization:' header */
201 struct http_msg req, rsp; /* HTTP request and response messages */
202
203 char *uri; /* first line if log needed, NULL otherwise */
204 char *cli_cookie; /* cookie presented by the client, in capture mode */
205 char *srv_cookie; /* cookie presented by the server, in capture mode */
206 int status; /* HTTP status from the server, negative if from proxy */
207};
208
Willy Tarreau58f10d72006-12-04 02:26:12 +0100209
Willy Tarreaubaaee002006-06-26 02:48:02 +0200210#endif /* _TYPES_PROTO_HTTP_H */
211
212/*
213 * Local variables:
214 * c-indent-level: 8
215 * c-basic-offset: 8
216 * End:
217 */