summaryrefslogtreecommitdiff
path: root/src/http/ngx_http_request.h
blob: 31b1187b0c6e1efa877ed129b92516ea299c8379 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374

/*
 * Copyright (C) Igor Sysoev
 */


#ifndef _NGX_HTTP_REQUEST_H_INCLUDED_
#define _NGX_HTTP_REQUEST_H_INCLUDED_


#define NGX_HTTP_DISCARD_BUFFER_SIZE       4096
#define NGX_HTTP_LINGERING_BUFFER_SIZE     4096


#define NGX_HTTP_VERSION_9                 9
#define NGX_HTTP_VERSION_10                1000
#define NGX_HTTP_VERSION_11                1001

#define NGX_HTTP_GET                       1
#define NGX_HTTP_HEAD                      2
#define NGX_HTTP_POST                      3

#define NGX_HTTP_CONNECTION_CLOSE          1
#define NGX_HTTP_CONNECTION_KEEP_ALIVE     2


#define NGX_NONE                           1


#define NGX_HTTP_PARSE_HEADER_DONE         1

#define NGX_HTTP_CLIENT_ERROR              10
#define NGX_HTTP_PARSE_INVALID_METHOD      10
#define NGX_HTTP_PARSE_INVALID_REQUEST     11
#define NGX_HTTP_PARSE_TOO_LONG_URI        12
#define NGX_HTTP_PARSE_INVALID_09_METHOD   13

#define NGX_HTTP_PARSE_HEADER_ERROR        14
#define NGX_HTTP_PARSE_INVALID_HEADER      14
#define NGX_HTTP_PARSE_TOO_LONG_HEADER     15
#define NGX_HTTP_PARSE_NO_HOST_HEADER      16
#define NGX_HTTP_PARSE_INVALID_CL_HEADER   17
#define NGX_HTTP_PARSE_POST_WO_CL_HEADER   18

#define NGX_HTTP_PARSE_INVALID_HOST        19
#define NGX_HTTP_PARSE_HTTP_TO_HTTPS       20


#define NGX_HTTP_OK                        200
#define NGX_HTTP_PARTIAL_CONTENT           206

#define NGX_HTTP_SPECIAL_RESPONSE          300
#define NGX_HTTP_MOVED_PERMANENTLY         301
#define NGX_HTTP_MOVED_TEMPORARILY         302
#define NGX_HTTP_NOT_MODIFIED              304

#define NGX_HTTP_BAD_REQUEST               400
#define NGX_HTTP_FORBIDDEN                 403
#define NGX_HTTP_NOT_FOUND                 404
#define NGX_HTTP_NOT_ALLOWED               405
#define NGX_HTTP_REQUEST_TIME_OUT          408
#define NGX_HTTP_REQUEST_ENTITY_TOO_LARGE  413
#define NGX_HTTP_REQUEST_URI_TOO_LARGE     414
#define NGX_HTTP_RANGE_NOT_SATISFIABLE     416


/* Our own HTTP codes */

#define NGX_HTTP_NGX_CODES                 NGX_HTTP_TO_HTTPS

/*
 * We use the special code for the plain HTTP requests that are sent to
 * HTTPS port to distinguish it from 4XX in an error page redirection 
 */
#define NGX_HTTP_TO_HTTPS                  497

/*
 * We use the special code for the requests with invalid host name
 * to distinguish it from 4XX in an error page redirection 
 */
#define NGX_HTTP_INVALID_HOST              498

/*
 * HTTP does not define the code for the case when a client closed
 * the connection while we are processing its request so we introduce
 * own code to log such situation when a client has closed the connection
 * before we even try to send the HTTP header to it
 */
#define NGX_HTTP_CLIENT_CLOSED_REQUEST     499


#define NGX_HTTP_INTERNAL_SERVER_ERROR     500
#define NGX_HTTP_NOT_IMPLEMENTED           501
#define NGX_HTTP_BAD_GATEWAY               502
#define NGX_HTTP_SERVICE_UNAVAILABLE       503
#define NGX_HTTP_GATEWAY_TIME_OUT          504


typedef enum {
    NGX_HTTP_RESTRICT_HOST_OFF = 0,
    NGX_HTTP_RESTRICT_HOST_ON,
    NGX_HTTP_RESTRICT_HOST_CLOSE
} ngx_http_restrict_host_e;


typedef enum {
    NGX_HTTP_INITING_REQUEST_STATE = 0,
    NGX_HTTP_READING_REQUEST_STATE,
    NGX_HTTP_PROCESS_REQUEST_STATE,

    NGX_HTTP_CONNECT_UPSTREAM_STATE,
    NGX_HTTP_WRITING_UPSTREAM_STATE,
    NGX_HTTP_READING_UPSTREAM_STATE,

    NGX_HTTP_WRITING_REQUEST_STATE,
    NGX_HTTP_LINGERING_CLOSE_STATE,
    NGX_HTTP_KEEPALIVE_STATE
} ngx_http_state_e;


typedef struct {
    ngx_str_t         name;
    ngx_uint_t        offset;
} ngx_http_header_t;


typedef struct {
    ngx_list_t        headers;

    ngx_table_elt_t  *host;
    ngx_table_elt_t  *connection;
    ngx_table_elt_t  *if_modified_since;
    ngx_table_elt_t  *user_agent;
    ngx_table_elt_t  *referer;
    ngx_table_elt_t  *content_length;

    ngx_table_elt_t  *range;

#if (NGX_HTTP_GZIP)
    ngx_table_elt_t  *accept_encoding;
    ngx_table_elt_t  *via;
#endif

    ngx_table_elt_t  *authorization;

    ngx_table_elt_t  *keep_alive;

#if (NGX_HTTP_PROXY)
    ngx_table_elt_t  *x_forwarded_for;
    ngx_table_elt_t  *x_real_ip;
    ngx_table_elt_t  *x_url;
#endif

    ngx_array_t       cookies;

    size_t            host_name_len;
    ssize_t           content_length_n;
    size_t            connection_type;
    ssize_t           keep_alive_n;

    unsigned          msie:1;
    unsigned          msie4:1;
    unsigned          opera:1;
    unsigned          gecko:1;
    unsigned          konqueror:1;
} ngx_http_headers_in_t;


typedef struct {
    off_t             start;
    off_t             end;
    ngx_str_t         content_range;
} ngx_http_range_t;


typedef struct {
    ngx_list_t        headers;

    ngx_uint_t        status;
    ngx_str_t         status_line;

    ngx_table_elt_t  *server;
    ngx_table_elt_t  *date;
    ngx_table_elt_t  *content_type;
    ngx_table_elt_t  *content_length;
    ngx_table_elt_t  *content_encoding;
    ngx_table_elt_t  *location;
    ngx_table_elt_t  *last_modified;
    ngx_table_elt_t  *content_range;
    ngx_table_elt_t  *accept_ranges;
    ngx_table_elt_t  *expires;
    ngx_table_elt_t  *cache_control;
    ngx_table_elt_t  *etag;

    ngx_str_t         charset;
    ngx_array_t       ranges;

    off_t             content_length_n;
    time_t            date_time;
    time_t            last_modified_time;
} ngx_http_headers_out_t;


typedef struct {
    ngx_temp_file_t   *temp_file;
    ngx_chain_t       *bufs;
    ngx_buf_t         *buf;
    size_t             rest;
    void             (*handler) (void *data); 
    void              *data;
} ngx_http_request_body_t;


struct ngx_http_cleanup_s {
    union {
        struct {
            ngx_fd_t                 fd;
            u_char                  *name;
        } file;

        struct {
            ngx_http_cache_hash_t   *hash;
            ngx_http_cache_t        *cache;
        } cache;
    } data;

    unsigned                         valid:1;
    unsigned                         cache:1;
};


typedef struct {
    ngx_http_request_t   *request;

    ngx_buf_t           **busy;
    ngx_int_t             nbusy;

    ngx_buf_t           **free;
    ngx_int_t             nfree;

    ngx_uint_t            pipeline;      /* unsigned  pipeline:1; */
} ngx_http_connection_t;


typedef ngx_int_t (*ngx_http_handler_pt)(ngx_http_request_t *r);

struct ngx_http_request_s {
    uint32_t                  signature;         /* "HTTP" */

    ngx_connection_t         *connection;

    void                    **ctx;
    void                    **main_conf;
    void                    **srv_conf;
    void                    **loc_conf;

    ngx_http_cache_t         *cache;

    ngx_file_t                file;

    ngx_pool_t               *pool;
    ngx_buf_t                *header_in;

    ngx_http_headers_in_t     headers_in;
    ngx_http_headers_out_t    headers_out;

    ngx_http_request_body_t  *request_body;

    time_t               lingering_time;

    ngx_uint_t           method;
    ngx_uint_t           http_version;
    ngx_uint_t           http_major;
    ngx_uint_t           http_minor;

    ngx_str_t            request_line;
    ngx_str_t            uri;
    ngx_str_t            args;
    ngx_str_t            exten;
    ngx_str_t            unparsed_uri;

    ngx_str_t            method_name;

    ngx_http_request_t  *main;

    uint32_t             in_addr;
    ngx_uint_t           port;
    ngx_str_t           *port_text;    /* ":80" */
    ngx_str_t            server_name;
    ngx_array_t         *virtual_names;

    ngx_uint_t           phase;
    ngx_int_t            phase_handler;
    ngx_http_handler_pt  content_handler;

    ngx_array_t          cleanup;

    /* used to learn the Apache compatible response length without a header */
    size_t               header_size;

    u_char              *discarded_buffer;
    void               **err_ctx;
    ngx_uint_t           err_status;

    ngx_http_connection_t  *http_connection;

    unsigned             http_state:4;

#if 0
    /* URI is not started with '/' - "GET http://" */
    unsigned             unusual_uri:1;
#endif
    /* URI with "/." and on Win32 with "//" */
    unsigned             complex_uri:1;
    /* URI with "%" */
    unsigned             quoted_uri:1;
    unsigned             header_timeout_set:1;

    unsigned             proxy:1;
    unsigned             bypass_cache:1;
    unsigned             no_cache:1;

#if 0
    unsigned             cachable:1;
#endif
    unsigned             pipeline:1;

    unsigned             plain_http:1;
    unsigned             chunked:1;
    unsigned             header_only:1;
    unsigned             keepalive:1;
    unsigned             lingering_close:1;
    unsigned             closed:1;

    unsigned             filter_need_in_memory:1;
    unsigned             filter_ssi_need_in_memory:1;
    unsigned             filter_need_temporary:1;
    unsigned             filter_allow_ranges:1;

#if (NGX_STAT_STUB)
    unsigned             stat_reading:1;
    unsigned             stat_writing:1;
#endif

    ngx_uint_t           headers_n;

    /* used to parse HTTP headers */
    ngx_uint_t           state;
    u_char              *uri_start;
    u_char              *uri_end;
    u_char              *uri_ext;
    u_char              *args_start;
    u_char              *request_start;
    u_char              *request_end;
    u_char              *method_end;
    u_char              *schema_start;
    u_char              *schema_end;
    u_char              *host_start;
    u_char              *host_end;
    u_char              *port_start;
    u_char              *port_end;
    u_char              *header_name_start;
    u_char              *header_name_end;
    u_char              *header_start;
    u_char              *header_end;
};


extern ngx_http_header_t ngx_http_headers_in[];
extern ngx_http_header_t ngx_http_headers_out[];



#endif /* _NGX_HTTP_REQUEST_H_INCLUDED_ */