annotate src/http/ngx_http_parse.c @ 8548:9ffef6054abf quic

HTTP/3: fixed handling request body eof. While for HTTP/1 unexpected eof always means an error, for HTTP/3 an eof right after a DATA frame end means the end of the request body. For this reason, since adding HTTP/3 support, eof no longer produced an error right after recv() but was passed to filters which would make a decision. This decision was made in ngx_http_parse_chunked() and ngx_http_v3_parse_request_body() based on the b->last_buf flag. Now that since 0f7f1a509113 (1.19.2) rb->chunked->length is a lower threshold for the expected number of bytes, it can be set to zero to indicate that more bytes may or may not follow. Now it's possible to move the check for eof from parser functions to ngx_http_request_body_chunked_filter() and clean up the parsing code. Also, in the default branch, in case of eof, the following three things happened, which were replaced with returning NGX_ERROR while implementing HTTP/3: - "client prematurely closed connection" message was logged - c->error flag was set - NGX_HTTP_BAD_REQUEST was returned The change brings back this behavior for HTTP/1 as well as HTTP/3.
author Roman Arutyunyan <arut@nginx.com>
date Wed, 16 Sep 2020 18:59:25 +0100
parents e334ca1b23ba
children 9dce2978e4fd
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
441
da8c5707af39 nginx-0.1.0-2004-09-28-12:34:51 import; set copyright and remove unused files
Igor Sysoev <igor@sysoev.ru>
parents: 432
diff changeset
1
da8c5707af39 nginx-0.1.0-2004-09-28-12:34:51 import; set copyright and remove unused files
Igor Sysoev <igor@sysoev.ru>
parents: 432
diff changeset
2 /*
444
42d11f017717 nginx-0.1.0-2004-09-29-20:00:49 import; remove years from copyright
Igor Sysoev <igor@sysoev.ru>
parents: 441
diff changeset
3 * Copyright (C) Igor Sysoev
4412
d620f497c50f Copyright updated.
Maxim Konovalov <maxim@nginx.com>
parents: 4313
diff changeset
4 * Copyright (C) Nginx, Inc.
441
da8c5707af39 nginx-0.1.0-2004-09-28-12:34:51 import; set copyright and remove unused files
Igor Sysoev <igor@sysoev.ru>
parents: 432
diff changeset
5 */
da8c5707af39 nginx-0.1.0-2004-09-28-12:34:51 import; set copyright and remove unused files
Igor Sysoev <igor@sysoev.ru>
parents: 432
diff changeset
6
1
d220029ac7f3 nginx-0.0.1-2002-08-15-21:20:26 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
7
d220029ac7f3 nginx-0.0.1-2002-08-15-21:20:26 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
8 #include <ngx_config.h>
7
b5481d6fbbd4 nginx-0.0.1-2002-08-29-20:59:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 1
diff changeset
9 #include <ngx_core.h>
1
d220029ac7f3 nginx-0.0.1-2002-08-15-21:20:26 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
10 #include <ngx_http.h>
d220029ac7f3 nginx-0.0.1-2002-08-15-21:20:26 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
11
417
0526206251f6 nginx-0.0.10-2004-09-07-19:29:22 import
Igor Sysoev <igor@sysoev.ru>
parents: 343
diff changeset
12
831
82742d66547a style fix
Igor Sysoev <igor@sysoev.ru>
parents: 830
diff changeset
13 static uint32_t usual[] = {
827
0444286b860a style fix
Igor Sysoev <igor@sysoev.ru>
parents: 826
diff changeset
14 0xffffdbfe, /* 1111 1111 1111 1111 1101 1011 1111 1110 */
823
ccf3c59f8040 optimize the most frequent cases
Igor Sysoev <igor@sysoev.ru>
parents: 822
diff changeset
15
827
0444286b860a style fix
Igor Sysoev <igor@sysoev.ru>
parents: 826
diff changeset
16 /* ?>=< ;:98 7654 3210 /.-, +*)( '&%$ #"! */
0444286b860a style fix
Igor Sysoev <igor@sysoev.ru>
parents: 826
diff changeset
17 0x7fff37d6, /* 0111 1111 1111 1111 0011 0111 1101 0110 */
0444286b860a style fix
Igor Sysoev <igor@sysoev.ru>
parents: 826
diff changeset
18
0444286b860a style fix
Igor Sysoev <igor@sysoev.ru>
parents: 826
diff changeset
19 /* _^]\ [ZYX WVUT SRQP ONML KJIH GFED CBA@ */
830
51b08975dfa3 treat '\' as special character in win32 only
Igor Sysoev <igor@sysoev.ru>
parents: 827
diff changeset
20 #if (NGX_WIN32)
827
0444286b860a style fix
Igor Sysoev <igor@sysoev.ru>
parents: 826
diff changeset
21 0xefffffff, /* 1110 1111 1111 1111 1111 1111 1111 1111 */
830
51b08975dfa3 treat '\' as special character in win32 only
Igor Sysoev <igor@sysoev.ru>
parents: 827
diff changeset
22 #else
51b08975dfa3 treat '\' as special character in win32 only
Igor Sysoev <igor@sysoev.ru>
parents: 827
diff changeset
23 0xffffffff, /* 1111 1111 1111 1111 1111 1111 1111 1111 */
51b08975dfa3 treat '\' as special character in win32 only
Igor Sysoev <igor@sysoev.ru>
parents: 827
diff changeset
24 #endif
823
ccf3c59f8040 optimize the most frequent cases
Igor Sysoev <igor@sysoev.ru>
parents: 822
diff changeset
25
827
0444286b860a style fix
Igor Sysoev <igor@sysoev.ru>
parents: 826
diff changeset
26 /* ~}| {zyx wvut srqp onml kjih gfed cba` */
0444286b860a style fix
Igor Sysoev <igor@sysoev.ru>
parents: 826
diff changeset
27 0xffffffff, /* 1111 1111 1111 1111 1111 1111 1111 1111 */
823
ccf3c59f8040 optimize the most frequent cases
Igor Sysoev <igor@sysoev.ru>
parents: 822
diff changeset
28
827
0444286b860a style fix
Igor Sysoev <igor@sysoev.ru>
parents: 826
diff changeset
29 0xffffffff, /* 1111 1111 1111 1111 1111 1111 1111 1111 */
0444286b860a style fix
Igor Sysoev <igor@sysoev.ru>
parents: 826
diff changeset
30 0xffffffff, /* 1111 1111 1111 1111 1111 1111 1111 1111 */
0444286b860a style fix
Igor Sysoev <igor@sysoev.ru>
parents: 826
diff changeset
31 0xffffffff, /* 1111 1111 1111 1111 1111 1111 1111 1111 */
0444286b860a style fix
Igor Sysoev <igor@sysoev.ru>
parents: 826
diff changeset
32 0xffffffff /* 1111 1111 1111 1111 1111 1111 1111 1111 */
0444286b860a style fix
Igor Sysoev <igor@sysoev.ru>
parents: 826
diff changeset
33 };
823
ccf3c59f8040 optimize the most frequent cases
Igor Sysoev <igor@sysoev.ru>
parents: 822
diff changeset
34
ccf3c59f8040 optimize the most frequent cases
Igor Sysoev <igor@sysoev.ru>
parents: 822
diff changeset
35
1196
67077918b965 optimize HTTP method parsing for i386 and amd64
Igor Sysoev <igor@sysoev.ru>
parents: 1151
diff changeset
36 #if (NGX_HAVE_LITTLE_ENDIAN && NGX_HAVE_NONALIGNED)
67077918b965 optimize HTTP method parsing for i386 and amd64
Igor Sysoev <igor@sysoev.ru>
parents: 1151
diff changeset
37
67077918b965 optimize HTTP method parsing for i386 and amd64
Igor Sysoev <igor@sysoev.ru>
parents: 1151
diff changeset
38 #define ngx_str3_cmp(m, c0, c1, c2, c3) \
67077918b965 optimize HTTP method parsing for i386 and amd64
Igor Sysoev <igor@sysoev.ru>
parents: 1151
diff changeset
39 *(uint32_t *) m == ((c3 << 24) | (c2 << 16) | (c1 << 8) | c0)
67077918b965 optimize HTTP method parsing for i386 and amd64
Igor Sysoev <igor@sysoev.ru>
parents: 1151
diff changeset
40
67077918b965 optimize HTTP method parsing for i386 and amd64
Igor Sysoev <igor@sysoev.ru>
parents: 1151
diff changeset
41 #define ngx_str3Ocmp(m, c0, c1, c2, c3) \
67077918b965 optimize HTTP method parsing for i386 and amd64
Igor Sysoev <igor@sysoev.ru>
parents: 1151
diff changeset
42 *(uint32_t *) m == ((c3 << 24) | (c2 << 16) | (c1 << 8) | c0)
67077918b965 optimize HTTP method parsing for i386 and amd64
Igor Sysoev <igor@sysoev.ru>
parents: 1151
diff changeset
43
67077918b965 optimize HTTP method parsing for i386 and amd64
Igor Sysoev <igor@sysoev.ru>
parents: 1151
diff changeset
44 #define ngx_str4cmp(m, c0, c1, c2, c3) \
67077918b965 optimize HTTP method parsing for i386 and amd64
Igor Sysoev <igor@sysoev.ru>
parents: 1151
diff changeset
45 *(uint32_t *) m == ((c3 << 24) | (c2 << 16) | (c1 << 8) | c0)
67077918b965 optimize HTTP method parsing for i386 and amd64
Igor Sysoev <igor@sysoev.ru>
parents: 1151
diff changeset
46
67077918b965 optimize HTTP method parsing for i386 and amd64
Igor Sysoev <igor@sysoev.ru>
parents: 1151
diff changeset
47 #define ngx_str5cmp(m, c0, c1, c2, c3, c4) \
67077918b965 optimize HTTP method parsing for i386 and amd64
Igor Sysoev <igor@sysoev.ru>
parents: 1151
diff changeset
48 *(uint32_t *) m == ((c3 << 24) | (c2 << 16) | (c1 << 8) | c0) \
67077918b965 optimize HTTP method parsing for i386 and amd64
Igor Sysoev <igor@sysoev.ru>
parents: 1151
diff changeset
49 && m[4] == c4
67077918b965 optimize HTTP method parsing for i386 and amd64
Igor Sysoev <igor@sysoev.ru>
parents: 1151
diff changeset
50
67077918b965 optimize HTTP method parsing for i386 and amd64
Igor Sysoev <igor@sysoev.ru>
parents: 1151
diff changeset
51 #define ngx_str6cmp(m, c0, c1, c2, c3, c4, c5) \
67077918b965 optimize HTTP method parsing for i386 and amd64
Igor Sysoev <igor@sysoev.ru>
parents: 1151
diff changeset
52 *(uint32_t *) m == ((c3 << 24) | (c2 << 16) | (c1 << 8) | c0) \
67077918b965 optimize HTTP method parsing for i386 and amd64
Igor Sysoev <igor@sysoev.ru>
parents: 1151
diff changeset
53 && (((uint32_t *) m)[1] & 0xffff) == ((c5 << 8) | c4)
67077918b965 optimize HTTP method parsing for i386 and amd64
Igor Sysoev <igor@sysoev.ru>
parents: 1151
diff changeset
54
67077918b965 optimize HTTP method parsing for i386 and amd64
Igor Sysoev <igor@sysoev.ru>
parents: 1151
diff changeset
55 #define ngx_str7_cmp(m, c0, c1, c2, c3, c4, c5, c6, c7) \
67077918b965 optimize HTTP method parsing for i386 and amd64
Igor Sysoev <igor@sysoev.ru>
parents: 1151
diff changeset
56 *(uint32_t *) m == ((c3 << 24) | (c2 << 16) | (c1 << 8) | c0) \
67077918b965 optimize HTTP method parsing for i386 and amd64
Igor Sysoev <igor@sysoev.ru>
parents: 1151
diff changeset
57 && ((uint32_t *) m)[1] == ((c7 << 24) | (c6 << 16) | (c5 << 8) | c4)
67077918b965 optimize HTTP method parsing for i386 and amd64
Igor Sysoev <igor@sysoev.ru>
parents: 1151
diff changeset
58
67077918b965 optimize HTTP method parsing for i386 and amd64
Igor Sysoev <igor@sysoev.ru>
parents: 1151
diff changeset
59 #define ngx_str8cmp(m, c0, c1, c2, c3, c4, c5, c6, c7) \
67077918b965 optimize HTTP method parsing for i386 and amd64
Igor Sysoev <igor@sysoev.ru>
parents: 1151
diff changeset
60 *(uint32_t *) m == ((c3 << 24) | (c2 << 16) | (c1 << 8) | c0) \
67077918b965 optimize HTTP method parsing for i386 and amd64
Igor Sysoev <igor@sysoev.ru>
parents: 1151
diff changeset
61 && ((uint32_t *) m)[1] == ((c7 << 24) | (c6 << 16) | (c5 << 8) | c4)
67077918b965 optimize HTTP method parsing for i386 and amd64
Igor Sysoev <igor@sysoev.ru>
parents: 1151
diff changeset
62
67077918b965 optimize HTTP method parsing for i386 and amd64
Igor Sysoev <igor@sysoev.ru>
parents: 1151
diff changeset
63 #define ngx_str9cmp(m, c0, c1, c2, c3, c4, c5, c6, c7, c8) \
67077918b965 optimize HTTP method parsing for i386 and amd64
Igor Sysoev <igor@sysoev.ru>
parents: 1151
diff changeset
64 *(uint32_t *) m == ((c3 << 24) | (c2 << 16) | (c1 << 8) | c0) \
67077918b965 optimize HTTP method parsing for i386 and amd64
Igor Sysoev <igor@sysoev.ru>
parents: 1151
diff changeset
65 && ((uint32_t *) m)[1] == ((c7 << 24) | (c6 << 16) | (c5 << 8) | c4) \
67077918b965 optimize HTTP method parsing for i386 and amd64
Igor Sysoev <igor@sysoev.ru>
parents: 1151
diff changeset
66 && m[8] == c8
67077918b965 optimize HTTP method parsing for i386 and amd64
Igor Sysoev <igor@sysoev.ru>
parents: 1151
diff changeset
67
67077918b965 optimize HTTP method parsing for i386 and amd64
Igor Sysoev <igor@sysoev.ru>
parents: 1151
diff changeset
68 #else /* !(NGX_HAVE_LITTLE_ENDIAN && NGX_HAVE_NONALIGNED) */
67077918b965 optimize HTTP method parsing for i386 and amd64
Igor Sysoev <igor@sysoev.ru>
parents: 1151
diff changeset
69
67077918b965 optimize HTTP method parsing for i386 and amd64
Igor Sysoev <igor@sysoev.ru>
parents: 1151
diff changeset
70 #define ngx_str3_cmp(m, c0, c1, c2, c3) \
67077918b965 optimize HTTP method parsing for i386 and amd64
Igor Sysoev <igor@sysoev.ru>
parents: 1151
diff changeset
71 m[0] == c0 && m[1] == c1 && m[2] == c2
67077918b965 optimize HTTP method parsing for i386 and amd64
Igor Sysoev <igor@sysoev.ru>
parents: 1151
diff changeset
72
67077918b965 optimize HTTP method parsing for i386 and amd64
Igor Sysoev <igor@sysoev.ru>
parents: 1151
diff changeset
73 #define ngx_str3Ocmp(m, c0, c1, c2, c3) \
67077918b965 optimize HTTP method parsing for i386 and amd64
Igor Sysoev <igor@sysoev.ru>
parents: 1151
diff changeset
74 m[0] == c0 && m[2] == c2 && m[3] == c3
67077918b965 optimize HTTP method parsing for i386 and amd64
Igor Sysoev <igor@sysoev.ru>
parents: 1151
diff changeset
75
67077918b965 optimize HTTP method parsing for i386 and amd64
Igor Sysoev <igor@sysoev.ru>
parents: 1151
diff changeset
76 #define ngx_str4cmp(m, c0, c1, c2, c3) \
67077918b965 optimize HTTP method parsing for i386 and amd64
Igor Sysoev <igor@sysoev.ru>
parents: 1151
diff changeset
77 m[0] == c0 && m[1] == c1 && m[2] == c2 && m[3] == c3
67077918b965 optimize HTTP method parsing for i386 and amd64
Igor Sysoev <igor@sysoev.ru>
parents: 1151
diff changeset
78
67077918b965 optimize HTTP method parsing for i386 and amd64
Igor Sysoev <igor@sysoev.ru>
parents: 1151
diff changeset
79 #define ngx_str5cmp(m, c0, c1, c2, c3, c4) \
67077918b965 optimize HTTP method parsing for i386 and amd64
Igor Sysoev <igor@sysoev.ru>
parents: 1151
diff changeset
80 m[0] == c0 && m[1] == c1 && m[2] == c2 && m[3] == c3 && m[4] == c4
67077918b965 optimize HTTP method parsing for i386 and amd64
Igor Sysoev <igor@sysoev.ru>
parents: 1151
diff changeset
81
67077918b965 optimize HTTP method parsing for i386 and amd64
Igor Sysoev <igor@sysoev.ru>
parents: 1151
diff changeset
82 #define ngx_str6cmp(m, c0, c1, c2, c3, c4, c5) \
67077918b965 optimize HTTP method parsing for i386 and amd64
Igor Sysoev <igor@sysoev.ru>
parents: 1151
diff changeset
83 m[0] == c0 && m[1] == c1 && m[2] == c2 && m[3] == c3 \
67077918b965 optimize HTTP method parsing for i386 and amd64
Igor Sysoev <igor@sysoev.ru>
parents: 1151
diff changeset
84 && m[4] == c4 && m[5] == c5
67077918b965 optimize HTTP method parsing for i386 and amd64
Igor Sysoev <igor@sysoev.ru>
parents: 1151
diff changeset
85
67077918b965 optimize HTTP method parsing for i386 and amd64
Igor Sysoev <igor@sysoev.ru>
parents: 1151
diff changeset
86 #define ngx_str7_cmp(m, c0, c1, c2, c3, c4, c5, c6, c7) \
67077918b965 optimize HTTP method parsing for i386 and amd64
Igor Sysoev <igor@sysoev.ru>
parents: 1151
diff changeset
87 m[0] == c0 && m[1] == c1 && m[2] == c2 && m[3] == c3 \
67077918b965 optimize HTTP method parsing for i386 and amd64
Igor Sysoev <igor@sysoev.ru>
parents: 1151
diff changeset
88 && m[4] == c4 && m[5] == c5 && m[6] == c6
67077918b965 optimize HTTP method parsing for i386 and amd64
Igor Sysoev <igor@sysoev.ru>
parents: 1151
diff changeset
89
67077918b965 optimize HTTP method parsing for i386 and amd64
Igor Sysoev <igor@sysoev.ru>
parents: 1151
diff changeset
90 #define ngx_str8cmp(m, c0, c1, c2, c3, c4, c5, c6, c7) \
67077918b965 optimize HTTP method parsing for i386 and amd64
Igor Sysoev <igor@sysoev.ru>
parents: 1151
diff changeset
91 m[0] == c0 && m[1] == c1 && m[2] == c2 && m[3] == c3 \
67077918b965 optimize HTTP method parsing for i386 and amd64
Igor Sysoev <igor@sysoev.ru>
parents: 1151
diff changeset
92 && m[4] == c4 && m[5] == c5 && m[6] == c6 && m[7] == c7
67077918b965 optimize HTTP method parsing for i386 and amd64
Igor Sysoev <igor@sysoev.ru>
parents: 1151
diff changeset
93
67077918b965 optimize HTTP method parsing for i386 and amd64
Igor Sysoev <igor@sysoev.ru>
parents: 1151
diff changeset
94 #define ngx_str9cmp(m, c0, c1, c2, c3, c4, c5, c6, c7, c8) \
67077918b965 optimize HTTP method parsing for i386 and amd64
Igor Sysoev <igor@sysoev.ru>
parents: 1151
diff changeset
95 m[0] == c0 && m[1] == c1 && m[2] == c2 && m[3] == c3 \
67077918b965 optimize HTTP method parsing for i386 and amd64
Igor Sysoev <igor@sysoev.ru>
parents: 1151
diff changeset
96 && m[4] == c4 && m[5] == c5 && m[6] == c6 && m[7] == c7 && m[8] == c8
67077918b965 optimize HTTP method parsing for i386 and amd64
Igor Sysoev <igor@sysoev.ru>
parents: 1151
diff changeset
97
67077918b965 optimize HTTP method parsing for i386 and amd64
Igor Sysoev <igor@sysoev.ru>
parents: 1151
diff changeset
98 #endif
67077918b965 optimize HTTP method parsing for i386 and amd64
Igor Sysoev <igor@sysoev.ru>
parents: 1151
diff changeset
99
67077918b965 optimize HTTP method parsing for i386 and amd64
Igor Sysoev <igor@sysoev.ru>
parents: 1151
diff changeset
100
649
1e720b0be7ec nginx-0.3.46-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 639
diff changeset
101 /* gcc, icc, msvc and others compile these switches as an jump table */
1e720b0be7ec nginx-0.3.46-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 639
diff changeset
102
509
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
103 ngx_int_t
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
104 ngx_http_parse_request_line(ngx_http_request_t *r, ngx_buf_t *b)
1
d220029ac7f3 nginx-0.0.1-2002-08-15-21:20:26 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
105 {
507
cd3117ad9aab nginx-0.1.28-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 505
diff changeset
106 u_char c, ch, *p, *m;
1
d220029ac7f3 nginx-0.0.1-2002-08-15-21:20:26 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
107 enum {
7
b5481d6fbbd4 nginx-0.0.1-2002-08-29-20:59:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 1
diff changeset
108 sw_start = 0,
314
d71c87d11b16 nginx-0.0.3-2004-04-14-09:57:36 import
Igor Sysoev <igor@sysoev.ru>
parents: 291
diff changeset
109 sw_method,
7
b5481d6fbbd4 nginx-0.0.1-2002-08-29-20:59:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 1
diff changeset
110 sw_spaces_before_uri,
314
d71c87d11b16 nginx-0.0.3-2004-04-14-09:57:36 import
Igor Sysoev <igor@sysoev.ru>
parents: 291
diff changeset
111 sw_schema,
d71c87d11b16 nginx-0.0.3-2004-04-14-09:57:36 import
Igor Sysoev <igor@sysoev.ru>
parents: 291
diff changeset
112 sw_schema_slash,
d71c87d11b16 nginx-0.0.3-2004-04-14-09:57:36 import
Igor Sysoev <igor@sysoev.ru>
parents: 291
diff changeset
113 sw_schema_slash_slash,
4313
e7db97bfac25 Added support for IP-literal in the Host header and request line (ticket #1).
Valentin Bartenev <vbart@nginx.com>
parents: 4125
diff changeset
114 sw_host_start,
314
d71c87d11b16 nginx-0.0.3-2004-04-14-09:57:36 import
Igor Sysoev <igor@sysoev.ru>
parents: 291
diff changeset
115 sw_host,
4313
e7db97bfac25 Added support for IP-literal in the Host header and request line (ticket #1).
Valentin Bartenev <vbart@nginx.com>
parents: 4125
diff changeset
116 sw_host_end,
e7db97bfac25 Added support for IP-literal in the Host header and request line (ticket #1).
Valentin Bartenev <vbart@nginx.com>
parents: 4125
diff changeset
117 sw_host_ip_literal,
314
d71c87d11b16 nginx-0.0.3-2004-04-14-09:57:36 import
Igor Sysoev <igor@sysoev.ru>
parents: 291
diff changeset
118 sw_port,
3615
31e9677b15a1 allow spaces in URI
Igor Sysoev <igor@sysoev.ru>
parents: 3613
diff changeset
119 sw_host_http_09,
7
b5481d6fbbd4 nginx-0.0.1-2002-08-29-20:59:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 1
diff changeset
120 sw_after_slash_in_uri,
b5481d6fbbd4 nginx-0.0.1-2002-08-29-20:59:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 1
diff changeset
121 sw_check_uri,
3615
31e9677b15a1 allow spaces in URI
Igor Sysoev <igor@sysoev.ru>
parents: 3613
diff changeset
122 sw_check_uri_http_09,
7
b5481d6fbbd4 nginx-0.0.1-2002-08-29-20:59:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 1
diff changeset
123 sw_uri,
b5481d6fbbd4 nginx-0.0.1-2002-08-29-20:59:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 1
diff changeset
124 sw_http_09,
91
637625a2acdb nginx-0.0.1-2003-05-19-20:39:14 import
Igor Sysoev <igor@sysoev.ru>
parents: 89
diff changeset
125 sw_http_H,
637625a2acdb nginx-0.0.1-2003-05-19-20:39:14 import
Igor Sysoev <igor@sysoev.ru>
parents: 89
diff changeset
126 sw_http_HT,
637625a2acdb nginx-0.0.1-2003-05-19-20:39:14 import
Igor Sysoev <igor@sysoev.ru>
parents: 89
diff changeset
127 sw_http_HTT,
637625a2acdb nginx-0.0.1-2003-05-19-20:39:14 import
Igor Sysoev <igor@sysoev.ru>
parents: 89
diff changeset
128 sw_http_HTTP,
7
b5481d6fbbd4 nginx-0.0.1-2002-08-29-20:59:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 1
diff changeset
129 sw_first_major_digit,
b5481d6fbbd4 nginx-0.0.1-2002-08-29-20:59:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 1
diff changeset
130 sw_major_digit,
b5481d6fbbd4 nginx-0.0.1-2002-08-29-20:59:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 1
diff changeset
131 sw_first_minor_digit,
b5481d6fbbd4 nginx-0.0.1-2002-08-29-20:59:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 1
diff changeset
132 sw_minor_digit,
1603
364587232429 compatibility with mget: space after HTTP/1.1
Igor Sysoev <igor@sysoev.ru>
parents: 1585
diff changeset
133 sw_spaces_after_digit,
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 473
diff changeset
134 sw_almost_done
21
df7fb216a149 nginx-0.0.1-2002-12-04-19:29:40 import
Igor Sysoev <igor@sysoev.ru>
parents: 18
diff changeset
135 } state;
df7fb216a149 nginx-0.0.1-2002-12-04-19:29:40 import
Igor Sysoev <igor@sysoev.ru>
parents: 18
diff changeset
136
df7fb216a149 nginx-0.0.1-2002-12-04-19:29:40 import
Igor Sysoev <igor@sysoev.ru>
parents: 18
diff changeset
137 state = r->state;
1
d220029ac7f3 nginx-0.0.1-2002-08-15-21:20:26 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
138
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 473
diff changeset
139 for (p = b->pos; p < b->last; p++) {
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 473
diff changeset
140 ch = *p;
1
d220029ac7f3 nginx-0.0.1-2002-08-15-21:20:26 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
141
d220029ac7f3 nginx-0.0.1-2002-08-15-21:20:26 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
142 switch (state) {
d220029ac7f3 nginx-0.0.1-2002-08-15-21:20:26 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
143
d220029ac7f3 nginx-0.0.1-2002-08-15-21:20:26 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
144 /* HTTP methods: GET, HEAD, POST */
7
b5481d6fbbd4 nginx-0.0.1-2002-08-29-20:59:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 1
diff changeset
145 case sw_start:
8407
d6feece1288a Fixed $request_length for HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents: 8404
diff changeset
146 r->parse_start = p;
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 473
diff changeset
147 r->request_start = p;
8215
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents: 7580
diff changeset
148 r->method_start = p;
65
4222c496acb3 nginx-0.0.1-2003-03-05-09:37:42 import
Igor Sysoev <igor@sysoev.ru>
parents: 59
diff changeset
149
323
ba876b26b76d nginx-0.0.3-2004-04-21-22:54:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 314
diff changeset
150 if (ch == CR || ch == LF) {
ba876b26b76d nginx-0.0.3-2004-04-21-22:54:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 314
diff changeset
151 break;
ba876b26b76d nginx-0.0.3-2004-04-21-22:54:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 314
diff changeset
152 }
ba876b26b76d nginx-0.0.3-2004-04-21-22:54:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 314
diff changeset
153
6732
57148b755320 Allowed '-' in method names.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6626
diff changeset
154 if ((ch < 'A' || ch > 'Z') && ch != '_' && ch != '-') {
91
637625a2acdb nginx-0.0.1-2003-05-19-20:39:14 import
Igor Sysoev <igor@sysoev.ru>
parents: 89
diff changeset
155 return NGX_HTTP_PARSE_INVALID_METHOD;
637625a2acdb nginx-0.0.1-2003-05-19-20:39:14 import
Igor Sysoev <igor@sysoev.ru>
parents: 89
diff changeset
156 }
1
d220029ac7f3 nginx-0.0.1-2002-08-15-21:20:26 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
157
314
d71c87d11b16 nginx-0.0.3-2004-04-14-09:57:36 import
Igor Sysoev <igor@sysoev.ru>
parents: 291
diff changeset
158 state = sw_method;
91
637625a2acdb nginx-0.0.1-2003-05-19-20:39:14 import
Igor Sysoev <igor@sysoev.ru>
parents: 89
diff changeset
159 break;
1
d220029ac7f3 nginx-0.0.1-2002-08-15-21:20:26 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
160
314
d71c87d11b16 nginx-0.0.3-2004-04-14-09:57:36 import
Igor Sysoev <igor@sysoev.ru>
parents: 291
diff changeset
161 case sw_method:
d71c87d11b16 nginx-0.0.3-2004-04-14-09:57:36 import
Igor Sysoev <igor@sysoev.ru>
parents: 291
diff changeset
162 if (ch == ' ') {
8215
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents: 7580
diff changeset
163 r->method_end = p;
314
d71c87d11b16 nginx-0.0.3-2004-04-14-09:57:36 import
Igor Sysoev <igor@sysoev.ru>
parents: 291
diff changeset
164 m = r->request_start;
d71c87d11b16 nginx-0.0.3-2004-04-14-09:57:36 import
Igor Sysoev <igor@sysoev.ru>
parents: 291
diff changeset
165
639
715d24327080 nginx-0.3.41-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 637
diff changeset
166 switch (p - m) {
314
d71c87d11b16 nginx-0.0.3-2004-04-14-09:57:36 import
Igor Sysoev <igor@sysoev.ru>
parents: 291
diff changeset
167
639
715d24327080 nginx-0.3.41-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 637
diff changeset
168 case 3:
1196
67077918b965 optimize HTTP method parsing for i386 and amd64
Igor Sysoev <igor@sysoev.ru>
parents: 1151
diff changeset
169 if (ngx_str3_cmp(m, 'G', 'E', 'T', ' ')) {
314
d71c87d11b16 nginx-0.0.3-2004-04-14-09:57:36 import
Igor Sysoev <igor@sysoev.ru>
parents: 291
diff changeset
170 r->method = NGX_HTTP_GET;
844
9ddb57468082 add more WebDAV methods
Igor Sysoev <igor@sysoev.ru>
parents: 832
diff changeset
171 break;
9ddb57468082 add more WebDAV methods
Igor Sysoev <igor@sysoev.ru>
parents: 832
diff changeset
172 }
633
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 625
diff changeset
173
1196
67077918b965 optimize HTTP method parsing for i386 and amd64
Igor Sysoev <igor@sysoev.ru>
parents: 1151
diff changeset
174 if (ngx_str3_cmp(m, 'P', 'U', 'T', ' ')) {
633
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 625
diff changeset
175 r->method = NGX_HTTP_PUT;
844
9ddb57468082 add more WebDAV methods
Igor Sysoev <igor@sysoev.ru>
parents: 832
diff changeset
176 break;
314
d71c87d11b16 nginx-0.0.3-2004-04-14-09:57:36 import
Igor Sysoev <igor@sysoev.ru>
parents: 291
diff changeset
177 }
844
9ddb57468082 add more WebDAV methods
Igor Sysoev <igor@sysoev.ru>
parents: 832
diff changeset
178
639
715d24327080 nginx-0.3.41-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 637
diff changeset
179 break;
314
d71c87d11b16 nginx-0.0.3-2004-04-14-09:57:36 import
Igor Sysoev <igor@sysoev.ru>
parents: 291
diff changeset
180
639
715d24327080 nginx-0.3.41-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 637
diff changeset
181 case 4:
844
9ddb57468082 add more WebDAV methods
Igor Sysoev <igor@sysoev.ru>
parents: 832
diff changeset
182 if (m[1] == 'O') {
9ddb57468082 add more WebDAV methods
Igor Sysoev <igor@sysoev.ru>
parents: 832
diff changeset
183
1196
67077918b965 optimize HTTP method parsing for i386 and amd64
Igor Sysoev <igor@sysoev.ru>
parents: 1151
diff changeset
184 if (ngx_str3Ocmp(m, 'P', 'O', 'S', 'T')) {
844
9ddb57468082 add more WebDAV methods
Igor Sysoev <igor@sysoev.ru>
parents: 832
diff changeset
185 r->method = NGX_HTTP_POST;
9ddb57468082 add more WebDAV methods
Igor Sysoev <igor@sysoev.ru>
parents: 832
diff changeset
186 break;
9ddb57468082 add more WebDAV methods
Igor Sysoev <igor@sysoev.ru>
parents: 832
diff changeset
187 }
9ddb57468082 add more WebDAV methods
Igor Sysoev <igor@sysoev.ru>
parents: 832
diff changeset
188
1196
67077918b965 optimize HTTP method parsing for i386 and amd64
Igor Sysoev <igor@sysoev.ru>
parents: 1151
diff changeset
189 if (ngx_str3Ocmp(m, 'C', 'O', 'P', 'Y')) {
844
9ddb57468082 add more WebDAV methods
Igor Sysoev <igor@sysoev.ru>
parents: 832
diff changeset
190 r->method = NGX_HTTP_COPY;
9ddb57468082 add more WebDAV methods
Igor Sysoev <igor@sysoev.ru>
parents: 832
diff changeset
191 break;
9ddb57468082 add more WebDAV methods
Igor Sysoev <igor@sysoev.ru>
parents: 832
diff changeset
192 }
314
d71c87d11b16 nginx-0.0.3-2004-04-14-09:57:36 import
Igor Sysoev <igor@sysoev.ru>
parents: 291
diff changeset
193
1196
67077918b965 optimize HTTP method parsing for i386 and amd64
Igor Sysoev <igor@sysoev.ru>
parents: 1151
diff changeset
194 if (ngx_str3Ocmp(m, 'M', 'O', 'V', 'E')) {
844
9ddb57468082 add more WebDAV methods
Igor Sysoev <igor@sysoev.ru>
parents: 832
diff changeset
195 r->method = NGX_HTTP_MOVE;
9ddb57468082 add more WebDAV methods
Igor Sysoev <igor@sysoev.ru>
parents: 832
diff changeset
196 break;
9ddb57468082 add more WebDAV methods
Igor Sysoev <igor@sysoev.ru>
parents: 832
diff changeset
197 }
9ddb57468082 add more WebDAV methods
Igor Sysoev <igor@sysoev.ru>
parents: 832
diff changeset
198
1196
67077918b965 optimize HTTP method parsing for i386 and amd64
Igor Sysoev <igor@sysoev.ru>
parents: 1151
diff changeset
199 if (ngx_str3Ocmp(m, 'L', 'O', 'C', 'K')) {
844
9ddb57468082 add more WebDAV methods
Igor Sysoev <igor@sysoev.ru>
parents: 832
diff changeset
200 r->method = NGX_HTTP_LOCK;
9ddb57468082 add more WebDAV methods
Igor Sysoev <igor@sysoev.ru>
parents: 832
diff changeset
201 break;
9ddb57468082 add more WebDAV methods
Igor Sysoev <igor@sysoev.ru>
parents: 832
diff changeset
202 }
9ddb57468082 add more WebDAV methods
Igor Sysoev <igor@sysoev.ru>
parents: 832
diff changeset
203
9ddb57468082 add more WebDAV methods
Igor Sysoev <igor@sysoev.ru>
parents: 832
diff changeset
204 } else {
9ddb57468082 add more WebDAV methods
Igor Sysoev <igor@sysoev.ru>
parents: 832
diff changeset
205
1196
67077918b965 optimize HTTP method parsing for i386 and amd64
Igor Sysoev <igor@sysoev.ru>
parents: 1151
diff changeset
206 if (ngx_str4cmp(m, 'H', 'E', 'A', 'D')) {
844
9ddb57468082 add more WebDAV methods
Igor Sysoev <igor@sysoev.ru>
parents: 832
diff changeset
207 r->method = NGX_HTTP_HEAD;
9ddb57468082 add more WebDAV methods
Igor Sysoev <igor@sysoev.ru>
parents: 832
diff changeset
208 break;
9ddb57468082 add more WebDAV methods
Igor Sysoev <igor@sysoev.ru>
parents: 832
diff changeset
209 }
314
d71c87d11b16 nginx-0.0.3-2004-04-14-09:57:36 import
Igor Sysoev <igor@sysoev.ru>
parents: 291
diff changeset
210 }
844
9ddb57468082 add more WebDAV methods
Igor Sysoev <igor@sysoev.ru>
parents: 832
diff changeset
211
639
715d24327080 nginx-0.3.41-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 637
diff changeset
212 break;
633
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 625
diff changeset
213
639
715d24327080 nginx-0.3.41-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 637
diff changeset
214 case 5:
1196
67077918b965 optimize HTTP method parsing for i386 and amd64
Igor Sysoev <igor@sysoev.ru>
parents: 1151
diff changeset
215 if (ngx_str5cmp(m, 'M', 'K', 'C', 'O', 'L')) {
637
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
216 r->method = NGX_HTTP_MKCOL;
5328
17291cb8c76e Minor ngx_http_parse_request_line() optimization.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5256
diff changeset
217 break;
637
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
218 }
844
9ddb57468082 add more WebDAV methods
Igor Sysoev <igor@sysoev.ru>
parents: 832
diff changeset
219
3613
64bd39f03182 PATCH method
Igor Sysoev <igor@sysoev.ru>
parents: 3571
diff changeset
220 if (ngx_str5cmp(m, 'P', 'A', 'T', 'C', 'H')) {
64bd39f03182 PATCH method
Igor Sysoev <igor@sysoev.ru>
parents: 3571
diff changeset
221 r->method = NGX_HTTP_PATCH;
5328
17291cb8c76e Minor ngx_http_parse_request_line() optimization.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5256
diff changeset
222 break;
3613
64bd39f03182 PATCH method
Igor Sysoev <igor@sysoev.ru>
parents: 3571
diff changeset
223 }
64bd39f03182 PATCH method
Igor Sysoev <igor@sysoev.ru>
parents: 3571
diff changeset
224
1196
67077918b965 optimize HTTP method parsing for i386 and amd64
Igor Sysoev <igor@sysoev.ru>
parents: 1151
diff changeset
225 if (ngx_str5cmp(m, 'T', 'R', 'A', 'C', 'E')) {
1151
b1ebd03de948 disable TRACE method
Igor Sysoev <igor@sysoev.ru>
parents: 923
diff changeset
226 r->method = NGX_HTTP_TRACE;
5328
17291cb8c76e Minor ngx_http_parse_request_line() optimization.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5256
diff changeset
227 break;
1151
b1ebd03de948 disable TRACE method
Igor Sysoev <igor@sysoev.ru>
parents: 923
diff changeset
228 }
b1ebd03de948 disable TRACE method
Igor Sysoev <igor@sysoev.ru>
parents: 923
diff changeset
229
639
715d24327080 nginx-0.3.41-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 637
diff changeset
230 break;
637
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
231
639
715d24327080 nginx-0.3.41-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 637
diff changeset
232 case 6:
1196
67077918b965 optimize HTTP method parsing for i386 and amd64
Igor Sysoev <igor@sysoev.ru>
parents: 1151
diff changeset
233 if (ngx_str6cmp(m, 'D', 'E', 'L', 'E', 'T', 'E')) {
633
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 625
diff changeset
234 r->method = NGX_HTTP_DELETE;
844
9ddb57468082 add more WebDAV methods
Igor Sysoev <igor@sysoev.ru>
parents: 832
diff changeset
235 break;
633
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 625
diff changeset
236 }
844
9ddb57468082 add more WebDAV methods
Igor Sysoev <igor@sysoev.ru>
parents: 832
diff changeset
237
1196
67077918b965 optimize HTTP method parsing for i386 and amd64
Igor Sysoev <igor@sysoev.ru>
parents: 1151
diff changeset
238 if (ngx_str6cmp(m, 'U', 'N', 'L', 'O', 'C', 'K')) {
844
9ddb57468082 add more WebDAV methods
Igor Sysoev <igor@sysoev.ru>
parents: 832
diff changeset
239 r->method = NGX_HTTP_UNLOCK;
9ddb57468082 add more WebDAV methods
Igor Sysoev <igor@sysoev.ru>
parents: 832
diff changeset
240 break;
9ddb57468082 add more WebDAV methods
Igor Sysoev <igor@sysoev.ru>
parents: 832
diff changeset
241 }
9ddb57468082 add more WebDAV methods
Igor Sysoev <igor@sysoev.ru>
parents: 832
diff changeset
242
9ddb57468082 add more WebDAV methods
Igor Sysoev <igor@sysoev.ru>
parents: 832
diff changeset
243 break;
9ddb57468082 add more WebDAV methods
Igor Sysoev <igor@sysoev.ru>
parents: 832
diff changeset
244
9ddb57468082 add more WebDAV methods
Igor Sysoev <igor@sysoev.ru>
parents: 832
diff changeset
245 case 7:
1196
67077918b965 optimize HTTP method parsing for i386 and amd64
Igor Sysoev <igor@sysoev.ru>
parents: 1151
diff changeset
246 if (ngx_str7_cmp(m, 'O', 'P', 'T', 'I', 'O', 'N', 'S', ' '))
844
9ddb57468082 add more WebDAV methods
Igor Sysoev <igor@sysoev.ru>
parents: 832
diff changeset
247 {
9ddb57468082 add more WebDAV methods
Igor Sysoev <igor@sysoev.ru>
parents: 832
diff changeset
248 r->method = NGX_HTTP_OPTIONS;
9ddb57468082 add more WebDAV methods
Igor Sysoev <igor@sysoev.ru>
parents: 832
diff changeset
249 }
9ddb57468082 add more WebDAV methods
Igor Sysoev <igor@sysoev.ru>
parents: 832
diff changeset
250
9ddb57468082 add more WebDAV methods
Igor Sysoev <igor@sysoev.ru>
parents: 832
diff changeset
251 break;
9ddb57468082 add more WebDAV methods
Igor Sysoev <igor@sysoev.ru>
parents: 832
diff changeset
252
9ddb57468082 add more WebDAV methods
Igor Sysoev <igor@sysoev.ru>
parents: 832
diff changeset
253 case 8:
1196
67077918b965 optimize HTTP method parsing for i386 and amd64
Igor Sysoev <igor@sysoev.ru>
parents: 1151
diff changeset
254 if (ngx_str8cmp(m, 'P', 'R', 'O', 'P', 'F', 'I', 'N', 'D'))
844
9ddb57468082 add more WebDAV methods
Igor Sysoev <igor@sysoev.ru>
parents: 832
diff changeset
255 {
9ddb57468082 add more WebDAV methods
Igor Sysoev <igor@sysoev.ru>
parents: 832
diff changeset
256 r->method = NGX_HTTP_PROPFIND;
9ddb57468082 add more WebDAV methods
Igor Sysoev <igor@sysoev.ru>
parents: 832
diff changeset
257 }
9ddb57468082 add more WebDAV methods
Igor Sysoev <igor@sysoev.ru>
parents: 832
diff changeset
258
9ddb57468082 add more WebDAV methods
Igor Sysoev <igor@sysoev.ru>
parents: 832
diff changeset
259 break;
9ddb57468082 add more WebDAV methods
Igor Sysoev <igor@sysoev.ru>
parents: 832
diff changeset
260
9ddb57468082 add more WebDAV methods
Igor Sysoev <igor@sysoev.ru>
parents: 832
diff changeset
261 case 9:
1196
67077918b965 optimize HTTP method parsing for i386 and amd64
Igor Sysoev <igor@sysoev.ru>
parents: 1151
diff changeset
262 if (ngx_str9cmp(m,
67077918b965 optimize HTTP method parsing for i386 and amd64
Igor Sysoev <igor@sysoev.ru>
parents: 1151
diff changeset
263 'P', 'R', 'O', 'P', 'P', 'A', 'T', 'C', 'H'))
844
9ddb57468082 add more WebDAV methods
Igor Sysoev <igor@sysoev.ru>
parents: 832
diff changeset
264 {
9ddb57468082 add more WebDAV methods
Igor Sysoev <igor@sysoev.ru>
parents: 832
diff changeset
265 r->method = NGX_HTTP_PROPPATCH;
9ddb57468082 add more WebDAV methods
Igor Sysoev <igor@sysoev.ru>
parents: 832
diff changeset
266 }
9ddb57468082 add more WebDAV methods
Igor Sysoev <igor@sysoev.ru>
parents: 832
diff changeset
267
639
715d24327080 nginx-0.3.41-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 637
diff changeset
268 break;
314
d71c87d11b16 nginx-0.0.3-2004-04-14-09:57:36 import
Igor Sysoev <igor@sysoev.ru>
parents: 291
diff changeset
269 }
d71c87d11b16 nginx-0.0.3-2004-04-14-09:57:36 import
Igor Sysoev <igor@sysoev.ru>
parents: 291
diff changeset
270
d71c87d11b16 nginx-0.0.3-2004-04-14-09:57:36 import
Igor Sysoev <igor@sysoev.ru>
parents: 291
diff changeset
271 state = sw_spaces_before_uri;
91
637625a2acdb nginx-0.0.1-2003-05-19-20:39:14 import
Igor Sysoev <igor@sysoev.ru>
parents: 89
diff changeset
272 break;
637625a2acdb nginx-0.0.1-2003-05-19-20:39:14 import
Igor Sysoev <igor@sysoev.ru>
parents: 89
diff changeset
273 }
637625a2acdb nginx-0.0.1-2003-05-19-20:39:14 import
Igor Sysoev <igor@sysoev.ru>
parents: 89
diff changeset
274
6732
57148b755320 Allowed '-' in method names.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6626
diff changeset
275 if ((ch < 'A' || ch > 'Z') && ch != '_' && ch != '-') {
91
637625a2acdb nginx-0.0.1-2003-05-19-20:39:14 import
Igor Sysoev <igor@sysoev.ru>
parents: 89
diff changeset
276 return NGX_HTTP_PARSE_INVALID_METHOD;
637625a2acdb nginx-0.0.1-2003-05-19-20:39:14 import
Igor Sysoev <igor@sysoev.ru>
parents: 89
diff changeset
277 }
637625a2acdb nginx-0.0.1-2003-05-19-20:39:14 import
Igor Sysoev <igor@sysoev.ru>
parents: 89
diff changeset
278
1
d220029ac7f3 nginx-0.0.1-2002-08-15-21:20:26 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
279 break;
d220029ac7f3 nginx-0.0.1-2002-08-15-21:20:26 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
280
d220029ac7f3 nginx-0.0.1-2002-08-15-21:20:26 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
281 /* space* before URI */
7
b5481d6fbbd4 nginx-0.0.1-2002-08-29-20:59:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 1
diff changeset
282 case sw_spaces_before_uri:
507
cd3117ad9aab nginx-0.1.28-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 505
diff changeset
283
3642
ac33852faaac style fix
Igor Sysoev <igor@sysoev.ru>
parents: 3626
diff changeset
284 if (ch == '/') {
822
a908ba404078 handle the most frequent case first
Igor Sysoev <igor@sysoev.ru>
parents: 821
diff changeset
285 r->uri_start = p;
a908ba404078 handle the most frequent case first
Igor Sysoev <igor@sysoev.ru>
parents: 821
diff changeset
286 state = sw_after_slash_in_uri;
a908ba404078 handle the most frequent case first
Igor Sysoev <igor@sysoev.ru>
parents: 821
diff changeset
287 break;
a908ba404078 handle the most frequent case first
Igor Sysoev <igor@sysoev.ru>
parents: 821
diff changeset
288 }
a908ba404078 handle the most frequent case first
Igor Sysoev <igor@sysoev.ru>
parents: 821
diff changeset
289
507
cd3117ad9aab nginx-0.1.28-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 505
diff changeset
290 c = (u_char) (ch | 0x20);
521
6f00349b98e5 nginx-0.1.35-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 511
diff changeset
291 if (c >= 'a' && c <= 'z') {
489
45a460f82aec nginx-0.1.19-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 485
diff changeset
292 r->schema_start = p;
45a460f82aec nginx-0.1.19-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 485
diff changeset
293 state = sw_schema;
45a460f82aec nginx-0.1.19-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 485
diff changeset
294 break;
45a460f82aec nginx-0.1.19-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 485
diff changeset
295 }
45a460f82aec nginx-0.1.19-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 485
diff changeset
296
1
d220029ac7f3 nginx-0.0.1-2002-08-15-21:20:26 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
297 switch (ch) {
d220029ac7f3 nginx-0.0.1-2002-08-15-21:20:26 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
298 case ' ':
d220029ac7f3 nginx-0.0.1-2002-08-15-21:20:26 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
299 break;
d220029ac7f3 nginx-0.0.1-2002-08-15-21:20:26 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
300 default:
314
d71c87d11b16 nginx-0.0.3-2004-04-14-09:57:36 import
Igor Sysoev <igor@sysoev.ru>
parents: 291
diff changeset
301 return NGX_HTTP_PARSE_INVALID_REQUEST;
d71c87d11b16 nginx-0.0.3-2004-04-14-09:57:36 import
Igor Sysoev <igor@sysoev.ru>
parents: 291
diff changeset
302 }
d71c87d11b16 nginx-0.0.3-2004-04-14-09:57:36 import
Igor Sysoev <igor@sysoev.ru>
parents: 291
diff changeset
303 break;
d71c87d11b16 nginx-0.0.3-2004-04-14-09:57:36 import
Igor Sysoev <igor@sysoev.ru>
parents: 291
diff changeset
304
d71c87d11b16 nginx-0.0.3-2004-04-14-09:57:36 import
Igor Sysoev <igor@sysoev.ru>
parents: 291
diff changeset
305 case sw_schema:
507
cd3117ad9aab nginx-0.1.28-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 505
diff changeset
306
cd3117ad9aab nginx-0.1.28-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 505
diff changeset
307 c = (u_char) (ch | 0x20);
521
6f00349b98e5 nginx-0.1.35-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 511
diff changeset
308 if (c >= 'a' && c <= 'z') {
489
45a460f82aec nginx-0.1.19-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 485
diff changeset
309 break;
45a460f82aec nginx-0.1.19-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 485
diff changeset
310 }
45a460f82aec nginx-0.1.19-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 485
diff changeset
311
7292
f9661f56c717 Allowed digits, '+', '-', and '.' in scheme names as per RFC 3986.
Ruslan Ermilov <ru@nginx.com>
parents: 7067
diff changeset
312 if ((ch >= '0' && ch <= '9') || ch == '+' || ch == '-' || ch == '.')
f9661f56c717 Allowed digits, '+', '-', and '.' in scheme names as per RFC 3986.
Ruslan Ermilov <ru@nginx.com>
parents: 7067
diff changeset
313 {
f9661f56c717 Allowed digits, '+', '-', and '.' in scheme names as per RFC 3986.
Ruslan Ermilov <ru@nginx.com>
parents: 7067
diff changeset
314 break;
f9661f56c717 Allowed digits, '+', '-', and '.' in scheme names as per RFC 3986.
Ruslan Ermilov <ru@nginx.com>
parents: 7067
diff changeset
315 }
f9661f56c717 Allowed digits, '+', '-', and '.' in scheme names as per RFC 3986.
Ruslan Ermilov <ru@nginx.com>
parents: 7067
diff changeset
316
314
d71c87d11b16 nginx-0.0.3-2004-04-14-09:57:36 import
Igor Sysoev <igor@sysoev.ru>
parents: 291
diff changeset
317 switch (ch) {
d71c87d11b16 nginx-0.0.3-2004-04-14-09:57:36 import
Igor Sysoev <igor@sysoev.ru>
parents: 291
diff changeset
318 case ':':
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 473
diff changeset
319 r->schema_end = p;
314
d71c87d11b16 nginx-0.0.3-2004-04-14-09:57:36 import
Igor Sysoev <igor@sysoev.ru>
parents: 291
diff changeset
320 state = sw_schema_slash;
d71c87d11b16 nginx-0.0.3-2004-04-14-09:57:36 import
Igor Sysoev <igor@sysoev.ru>
parents: 291
diff changeset
321 break;
d71c87d11b16 nginx-0.0.3-2004-04-14-09:57:36 import
Igor Sysoev <igor@sysoev.ru>
parents: 291
diff changeset
322 default:
d71c87d11b16 nginx-0.0.3-2004-04-14-09:57:36 import
Igor Sysoev <igor@sysoev.ru>
parents: 291
diff changeset
323 return NGX_HTTP_PARSE_INVALID_REQUEST;
d71c87d11b16 nginx-0.0.3-2004-04-14-09:57:36 import
Igor Sysoev <igor@sysoev.ru>
parents: 291
diff changeset
324 }
d71c87d11b16 nginx-0.0.3-2004-04-14-09:57:36 import
Igor Sysoev <igor@sysoev.ru>
parents: 291
diff changeset
325 break;
d71c87d11b16 nginx-0.0.3-2004-04-14-09:57:36 import
Igor Sysoev <igor@sysoev.ru>
parents: 291
diff changeset
326
d71c87d11b16 nginx-0.0.3-2004-04-14-09:57:36 import
Igor Sysoev <igor@sysoev.ru>
parents: 291
diff changeset
327 case sw_schema_slash:
d71c87d11b16 nginx-0.0.3-2004-04-14-09:57:36 import
Igor Sysoev <igor@sysoev.ru>
parents: 291
diff changeset
328 switch (ch) {
d71c87d11b16 nginx-0.0.3-2004-04-14-09:57:36 import
Igor Sysoev <igor@sysoev.ru>
parents: 291
diff changeset
329 case '/':
d71c87d11b16 nginx-0.0.3-2004-04-14-09:57:36 import
Igor Sysoev <igor@sysoev.ru>
parents: 291
diff changeset
330 state = sw_schema_slash_slash;
d71c87d11b16 nginx-0.0.3-2004-04-14-09:57:36 import
Igor Sysoev <igor@sysoev.ru>
parents: 291
diff changeset
331 break;
d71c87d11b16 nginx-0.0.3-2004-04-14-09:57:36 import
Igor Sysoev <igor@sysoev.ru>
parents: 291
diff changeset
332 default:
d71c87d11b16 nginx-0.0.3-2004-04-14-09:57:36 import
Igor Sysoev <igor@sysoev.ru>
parents: 291
diff changeset
333 return NGX_HTTP_PARSE_INVALID_REQUEST;
d71c87d11b16 nginx-0.0.3-2004-04-14-09:57:36 import
Igor Sysoev <igor@sysoev.ru>
parents: 291
diff changeset
334 }
d71c87d11b16 nginx-0.0.3-2004-04-14-09:57:36 import
Igor Sysoev <igor@sysoev.ru>
parents: 291
diff changeset
335 break;
d71c87d11b16 nginx-0.0.3-2004-04-14-09:57:36 import
Igor Sysoev <igor@sysoev.ru>
parents: 291
diff changeset
336
d71c87d11b16 nginx-0.0.3-2004-04-14-09:57:36 import
Igor Sysoev <igor@sysoev.ru>
parents: 291
diff changeset
337 case sw_schema_slash_slash:
d71c87d11b16 nginx-0.0.3-2004-04-14-09:57:36 import
Igor Sysoev <igor@sysoev.ru>
parents: 291
diff changeset
338 switch (ch) {
d71c87d11b16 nginx-0.0.3-2004-04-14-09:57:36 import
Igor Sysoev <igor@sysoev.ru>
parents: 291
diff changeset
339 case '/':
4313
e7db97bfac25 Added support for IP-literal in the Host header and request line (ticket #1).
Valentin Bartenev <vbart@nginx.com>
parents: 4125
diff changeset
340 state = sw_host_start;
314
d71c87d11b16 nginx-0.0.3-2004-04-14-09:57:36 import
Igor Sysoev <igor@sysoev.ru>
parents: 291
diff changeset
341 break;
d71c87d11b16 nginx-0.0.3-2004-04-14-09:57:36 import
Igor Sysoev <igor@sysoev.ru>
parents: 291
diff changeset
342 default:
d71c87d11b16 nginx-0.0.3-2004-04-14-09:57:36 import
Igor Sysoev <igor@sysoev.ru>
parents: 291
diff changeset
343 return NGX_HTTP_PARSE_INVALID_REQUEST;
d71c87d11b16 nginx-0.0.3-2004-04-14-09:57:36 import
Igor Sysoev <igor@sysoev.ru>
parents: 291
diff changeset
344 }
d71c87d11b16 nginx-0.0.3-2004-04-14-09:57:36 import
Igor Sysoev <igor@sysoev.ru>
parents: 291
diff changeset
345 break;
d71c87d11b16 nginx-0.0.3-2004-04-14-09:57:36 import
Igor Sysoev <igor@sysoev.ru>
parents: 291
diff changeset
346
4313
e7db97bfac25 Added support for IP-literal in the Host header and request line (ticket #1).
Valentin Bartenev <vbart@nginx.com>
parents: 4125
diff changeset
347 case sw_host_start:
e7db97bfac25 Added support for IP-literal in the Host header and request line (ticket #1).
Valentin Bartenev <vbart@nginx.com>
parents: 4125
diff changeset
348
e7db97bfac25 Added support for IP-literal in the Host header and request line (ticket #1).
Valentin Bartenev <vbart@nginx.com>
parents: 4125
diff changeset
349 r->host_start = p;
e7db97bfac25 Added support for IP-literal in the Host header and request line (ticket #1).
Valentin Bartenev <vbart@nginx.com>
parents: 4125
diff changeset
350
e7db97bfac25 Added support for IP-literal in the Host header and request line (ticket #1).
Valentin Bartenev <vbart@nginx.com>
parents: 4125
diff changeset
351 if (ch == '[') {
e7db97bfac25 Added support for IP-literal in the Host header and request line (ticket #1).
Valentin Bartenev <vbart@nginx.com>
parents: 4125
diff changeset
352 state = sw_host_ip_literal;
e7db97bfac25 Added support for IP-literal in the Host header and request line (ticket #1).
Valentin Bartenev <vbart@nginx.com>
parents: 4125
diff changeset
353 break;
e7db97bfac25 Added support for IP-literal in the Host header and request line (ticket #1).
Valentin Bartenev <vbart@nginx.com>
parents: 4125
diff changeset
354 }
e7db97bfac25 Added support for IP-literal in the Host header and request line (ticket #1).
Valentin Bartenev <vbart@nginx.com>
parents: 4125
diff changeset
355
e7db97bfac25 Added support for IP-literal in the Host header and request line (ticket #1).
Valentin Bartenev <vbart@nginx.com>
parents: 4125
diff changeset
356 state = sw_host;
e7db97bfac25 Added support for IP-literal in the Host header and request line (ticket #1).
Valentin Bartenev <vbart@nginx.com>
parents: 4125
diff changeset
357
e7db97bfac25 Added support for IP-literal in the Host header and request line (ticket #1).
Valentin Bartenev <vbart@nginx.com>
parents: 4125
diff changeset
358 /* fall through */
e7db97bfac25 Added support for IP-literal in the Host header and request line (ticket #1).
Valentin Bartenev <vbart@nginx.com>
parents: 4125
diff changeset
359
314
d71c87d11b16 nginx-0.0.3-2004-04-14-09:57:36 import
Igor Sysoev <igor@sysoev.ru>
parents: 291
diff changeset
360 case sw_host:
507
cd3117ad9aab nginx-0.1.28-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 505
diff changeset
361
cd3117ad9aab nginx-0.1.28-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 505
diff changeset
362 c = (u_char) (ch | 0x20);
521
6f00349b98e5 nginx-0.1.35-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 511
diff changeset
363 if (c >= 'a' && c <= 'z') {
507
cd3117ad9aab nginx-0.1.28-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 505
diff changeset
364 break;
cd3117ad9aab nginx-0.1.28-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 505
diff changeset
365 }
cd3117ad9aab nginx-0.1.28-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 505
diff changeset
366
832
fe681917a24d style fix
Igor Sysoev <igor@sysoev.ru>
parents: 831
diff changeset
367 if ((ch >= '0' && ch <= '9') || ch == '.' || ch == '-') {
489
45a460f82aec nginx-0.1.19-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 485
diff changeset
368 break;
45a460f82aec nginx-0.1.19-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 485
diff changeset
369 }
45a460f82aec nginx-0.1.19-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 485
diff changeset
370
4313
e7db97bfac25 Added support for IP-literal in the Host header and request line (ticket #1).
Valentin Bartenev <vbart@nginx.com>
parents: 4125
diff changeset
371 /* fall through */
e7db97bfac25 Added support for IP-literal in the Host header and request line (ticket #1).
Valentin Bartenev <vbart@nginx.com>
parents: 4125
diff changeset
372
e7db97bfac25 Added support for IP-literal in the Host header and request line (ticket #1).
Valentin Bartenev <vbart@nginx.com>
parents: 4125
diff changeset
373 case sw_host_end:
e7db97bfac25 Added support for IP-literal in the Host header and request line (ticket #1).
Valentin Bartenev <vbart@nginx.com>
parents: 4125
diff changeset
374
1584
25427a0e9559 allow full URL without URI part: "GET http://host HTTP/1.0"
Igor Sysoev <igor@sysoev.ru>
parents: 1196
diff changeset
375 r->host_end = p;
25427a0e9559 allow full URL without URI part: "GET http://host HTTP/1.0"
Igor Sysoev <igor@sysoev.ru>
parents: 1196
diff changeset
376
314
d71c87d11b16 nginx-0.0.3-2004-04-14-09:57:36 import
Igor Sysoev <igor@sysoev.ru>
parents: 291
diff changeset
377 switch (ch) {
d71c87d11b16 nginx-0.0.3-2004-04-14-09:57:36 import
Igor Sysoev <igor@sysoev.ru>
parents: 291
diff changeset
378 case ':':
d71c87d11b16 nginx-0.0.3-2004-04-14-09:57:36 import
Igor Sysoev <igor@sysoev.ru>
parents: 291
diff changeset
379 state = sw_port;
d71c87d11b16 nginx-0.0.3-2004-04-14-09:57:36 import
Igor Sysoev <igor@sysoev.ru>
parents: 291
diff changeset
380 break;
d71c87d11b16 nginx-0.0.3-2004-04-14-09:57:36 import
Igor Sysoev <igor@sysoev.ru>
parents: 291
diff changeset
381 case '/':
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 473
diff changeset
382 r->uri_start = p;
314
d71c87d11b16 nginx-0.0.3-2004-04-14-09:57:36 import
Igor Sysoev <igor@sysoev.ru>
parents: 291
diff changeset
383 state = sw_after_slash_in_uri;
d71c87d11b16 nginx-0.0.3-2004-04-14-09:57:36 import
Igor Sysoev <igor@sysoev.ru>
parents: 291
diff changeset
384 break;
1584
25427a0e9559 allow full URL without URI part: "GET http://host HTTP/1.0"
Igor Sysoev <igor@sysoev.ru>
parents: 1196
diff changeset
385 case ' ':
25427a0e9559 allow full URL without URI part: "GET http://host HTTP/1.0"
Igor Sysoev <igor@sysoev.ru>
parents: 1196
diff changeset
386 /*
25427a0e9559 allow full URL without URI part: "GET http://host HTTP/1.0"
Igor Sysoev <igor@sysoev.ru>
parents: 1196
diff changeset
387 * use single "/" from request line to preserve pointers,
25427a0e9559 allow full URL without URI part: "GET http://host HTTP/1.0"
Igor Sysoev <igor@sysoev.ru>
parents: 1196
diff changeset
388 * if request line will be copied to large client buffer
25427a0e9559 allow full URL without URI part: "GET http://host HTTP/1.0"
Igor Sysoev <igor@sysoev.ru>
parents: 1196
diff changeset
389 */
25427a0e9559 allow full URL without URI part: "GET http://host HTTP/1.0"
Igor Sysoev <igor@sysoev.ru>
parents: 1196
diff changeset
390 r->uri_start = r->schema_end + 1;
25427a0e9559 allow full URL without URI part: "GET http://host HTTP/1.0"
Igor Sysoev <igor@sysoev.ru>
parents: 1196
diff changeset
391 r->uri_end = r->schema_end + 2;
3615
31e9677b15a1 allow spaces in URI
Igor Sysoev <igor@sysoev.ru>
parents: 3613
diff changeset
392 state = sw_host_http_09;
1584
25427a0e9559 allow full URL without URI part: "GET http://host HTTP/1.0"
Igor Sysoev <igor@sysoev.ru>
parents: 1196
diff changeset
393 break;
314
d71c87d11b16 nginx-0.0.3-2004-04-14-09:57:36 import
Igor Sysoev <igor@sysoev.ru>
parents: 291
diff changeset
394 default:
d71c87d11b16 nginx-0.0.3-2004-04-14-09:57:36 import
Igor Sysoev <igor@sysoev.ru>
parents: 291
diff changeset
395 return NGX_HTTP_PARSE_INVALID_REQUEST;
d71c87d11b16 nginx-0.0.3-2004-04-14-09:57:36 import
Igor Sysoev <igor@sysoev.ru>
parents: 291
diff changeset
396 }
d71c87d11b16 nginx-0.0.3-2004-04-14-09:57:36 import
Igor Sysoev <igor@sysoev.ru>
parents: 291
diff changeset
397 break;
d71c87d11b16 nginx-0.0.3-2004-04-14-09:57:36 import
Igor Sysoev <igor@sysoev.ru>
parents: 291
diff changeset
398
4313
e7db97bfac25 Added support for IP-literal in the Host header and request line (ticket #1).
Valentin Bartenev <vbart@nginx.com>
parents: 4125
diff changeset
399 case sw_host_ip_literal:
e7db97bfac25 Added support for IP-literal in the Host header and request line (ticket #1).
Valentin Bartenev <vbart@nginx.com>
parents: 4125
diff changeset
400
e7db97bfac25 Added support for IP-literal in the Host header and request line (ticket #1).
Valentin Bartenev <vbart@nginx.com>
parents: 4125
diff changeset
401 if (ch >= '0' && ch <= '9') {
e7db97bfac25 Added support for IP-literal in the Host header and request line (ticket #1).
Valentin Bartenev <vbart@nginx.com>
parents: 4125
diff changeset
402 break;
e7db97bfac25 Added support for IP-literal in the Host header and request line (ticket #1).
Valentin Bartenev <vbart@nginx.com>
parents: 4125
diff changeset
403 }
e7db97bfac25 Added support for IP-literal in the Host header and request line (ticket #1).
Valentin Bartenev <vbart@nginx.com>
parents: 4125
diff changeset
404
e7db97bfac25 Added support for IP-literal in the Host header and request line (ticket #1).
Valentin Bartenev <vbart@nginx.com>
parents: 4125
diff changeset
405 c = (u_char) (ch | 0x20);
e7db97bfac25 Added support for IP-literal in the Host header and request line (ticket #1).
Valentin Bartenev <vbart@nginx.com>
parents: 4125
diff changeset
406 if (c >= 'a' && c <= 'z') {
e7db97bfac25 Added support for IP-literal in the Host header and request line (ticket #1).
Valentin Bartenev <vbart@nginx.com>
parents: 4125
diff changeset
407 break;
e7db97bfac25 Added support for IP-literal in the Host header and request line (ticket #1).
Valentin Bartenev <vbart@nginx.com>
parents: 4125
diff changeset
408 }
e7db97bfac25 Added support for IP-literal in the Host header and request line (ticket #1).
Valentin Bartenev <vbart@nginx.com>
parents: 4125
diff changeset
409
e7db97bfac25 Added support for IP-literal in the Host header and request line (ticket #1).
Valentin Bartenev <vbart@nginx.com>
parents: 4125
diff changeset
410 switch (ch) {
e7db97bfac25 Added support for IP-literal in the Host header and request line (ticket #1).
Valentin Bartenev <vbart@nginx.com>
parents: 4125
diff changeset
411 case ':':
e7db97bfac25 Added support for IP-literal in the Host header and request line (ticket #1).
Valentin Bartenev <vbart@nginx.com>
parents: 4125
diff changeset
412 break;
e7db97bfac25 Added support for IP-literal in the Host header and request line (ticket #1).
Valentin Bartenev <vbart@nginx.com>
parents: 4125
diff changeset
413 case ']':
e7db97bfac25 Added support for IP-literal in the Host header and request line (ticket #1).
Valentin Bartenev <vbart@nginx.com>
parents: 4125
diff changeset
414 state = sw_host_end;
e7db97bfac25 Added support for IP-literal in the Host header and request line (ticket #1).
Valentin Bartenev <vbart@nginx.com>
parents: 4125
diff changeset
415 break;
e7db97bfac25 Added support for IP-literal in the Host header and request line (ticket #1).
Valentin Bartenev <vbart@nginx.com>
parents: 4125
diff changeset
416 case '-':
e7db97bfac25 Added support for IP-literal in the Host header and request line (ticket #1).
Valentin Bartenev <vbart@nginx.com>
parents: 4125
diff changeset
417 case '.':
e7db97bfac25 Added support for IP-literal in the Host header and request line (ticket #1).
Valentin Bartenev <vbart@nginx.com>
parents: 4125
diff changeset
418 case '_':
e7db97bfac25 Added support for IP-literal in the Host header and request line (ticket #1).
Valentin Bartenev <vbart@nginx.com>
parents: 4125
diff changeset
419 case '~':
e7db97bfac25 Added support for IP-literal in the Host header and request line (ticket #1).
Valentin Bartenev <vbart@nginx.com>
parents: 4125
diff changeset
420 /* unreserved */
e7db97bfac25 Added support for IP-literal in the Host header and request line (ticket #1).
Valentin Bartenev <vbart@nginx.com>
parents: 4125
diff changeset
421 break;
e7db97bfac25 Added support for IP-literal in the Host header and request line (ticket #1).
Valentin Bartenev <vbart@nginx.com>
parents: 4125
diff changeset
422 case '!':
e7db97bfac25 Added support for IP-literal in the Host header and request line (ticket #1).
Valentin Bartenev <vbart@nginx.com>
parents: 4125
diff changeset
423 case '$':
e7db97bfac25 Added support for IP-literal in the Host header and request line (ticket #1).
Valentin Bartenev <vbart@nginx.com>
parents: 4125
diff changeset
424 case '&':
e7db97bfac25 Added support for IP-literal in the Host header and request line (ticket #1).
Valentin Bartenev <vbart@nginx.com>
parents: 4125
diff changeset
425 case '\'':
e7db97bfac25 Added support for IP-literal in the Host header and request line (ticket #1).
Valentin Bartenev <vbart@nginx.com>
parents: 4125
diff changeset
426 case '(':
e7db97bfac25 Added support for IP-literal in the Host header and request line (ticket #1).
Valentin Bartenev <vbart@nginx.com>
parents: 4125
diff changeset
427 case ')':
e7db97bfac25 Added support for IP-literal in the Host header and request line (ticket #1).
Valentin Bartenev <vbart@nginx.com>
parents: 4125
diff changeset
428 case '*':
e7db97bfac25 Added support for IP-literal in the Host header and request line (ticket #1).
Valentin Bartenev <vbart@nginx.com>
parents: 4125
diff changeset
429 case '+':
e7db97bfac25 Added support for IP-literal in the Host header and request line (ticket #1).
Valentin Bartenev <vbart@nginx.com>
parents: 4125
diff changeset
430 case ',':
e7db97bfac25 Added support for IP-literal in the Host header and request line (ticket #1).
Valentin Bartenev <vbart@nginx.com>
parents: 4125
diff changeset
431 case ';':
e7db97bfac25 Added support for IP-literal in the Host header and request line (ticket #1).
Valentin Bartenev <vbart@nginx.com>
parents: 4125
diff changeset
432 case '=':
e7db97bfac25 Added support for IP-literal in the Host header and request line (ticket #1).
Valentin Bartenev <vbart@nginx.com>
parents: 4125
diff changeset
433 /* sub-delims */
e7db97bfac25 Added support for IP-literal in the Host header and request line (ticket #1).
Valentin Bartenev <vbart@nginx.com>
parents: 4125
diff changeset
434 break;
e7db97bfac25 Added support for IP-literal in the Host header and request line (ticket #1).
Valentin Bartenev <vbart@nginx.com>
parents: 4125
diff changeset
435 default:
e7db97bfac25 Added support for IP-literal in the Host header and request line (ticket #1).
Valentin Bartenev <vbart@nginx.com>
parents: 4125
diff changeset
436 return NGX_HTTP_PARSE_INVALID_REQUEST;
e7db97bfac25 Added support for IP-literal in the Host header and request line (ticket #1).
Valentin Bartenev <vbart@nginx.com>
parents: 4125
diff changeset
437 }
e7db97bfac25 Added support for IP-literal in the Host header and request line (ticket #1).
Valentin Bartenev <vbart@nginx.com>
parents: 4125
diff changeset
438 break;
e7db97bfac25 Added support for IP-literal in the Host header and request line (ticket #1).
Valentin Bartenev <vbart@nginx.com>
parents: 4125
diff changeset
439
314
d71c87d11b16 nginx-0.0.3-2004-04-14-09:57:36 import
Igor Sysoev <igor@sysoev.ru>
parents: 291
diff changeset
440 case sw_port:
489
45a460f82aec nginx-0.1.19-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 485
diff changeset
441 if (ch >= '0' && ch <= '9') {
45a460f82aec nginx-0.1.19-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 485
diff changeset
442 break;
45a460f82aec nginx-0.1.19-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 485
diff changeset
443 }
45a460f82aec nginx-0.1.19-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 485
diff changeset
444
314
d71c87d11b16 nginx-0.0.3-2004-04-14-09:57:36 import
Igor Sysoev <igor@sysoev.ru>
parents: 291
diff changeset
445 switch (ch) {
d71c87d11b16 nginx-0.0.3-2004-04-14-09:57:36 import
Igor Sysoev <igor@sysoev.ru>
parents: 291
diff changeset
446 case '/':
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 473
diff changeset
447 r->port_end = p;
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 473
diff changeset
448 r->uri_start = p;
314
d71c87d11b16 nginx-0.0.3-2004-04-14-09:57:36 import
Igor Sysoev <igor@sysoev.ru>
parents: 291
diff changeset
449 state = sw_after_slash_in_uri;
d71c87d11b16 nginx-0.0.3-2004-04-14-09:57:36 import
Igor Sysoev <igor@sysoev.ru>
parents: 291
diff changeset
450 break;
1584
25427a0e9559 allow full URL without URI part: "GET http://host HTTP/1.0"
Igor Sysoev <igor@sysoev.ru>
parents: 1196
diff changeset
451 case ' ':
25427a0e9559 allow full URL without URI part: "GET http://host HTTP/1.0"
Igor Sysoev <igor@sysoev.ru>
parents: 1196
diff changeset
452 r->port_end = p;
25427a0e9559 allow full URL without URI part: "GET http://host HTTP/1.0"
Igor Sysoev <igor@sysoev.ru>
parents: 1196
diff changeset
453 /*
25427a0e9559 allow full URL without URI part: "GET http://host HTTP/1.0"
Igor Sysoev <igor@sysoev.ru>
parents: 1196
diff changeset
454 * use single "/" from request line to preserve pointers,
25427a0e9559 allow full URL without URI part: "GET http://host HTTP/1.0"
Igor Sysoev <igor@sysoev.ru>
parents: 1196
diff changeset
455 * if request line will be copied to large client buffer
25427a0e9559 allow full URL without URI part: "GET http://host HTTP/1.0"
Igor Sysoev <igor@sysoev.ru>
parents: 1196
diff changeset
456 */
25427a0e9559 allow full URL without URI part: "GET http://host HTTP/1.0"
Igor Sysoev <igor@sysoev.ru>
parents: 1196
diff changeset
457 r->uri_start = r->schema_end + 1;
25427a0e9559 allow full URL without URI part: "GET http://host HTTP/1.0"
Igor Sysoev <igor@sysoev.ru>
parents: 1196
diff changeset
458 r->uri_end = r->schema_end + 2;
3615
31e9677b15a1 allow spaces in URI
Igor Sysoev <igor@sysoev.ru>
parents: 3613
diff changeset
459 state = sw_host_http_09;
1584
25427a0e9559 allow full URL without URI part: "GET http://host HTTP/1.0"
Igor Sysoev <igor@sysoev.ru>
parents: 1196
diff changeset
460 break;
314
d71c87d11b16 nginx-0.0.3-2004-04-14-09:57:36 import
Igor Sysoev <igor@sysoev.ru>
parents: 291
diff changeset
461 default:
489
45a460f82aec nginx-0.1.19-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 485
diff changeset
462 return NGX_HTTP_PARSE_INVALID_REQUEST;
1
d220029ac7f3 nginx-0.0.1-2002-08-15-21:20:26 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
463 }
d220029ac7f3 nginx-0.0.1-2002-08-15-21:20:26 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
464 break;
d220029ac7f3 nginx-0.0.1-2002-08-15-21:20:26 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
465
3615
31e9677b15a1 allow spaces in URI
Igor Sysoev <igor@sysoev.ru>
parents: 3613
diff changeset
466 /* space+ after "http://host[:port] " */
31e9677b15a1 allow spaces in URI
Igor Sysoev <igor@sysoev.ru>
parents: 3613
diff changeset
467 case sw_host_http_09:
31e9677b15a1 allow spaces in URI
Igor Sysoev <igor@sysoev.ru>
parents: 3613
diff changeset
468 switch (ch) {
31e9677b15a1 allow spaces in URI
Igor Sysoev <igor@sysoev.ru>
parents: 3613
diff changeset
469 case ' ':
31e9677b15a1 allow spaces in URI
Igor Sysoev <igor@sysoev.ru>
parents: 3613
diff changeset
470 break;
31e9677b15a1 allow spaces in URI
Igor Sysoev <igor@sysoev.ru>
parents: 3613
diff changeset
471 case CR:
31e9677b15a1 allow spaces in URI
Igor Sysoev <igor@sysoev.ru>
parents: 3613
diff changeset
472 r->http_minor = 9;
31e9677b15a1 allow spaces in URI
Igor Sysoev <igor@sysoev.ru>
parents: 3613
diff changeset
473 state = sw_almost_done;
31e9677b15a1 allow spaces in URI
Igor Sysoev <igor@sysoev.ru>
parents: 3613
diff changeset
474 break;
31e9677b15a1 allow spaces in URI
Igor Sysoev <igor@sysoev.ru>
parents: 3613
diff changeset
475 case LF:
31e9677b15a1 allow spaces in URI
Igor Sysoev <igor@sysoev.ru>
parents: 3613
diff changeset
476 r->http_minor = 9;
31e9677b15a1 allow spaces in URI
Igor Sysoev <igor@sysoev.ru>
parents: 3613
diff changeset
477 goto done;
31e9677b15a1 allow spaces in URI
Igor Sysoev <igor@sysoev.ru>
parents: 3613
diff changeset
478 case 'H':
31e9677b15a1 allow spaces in URI
Igor Sysoev <igor@sysoev.ru>
parents: 3613
diff changeset
479 r->http_protocol.data = p;
31e9677b15a1 allow spaces in URI
Igor Sysoev <igor@sysoev.ru>
parents: 3613
diff changeset
480 state = sw_http_H;
31e9677b15a1 allow spaces in URI
Igor Sysoev <igor@sysoev.ru>
parents: 3613
diff changeset
481 break;
31e9677b15a1 allow spaces in URI
Igor Sysoev <igor@sysoev.ru>
parents: 3613
diff changeset
482 default:
31e9677b15a1 allow spaces in URI
Igor Sysoev <igor@sysoev.ru>
parents: 3613
diff changeset
483 return NGX_HTTP_PARSE_INVALID_REQUEST;
31e9677b15a1 allow spaces in URI
Igor Sysoev <igor@sysoev.ru>
parents: 3613
diff changeset
484 }
31e9677b15a1 allow spaces in URI
Igor Sysoev <igor@sysoev.ru>
parents: 3613
diff changeset
485 break;
31e9677b15a1 allow spaces in URI
Igor Sysoev <igor@sysoev.ru>
parents: 3613
diff changeset
486
31e9677b15a1 allow spaces in URI
Igor Sysoev <igor@sysoev.ru>
parents: 3613
diff changeset
487
461
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
488 /* check "/.", "//", "%", and "\" (Win32) in URI */
7
b5481d6fbbd4 nginx-0.0.1-2002-08-29-20:59:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 1
diff changeset
489 case sw_after_slash_in_uri:
489
45a460f82aec nginx-0.1.19-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 485
diff changeset
490
6626
b3682580c1bd Avoid left-shifting integers into the sign bit, which is undefined.
Sergey Kandaurov <pluknet@nginx.com>
parents: 6543
diff changeset
491 if (usual[ch >> 5] & (1U << (ch & 0x1f))) {
489
45a460f82aec nginx-0.1.19-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 485
diff changeset
492 state = sw_check_uri;
45a460f82aec nginx-0.1.19-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 485
diff changeset
493 break;
45a460f82aec nginx-0.1.19-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 485
diff changeset
494 }
45a460f82aec nginx-0.1.19-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 485
diff changeset
495
1
d220029ac7f3 nginx-0.0.1-2002-08-15-21:20:26 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
496 switch (ch) {
489
45a460f82aec nginx-0.1.19-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 485
diff changeset
497 case ' ':
45a460f82aec nginx-0.1.19-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 485
diff changeset
498 r->uri_end = p;
3615
31e9677b15a1 allow spaces in URI
Igor Sysoev <igor@sysoev.ru>
parents: 3613
diff changeset
499 state = sw_check_uri_http_09;
489
45a460f82aec nginx-0.1.19-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 485
diff changeset
500 break;
1
d220029ac7f3 nginx-0.0.1-2002-08-15-21:20:26 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
501 case CR:
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 473
diff changeset
502 r->uri_end = p;
1
d220029ac7f3 nginx-0.0.1-2002-08-15-21:20:26 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
503 r->http_minor = 9;
7
b5481d6fbbd4 nginx-0.0.1-2002-08-29-20:59:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 1
diff changeset
504 state = sw_almost_done;
1
d220029ac7f3 nginx-0.0.1-2002-08-15-21:20:26 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
505 break;
d220029ac7f3 nginx-0.0.1-2002-08-15-21:20:26 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
506 case LF:
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 473
diff changeset
507 r->uri_end = p;
1
d220029ac7f3 nginx-0.0.1-2002-08-15-21:20:26 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
508 r->http_minor = 9;
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 473
diff changeset
509 goto done;
1
d220029ac7f3 nginx-0.0.1-2002-08-15-21:20:26 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
510 case '.':
452
23fb87bddda1 nginx-0.1.1-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 444
diff changeset
511 r->complex_uri = 1;
23fb87bddda1 nginx-0.1.1-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 444
diff changeset
512 state = sw_uri;
23fb87bddda1 nginx-0.1.1-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 444
diff changeset
513 break;
99
a059e1aa65d4 nginx-0.0.1-2003-06-02-19:24:30 import
Igor Sysoev <igor@sysoev.ru>
parents: 91
diff changeset
514 case '%':
452
23fb87bddda1 nginx-0.1.1-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 444
diff changeset
515 r->quoted_uri = 1;
7
b5481d6fbbd4 nginx-0.0.1-2002-08-29-20:59:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 1
diff changeset
516 state = sw_uri;
1
d220029ac7f3 nginx-0.0.1-2002-08-15-21:20:26 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
517 break;
489
45a460f82aec nginx-0.1.19-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 485
diff changeset
518 case '/':
45a460f82aec nginx-0.1.19-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 485
diff changeset
519 r->complex_uri = 1;
45a460f82aec nginx-0.1.19-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 485
diff changeset
520 state = sw_uri;
45a460f82aec nginx-0.1.19-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 485
diff changeset
521 break;
461
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
522 #if (NGX_WIN32)
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
523 case '\\':
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
524 r->complex_uri = 1;
489
45a460f82aec nginx-0.1.19-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 485
diff changeset
525 state = sw_uri;
461
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
526 break;
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
527 #endif
489
45a460f82aec nginx-0.1.19-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 485
diff changeset
528 case '?':
45a460f82aec nginx-0.1.19-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 485
diff changeset
529 r->args_start = p + 1;
45a460f82aec nginx-0.1.19-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 485
diff changeset
530 state = sw_uri;
1
d220029ac7f3 nginx-0.0.1-2002-08-15-21:20:26 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
531 break;
820
cdbe991cbdf5 omit "#fragment"
Igor Sysoev <igor@sysoev.ru>
parents: 819
diff changeset
532 case '#':
cdbe991cbdf5 omit "#fragment"
Igor Sysoev <igor@sysoev.ru>
parents: 819
diff changeset
533 r->complex_uri = 1;
cdbe991cbdf5 omit "#fragment"
Igor Sysoev <igor@sysoev.ru>
parents: 819
diff changeset
534 state = sw_uri;
cdbe991cbdf5 omit "#fragment"
Igor Sysoev <igor@sysoev.ru>
parents: 819
diff changeset
535 break;
485
4ebe09b07e30 nginx-0.1.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 479
diff changeset
536 case '+':
4ebe09b07e30 nginx-0.1.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 479
diff changeset
537 r->plus_in_uri = 1;
4ebe09b07e30 nginx-0.1.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 479
diff changeset
538 break;
489
45a460f82aec nginx-0.1.19-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 485
diff changeset
539 case '\0':
3527
84905c7b2aa7 remove r->zero_in_uri
Igor Sysoev <igor@sysoev.ru>
parents: 3161
diff changeset
540 return NGX_HTTP_PARSE_INVALID_REQUEST;
1
d220029ac7f3 nginx-0.0.1-2002-08-15-21:20:26 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
541 default:
7
b5481d6fbbd4 nginx-0.0.1-2002-08-29-20:59:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 1
diff changeset
542 state = sw_check_uri;
1
d220029ac7f3 nginx-0.0.1-2002-08-15-21:20:26 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
543 break;
d220029ac7f3 nginx-0.0.1-2002-08-15-21:20:26 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
544 }
d220029ac7f3 nginx-0.0.1-2002-08-15-21:20:26 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
545 break;
d220029ac7f3 nginx-0.0.1-2002-08-15-21:20:26 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
546
461
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
547 /* check "/", "%" and "\" (Win32) in URI */
7
b5481d6fbbd4 nginx-0.0.1-2002-08-29-20:59:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 1
diff changeset
548 case sw_check_uri:
489
45a460f82aec nginx-0.1.19-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 485
diff changeset
549
6626
b3682580c1bd Avoid left-shifting integers into the sign bit, which is undefined.
Sergey Kandaurov <pluknet@nginx.com>
parents: 6543
diff changeset
550 if (usual[ch >> 5] & (1U << (ch & 0x1f))) {
489
45a460f82aec nginx-0.1.19-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 485
diff changeset
551 break;
45a460f82aec nginx-0.1.19-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 485
diff changeset
552 }
45a460f82aec nginx-0.1.19-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 485
diff changeset
553
1
d220029ac7f3 nginx-0.0.1-2002-08-15-21:20:26 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
554 switch (ch) {
489
45a460f82aec nginx-0.1.19-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 485
diff changeset
555 case '/':
4674
5d86ab8f2340 Win32: normalization of trailing dot inside uri.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4572
diff changeset
556 #if (NGX_WIN32)
5d86ab8f2340 Win32: normalization of trailing dot inside uri.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4572
diff changeset
557 if (r->uri_ext == p) {
5d86ab8f2340 Win32: normalization of trailing dot inside uri.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4572
diff changeset
558 r->complex_uri = 1;
5d86ab8f2340 Win32: normalization of trailing dot inside uri.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4572
diff changeset
559 state = sw_uri;
5d86ab8f2340 Win32: normalization of trailing dot inside uri.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4572
diff changeset
560 break;
5d86ab8f2340 Win32: normalization of trailing dot inside uri.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4572
diff changeset
561 }
5d86ab8f2340 Win32: normalization of trailing dot inside uri.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4572
diff changeset
562 #endif
489
45a460f82aec nginx-0.1.19-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 485
diff changeset
563 r->uri_ext = NULL;
45a460f82aec nginx-0.1.19-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 485
diff changeset
564 state = sw_after_slash_in_uri;
45a460f82aec nginx-0.1.19-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 485
diff changeset
565 break;
45a460f82aec nginx-0.1.19-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 485
diff changeset
566 case '.':
45a460f82aec nginx-0.1.19-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 485
diff changeset
567 r->uri_ext = p + 1;
45a460f82aec nginx-0.1.19-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 485
diff changeset
568 break;
45a460f82aec nginx-0.1.19-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 485
diff changeset
569 case ' ':
45a460f82aec nginx-0.1.19-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 485
diff changeset
570 r->uri_end = p;
3615
31e9677b15a1 allow spaces in URI
Igor Sysoev <igor@sysoev.ru>
parents: 3613
diff changeset
571 state = sw_check_uri_http_09;
489
45a460f82aec nginx-0.1.19-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 485
diff changeset
572 break;
1
d220029ac7f3 nginx-0.0.1-2002-08-15-21:20:26 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
573 case CR:
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 473
diff changeset
574 r->uri_end = p;
1
d220029ac7f3 nginx-0.0.1-2002-08-15-21:20:26 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
575 r->http_minor = 9;
7
b5481d6fbbd4 nginx-0.0.1-2002-08-29-20:59:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 1
diff changeset
576 state = sw_almost_done;
1
d220029ac7f3 nginx-0.0.1-2002-08-15-21:20:26 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
577 break;
d220029ac7f3 nginx-0.0.1-2002-08-15-21:20:26 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
578 case LF:
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 473
diff changeset
579 r->uri_end = p;
1
d220029ac7f3 nginx-0.0.1-2002-08-15-21:20:26 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
580 r->http_minor = 9;
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 473
diff changeset
581 goto done;
461
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
582 #if (NGX_WIN32)
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
583 case '\\':
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
584 r->complex_uri = 1;
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
585 state = sw_after_slash_in_uri;
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
586 break;
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
587 #endif
489
45a460f82aec nginx-0.1.19-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 485
diff changeset
588 case '%':
45a460f82aec nginx-0.1.19-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 485
diff changeset
589 r->quoted_uri = 1;
45a460f82aec nginx-0.1.19-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 485
diff changeset
590 state = sw_uri;
1
d220029ac7f3 nginx-0.0.1-2002-08-15-21:20:26 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
591 break;
d220029ac7f3 nginx-0.0.1-2002-08-15-21:20:26 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
592 case '?':
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 473
diff changeset
593 r->args_start = p + 1;
7
b5481d6fbbd4 nginx-0.0.1-2002-08-29-20:59:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 1
diff changeset
594 state = sw_uri;
1
d220029ac7f3 nginx-0.0.1-2002-08-15-21:20:26 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
595 break;
820
cdbe991cbdf5 omit "#fragment"
Igor Sysoev <igor@sysoev.ru>
parents: 819
diff changeset
596 case '#':
cdbe991cbdf5 omit "#fragment"
Igor Sysoev <igor@sysoev.ru>
parents: 819
diff changeset
597 r->complex_uri = 1;
cdbe991cbdf5 omit "#fragment"
Igor Sysoev <igor@sysoev.ru>
parents: 819
diff changeset
598 state = sw_uri;
cdbe991cbdf5 omit "#fragment"
Igor Sysoev <igor@sysoev.ru>
parents: 819
diff changeset
599 break;
657
400711951595 nginx-0.3.50-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
600 case '+':
400711951595 nginx-0.3.50-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
601 r->plus_in_uri = 1;
400711951595 nginx-0.3.50-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
602 break;
489
45a460f82aec nginx-0.1.19-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 485
diff changeset
603 case '\0':
3527
84905c7b2aa7 remove r->zero_in_uri
Igor Sysoev <igor@sysoev.ru>
parents: 3161
diff changeset
604 return NGX_HTTP_PARSE_INVALID_REQUEST;
1
d220029ac7f3 nginx-0.0.1-2002-08-15-21:20:26 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
605 }
d220029ac7f3 nginx-0.0.1-2002-08-15-21:20:26 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
606 break;
d220029ac7f3 nginx-0.0.1-2002-08-15-21:20:26 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
607
3615
31e9677b15a1 allow spaces in URI
Igor Sysoev <igor@sysoev.ru>
parents: 3613
diff changeset
608 /* space+ after URI */
31e9677b15a1 allow spaces in URI
Igor Sysoev <igor@sysoev.ru>
parents: 3613
diff changeset
609 case sw_check_uri_http_09:
31e9677b15a1 allow spaces in URI
Igor Sysoev <igor@sysoev.ru>
parents: 3613
diff changeset
610 switch (ch) {
31e9677b15a1 allow spaces in URI
Igor Sysoev <igor@sysoev.ru>
parents: 3613
diff changeset
611 case ' ':
31e9677b15a1 allow spaces in URI
Igor Sysoev <igor@sysoev.ru>
parents: 3613
diff changeset
612 break;
31e9677b15a1 allow spaces in URI
Igor Sysoev <igor@sysoev.ru>
parents: 3613
diff changeset
613 case CR:
31e9677b15a1 allow spaces in URI
Igor Sysoev <igor@sysoev.ru>
parents: 3613
diff changeset
614 r->http_minor = 9;
31e9677b15a1 allow spaces in URI
Igor Sysoev <igor@sysoev.ru>
parents: 3613
diff changeset
615 state = sw_almost_done;
31e9677b15a1 allow spaces in URI
Igor Sysoev <igor@sysoev.ru>
parents: 3613
diff changeset
616 break;
31e9677b15a1 allow spaces in URI
Igor Sysoev <igor@sysoev.ru>
parents: 3613
diff changeset
617 case LF:
31e9677b15a1 allow spaces in URI
Igor Sysoev <igor@sysoev.ru>
parents: 3613
diff changeset
618 r->http_minor = 9;
31e9677b15a1 allow spaces in URI
Igor Sysoev <igor@sysoev.ru>
parents: 3613
diff changeset
619 goto done;
31e9677b15a1 allow spaces in URI
Igor Sysoev <igor@sysoev.ru>
parents: 3613
diff changeset
620 case 'H':
31e9677b15a1 allow spaces in URI
Igor Sysoev <igor@sysoev.ru>
parents: 3613
diff changeset
621 r->http_protocol.data = p;
31e9677b15a1 allow spaces in URI
Igor Sysoev <igor@sysoev.ru>
parents: 3613
diff changeset
622 state = sw_http_H;
31e9677b15a1 allow spaces in URI
Igor Sysoev <igor@sysoev.ru>
parents: 3613
diff changeset
623 break;
31e9677b15a1 allow spaces in URI
Igor Sysoev <igor@sysoev.ru>
parents: 3613
diff changeset
624 default:
31e9677b15a1 allow spaces in URI
Igor Sysoev <igor@sysoev.ru>
parents: 3613
diff changeset
625 r->space_in_uri = 1;
31e9677b15a1 allow spaces in URI
Igor Sysoev <igor@sysoev.ru>
parents: 3613
diff changeset
626 state = sw_check_uri;
5442
63f960bbc52f Proper backtracking after space in a request line.
Ruslan Ermilov <ru@nginx.com>
parents: 5328
diff changeset
627 p--;
3615
31e9677b15a1 allow spaces in URI
Igor Sysoev <igor@sysoev.ru>
parents: 3613
diff changeset
628 break;
31e9677b15a1 allow spaces in URI
Igor Sysoev <igor@sysoev.ru>
parents: 3613
diff changeset
629 }
31e9677b15a1 allow spaces in URI
Igor Sysoev <igor@sysoev.ru>
parents: 3613
diff changeset
630 break;
31e9677b15a1 allow spaces in URI
Igor Sysoev <igor@sysoev.ru>
parents: 3613
diff changeset
631
31e9677b15a1 allow spaces in URI
Igor Sysoev <igor@sysoev.ru>
parents: 3613
diff changeset
632
1
d220029ac7f3 nginx-0.0.1-2002-08-15-21:20:26 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
633 /* URI */
7
b5481d6fbbd4 nginx-0.0.1-2002-08-29-20:59:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 1
diff changeset
634 case sw_uri:
823
ccf3c59f8040 optimize the most frequent cases
Igor Sysoev <igor@sysoev.ru>
parents: 822
diff changeset
635
6626
b3682580c1bd Avoid left-shifting integers into the sign bit, which is undefined.
Sergey Kandaurov <pluknet@nginx.com>
parents: 6543
diff changeset
636 if (usual[ch >> 5] & (1U << (ch & 0x1f))) {
823
ccf3c59f8040 optimize the most frequent cases
Igor Sysoev <igor@sysoev.ru>
parents: 822
diff changeset
637 break;
ccf3c59f8040 optimize the most frequent cases
Igor Sysoev <igor@sysoev.ru>
parents: 822
diff changeset
638 }
ccf3c59f8040 optimize the most frequent cases
Igor Sysoev <igor@sysoev.ru>
parents: 822
diff changeset
639
1
d220029ac7f3 nginx-0.0.1-2002-08-15-21:20:26 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
640 switch (ch) {
489
45a460f82aec nginx-0.1.19-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 485
diff changeset
641 case ' ':
45a460f82aec nginx-0.1.19-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 485
diff changeset
642 r->uri_end = p;
45a460f82aec nginx-0.1.19-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 485
diff changeset
643 state = sw_http_09;
45a460f82aec nginx-0.1.19-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 485
diff changeset
644 break;
1
d220029ac7f3 nginx-0.0.1-2002-08-15-21:20:26 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
645 case CR:
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 473
diff changeset
646 r->uri_end = p;
1
d220029ac7f3 nginx-0.0.1-2002-08-15-21:20:26 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
647 r->http_minor = 9;
7
b5481d6fbbd4 nginx-0.0.1-2002-08-29-20:59:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 1
diff changeset
648 state = sw_almost_done;
1
d220029ac7f3 nginx-0.0.1-2002-08-15-21:20:26 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
649 break;
d220029ac7f3 nginx-0.0.1-2002-08-15-21:20:26 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
650 case LF:
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 473
diff changeset
651 r->uri_end = p;
1
d220029ac7f3 nginx-0.0.1-2002-08-15-21:20:26 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
652 r->http_minor = 9;
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 473
diff changeset
653 goto done;
820
cdbe991cbdf5 omit "#fragment"
Igor Sysoev <igor@sysoev.ru>
parents: 819
diff changeset
654 case '#':
cdbe991cbdf5 omit "#fragment"
Igor Sysoev <igor@sysoev.ru>
parents: 819
diff changeset
655 r->complex_uri = 1;
cdbe991cbdf5 omit "#fragment"
Igor Sysoev <igor@sysoev.ru>
parents: 819
diff changeset
656 break;
489
45a460f82aec nginx-0.1.19-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 485
diff changeset
657 case '\0':
3527
84905c7b2aa7 remove r->zero_in_uri
Igor Sysoev <igor@sysoev.ru>
parents: 3161
diff changeset
658 return NGX_HTTP_PARSE_INVALID_REQUEST;
1
d220029ac7f3 nginx-0.0.1-2002-08-15-21:20:26 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
659 }
d220029ac7f3 nginx-0.0.1-2002-08-15-21:20:26 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
660 break;
d220029ac7f3 nginx-0.0.1-2002-08-15-21:20:26 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
661
d220029ac7f3 nginx-0.0.1-2002-08-15-21:20:26 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
662 /* space+ after URI */
7
b5481d6fbbd4 nginx-0.0.1-2002-08-29-20:59:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 1
diff changeset
663 case sw_http_09:
1
d220029ac7f3 nginx-0.0.1-2002-08-15-21:20:26 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
664 switch (ch) {
d220029ac7f3 nginx-0.0.1-2002-08-15-21:20:26 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
665 case ' ':
d220029ac7f3 nginx-0.0.1-2002-08-15-21:20:26 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
666 break;
d220029ac7f3 nginx-0.0.1-2002-08-15-21:20:26 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
667 case CR:
d220029ac7f3 nginx-0.0.1-2002-08-15-21:20:26 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
668 r->http_minor = 9;
7
b5481d6fbbd4 nginx-0.0.1-2002-08-29-20:59:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 1
diff changeset
669 state = sw_almost_done;
1
d220029ac7f3 nginx-0.0.1-2002-08-15-21:20:26 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
670 break;
d220029ac7f3 nginx-0.0.1-2002-08-15-21:20:26 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
671 case LF:
d220029ac7f3 nginx-0.0.1-2002-08-15-21:20:26 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
672 r->http_minor = 9;
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 473
diff changeset
673 goto done;
1
d220029ac7f3 nginx-0.0.1-2002-08-15-21:20:26 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
674 case 'H':
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 473
diff changeset
675 r->http_protocol.data = p;
91
637625a2acdb nginx-0.0.1-2003-05-19-20:39:14 import
Igor Sysoev <igor@sysoev.ru>
parents: 89
diff changeset
676 state = sw_http_H;
637625a2acdb nginx-0.0.1-2003-05-19-20:39:14 import
Igor Sysoev <igor@sysoev.ru>
parents: 89
diff changeset
677 break;
637625a2acdb nginx-0.0.1-2003-05-19-20:39:14 import
Igor Sysoev <igor@sysoev.ru>
parents: 89
diff changeset
678 default:
3615
31e9677b15a1 allow spaces in URI
Igor Sysoev <igor@sysoev.ru>
parents: 3613
diff changeset
679 r->space_in_uri = 1;
31e9677b15a1 allow spaces in URI
Igor Sysoev <igor@sysoev.ru>
parents: 3613
diff changeset
680 state = sw_uri;
5442
63f960bbc52f Proper backtracking after space in a request line.
Ruslan Ermilov <ru@nginx.com>
parents: 5328
diff changeset
681 p--;
3615
31e9677b15a1 allow spaces in URI
Igor Sysoev <igor@sysoev.ru>
parents: 3613
diff changeset
682 break;
91
637625a2acdb nginx-0.0.1-2003-05-19-20:39:14 import
Igor Sysoev <igor@sysoev.ru>
parents: 89
diff changeset
683 }
637625a2acdb nginx-0.0.1-2003-05-19-20:39:14 import
Igor Sysoev <igor@sysoev.ru>
parents: 89
diff changeset
684 break;
637625a2acdb nginx-0.0.1-2003-05-19-20:39:14 import
Igor Sysoev <igor@sysoev.ru>
parents: 89
diff changeset
685
637625a2acdb nginx-0.0.1-2003-05-19-20:39:14 import
Igor Sysoev <igor@sysoev.ru>
parents: 89
diff changeset
686 case sw_http_H:
637625a2acdb nginx-0.0.1-2003-05-19-20:39:14 import
Igor Sysoev <igor@sysoev.ru>
parents: 89
diff changeset
687 switch (ch) {
637625a2acdb nginx-0.0.1-2003-05-19-20:39:14 import
Igor Sysoev <igor@sysoev.ru>
parents: 89
diff changeset
688 case 'T':
637625a2acdb nginx-0.0.1-2003-05-19-20:39:14 import
Igor Sysoev <igor@sysoev.ru>
parents: 89
diff changeset
689 state = sw_http_HT;
1
d220029ac7f3 nginx-0.0.1-2002-08-15-21:20:26 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
690 break;
d220029ac7f3 nginx-0.0.1-2002-08-15-21:20:26 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
691 default:
12
055ed05235ae nginx-0.0.1-2002-09-13-18:47:42 import
Igor Sysoev <igor@sysoev.ru>
parents: 9
diff changeset
692 return NGX_HTTP_PARSE_INVALID_REQUEST;
1
d220029ac7f3 nginx-0.0.1-2002-08-15-21:20:26 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
693 }
d220029ac7f3 nginx-0.0.1-2002-08-15-21:20:26 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
694 break;
d220029ac7f3 nginx-0.0.1-2002-08-15-21:20:26 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
695
91
637625a2acdb nginx-0.0.1-2003-05-19-20:39:14 import
Igor Sysoev <igor@sysoev.ru>
parents: 89
diff changeset
696 case sw_http_HT:
637625a2acdb nginx-0.0.1-2003-05-19-20:39:14 import
Igor Sysoev <igor@sysoev.ru>
parents: 89
diff changeset
697 switch (ch) {
637625a2acdb nginx-0.0.1-2003-05-19-20:39:14 import
Igor Sysoev <igor@sysoev.ru>
parents: 89
diff changeset
698 case 'T':
637625a2acdb nginx-0.0.1-2003-05-19-20:39:14 import
Igor Sysoev <igor@sysoev.ru>
parents: 89
diff changeset
699 state = sw_http_HTT;
637625a2acdb nginx-0.0.1-2003-05-19-20:39:14 import
Igor Sysoev <igor@sysoev.ru>
parents: 89
diff changeset
700 break;
637625a2acdb nginx-0.0.1-2003-05-19-20:39:14 import
Igor Sysoev <igor@sysoev.ru>
parents: 89
diff changeset
701 default:
12
055ed05235ae nginx-0.0.1-2002-09-13-18:47:42 import
Igor Sysoev <igor@sysoev.ru>
parents: 9
diff changeset
702 return NGX_HTTP_PARSE_INVALID_REQUEST;
44
0e81ac0bb3e2 nginx-0.0.1-2003-01-09-08:36:00 import
Igor Sysoev <igor@sysoev.ru>
parents: 26
diff changeset
703 }
91
637625a2acdb nginx-0.0.1-2003-05-19-20:39:14 import
Igor Sysoev <igor@sysoev.ru>
parents: 89
diff changeset
704 break;
1
d220029ac7f3 nginx-0.0.1-2002-08-15-21:20:26 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
705
91
637625a2acdb nginx-0.0.1-2003-05-19-20:39:14 import
Igor Sysoev <igor@sysoev.ru>
parents: 89
diff changeset
706 case sw_http_HTT:
637625a2acdb nginx-0.0.1-2003-05-19-20:39:14 import
Igor Sysoev <igor@sysoev.ru>
parents: 89
diff changeset
707 switch (ch) {
637625a2acdb nginx-0.0.1-2003-05-19-20:39:14 import
Igor Sysoev <igor@sysoev.ru>
parents: 89
diff changeset
708 case 'P':
637625a2acdb nginx-0.0.1-2003-05-19-20:39:14 import
Igor Sysoev <igor@sysoev.ru>
parents: 89
diff changeset
709 state = sw_http_HTTP;
637625a2acdb nginx-0.0.1-2003-05-19-20:39:14 import
Igor Sysoev <igor@sysoev.ru>
parents: 89
diff changeset
710 break;
637625a2acdb nginx-0.0.1-2003-05-19-20:39:14 import
Igor Sysoev <igor@sysoev.ru>
parents: 89
diff changeset
711 default:
637625a2acdb nginx-0.0.1-2003-05-19-20:39:14 import
Igor Sysoev <igor@sysoev.ru>
parents: 89
diff changeset
712 return NGX_HTTP_PARSE_INVALID_REQUEST;
637625a2acdb nginx-0.0.1-2003-05-19-20:39:14 import
Igor Sysoev <igor@sysoev.ru>
parents: 89
diff changeset
713 }
637625a2acdb nginx-0.0.1-2003-05-19-20:39:14 import
Igor Sysoev <igor@sysoev.ru>
parents: 89
diff changeset
714 break;
637625a2acdb nginx-0.0.1-2003-05-19-20:39:14 import
Igor Sysoev <igor@sysoev.ru>
parents: 89
diff changeset
715
637625a2acdb nginx-0.0.1-2003-05-19-20:39:14 import
Igor Sysoev <igor@sysoev.ru>
parents: 89
diff changeset
716 case sw_http_HTTP:
637625a2acdb nginx-0.0.1-2003-05-19-20:39:14 import
Igor Sysoev <igor@sysoev.ru>
parents: 89
diff changeset
717 switch (ch) {
637625a2acdb nginx-0.0.1-2003-05-19-20:39:14 import
Igor Sysoev <igor@sysoev.ru>
parents: 89
diff changeset
718 case '/':
637625a2acdb nginx-0.0.1-2003-05-19-20:39:14 import
Igor Sysoev <igor@sysoev.ru>
parents: 89
diff changeset
719 state = sw_first_major_digit;
637625a2acdb nginx-0.0.1-2003-05-19-20:39:14 import
Igor Sysoev <igor@sysoev.ru>
parents: 89
diff changeset
720 break;
637625a2acdb nginx-0.0.1-2003-05-19-20:39:14 import
Igor Sysoev <igor@sysoev.ru>
parents: 89
diff changeset
721 default:
637625a2acdb nginx-0.0.1-2003-05-19-20:39:14 import
Igor Sysoev <igor@sysoev.ru>
parents: 89
diff changeset
722 return NGX_HTTP_PARSE_INVALID_REQUEST;
637625a2acdb nginx-0.0.1-2003-05-19-20:39:14 import
Igor Sysoev <igor@sysoev.ru>
parents: 89
diff changeset
723 }
1
d220029ac7f3 nginx-0.0.1-2002-08-15-21:20:26 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
724 break;
d220029ac7f3 nginx-0.0.1-2002-08-15-21:20:26 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
725
d220029ac7f3 nginx-0.0.1-2002-08-15-21:20:26 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
726 /* first digit of major HTTP version */
7
b5481d6fbbd4 nginx-0.0.1-2002-08-29-20:59:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 1
diff changeset
727 case sw_first_major_digit:
44
0e81ac0bb3e2 nginx-0.0.1-2003-01-09-08:36:00 import
Igor Sysoev <igor@sysoev.ru>
parents: 26
diff changeset
728 if (ch < '1' || ch > '9') {
12
055ed05235ae nginx-0.0.1-2002-09-13-18:47:42 import
Igor Sysoev <igor@sysoev.ru>
parents: 9
diff changeset
729 return NGX_HTTP_PARSE_INVALID_REQUEST;
44
0e81ac0bb3e2 nginx-0.0.1-2003-01-09-08:36:00 import
Igor Sysoev <igor@sysoev.ru>
parents: 26
diff changeset
730 }
1
d220029ac7f3 nginx-0.0.1-2002-08-15-21:20:26 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
731
d220029ac7f3 nginx-0.0.1-2002-08-15-21:20:26 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
732 r->http_major = ch - '0';
6993
8801ff7d58e1 Don't pretend we support HTTP major versions >1 as HTTP/1.1.
Ruslan Ermilov <ru@nginx.com>
parents: 6732
diff changeset
733
8801ff7d58e1 Don't pretend we support HTTP major versions >1 as HTTP/1.1.
Ruslan Ermilov <ru@nginx.com>
parents: 6732
diff changeset
734 if (r->http_major > 1) {
8801ff7d58e1 Don't pretend we support HTTP major versions >1 as HTTP/1.1.
Ruslan Ermilov <ru@nginx.com>
parents: 6732
diff changeset
735 return NGX_HTTP_PARSE_INVALID_VERSION;
8801ff7d58e1 Don't pretend we support HTTP major versions >1 as HTTP/1.1.
Ruslan Ermilov <ru@nginx.com>
parents: 6732
diff changeset
736 }
8801ff7d58e1 Don't pretend we support HTTP major versions >1 as HTTP/1.1.
Ruslan Ermilov <ru@nginx.com>
parents: 6732
diff changeset
737
7
b5481d6fbbd4 nginx-0.0.1-2002-08-29-20:59:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 1
diff changeset
738 state = sw_major_digit;
1
d220029ac7f3 nginx-0.0.1-2002-08-15-21:20:26 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
739 break;
d220029ac7f3 nginx-0.0.1-2002-08-15-21:20:26 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
740
d220029ac7f3 nginx-0.0.1-2002-08-15-21:20:26 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
741 /* major HTTP version or dot */
7
b5481d6fbbd4 nginx-0.0.1-2002-08-29-20:59:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 1
diff changeset
742 case sw_major_digit:
1
d220029ac7f3 nginx-0.0.1-2002-08-15-21:20:26 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
743 if (ch == '.') {
7
b5481d6fbbd4 nginx-0.0.1-2002-08-29-20:59:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 1
diff changeset
744 state = sw_first_minor_digit;
1
d220029ac7f3 nginx-0.0.1-2002-08-15-21:20:26 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
745 break;
d220029ac7f3 nginx-0.0.1-2002-08-15-21:20:26 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
746 }
d220029ac7f3 nginx-0.0.1-2002-08-15-21:20:26 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
747
44
0e81ac0bb3e2 nginx-0.0.1-2003-01-09-08:36:00 import
Igor Sysoev <igor@sysoev.ru>
parents: 26
diff changeset
748 if (ch < '0' || ch > '9') {
12
055ed05235ae nginx-0.0.1-2002-09-13-18:47:42 import
Igor Sysoev <igor@sysoev.ru>
parents: 9
diff changeset
749 return NGX_HTTP_PARSE_INVALID_REQUEST;
44
0e81ac0bb3e2 nginx-0.0.1-2003-01-09-08:36:00 import
Igor Sysoev <igor@sysoev.ru>
parents: 26
diff changeset
750 }
1
d220029ac7f3 nginx-0.0.1-2002-08-15-21:20:26 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
751
7067
e3723f2a11b7 Parenthesized ASCII-related calculations.
Valentin Bartenev <vbart@nginx.com>
parents: 6994
diff changeset
752 r->http_major = r->http_major * 10 + (ch - '0');
6993
8801ff7d58e1 Don't pretend we support HTTP major versions >1 as HTTP/1.1.
Ruslan Ermilov <ru@nginx.com>
parents: 6732
diff changeset
753
8801ff7d58e1 Don't pretend we support HTTP major versions >1 as HTTP/1.1.
Ruslan Ermilov <ru@nginx.com>
parents: 6732
diff changeset
754 if (r->http_major > 1) {
8801ff7d58e1 Don't pretend we support HTTP major versions >1 as HTTP/1.1.
Ruslan Ermilov <ru@nginx.com>
parents: 6732
diff changeset
755 return NGX_HTTP_PARSE_INVALID_VERSION;
6543
302ff40c9bc9 Added overflow checks for version numbers (ticket #762).
Maxim Dounin <mdounin@mdounin.ru>
parents: 6014
diff changeset
756 }
302ff40c9bc9 Added overflow checks for version numbers (ticket #762).
Maxim Dounin <mdounin@mdounin.ru>
parents: 6014
diff changeset
757
1
d220029ac7f3 nginx-0.0.1-2002-08-15-21:20:26 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
758 break;
d220029ac7f3 nginx-0.0.1-2002-08-15-21:20:26 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
759
d220029ac7f3 nginx-0.0.1-2002-08-15-21:20:26 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
760 /* first digit of minor HTTP version */
7
b5481d6fbbd4 nginx-0.0.1-2002-08-29-20:59:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 1
diff changeset
761 case sw_first_minor_digit:
44
0e81ac0bb3e2 nginx-0.0.1-2003-01-09-08:36:00 import
Igor Sysoev <igor@sysoev.ru>
parents: 26
diff changeset
762 if (ch < '0' || ch > '9') {
12
055ed05235ae nginx-0.0.1-2002-09-13-18:47:42 import
Igor Sysoev <igor@sysoev.ru>
parents: 9
diff changeset
763 return NGX_HTTP_PARSE_INVALID_REQUEST;
44
0e81ac0bb3e2 nginx-0.0.1-2003-01-09-08:36:00 import
Igor Sysoev <igor@sysoev.ru>
parents: 26
diff changeset
764 }
1
d220029ac7f3 nginx-0.0.1-2002-08-15-21:20:26 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
765
d220029ac7f3 nginx-0.0.1-2002-08-15-21:20:26 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
766 r->http_minor = ch - '0';
7
b5481d6fbbd4 nginx-0.0.1-2002-08-29-20:59:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 1
diff changeset
767 state = sw_minor_digit;
1
d220029ac7f3 nginx-0.0.1-2002-08-15-21:20:26 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
768 break;
d220029ac7f3 nginx-0.0.1-2002-08-15-21:20:26 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
769
d220029ac7f3 nginx-0.0.1-2002-08-15-21:20:26 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
770 /* minor HTTP version or end of request line */
7
b5481d6fbbd4 nginx-0.0.1-2002-08-29-20:59:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 1
diff changeset
771 case sw_minor_digit:
1
d220029ac7f3 nginx-0.0.1-2002-08-15-21:20:26 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
772 if (ch == CR) {
7
b5481d6fbbd4 nginx-0.0.1-2002-08-29-20:59:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 1
diff changeset
773 state = sw_almost_done;
1
d220029ac7f3 nginx-0.0.1-2002-08-15-21:20:26 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
774 break;
d220029ac7f3 nginx-0.0.1-2002-08-15-21:20:26 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
775 }
d220029ac7f3 nginx-0.0.1-2002-08-15-21:20:26 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
776
d220029ac7f3 nginx-0.0.1-2002-08-15-21:20:26 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
777 if (ch == LF) {
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 473
diff changeset
778 goto done;
1
d220029ac7f3 nginx-0.0.1-2002-08-15-21:20:26 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
779 }
d220029ac7f3 nginx-0.0.1-2002-08-15-21:20:26 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
780
1603
364587232429 compatibility with mget: space after HTTP/1.1
Igor Sysoev <igor@sysoev.ru>
parents: 1585
diff changeset
781 if (ch == ' ') {
364587232429 compatibility with mget: space after HTTP/1.1
Igor Sysoev <igor@sysoev.ru>
parents: 1585
diff changeset
782 state = sw_spaces_after_digit;
364587232429 compatibility with mget: space after HTTP/1.1
Igor Sysoev <igor@sysoev.ru>
parents: 1585
diff changeset
783 break;
364587232429 compatibility with mget: space after HTTP/1.1
Igor Sysoev <igor@sysoev.ru>
parents: 1585
diff changeset
784 }
364587232429 compatibility with mget: space after HTTP/1.1
Igor Sysoev <igor@sysoev.ru>
parents: 1585
diff changeset
785
44
0e81ac0bb3e2 nginx-0.0.1-2003-01-09-08:36:00 import
Igor Sysoev <igor@sysoev.ru>
parents: 26
diff changeset
786 if (ch < '0' || ch > '9') {
12
055ed05235ae nginx-0.0.1-2002-09-13-18:47:42 import
Igor Sysoev <igor@sysoev.ru>
parents: 9
diff changeset
787 return NGX_HTTP_PARSE_INVALID_REQUEST;
44
0e81ac0bb3e2 nginx-0.0.1-2003-01-09-08:36:00 import
Igor Sysoev <igor@sysoev.ru>
parents: 26
diff changeset
788 }
1
d220029ac7f3 nginx-0.0.1-2002-08-15-21:20:26 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
789
6543
302ff40c9bc9 Added overflow checks for version numbers (ticket #762).
Maxim Dounin <mdounin@mdounin.ru>
parents: 6014
diff changeset
790 if (r->http_minor > 99) {
302ff40c9bc9 Added overflow checks for version numbers (ticket #762).
Maxim Dounin <mdounin@mdounin.ru>
parents: 6014
diff changeset
791 return NGX_HTTP_PARSE_INVALID_REQUEST;
302ff40c9bc9 Added overflow checks for version numbers (ticket #762).
Maxim Dounin <mdounin@mdounin.ru>
parents: 6014
diff changeset
792 }
302ff40c9bc9 Added overflow checks for version numbers (ticket #762).
Maxim Dounin <mdounin@mdounin.ru>
parents: 6014
diff changeset
793
7067
e3723f2a11b7 Parenthesized ASCII-related calculations.
Valentin Bartenev <vbart@nginx.com>
parents: 6994
diff changeset
794 r->http_minor = r->http_minor * 10 + (ch - '0');
1
d220029ac7f3 nginx-0.0.1-2002-08-15-21:20:26 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
795 break;
d220029ac7f3 nginx-0.0.1-2002-08-15-21:20:26 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
796
1603
364587232429 compatibility with mget: space after HTTP/1.1
Igor Sysoev <igor@sysoev.ru>
parents: 1585
diff changeset
797 case sw_spaces_after_digit:
364587232429 compatibility with mget: space after HTTP/1.1
Igor Sysoev <igor@sysoev.ru>
parents: 1585
diff changeset
798 switch (ch) {
364587232429 compatibility with mget: space after HTTP/1.1
Igor Sysoev <igor@sysoev.ru>
parents: 1585
diff changeset
799 case ' ':
364587232429 compatibility with mget: space after HTTP/1.1
Igor Sysoev <igor@sysoev.ru>
parents: 1585
diff changeset
800 break;
364587232429 compatibility with mget: space after HTTP/1.1
Igor Sysoev <igor@sysoev.ru>
parents: 1585
diff changeset
801 case CR:
364587232429 compatibility with mget: space after HTTP/1.1
Igor Sysoev <igor@sysoev.ru>
parents: 1585
diff changeset
802 state = sw_almost_done;
364587232429 compatibility with mget: space after HTTP/1.1
Igor Sysoev <igor@sysoev.ru>
parents: 1585
diff changeset
803 break;
364587232429 compatibility with mget: space after HTTP/1.1
Igor Sysoev <igor@sysoev.ru>
parents: 1585
diff changeset
804 case LF:
364587232429 compatibility with mget: space after HTTP/1.1
Igor Sysoev <igor@sysoev.ru>
parents: 1585
diff changeset
805 goto done;
364587232429 compatibility with mget: space after HTTP/1.1
Igor Sysoev <igor@sysoev.ru>
parents: 1585
diff changeset
806 default:
364587232429 compatibility with mget: space after HTTP/1.1
Igor Sysoev <igor@sysoev.ru>
parents: 1585
diff changeset
807 return NGX_HTTP_PARSE_INVALID_REQUEST;
364587232429 compatibility with mget: space after HTTP/1.1
Igor Sysoev <igor@sysoev.ru>
parents: 1585
diff changeset
808 }
364587232429 compatibility with mget: space after HTTP/1.1
Igor Sysoev <igor@sysoev.ru>
parents: 1585
diff changeset
809 break;
364587232429 compatibility with mget: space after HTTP/1.1
Igor Sysoev <igor@sysoev.ru>
parents: 1585
diff changeset
810
1
d220029ac7f3 nginx-0.0.1-2002-08-15-21:20:26 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
811 /* end of request line */
7
b5481d6fbbd4 nginx-0.0.1-2002-08-29-20:59:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 1
diff changeset
812 case sw_almost_done:
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 473
diff changeset
813 r->request_end = p - 1;
1
d220029ac7f3 nginx-0.0.1-2002-08-15-21:20:26 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
814 switch (ch) {
d220029ac7f3 nginx-0.0.1-2002-08-15-21:20:26 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
815 case LF:
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 473
diff changeset
816 goto done;
1
d220029ac7f3 nginx-0.0.1-2002-08-15-21:20:26 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
817 default:
12
055ed05235ae nginx-0.0.1-2002-09-13-18:47:42 import
Igor Sysoev <igor@sysoev.ru>
parents: 9
diff changeset
818 return NGX_HTTP_PARSE_INVALID_REQUEST;
1
d220029ac7f3 nginx-0.0.1-2002-08-15-21:20:26 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
819 }
d220029ac7f3 nginx-0.0.1-2002-08-15-21:20:26 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
820 }
d220029ac7f3 nginx-0.0.1-2002-08-15-21:20:26 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
821 }
d220029ac7f3 nginx-0.0.1-2002-08-15-21:20:26 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
822
432
11362a3e3911 nginx-0.0.11-2004-09-21-09:38:28 import
Igor Sysoev <igor@sysoev.ru>
parents: 419
diff changeset
823 b->pos = p;
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 473
diff changeset
824 r->state = state;
1
d220029ac7f3 nginx-0.0.1-2002-08-15-21:20:26 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
825
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 473
diff changeset
826 return NGX_AGAIN;
44
0e81ac0bb3e2 nginx-0.0.1-2003-01-09-08:36:00 import
Igor Sysoev <igor@sysoev.ru>
parents: 26
diff changeset
827
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 473
diff changeset
828 done:
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 473
diff changeset
829
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 473
diff changeset
830 b->pos = p + 1;
44
0e81ac0bb3e2 nginx-0.0.1-2003-01-09-08:36:00 import
Igor Sysoev <igor@sysoev.ru>
parents: 26
diff changeset
831
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 473
diff changeset
832 if (r->request_end == NULL) {
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 473
diff changeset
833 r->request_end = p;
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 473
diff changeset
834 }
44
0e81ac0bb3e2 nginx-0.0.1-2003-01-09-08:36:00 import
Igor Sysoev <igor@sysoev.ru>
parents: 26
diff changeset
835
8494
e334ca1b23ba HTTP/3: support $server_protocol variable.
Roman Arutyunyan <arut@nginx.com>
parents: 8407
diff changeset
836 if (r->http_protocol.data) {
e334ca1b23ba HTTP/3: support $server_protocol variable.
Roman Arutyunyan <arut@nginx.com>
parents: 8407
diff changeset
837 r->http_protocol.len = r->request_end - r->http_protocol.data;
e334ca1b23ba HTTP/3: support $server_protocol variable.
Roman Arutyunyan <arut@nginx.com>
parents: 8407
diff changeset
838 }
e334ca1b23ba HTTP/3: support $server_protocol variable.
Roman Arutyunyan <arut@nginx.com>
parents: 8407
diff changeset
839
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 473
diff changeset
840 r->http_version = r->http_major * 1000 + r->http_minor;
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 473
diff changeset
841 r->state = sw_start;
89
29bf798b583f nginx-0.0.1-2003-05-15-19:42:53 import
Igor Sysoev <igor@sysoev.ru>
parents: 86
diff changeset
842
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 473
diff changeset
843 if (r->http_version == 9 && r->method != NGX_HTTP_GET) {
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 473
diff changeset
844 return NGX_HTTP_PARSE_INVALID_09_METHOD;
1
d220029ac7f3 nginx-0.0.1-2002-08-15-21:20:26 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
845 }
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 473
diff changeset
846
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 473
diff changeset
847 return NGX_OK;
1
d220029ac7f3 nginx-0.0.1-2002-08-15-21:20:26 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
848 }
d220029ac7f3 nginx-0.0.1-2002-08-15-21:20:26 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
849
200
abeaebe0a33c nginx-0.0.1-2003-11-28-20:41:47 import
Igor Sysoev <igor@sysoev.ru>
parents: 194
diff changeset
850
509
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
851 ngx_int_t
2256
8c17cfe63d2c underscores_in_headers
Igor Sysoev <igor@sysoev.ru>
parents: 2236
diff changeset
852 ngx_http_parse_header_line(ngx_http_request_t *r, ngx_buf_t *b,
8c17cfe63d2c underscores_in_headers
Igor Sysoev <igor@sysoev.ru>
parents: 2236
diff changeset
853 ngx_uint_t allow_underscores)
1
d220029ac7f3 nginx-0.0.1-2002-08-15-21:20:26 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
854 {
507
cd3117ad9aab nginx-0.1.28-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 505
diff changeset
855 u_char c, ch, *p;
649
1e720b0be7ec nginx-0.3.46-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 639
diff changeset
856 ngx_uint_t hash, i;
200
abeaebe0a33c nginx-0.0.1-2003-11-28-20:41:47 import
Igor Sysoev <igor@sysoev.ru>
parents: 194
diff changeset
857 enum {
7
b5481d6fbbd4 nginx-0.0.1-2002-08-29-20:59:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 1
diff changeset
858 sw_start = 0,
b5481d6fbbd4 nginx-0.0.1-2002-08-29-20:59:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 1
diff changeset
859 sw_name,
b5481d6fbbd4 nginx-0.0.1-2002-08-29-20:59:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 1
diff changeset
860 sw_space_before_value,
b5481d6fbbd4 nginx-0.0.1-2002-08-29-20:59:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 1
diff changeset
861 sw_value,
b5481d6fbbd4 nginx-0.0.1-2002-08-29-20:59:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 1
diff changeset
862 sw_space_after_value,
503
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
863 sw_ignore_line,
7
b5481d6fbbd4 nginx-0.0.1-2002-08-29-20:59:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 1
diff changeset
864 sw_almost_done,
503
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
865 sw_header_almost_done
21
df7fb216a149 nginx-0.0.1-2002-12-04-19:29:40 import
Igor Sysoev <igor@sysoev.ru>
parents: 18
diff changeset
866 } state;
df7fb216a149 nginx-0.0.1-2002-12-04-19:29:40 import
Igor Sysoev <igor@sysoev.ru>
parents: 18
diff changeset
867
786
5dc3ba0d6388 backout r783 and add comment
Igor Sysoev <igor@sysoev.ru>
parents: 782
diff changeset
868 /* the last '\0' is not needed because string is zero terminated */
5dc3ba0d6388 backout r783 and add comment
Igor Sysoev <igor@sysoev.ru>
parents: 782
diff changeset
869
649
1e720b0be7ec nginx-0.3.46-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 639
diff changeset
870 static u_char lowcase[] =
1e720b0be7ec nginx-0.3.46-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 639
diff changeset
871 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
1e720b0be7ec nginx-0.3.46-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 639
diff changeset
872 "\0\0\0\0\0\0\0\0\0\0\0\0\0-\0\0" "0123456789\0\0\0\0\0\0"
2256
8c17cfe63d2c underscores_in_headers
Igor Sysoev <igor@sysoev.ru>
parents: 2236
diff changeset
873 "\0abcdefghijklmnopqrstuvwxyz\0\0\0\0\0"
649
1e720b0be7ec nginx-0.3.46-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 639
diff changeset
874 "\0abcdefghijklmnopqrstuvwxyz\0\0\0\0\0"
1e720b0be7ec nginx-0.3.46-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 639
diff changeset
875 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
1e720b0be7ec nginx-0.3.46-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 639
diff changeset
876 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
1e720b0be7ec nginx-0.3.46-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 639
diff changeset
877 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
786
5dc3ba0d6388 backout r783 and add comment
Igor Sysoev <igor@sysoev.ru>
parents: 782
diff changeset
878 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0";
649
1e720b0be7ec nginx-0.3.46-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 639
diff changeset
879
21
df7fb216a149 nginx-0.0.1-2002-12-04-19:29:40 import
Igor Sysoev <igor@sysoev.ru>
parents: 18
diff changeset
880 state = r->state;
507
cd3117ad9aab nginx-0.1.28-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 505
diff changeset
881 hash = r->header_hash;
649
1e720b0be7ec nginx-0.3.46-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 639
diff changeset
882 i = r->lowcase_index;
1
d220029ac7f3 nginx-0.0.1-2002-08-15-21:20:26 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
883
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 473
diff changeset
884 for (p = b->pos; p < b->last; p++) {
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 473
diff changeset
885 ch = *p;
1
d220029ac7f3 nginx-0.0.1-2002-08-15-21:20:26 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
886
d220029ac7f3 nginx-0.0.1-2002-08-15-21:20:26 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
887 switch (state) {
d220029ac7f3 nginx-0.0.1-2002-08-15-21:20:26 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
888
d220029ac7f3 nginx-0.0.1-2002-08-15-21:20:26 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
889 /* first char */
7
b5481d6fbbd4 nginx-0.0.1-2002-08-29-20:59:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 1
diff changeset
890 case sw_start:
8407
d6feece1288a Fixed $request_length for HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents: 8404
diff changeset
891 r->parse_start = p;
3079
566eeb81e807 discrease slightly ngx_http_parse_header_line() size:
Igor Sysoev <igor@sysoev.ru>
parents: 3075
diff changeset
892 r->header_name_start = p;
511
c12967aadd87 nginx-0.1.30-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 509
diff changeset
893 r->invalid_header = 0;
c12967aadd87 nginx-0.1.30-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 509
diff changeset
894
1
d220029ac7f3 nginx-0.0.1-2002-08-15-21:20:26 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
895 switch (ch) {
d220029ac7f3 nginx-0.0.1-2002-08-15-21:20:26 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
896 case CR:
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 473
diff changeset
897 r->header_end = p;
7
b5481d6fbbd4 nginx-0.0.1-2002-08-29-20:59:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 1
diff changeset
898 state = sw_header_almost_done;
1
d220029ac7f3 nginx-0.0.1-2002-08-15-21:20:26 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
899 break;
d220029ac7f3 nginx-0.0.1-2002-08-15-21:20:26 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
900 case LF:
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 473
diff changeset
901 r->header_end = p;
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 473
diff changeset
902 goto header_done;
1
d220029ac7f3 nginx-0.0.1-2002-08-15-21:20:26 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
903 default:
7
b5481d6fbbd4 nginx-0.0.1-2002-08-29-20:59:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 1
diff changeset
904 state = sw_name;
1
d220029ac7f3 nginx-0.0.1-2002-08-15-21:20:26 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
905
649
1e720b0be7ec nginx-0.3.46-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 639
diff changeset
906 c = lowcase[ch];
1
d220029ac7f3 nginx-0.0.1-2002-08-15-21:20:26 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
907
649
1e720b0be7ec nginx-0.3.46-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 639
diff changeset
908 if (c) {
1e720b0be7ec nginx-0.3.46-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 639
diff changeset
909 hash = ngx_hash(0, c);
1e720b0be7ec nginx-0.3.46-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 639
diff changeset
910 r->lowcase_header[0] = c;
1e720b0be7ec nginx-0.3.46-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 639
diff changeset
911 i = 1;
1
d220029ac7f3 nginx-0.0.1-2002-08-15-21:20:26 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
912 break;
44
0e81ac0bb3e2 nginx-0.0.1-2003-01-09-08:36:00 import
Igor Sysoev <igor@sysoev.ru>
parents: 26
diff changeset
913 }
1
d220029ac7f3 nginx-0.0.1-2002-08-15-21:20:26 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
914
5624
bd91f286ee0a Apply underscores_in_headers also to the first character.
Piotr Sikora <piotr@cloudflare.com>
parents: 5491
diff changeset
915 if (ch == '_') {
bd91f286ee0a Apply underscores_in_headers also to the first character.
Piotr Sikora <piotr@cloudflare.com>
parents: 5491
diff changeset
916 if (allow_underscores) {
bd91f286ee0a Apply underscores_in_headers also to the first character.
Piotr Sikora <piotr@cloudflare.com>
parents: 5491
diff changeset
917 hash = ngx_hash(0, ch);
bd91f286ee0a Apply underscores_in_headers also to the first character.
Piotr Sikora <piotr@cloudflare.com>
parents: 5491
diff changeset
918 r->lowcase_header[0] = ch;
bd91f286ee0a Apply underscores_in_headers also to the first character.
Piotr Sikora <piotr@cloudflare.com>
parents: 5491
diff changeset
919 i = 1;
bd91f286ee0a Apply underscores_in_headers also to the first character.
Piotr Sikora <piotr@cloudflare.com>
parents: 5491
diff changeset
920
bd91f286ee0a Apply underscores_in_headers also to the first character.
Piotr Sikora <piotr@cloudflare.com>
parents: 5491
diff changeset
921 } else {
7580
8f55cb5c7e79 Fixed header parsing with ignore_invalid_headers switched off.
Ruslan Ermilov <ru@nginx.com>
parents: 7579
diff changeset
922 hash = 0;
8f55cb5c7e79 Fixed header parsing with ignore_invalid_headers switched off.
Ruslan Ermilov <ru@nginx.com>
parents: 7579
diff changeset
923 i = 0;
5624
bd91f286ee0a Apply underscores_in_headers also to the first character.
Piotr Sikora <piotr@cloudflare.com>
parents: 5491
diff changeset
924 r->invalid_header = 1;
bd91f286ee0a Apply underscores_in_headers also to the first character.
Piotr Sikora <piotr@cloudflare.com>
parents: 5491
diff changeset
925 }
bd91f286ee0a Apply underscores_in_headers also to the first character.
Piotr Sikora <piotr@cloudflare.com>
parents: 5491
diff changeset
926
bd91f286ee0a Apply underscores_in_headers also to the first character.
Piotr Sikora <piotr@cloudflare.com>
parents: 5491
diff changeset
927 break;
bd91f286ee0a Apply underscores_in_headers also to the first character.
Piotr Sikora <piotr@cloudflare.com>
parents: 5491
diff changeset
928 }
bd91f286ee0a Apply underscores_in_headers also to the first character.
Piotr Sikora <piotr@cloudflare.com>
parents: 5491
diff changeset
929
4530
667aaf61a778 Headers with null character are now rejected.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4412
diff changeset
930 if (ch == '\0') {
667aaf61a778 Headers with null character are now rejected.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4412
diff changeset
931 return NGX_HTTP_PARSE_INVALID_HEADER;
667aaf61a778 Headers with null character are now rejected.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4412
diff changeset
932 }
667aaf61a778 Headers with null character are now rejected.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4412
diff changeset
933
7580
8f55cb5c7e79 Fixed header parsing with ignore_invalid_headers switched off.
Ruslan Ermilov <ru@nginx.com>
parents: 7579
diff changeset
934 hash = 0;
8f55cb5c7e79 Fixed header parsing with ignore_invalid_headers switched off.
Ruslan Ermilov <ru@nginx.com>
parents: 7579
diff changeset
935 i = 0;
511
c12967aadd87 nginx-0.1.30-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 509
diff changeset
936 r->invalid_header = 1;
c12967aadd87 nginx-0.1.30-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 509
diff changeset
937
503
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
938 break;
1
d220029ac7f3 nginx-0.0.1-2002-08-15-21:20:26 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
939
d220029ac7f3 nginx-0.0.1-2002-08-15-21:20:26 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
940 }
d220029ac7f3 nginx-0.0.1-2002-08-15-21:20:26 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
941 break;
d220029ac7f3 nginx-0.0.1-2002-08-15-21:20:26 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
942
d220029ac7f3 nginx-0.0.1-2002-08-15-21:20:26 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
943 /* header name */
7
b5481d6fbbd4 nginx-0.0.1-2002-08-29-20:59:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 1
diff changeset
944 case sw_name:
649
1e720b0be7ec nginx-0.3.46-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 639
diff changeset
945 c = lowcase[ch];
1e720b0be7ec nginx-0.3.46-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 639
diff changeset
946
1e720b0be7ec nginx-0.3.46-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 639
diff changeset
947 if (c) {
1e720b0be7ec nginx-0.3.46-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 639
diff changeset
948 hash = ngx_hash(hash, c);
1e720b0be7ec nginx-0.3.46-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 639
diff changeset
949 r->lowcase_header[i++] = c;
1942
2546677dae0b use the more correct mask
Igor Sysoev <igor@sysoev.ru>
parents: 1738
diff changeset
950 i &= (NGX_HTTP_LC_HEADER_LEN - 1);
1
d220029ac7f3 nginx-0.0.1-2002-08-15-21:20:26 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
951 break;
44
0e81ac0bb3e2 nginx-0.0.1-2003-01-09-08:36:00 import
Igor Sysoev <igor@sysoev.ru>
parents: 26
diff changeset
952 }
1
d220029ac7f3 nginx-0.0.1-2002-08-15-21:20:26 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
953
2256
8c17cfe63d2c underscores_in_headers
Igor Sysoev <igor@sysoev.ru>
parents: 2236
diff changeset
954 if (ch == '_') {
8c17cfe63d2c underscores_in_headers
Igor Sysoev <igor@sysoev.ru>
parents: 2236
diff changeset
955 if (allow_underscores) {
8c17cfe63d2c underscores_in_headers
Igor Sysoev <igor@sysoev.ru>
parents: 2236
diff changeset
956 hash = ngx_hash(hash, ch);
8c17cfe63d2c underscores_in_headers
Igor Sysoev <igor@sysoev.ru>
parents: 2236
diff changeset
957 r->lowcase_header[i++] = ch;
8c17cfe63d2c underscores_in_headers
Igor Sysoev <igor@sysoev.ru>
parents: 2236
diff changeset
958 i &= (NGX_HTTP_LC_HEADER_LEN - 1);
8c17cfe63d2c underscores_in_headers
Igor Sysoev <igor@sysoev.ru>
parents: 2236
diff changeset
959
8c17cfe63d2c underscores_in_headers
Igor Sysoev <igor@sysoev.ru>
parents: 2236
diff changeset
960 } else {
8c17cfe63d2c underscores_in_headers
Igor Sysoev <igor@sysoev.ru>
parents: 2236
diff changeset
961 r->invalid_header = 1;
8c17cfe63d2c underscores_in_headers
Igor Sysoev <igor@sysoev.ru>
parents: 2236
diff changeset
962 }
8c17cfe63d2c underscores_in_headers
Igor Sysoev <igor@sysoev.ru>
parents: 2236
diff changeset
963
8c17cfe63d2c underscores_in_headers
Igor Sysoev <igor@sysoev.ru>
parents: 2236
diff changeset
964 break;
8c17cfe63d2c underscores_in_headers
Igor Sysoev <igor@sysoev.ru>
parents: 2236
diff changeset
965 }
8c17cfe63d2c underscores_in_headers
Igor Sysoev <igor@sysoev.ru>
parents: 2236
diff changeset
966
1
d220029ac7f3 nginx-0.0.1-2002-08-15-21:20:26 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
967 if (ch == ':') {
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 473
diff changeset
968 r->header_name_end = p;
7
b5481d6fbbd4 nginx-0.0.1-2002-08-29-20:59:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 1
diff changeset
969 state = sw_space_before_value;
1
d220029ac7f3 nginx-0.0.1-2002-08-15-21:20:26 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
970 break;
d220029ac7f3 nginx-0.0.1-2002-08-15-21:20:26 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
971 }
d220029ac7f3 nginx-0.0.1-2002-08-15-21:20:26 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
972
509
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
973 if (ch == CR) {
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
974 r->header_name_end = p;
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
975 r->header_start = p;
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
976 r->header_end = p;
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
977 state = sw_almost_done;
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
978 break;
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
979 }
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
980
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
981 if (ch == LF) {
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
982 r->header_name_end = p;
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
983 r->header_start = p;
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
984 r->header_end = p;
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
985 goto done;
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
986 }
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
987
452
23fb87bddda1 nginx-0.1.1-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 444
diff changeset
988 /* IIS may send the duplicate "HTTP/1.1 ..." lines */
72
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
989 if (ch == '/'
509
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
990 && r->upstream
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
991 && p - r->header_name_start == 4
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
992 && ngx_strncmp(r->header_name_start, "HTTP", 4) == 0)
72
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
993 {
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
994 state = sw_ignore_line;
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
995 break;
71
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
996 }
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
997
4530
667aaf61a778 Headers with null character are now rejected.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4412
diff changeset
998 if (ch == '\0') {
667aaf61a778 Headers with null character are now rejected.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4412
diff changeset
999 return NGX_HTTP_PARSE_INVALID_HEADER;
667aaf61a778 Headers with null character are now rejected.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4412
diff changeset
1000 }
667aaf61a778 Headers with null character are now rejected.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4412
diff changeset
1001
511
c12967aadd87 nginx-0.1.30-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 509
diff changeset
1002 r->invalid_header = 1;
c12967aadd87 nginx-0.1.30-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 509
diff changeset
1003
503
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
1004 break;
1
d220029ac7f3 nginx-0.0.1-2002-08-15-21:20:26 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1005
d220029ac7f3 nginx-0.0.1-2002-08-15-21:20:26 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1006 /* space* before header value */
7
b5481d6fbbd4 nginx-0.0.1-2002-08-29-20:59:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 1
diff changeset
1007 case sw_space_before_value:
1
d220029ac7f3 nginx-0.0.1-2002-08-15-21:20:26 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1008 switch (ch) {
d220029ac7f3 nginx-0.0.1-2002-08-15-21:20:26 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1009 case ' ':
d220029ac7f3 nginx-0.0.1-2002-08-15-21:20:26 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1010 break;
d220029ac7f3 nginx-0.0.1-2002-08-15-21:20:26 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1011 case CR:
509
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
1012 r->header_start = p;
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
1013 r->header_end = p;
7
b5481d6fbbd4 nginx-0.0.1-2002-08-29-20:59:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 1
diff changeset
1014 state = sw_almost_done;
1
d220029ac7f3 nginx-0.0.1-2002-08-15-21:20:26 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1015 break;
d220029ac7f3 nginx-0.0.1-2002-08-15-21:20:26 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1016 case LF:
509
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
1017 r->header_start = p;
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
1018 r->header_end = p;
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 473
diff changeset
1019 goto done;
4530
667aaf61a778 Headers with null character are now rejected.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4412
diff changeset
1020 case '\0':
667aaf61a778 Headers with null character are now rejected.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4412
diff changeset
1021 return NGX_HTTP_PARSE_INVALID_HEADER;
1
d220029ac7f3 nginx-0.0.1-2002-08-15-21:20:26 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1022 default:
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 473
diff changeset
1023 r->header_start = p;
7
b5481d6fbbd4 nginx-0.0.1-2002-08-29-20:59:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 1
diff changeset
1024 state = sw_value;
1
d220029ac7f3 nginx-0.0.1-2002-08-15-21:20:26 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1025 break;
d220029ac7f3 nginx-0.0.1-2002-08-15-21:20:26 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1026 }
d220029ac7f3 nginx-0.0.1-2002-08-15-21:20:26 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1027 break;
d220029ac7f3 nginx-0.0.1-2002-08-15-21:20:26 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1028
d220029ac7f3 nginx-0.0.1-2002-08-15-21:20:26 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1029 /* header value */
7
b5481d6fbbd4 nginx-0.0.1-2002-08-29-20:59:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 1
diff changeset
1030 case sw_value:
1
d220029ac7f3 nginx-0.0.1-2002-08-15-21:20:26 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1031 switch (ch) {
d220029ac7f3 nginx-0.0.1-2002-08-15-21:20:26 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1032 case ' ':
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 473
diff changeset
1033 r->header_end = p;
7
b5481d6fbbd4 nginx-0.0.1-2002-08-29-20:59:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 1
diff changeset
1034 state = sw_space_after_value;
1
d220029ac7f3 nginx-0.0.1-2002-08-15-21:20:26 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1035 break;
d220029ac7f3 nginx-0.0.1-2002-08-15-21:20:26 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1036 case CR:
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 473
diff changeset
1037 r->header_end = p;
7
b5481d6fbbd4 nginx-0.0.1-2002-08-29-20:59:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 1
diff changeset
1038 state = sw_almost_done;
1
d220029ac7f3 nginx-0.0.1-2002-08-15-21:20:26 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1039 break;
d220029ac7f3 nginx-0.0.1-2002-08-15-21:20:26 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1040 case LF:
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 473
diff changeset
1041 r->header_end = p;
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 473
diff changeset
1042 goto done;
4530
667aaf61a778 Headers with null character are now rejected.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4412
diff changeset
1043 case '\0':
667aaf61a778 Headers with null character are now rejected.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4412
diff changeset
1044 return NGX_HTTP_PARSE_INVALID_HEADER;
1
d220029ac7f3 nginx-0.0.1-2002-08-15-21:20:26 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1045 }
d220029ac7f3 nginx-0.0.1-2002-08-15-21:20:26 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1046 break;
d220029ac7f3 nginx-0.0.1-2002-08-15-21:20:26 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1047
d220029ac7f3 nginx-0.0.1-2002-08-15-21:20:26 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1048 /* space* before end of header line */
7
b5481d6fbbd4 nginx-0.0.1-2002-08-29-20:59:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 1
diff changeset
1049 case sw_space_after_value:
1
d220029ac7f3 nginx-0.0.1-2002-08-15-21:20:26 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1050 switch (ch) {
d220029ac7f3 nginx-0.0.1-2002-08-15-21:20:26 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1051 case ' ':
d220029ac7f3 nginx-0.0.1-2002-08-15-21:20:26 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1052 break;
d220029ac7f3 nginx-0.0.1-2002-08-15-21:20:26 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1053 case CR:
7
b5481d6fbbd4 nginx-0.0.1-2002-08-29-20:59:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 1
diff changeset
1054 state = sw_almost_done;
1
d220029ac7f3 nginx-0.0.1-2002-08-15-21:20:26 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1055 break;
d220029ac7f3 nginx-0.0.1-2002-08-15-21:20:26 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1056 case LF:
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 473
diff changeset
1057 goto done;
4530
667aaf61a778 Headers with null character are now rejected.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4412
diff changeset
1058 case '\0':
667aaf61a778 Headers with null character are now rejected.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4412
diff changeset
1059 return NGX_HTTP_PARSE_INVALID_HEADER;
1
d220029ac7f3 nginx-0.0.1-2002-08-15-21:20:26 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1060 default:
7
b5481d6fbbd4 nginx-0.0.1-2002-08-29-20:59:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 1
diff changeset
1061 state = sw_value;
1
d220029ac7f3 nginx-0.0.1-2002-08-15-21:20:26 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1062 break;
d220029ac7f3 nginx-0.0.1-2002-08-15-21:20:26 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1063 }
d220029ac7f3 nginx-0.0.1-2002-08-15-21:20:26 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1064 break;
d220029ac7f3 nginx-0.0.1-2002-08-15-21:20:26 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1065
71
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
1066 /* ignore header line */
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
1067 case sw_ignore_line:
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
1068 switch (ch) {
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
1069 case LF:
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
1070 state = sw_start;
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
1071 break;
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
1072 default:
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
1073 break;
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
1074 }
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
1075 break;
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
1076
1
d220029ac7f3 nginx-0.0.1-2002-08-15-21:20:26 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1077 /* end of header line */
7
b5481d6fbbd4 nginx-0.0.1-2002-08-29-20:59:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 1
diff changeset
1078 case sw_almost_done:
1
d220029ac7f3 nginx-0.0.1-2002-08-15-21:20:26 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1079 switch (ch) {
1943
5acc8bea2c49 test the more likely case first
Igor Sysoev <igor@sysoev.ru>
parents: 1942
diff changeset
1080 case LF:
5acc8bea2c49 test the more likely case first
Igor Sysoev <igor@sysoev.ru>
parents: 1942
diff changeset
1081 goto done;
623
0216fd1471f3 nginx-0.3.33-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
1082 case CR:
0216fd1471f3 nginx-0.3.33-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
1083 break;
1
d220029ac7f3 nginx-0.0.1-2002-08-15-21:20:26 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1084 default:
12
055ed05235ae nginx-0.0.1-2002-09-13-18:47:42 import
Igor Sysoev <igor@sysoev.ru>
parents: 9
diff changeset
1085 return NGX_HTTP_PARSE_INVALID_HEADER;
1
d220029ac7f3 nginx-0.0.1-2002-08-15-21:20:26 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1086 }
625
fbed40ce7cb4 nginx-0.3.34-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 623
diff changeset
1087 break;
1
d220029ac7f3 nginx-0.0.1-2002-08-15-21:20:26 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1088
d220029ac7f3 nginx-0.0.1-2002-08-15-21:20:26 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1089 /* end of header */
7
b5481d6fbbd4 nginx-0.0.1-2002-08-29-20:59:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 1
diff changeset
1090 case sw_header_almost_done:
1
d220029ac7f3 nginx-0.0.1-2002-08-15-21:20:26 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1091 switch (ch) {
d220029ac7f3 nginx-0.0.1-2002-08-15-21:20:26 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1092 case LF:
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 473
diff changeset
1093 goto header_done;
1
d220029ac7f3 nginx-0.0.1-2002-08-15-21:20:26 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1094 default:
12
055ed05235ae nginx-0.0.1-2002-09-13-18:47:42 import
Igor Sysoev <igor@sysoev.ru>
parents: 9
diff changeset
1095 return NGX_HTTP_PARSE_INVALID_HEADER;
1
d220029ac7f3 nginx-0.0.1-2002-08-15-21:20:26 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1096 }
d220029ac7f3 nginx-0.0.1-2002-08-15-21:20:26 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1097 }
d220029ac7f3 nginx-0.0.1-2002-08-15-21:20:26 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1098 }
d220029ac7f3 nginx-0.0.1-2002-08-15-21:20:26 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1099
343
6bdf858bff8c nginx-0.0.3-2004-05-28-19:49:23 import; rename ngx_hunk_t to ngx_buf_t
Igor Sysoev <igor@sysoev.ru>
parents: 323
diff changeset
1100 b->pos = p;
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 473
diff changeset
1101 r->state = state;
507
cd3117ad9aab nginx-0.1.28-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 505
diff changeset
1102 r->header_hash = hash;
649
1e720b0be7ec nginx-0.3.46-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 639
diff changeset
1103 r->lowcase_index = i;
1
d220029ac7f3 nginx-0.0.1-2002-08-15-21:20:26 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1104
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 473
diff changeset
1105 return NGX_AGAIN;
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 473
diff changeset
1106
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 473
diff changeset
1107 done:
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 473
diff changeset
1108
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 473
diff changeset
1109 b->pos = p + 1;
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 473
diff changeset
1110 r->state = sw_start;
507
cd3117ad9aab nginx-0.1.28-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 505
diff changeset
1111 r->header_hash = hash;
649
1e720b0be7ec nginx-0.3.46-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 639
diff changeset
1112 r->lowcase_index = i;
44
0e81ac0bb3e2 nginx-0.0.1-2003-01-09-08:36:00 import
Igor Sysoev <igor@sysoev.ru>
parents: 26
diff changeset
1113
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 473
diff changeset
1114 return NGX_OK;
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 473
diff changeset
1115
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 473
diff changeset
1116 header_done:
44
0e81ac0bb3e2 nginx-0.0.1-2003-01-09-08:36:00 import
Igor Sysoev <igor@sysoev.ru>
parents: 26
diff changeset
1117
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 473
diff changeset
1118 b->pos = p + 1;
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 473
diff changeset
1119 r->state = sw_start;
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 473
diff changeset
1120
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 473
diff changeset
1121 return NGX_HTTP_PARSE_HEADER_DONE;
1
d220029ac7f3 nginx-0.0.1-2002-08-15-21:20:26 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1122 }
200
abeaebe0a33c nginx-0.0.1-2003-11-28-20:41:47 import
Igor Sysoev <igor@sysoev.ru>
parents: 194
diff changeset
1123
abeaebe0a33c nginx-0.0.1-2003-11-28-20:41:47 import
Igor Sysoev <igor@sysoev.ru>
parents: 194
diff changeset
1124
509
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
1125 ngx_int_t
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents: 4926
diff changeset
1126 ngx_http_parse_uri(ngx_http_request_t *r)
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents: 4926
diff changeset
1127 {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents: 4926
diff changeset
1128 u_char *p, ch;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents: 4926
diff changeset
1129 enum {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents: 4926
diff changeset
1130 sw_start = 0,
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents: 4926
diff changeset
1131 sw_after_slash_in_uri,
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents: 4926
diff changeset
1132 sw_check_uri,
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents: 4926
diff changeset
1133 sw_uri
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents: 4926
diff changeset
1134 } state;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents: 4926
diff changeset
1135
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents: 4926
diff changeset
1136 state = sw_start;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents: 4926
diff changeset
1137
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents: 4926
diff changeset
1138 for (p = r->uri_start; p != r->uri_end; p++) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents: 4926
diff changeset
1139
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents: 4926
diff changeset
1140 ch = *p;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents: 4926
diff changeset
1141
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents: 4926
diff changeset
1142 switch (state) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents: 4926
diff changeset
1143
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents: 4926
diff changeset
1144 case sw_start:
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents: 4926
diff changeset
1145
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents: 4926
diff changeset
1146 if (ch != '/') {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents: 4926
diff changeset
1147 return NGX_ERROR;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents: 4926
diff changeset
1148 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents: 4926
diff changeset
1149
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents: 4926
diff changeset
1150 state = sw_after_slash_in_uri;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents: 4926
diff changeset
1151 break;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents: 4926
diff changeset
1152
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents: 4926
diff changeset
1153 /* check "/.", "//", "%", and "\" (Win32) in URI */
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents: 4926
diff changeset
1154 case sw_after_slash_in_uri:
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents: 4926
diff changeset
1155
6626
b3682580c1bd Avoid left-shifting integers into the sign bit, which is undefined.
Sergey Kandaurov <pluknet@nginx.com>
parents: 6543
diff changeset
1156 if (usual[ch >> 5] & (1U << (ch & 0x1f))) {
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents: 4926
diff changeset
1157 state = sw_check_uri;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents: 4926
diff changeset
1158 break;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents: 4926
diff changeset
1159 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents: 4926
diff changeset
1160
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents: 4926
diff changeset
1161 switch (ch) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents: 4926
diff changeset
1162 case ' ':
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents: 4926
diff changeset
1163 r->space_in_uri = 1;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents: 4926
diff changeset
1164 state = sw_check_uri;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents: 4926
diff changeset
1165 break;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents: 4926
diff changeset
1166 case '.':
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents: 4926
diff changeset
1167 r->complex_uri = 1;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents: 4926
diff changeset
1168 state = sw_uri;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents: 4926
diff changeset
1169 break;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents: 4926
diff changeset
1170 case '%':
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents: 4926
diff changeset
1171 r->quoted_uri = 1;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents: 4926
diff changeset
1172 state = sw_uri;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents: 4926
diff changeset
1173 break;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents: 4926
diff changeset
1174 case '/':
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents: 4926
diff changeset
1175 r->complex_uri = 1;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents: 4926
diff changeset
1176 state = sw_uri;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents: 4926
diff changeset
1177 break;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents: 4926
diff changeset
1178 #if (NGX_WIN32)
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents: 4926
diff changeset
1179 case '\\':
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents: 4926
diff changeset
1180 r->complex_uri = 1;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents: 4926
diff changeset
1181 state = sw_uri;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents: 4926
diff changeset
1182 break;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents: 4926
diff changeset
1183 #endif
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents: 4926
diff changeset
1184 case '?':
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents: 4926
diff changeset
1185 r->args_start = p + 1;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents: 4926
diff changeset
1186 state = sw_uri;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents: 4926
diff changeset
1187 break;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents: 4926
diff changeset
1188 case '#':
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents: 4926
diff changeset
1189 r->complex_uri = 1;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents: 4926
diff changeset
1190 state = sw_uri;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents: 4926
diff changeset
1191 break;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents: 4926
diff changeset
1192 case '+':
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents: 4926
diff changeset
1193 r->plus_in_uri = 1;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents: 4926
diff changeset
1194 break;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents: 4926
diff changeset
1195 default:
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents: 4926
diff changeset
1196 state = sw_check_uri;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents: 4926
diff changeset
1197 break;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents: 4926
diff changeset
1198 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents: 4926
diff changeset
1199 break;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents: 4926
diff changeset
1200
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents: 4926
diff changeset
1201 /* check "/", "%" and "\" (Win32) in URI */
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents: 4926
diff changeset
1202 case sw_check_uri:
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents: 4926
diff changeset
1203
6626
b3682580c1bd Avoid left-shifting integers into the sign bit, which is undefined.
Sergey Kandaurov <pluknet@nginx.com>
parents: 6543
diff changeset
1204 if (usual[ch >> 5] & (1U << (ch & 0x1f))) {
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents: 4926
diff changeset
1205 break;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents: 4926
diff changeset
1206 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents: 4926
diff changeset
1207
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents: 4926
diff changeset
1208 switch (ch) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents: 4926
diff changeset
1209 case '/':
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents: 4926
diff changeset
1210 #if (NGX_WIN32)
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents: 4926
diff changeset
1211 if (r->uri_ext == p) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents: 4926
diff changeset
1212 r->complex_uri = 1;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents: 4926
diff changeset
1213 state = sw_uri;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents: 4926
diff changeset
1214 break;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents: 4926
diff changeset
1215 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents: 4926
diff changeset
1216 #endif
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents: 4926
diff changeset
1217 r->uri_ext = NULL;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents: 4926
diff changeset
1218 state = sw_after_slash_in_uri;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents: 4926
diff changeset
1219 break;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents: 4926
diff changeset
1220 case '.':
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents: 4926
diff changeset
1221 r->uri_ext = p + 1;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents: 4926
diff changeset
1222 break;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents: 4926
diff changeset
1223 case ' ':
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents: 4926
diff changeset
1224 r->space_in_uri = 1;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents: 4926
diff changeset
1225 break;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents: 4926
diff changeset
1226 #if (NGX_WIN32)
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents: 4926
diff changeset
1227 case '\\':
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents: 4926
diff changeset
1228 r->complex_uri = 1;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents: 4926
diff changeset
1229 state = sw_after_slash_in_uri;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents: 4926
diff changeset
1230 break;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents: 4926
diff changeset
1231 #endif
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents: 4926
diff changeset
1232 case '%':
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents: 4926
diff changeset
1233 r->quoted_uri = 1;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents: 4926
diff changeset
1234 state = sw_uri;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents: 4926
diff changeset
1235 break;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents: 4926
diff changeset
1236 case '?':
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents: 4926
diff changeset
1237 r->args_start = p + 1;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents: 4926
diff changeset
1238 state = sw_uri;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents: 4926
diff changeset
1239 break;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents: 4926
diff changeset
1240 case '#':
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents: 4926
diff changeset
1241 r->complex_uri = 1;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents: 4926
diff changeset
1242 state = sw_uri;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents: 4926
diff changeset
1243 break;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents: 4926
diff changeset
1244 case '+':
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents: 4926
diff changeset
1245 r->plus_in_uri = 1;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents: 4926
diff changeset
1246 break;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents: 4926
diff changeset
1247 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents: 4926
diff changeset
1248 break;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents: 4926
diff changeset
1249
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents: 4926
diff changeset
1250 /* URI */
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents: 4926
diff changeset
1251 case sw_uri:
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents: 4926
diff changeset
1252
6626
b3682580c1bd Avoid left-shifting integers into the sign bit, which is undefined.
Sergey Kandaurov <pluknet@nginx.com>
parents: 6543
diff changeset
1253 if (usual[ch >> 5] & (1U << (ch & 0x1f))) {
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents: 4926
diff changeset
1254 break;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents: 4926
diff changeset
1255 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents: 4926
diff changeset
1256
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents: 4926
diff changeset
1257 switch (ch) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents: 4926
diff changeset
1258 case ' ':
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents: 4926
diff changeset
1259 r->space_in_uri = 1;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents: 4926
diff changeset
1260 break;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents: 4926
diff changeset
1261 case '#':
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents: 4926
diff changeset
1262 r->complex_uri = 1;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents: 4926
diff changeset
1263 break;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents: 4926
diff changeset
1264 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents: 4926
diff changeset
1265 break;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents: 4926
diff changeset
1266 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents: 4926
diff changeset
1267 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents: 4926
diff changeset
1268
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents: 4926
diff changeset
1269 return NGX_OK;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents: 4926
diff changeset
1270 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents: 4926
diff changeset
1271
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents: 4926
diff changeset
1272
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents: 4926
diff changeset
1273 ngx_int_t
1585
4435ca2e467d merge_slashes
Igor Sysoev <igor@sysoev.ru>
parents: 1584
diff changeset
1274 ngx_http_parse_complex_uri(ngx_http_request_t *r, ngx_uint_t merge_slashes)
200
abeaebe0a33c nginx-0.0.1-2003-11-28-20:41:47 import
Igor Sysoev <igor@sysoev.ru>
parents: 194
diff changeset
1275 {
290
87e73f067470 nginx-0.0.2-2004-03-16-10:10:12 import
Igor Sysoev <igor@sysoev.ru>
parents: 257
diff changeset
1276 u_char c, ch, decoded, *p, *u;
200
abeaebe0a33c nginx-0.0.1-2003-11-28-20:41:47 import
Igor Sysoev <igor@sysoev.ru>
parents: 194
diff changeset
1277 enum {
abeaebe0a33c nginx-0.0.1-2003-11-28-20:41:47 import
Igor Sysoev <igor@sysoev.ru>
parents: 194
diff changeset
1278 sw_usual = 0,
abeaebe0a33c nginx-0.0.1-2003-11-28-20:41:47 import
Igor Sysoev <igor@sysoev.ru>
parents: 194
diff changeset
1279 sw_slash,
abeaebe0a33c nginx-0.0.1-2003-11-28-20:41:47 import
Igor Sysoev <igor@sysoev.ru>
parents: 194
diff changeset
1280 sw_dot,
abeaebe0a33c nginx-0.0.1-2003-11-28-20:41:47 import
Igor Sysoev <igor@sysoev.ru>
parents: 194
diff changeset
1281 sw_dot_dot,
abeaebe0a33c nginx-0.0.1-2003-11-28-20:41:47 import
Igor Sysoev <igor@sysoev.ru>
parents: 194
diff changeset
1282 sw_quoted,
abeaebe0a33c nginx-0.0.1-2003-11-28-20:41:47 import
Igor Sysoev <igor@sysoev.ru>
parents: 194
diff changeset
1283 sw_quoted_second
abeaebe0a33c nginx-0.0.1-2003-11-28-20:41:47 import
Igor Sysoev <igor@sysoev.ru>
parents: 194
diff changeset
1284 } state, quoted_state;
abeaebe0a33c nginx-0.0.1-2003-11-28-20:41:47 import
Igor Sysoev <igor@sysoev.ru>
parents: 194
diff changeset
1285
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 473
diff changeset
1286 #if (NGX_SUPPRESS_WARN)
200
abeaebe0a33c nginx-0.0.1-2003-11-28-20:41:47 import
Igor Sysoev <igor@sysoev.ru>
parents: 194
diff changeset
1287 decoded = '\0';
abeaebe0a33c nginx-0.0.1-2003-11-28-20:41:47 import
Igor Sysoev <igor@sysoev.ru>
parents: 194
diff changeset
1288 quoted_state = sw_usual;
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 473
diff changeset
1289 #endif
200
abeaebe0a33c nginx-0.0.1-2003-11-28-20:41:47 import
Igor Sysoev <igor@sysoev.ru>
parents: 194
diff changeset
1290
abeaebe0a33c nginx-0.0.1-2003-11-28-20:41:47 import
Igor Sysoev <igor@sysoev.ru>
parents: 194
diff changeset
1291 state = sw_usual;
abeaebe0a33c nginx-0.0.1-2003-11-28-20:41:47 import
Igor Sysoev <igor@sysoev.ru>
parents: 194
diff changeset
1292 p = r->uri_start;
abeaebe0a33c nginx-0.0.1-2003-11-28-20:41:47 import
Igor Sysoev <igor@sysoev.ru>
parents: 194
diff changeset
1293 u = r->uri.data;
201
267ea1d98683 nginx-0.0.1-2003-11-30-23:03:18 import
Igor Sysoev <igor@sysoev.ru>
parents: 200
diff changeset
1294 r->uri_ext = NULL;
461
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
1295 r->args_start = NULL;
200
abeaebe0a33c nginx-0.0.1-2003-11-28-20:41:47 import
Igor Sysoev <igor@sysoev.ru>
parents: 194
diff changeset
1296
abeaebe0a33c nginx-0.0.1-2003-11-28-20:41:47 import
Igor Sysoev <igor@sysoev.ru>
parents: 194
diff changeset
1297 ch = *p++;
abeaebe0a33c nginx-0.0.1-2003-11-28-20:41:47 import
Igor Sysoev <igor@sysoev.ru>
parents: 194
diff changeset
1298
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 473
diff changeset
1299 while (p <= r->uri_end) {
461
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
1300
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
1301 /*
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 473
diff changeset
1302 * we use "ch = *p++" inside the cycle, but this operation is safe,
4572
67653855682e Fixed spelling in multiline C comments.
Ruslan Ermilov <ru@nginx.com>
parents: 4546
diff changeset
1303 * because after the URI there is always at least one character:
461
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
1304 * the line feed
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
1305 */
200
abeaebe0a33c nginx-0.0.1-2003-11-28-20:41:47 import
Igor Sysoev <igor@sysoev.ru>
parents: 194
diff changeset
1306
5247
55dc535ae5dc Fixed debug logging in ngx_http_parse_complex_uri().
Maxim Dounin <mdounin@mdounin.ru>
parents: 5189
diff changeset
1307 ngx_log_debug3(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
55dc535ae5dc Fixed debug logging in ngx_http_parse_complex_uri().
Maxim Dounin <mdounin@mdounin.ru>
parents: 5189
diff changeset
1308 "s:%d in:'%Xd:%c'", state, ch, ch);
200
abeaebe0a33c nginx-0.0.1-2003-11-28-20:41:47 import
Igor Sysoev <igor@sysoev.ru>
parents: 194
diff changeset
1309
abeaebe0a33c nginx-0.0.1-2003-11-28-20:41:47 import
Igor Sysoev <igor@sysoev.ru>
parents: 194
diff changeset
1310 switch (state) {
573
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 521
diff changeset
1311
200
abeaebe0a33c nginx-0.0.1-2003-11-28-20:41:47 import
Igor Sysoev <igor@sysoev.ru>
parents: 194
diff changeset
1312 case sw_usual:
823
ccf3c59f8040 optimize the most frequent cases
Igor Sysoev <igor@sysoev.ru>
parents: 822
diff changeset
1313
6626
b3682580c1bd Avoid left-shifting integers into the sign bit, which is undefined.
Sergey Kandaurov <pluknet@nginx.com>
parents: 6543
diff changeset
1314 if (usual[ch >> 5] & (1U << (ch & 0x1f))) {
823
ccf3c59f8040 optimize the most frequent cases
Igor Sysoev <igor@sysoev.ru>
parents: 822
diff changeset
1315 *u++ = ch;
ccf3c59f8040 optimize the most frequent cases
Igor Sysoev <igor@sysoev.ru>
parents: 822
diff changeset
1316 ch = *p++;
ccf3c59f8040 optimize the most frequent cases
Igor Sysoev <igor@sysoev.ru>
parents: 822
diff changeset
1317 break;
ccf3c59f8040 optimize the most frequent cases
Igor Sysoev <igor@sysoev.ru>
parents: 822
diff changeset
1318 }
ccf3c59f8040 optimize the most frequent cases
Igor Sysoev <igor@sysoev.ru>
parents: 822
diff changeset
1319
5757
c5ec6944de98 Style: add whitespace between control statement and parentheses.
Piotr Sikora <piotr@cloudflare.com>
parents: 5677
diff changeset
1320 switch (ch) {
461
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
1321 #if (NGX_WIN32)
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
1322 case '\\':
4674
5d86ab8f2340 Win32: normalization of trailing dot inside uri.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4572
diff changeset
1323 if (u - 2 >= r->uri.data
5d86ab8f2340 Win32: normalization of trailing dot inside uri.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4572
diff changeset
1324 && *(u - 1) == '.' && *(u - 2) != '.')
5d86ab8f2340 Win32: normalization of trailing dot inside uri.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4572
diff changeset
1325 {
5d86ab8f2340 Win32: normalization of trailing dot inside uri.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4572
diff changeset
1326 u--;
5d86ab8f2340 Win32: normalization of trailing dot inside uri.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4572
diff changeset
1327 }
5d86ab8f2340 Win32: normalization of trailing dot inside uri.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4572
diff changeset
1328
461
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
1329 r->uri_ext = NULL;
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
1330
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
1331 if (p == r->uri_start + r->uri.len) {
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
1332
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
1333 /*
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
1334 * we omit the last "\" to cause redirect because
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
1335 * the browsers do not treat "\" as "/" in relative URL path
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
1336 */
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
1337
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
1338 break;
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
1339 }
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
1340
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
1341 state = sw_slash;
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
1342 *u++ = '/';
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
1343 break;
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
1344 #endif
200
abeaebe0a33c nginx-0.0.1-2003-11-28-20:41:47 import
Igor Sysoev <igor@sysoev.ru>
parents: 194
diff changeset
1345 case '/':
4674
5d86ab8f2340 Win32: normalization of trailing dot inside uri.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4572
diff changeset
1346 #if (NGX_WIN32)
5d86ab8f2340 Win32: normalization of trailing dot inside uri.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4572
diff changeset
1347 if (u - 2 >= r->uri.data
5d86ab8f2340 Win32: normalization of trailing dot inside uri.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4572
diff changeset
1348 && *(u - 1) == '.' && *(u - 2) != '.')
5d86ab8f2340 Win32: normalization of trailing dot inside uri.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4572
diff changeset
1349 {
5d86ab8f2340 Win32: normalization of trailing dot inside uri.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4572
diff changeset
1350 u--;
5d86ab8f2340 Win32: normalization of trailing dot inside uri.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4572
diff changeset
1351 }
5d86ab8f2340 Win32: normalization of trailing dot inside uri.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4572
diff changeset
1352 #endif
201
267ea1d98683 nginx-0.0.1-2003-11-30-23:03:18 import
Igor Sysoev <igor@sysoev.ru>
parents: 200
diff changeset
1353 r->uri_ext = NULL;
200
abeaebe0a33c nginx-0.0.1-2003-11-28-20:41:47 import
Igor Sysoev <igor@sysoev.ru>
parents: 194
diff changeset
1354 state = sw_slash;
abeaebe0a33c nginx-0.0.1-2003-11-28-20:41:47 import
Igor Sysoev <igor@sysoev.ru>
parents: 194
diff changeset
1355 *u++ = ch;
abeaebe0a33c nginx-0.0.1-2003-11-28-20:41:47 import
Igor Sysoev <igor@sysoev.ru>
parents: 194
diff changeset
1356 break;
abeaebe0a33c nginx-0.0.1-2003-11-28-20:41:47 import
Igor Sysoev <igor@sysoev.ru>
parents: 194
diff changeset
1357 case '%':
abeaebe0a33c nginx-0.0.1-2003-11-28-20:41:47 import
Igor Sysoev <igor@sysoev.ru>
parents: 194
diff changeset
1358 quoted_state = state;
abeaebe0a33c nginx-0.0.1-2003-11-28-20:41:47 import
Igor Sysoev <igor@sysoev.ru>
parents: 194
diff changeset
1359 state = sw_quoted;
abeaebe0a33c nginx-0.0.1-2003-11-28-20:41:47 import
Igor Sysoev <igor@sysoev.ru>
parents: 194
diff changeset
1360 break;
461
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
1361 case '?':
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
1362 r->args_start = p;
820
cdbe991cbdf5 omit "#fragment"
Igor Sysoev <igor@sysoev.ru>
parents: 819
diff changeset
1363 goto args;
cdbe991cbdf5 omit "#fragment"
Igor Sysoev <igor@sysoev.ru>
parents: 819
diff changeset
1364 case '#':
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 473
diff changeset
1365 goto done;
201
267ea1d98683 nginx-0.0.1-2003-11-30-23:03:18 import
Igor Sysoev <igor@sysoev.ru>
parents: 200
diff changeset
1366 case '.':
267ea1d98683 nginx-0.0.1-2003-11-30-23:03:18 import
Igor Sysoev <igor@sysoev.ru>
parents: 200
diff changeset
1367 r->uri_ext = u + 1;
473
8e8f3af115b5 nginx-0.1.11-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 471
diff changeset
1368 *u++ = ch;
8e8f3af115b5 nginx-0.1.11-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 471
diff changeset
1369 break;
657
400711951595 nginx-0.3.50-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
1370 case '+':
400711951595 nginx-0.3.50-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
1371 r->plus_in_uri = 1;
4546
4988fa232629 For the sake of case/switch code readability, 'fall through'
Maxim Konovalov <maxim@nginx.com>
parents: 4530
diff changeset
1372 /* fall through */
200
abeaebe0a33c nginx-0.0.1-2003-11-28-20:41:47 import
Igor Sysoev <igor@sysoev.ru>
parents: 194
diff changeset
1373 default:
abeaebe0a33c nginx-0.0.1-2003-11-28-20:41:47 import
Igor Sysoev <igor@sysoev.ru>
parents: 194
diff changeset
1374 *u++ = ch;
abeaebe0a33c nginx-0.0.1-2003-11-28-20:41:47 import
Igor Sysoev <igor@sysoev.ru>
parents: 194
diff changeset
1375 break;
abeaebe0a33c nginx-0.0.1-2003-11-28-20:41:47 import
Igor Sysoev <igor@sysoev.ru>
parents: 194
diff changeset
1376 }
823
ccf3c59f8040 optimize the most frequent cases
Igor Sysoev <igor@sysoev.ru>
parents: 822
diff changeset
1377
200
abeaebe0a33c nginx-0.0.1-2003-11-28-20:41:47 import
Igor Sysoev <igor@sysoev.ru>
parents: 194
diff changeset
1378 ch = *p++;
abeaebe0a33c nginx-0.0.1-2003-11-28-20:41:47 import
Igor Sysoev <igor@sysoev.ru>
parents: 194
diff changeset
1379 break;
abeaebe0a33c nginx-0.0.1-2003-11-28-20:41:47 import
Igor Sysoev <igor@sysoev.ru>
parents: 194
diff changeset
1380
abeaebe0a33c nginx-0.0.1-2003-11-28-20:41:47 import
Igor Sysoev <igor@sysoev.ru>
parents: 194
diff changeset
1381 case sw_slash:
823
ccf3c59f8040 optimize the most frequent cases
Igor Sysoev <igor@sysoev.ru>
parents: 822
diff changeset
1382
6626
b3682580c1bd Avoid left-shifting integers into the sign bit, which is undefined.
Sergey Kandaurov <pluknet@nginx.com>
parents: 6543
diff changeset
1383 if (usual[ch >> 5] & (1U << (ch & 0x1f))) {
823
ccf3c59f8040 optimize the most frequent cases
Igor Sysoev <igor@sysoev.ru>
parents: 822
diff changeset
1384 state = sw_usual;
ccf3c59f8040 optimize the most frequent cases
Igor Sysoev <igor@sysoev.ru>
parents: 822
diff changeset
1385 *u++ = ch;
ccf3c59f8040 optimize the most frequent cases
Igor Sysoev <igor@sysoev.ru>
parents: 822
diff changeset
1386 ch = *p++;
ccf3c59f8040 optimize the most frequent cases
Igor Sysoev <igor@sysoev.ru>
parents: 822
diff changeset
1387 break;
ccf3c59f8040 optimize the most frequent cases
Igor Sysoev <igor@sysoev.ru>
parents: 822
diff changeset
1388 }
ccf3c59f8040 optimize the most frequent cases
Igor Sysoev <igor@sysoev.ru>
parents: 822
diff changeset
1389
5757
c5ec6944de98 Style: add whitespace between control statement and parentheses.
Piotr Sikora <piotr@cloudflare.com>
parents: 5677
diff changeset
1390 switch (ch) {
461
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
1391 #if (NGX_WIN32)
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
1392 case '\\':
1585
4435ca2e467d merge_slashes
Igor Sysoev <igor@sysoev.ru>
parents: 1584
diff changeset
1393 break;
461
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
1394 #endif
200
abeaebe0a33c nginx-0.0.1-2003-11-28-20:41:47 import
Igor Sysoev <igor@sysoev.ru>
parents: 194
diff changeset
1395 case '/':
1738
e8cef87413a0 fix merge_slashes
Igor Sysoev <igor@sysoev.ru>
parents: 1603
diff changeset
1396 if (!merge_slashes) {
1585
4435ca2e467d merge_slashes
Igor Sysoev <igor@sysoev.ru>
parents: 1584
diff changeset
1397 *u++ = ch;
4435ca2e467d merge_slashes
Igor Sysoev <igor@sysoev.ru>
parents: 1584
diff changeset
1398 }
200
abeaebe0a33c nginx-0.0.1-2003-11-28-20:41:47 import
Igor Sysoev <igor@sysoev.ru>
parents: 194
diff changeset
1399 break;
abeaebe0a33c nginx-0.0.1-2003-11-28-20:41:47 import
Igor Sysoev <igor@sysoev.ru>
parents: 194
diff changeset
1400 case '.':
abeaebe0a33c nginx-0.0.1-2003-11-28-20:41:47 import
Igor Sysoev <igor@sysoev.ru>
parents: 194
diff changeset
1401 state = sw_dot;
abeaebe0a33c nginx-0.0.1-2003-11-28-20:41:47 import
Igor Sysoev <igor@sysoev.ru>
parents: 194
diff changeset
1402 *u++ = ch;
abeaebe0a33c nginx-0.0.1-2003-11-28-20:41:47 import
Igor Sysoev <igor@sysoev.ru>
parents: 194
diff changeset
1403 break;
abeaebe0a33c nginx-0.0.1-2003-11-28-20:41:47 import
Igor Sysoev <igor@sysoev.ru>
parents: 194
diff changeset
1404 case '%':
abeaebe0a33c nginx-0.0.1-2003-11-28-20:41:47 import
Igor Sysoev <igor@sysoev.ru>
parents: 194
diff changeset
1405 quoted_state = state;
abeaebe0a33c nginx-0.0.1-2003-11-28-20:41:47 import
Igor Sysoev <igor@sysoev.ru>
parents: 194
diff changeset
1406 state = sw_quoted;
abeaebe0a33c nginx-0.0.1-2003-11-28-20:41:47 import
Igor Sysoev <igor@sysoev.ru>
parents: 194
diff changeset
1407 break;
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 473
diff changeset
1408 case '?':
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 473
diff changeset
1409 r->args_start = p;
820
cdbe991cbdf5 omit "#fragment"
Igor Sysoev <igor@sysoev.ru>
parents: 819
diff changeset
1410 goto args;
cdbe991cbdf5 omit "#fragment"
Igor Sysoev <igor@sysoev.ru>
parents: 819
diff changeset
1411 case '#':
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 473
diff changeset
1412 goto done;
657
400711951595 nginx-0.3.50-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
1413 case '+':
400711951595 nginx-0.3.50-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
1414 r->plus_in_uri = 1;
6994
f38647c651a8 Added missing "fall through" comments (ticket #1259).
Maxim Dounin <mdounin@mdounin.ru>
parents: 6993
diff changeset
1415 /* fall through */
200
abeaebe0a33c nginx-0.0.1-2003-11-28-20:41:47 import
Igor Sysoev <igor@sysoev.ru>
parents: 194
diff changeset
1416 default:
abeaebe0a33c nginx-0.0.1-2003-11-28-20:41:47 import
Igor Sysoev <igor@sysoev.ru>
parents: 194
diff changeset
1417 state = sw_usual;
abeaebe0a33c nginx-0.0.1-2003-11-28-20:41:47 import
Igor Sysoev <igor@sysoev.ru>
parents: 194
diff changeset
1418 *u++ = ch;
abeaebe0a33c nginx-0.0.1-2003-11-28-20:41:47 import
Igor Sysoev <igor@sysoev.ru>
parents: 194
diff changeset
1419 break;
abeaebe0a33c nginx-0.0.1-2003-11-28-20:41:47 import
Igor Sysoev <igor@sysoev.ru>
parents: 194
diff changeset
1420 }
823
ccf3c59f8040 optimize the most frequent cases
Igor Sysoev <igor@sysoev.ru>
parents: 822
diff changeset
1421
200
abeaebe0a33c nginx-0.0.1-2003-11-28-20:41:47 import
Igor Sysoev <igor@sysoev.ru>
parents: 194
diff changeset
1422 ch = *p++;
abeaebe0a33c nginx-0.0.1-2003-11-28-20:41:47 import
Igor Sysoev <igor@sysoev.ru>
parents: 194
diff changeset
1423 break;
abeaebe0a33c nginx-0.0.1-2003-11-28-20:41:47 import
Igor Sysoev <igor@sysoev.ru>
parents: 194
diff changeset
1424
abeaebe0a33c nginx-0.0.1-2003-11-28-20:41:47 import
Igor Sysoev <igor@sysoev.ru>
parents: 194
diff changeset
1425 case sw_dot:
823
ccf3c59f8040 optimize the most frequent cases
Igor Sysoev <igor@sysoev.ru>
parents: 822
diff changeset
1426
6626
b3682580c1bd Avoid left-shifting integers into the sign bit, which is undefined.
Sergey Kandaurov <pluknet@nginx.com>
parents: 6543
diff changeset
1427 if (usual[ch >> 5] & (1U << (ch & 0x1f))) {
823
ccf3c59f8040 optimize the most frequent cases
Igor Sysoev <igor@sysoev.ru>
parents: 822
diff changeset
1428 state = sw_usual;
ccf3c59f8040 optimize the most frequent cases
Igor Sysoev <igor@sysoev.ru>
parents: 822
diff changeset
1429 *u++ = ch;
ccf3c59f8040 optimize the most frequent cases
Igor Sysoev <igor@sysoev.ru>
parents: 822
diff changeset
1430 ch = *p++;
ccf3c59f8040 optimize the most frequent cases
Igor Sysoev <igor@sysoev.ru>
parents: 822
diff changeset
1431 break;
ccf3c59f8040 optimize the most frequent cases
Igor Sysoev <igor@sysoev.ru>
parents: 822
diff changeset
1432 }
ccf3c59f8040 optimize the most frequent cases
Igor Sysoev <igor@sysoev.ru>
parents: 822
diff changeset
1433
5757
c5ec6944de98 Style: add whitespace between control statement and parentheses.
Piotr Sikora <piotr@cloudflare.com>
parents: 5677
diff changeset
1434 switch (ch) {
461
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
1435 #if (NGX_WIN32)
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
1436 case '\\':
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
1437 #endif
200
abeaebe0a33c nginx-0.0.1-2003-11-28-20:41:47 import
Igor Sysoev <igor@sysoev.ru>
parents: 194
diff changeset
1438 case '/':
abeaebe0a33c nginx-0.0.1-2003-11-28-20:41:47 import
Igor Sysoev <igor@sysoev.ru>
parents: 194
diff changeset
1439 state = sw_slash;
abeaebe0a33c nginx-0.0.1-2003-11-28-20:41:47 import
Igor Sysoev <igor@sysoev.ru>
parents: 194
diff changeset
1440 u--;
abeaebe0a33c nginx-0.0.1-2003-11-28-20:41:47 import
Igor Sysoev <igor@sysoev.ru>
parents: 194
diff changeset
1441 break;
abeaebe0a33c nginx-0.0.1-2003-11-28-20:41:47 import
Igor Sysoev <igor@sysoev.ru>
parents: 194
diff changeset
1442 case '.':
abeaebe0a33c nginx-0.0.1-2003-11-28-20:41:47 import
Igor Sysoev <igor@sysoev.ru>
parents: 194
diff changeset
1443 state = sw_dot_dot;
abeaebe0a33c nginx-0.0.1-2003-11-28-20:41:47 import
Igor Sysoev <igor@sysoev.ru>
parents: 194
diff changeset
1444 *u++ = ch;
abeaebe0a33c nginx-0.0.1-2003-11-28-20:41:47 import
Igor Sysoev <igor@sysoev.ru>
parents: 194
diff changeset
1445 break;
abeaebe0a33c nginx-0.0.1-2003-11-28-20:41:47 import
Igor Sysoev <igor@sysoev.ru>
parents: 194
diff changeset
1446 case '%':
abeaebe0a33c nginx-0.0.1-2003-11-28-20:41:47 import
Igor Sysoev <igor@sysoev.ru>
parents: 194
diff changeset
1447 quoted_state = state;
abeaebe0a33c nginx-0.0.1-2003-11-28-20:41:47 import
Igor Sysoev <igor@sysoev.ru>
parents: 194
diff changeset
1448 state = sw_quoted;
abeaebe0a33c nginx-0.0.1-2003-11-28-20:41:47 import
Igor Sysoev <igor@sysoev.ru>
parents: 194
diff changeset
1449 break;
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 473
diff changeset
1450 case '?':
7578
79bcbe7cd3f2 The "/." and "/.." at the end of URI should be normalized.
Ruslan Ermilov <ru@nginx.com>
parents: 7577
diff changeset
1451 u--;
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 473
diff changeset
1452 r->args_start = p;
820
cdbe991cbdf5 omit "#fragment"
Igor Sysoev <igor@sysoev.ru>
parents: 819
diff changeset
1453 goto args;
cdbe991cbdf5 omit "#fragment"
Igor Sysoev <igor@sysoev.ru>
parents: 819
diff changeset
1454 case '#':
7578
79bcbe7cd3f2 The "/." and "/.." at the end of URI should be normalized.
Ruslan Ermilov <ru@nginx.com>
parents: 7577
diff changeset
1455 u--;
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 473
diff changeset
1456 goto done;
657
400711951595 nginx-0.3.50-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
1457 case '+':
400711951595 nginx-0.3.50-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
1458 r->plus_in_uri = 1;
6994
f38647c651a8 Added missing "fall through" comments (ticket #1259).
Maxim Dounin <mdounin@mdounin.ru>
parents: 6993
diff changeset
1459 /* fall through */
200
abeaebe0a33c nginx-0.0.1-2003-11-28-20:41:47 import
Igor Sysoev <igor@sysoev.ru>
parents: 194
diff changeset
1460 default:
abeaebe0a33c nginx-0.0.1-2003-11-28-20:41:47 import
Igor Sysoev <igor@sysoev.ru>
parents: 194
diff changeset
1461 state = sw_usual;
abeaebe0a33c nginx-0.0.1-2003-11-28-20:41:47 import
Igor Sysoev <igor@sysoev.ru>
parents: 194
diff changeset
1462 *u++ = ch;
abeaebe0a33c nginx-0.0.1-2003-11-28-20:41:47 import
Igor Sysoev <igor@sysoev.ru>
parents: 194
diff changeset
1463 break;
abeaebe0a33c nginx-0.0.1-2003-11-28-20:41:47 import
Igor Sysoev <igor@sysoev.ru>
parents: 194
diff changeset
1464 }
823
ccf3c59f8040 optimize the most frequent cases
Igor Sysoev <igor@sysoev.ru>
parents: 822
diff changeset
1465
200
abeaebe0a33c nginx-0.0.1-2003-11-28-20:41:47 import
Igor Sysoev <igor@sysoev.ru>
parents: 194
diff changeset
1466 ch = *p++;
abeaebe0a33c nginx-0.0.1-2003-11-28-20:41:47 import
Igor Sysoev <igor@sysoev.ru>
parents: 194
diff changeset
1467 break;
abeaebe0a33c nginx-0.0.1-2003-11-28-20:41:47 import
Igor Sysoev <igor@sysoev.ru>
parents: 194
diff changeset
1468
abeaebe0a33c nginx-0.0.1-2003-11-28-20:41:47 import
Igor Sysoev <igor@sysoev.ru>
parents: 194
diff changeset
1469 case sw_dot_dot:
823
ccf3c59f8040 optimize the most frequent cases
Igor Sysoev <igor@sysoev.ru>
parents: 822
diff changeset
1470
6626
b3682580c1bd Avoid left-shifting integers into the sign bit, which is undefined.
Sergey Kandaurov <pluknet@nginx.com>
parents: 6543
diff changeset
1471 if (usual[ch >> 5] & (1U << (ch & 0x1f))) {
823
ccf3c59f8040 optimize the most frequent cases
Igor Sysoev <igor@sysoev.ru>
parents: 822
diff changeset
1472 state = sw_usual;
ccf3c59f8040 optimize the most frequent cases
Igor Sysoev <igor@sysoev.ru>
parents: 822
diff changeset
1473 *u++ = ch;
ccf3c59f8040 optimize the most frequent cases
Igor Sysoev <igor@sysoev.ru>
parents: 822
diff changeset
1474 ch = *p++;
ccf3c59f8040 optimize the most frequent cases
Igor Sysoev <igor@sysoev.ru>
parents: 822
diff changeset
1475 break;
ccf3c59f8040 optimize the most frequent cases
Igor Sysoev <igor@sysoev.ru>
parents: 822
diff changeset
1476 }
ccf3c59f8040 optimize the most frequent cases
Igor Sysoev <igor@sysoev.ru>
parents: 822
diff changeset
1477
5757
c5ec6944de98 Style: add whitespace between control statement and parentheses.
Piotr Sikora <piotr@cloudflare.com>
parents: 5677
diff changeset
1478 switch (ch) {
461
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
1479 #if (NGX_WIN32)
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
1480 case '\\':
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
1481 #endif
200
abeaebe0a33c nginx-0.0.1-2003-11-28-20:41:47 import
Igor Sysoev <igor@sysoev.ru>
parents: 194
diff changeset
1482 case '/':
7578
79bcbe7cd3f2 The "/." and "/.." at the end of URI should be normalized.
Ruslan Ermilov <ru@nginx.com>
parents: 7577
diff changeset
1483 case '?':
79bcbe7cd3f2 The "/." and "/.." at the end of URI should be normalized.
Ruslan Ermilov <ru@nginx.com>
parents: 7577
diff changeset
1484 case '#':
7579
6208c5418c88 Fixed URI normalization with merge_slashes switched off.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7578
diff changeset
1485 u -= 4;
3121
bd2573c97e4a handle "/../" case more reliably
Igor Sysoev <igor@sysoev.ru>
parents: 3079
diff changeset
1486 for ( ;; ) {
bd2573c97e4a handle "/../" case more reliably
Igor Sysoev <igor@sysoev.ru>
parents: 3079
diff changeset
1487 if (u < r->uri.data) {
bd2573c97e4a handle "/../" case more reliably
Igor Sysoev <igor@sysoev.ru>
parents: 3079
diff changeset
1488 return NGX_HTTP_PARSE_INVALID_REQUEST;
bd2573c97e4a handle "/../" case more reliably
Igor Sysoev <igor@sysoev.ru>
parents: 3079
diff changeset
1489 }
bd2573c97e4a handle "/../" case more reliably
Igor Sysoev <igor@sysoev.ru>
parents: 3079
diff changeset
1490 if (*u == '/') {
bd2573c97e4a handle "/../" case more reliably
Igor Sysoev <igor@sysoev.ru>
parents: 3079
diff changeset
1491 u++;
bd2573c97e4a handle "/../" case more reliably
Igor Sysoev <igor@sysoev.ru>
parents: 3079
diff changeset
1492 break;
bd2573c97e4a handle "/../" case more reliably
Igor Sysoev <igor@sysoev.ru>
parents: 3079
diff changeset
1493 }
200
abeaebe0a33c nginx-0.0.1-2003-11-28-20:41:47 import
Igor Sysoev <igor@sysoev.ru>
parents: 194
diff changeset
1494 u--;
abeaebe0a33c nginx-0.0.1-2003-11-28-20:41:47 import
Igor Sysoev <igor@sysoev.ru>
parents: 194
diff changeset
1495 }
7578
79bcbe7cd3f2 The "/." and "/.." at the end of URI should be normalized.
Ruslan Ermilov <ru@nginx.com>
parents: 7577
diff changeset
1496 if (ch == '?') {
79bcbe7cd3f2 The "/." and "/.." at the end of URI should be normalized.
Ruslan Ermilov <ru@nginx.com>
parents: 7577
diff changeset
1497 r->args_start = p;
79bcbe7cd3f2 The "/." and "/.." at the end of URI should be normalized.
Ruslan Ermilov <ru@nginx.com>
parents: 7577
diff changeset
1498 goto args;
79bcbe7cd3f2 The "/." and "/.." at the end of URI should be normalized.
Ruslan Ermilov <ru@nginx.com>
parents: 7577
diff changeset
1499 }
79bcbe7cd3f2 The "/." and "/.." at the end of URI should be normalized.
Ruslan Ermilov <ru@nginx.com>
parents: 7577
diff changeset
1500 if (ch == '#') {
79bcbe7cd3f2 The "/." and "/.." at the end of URI should be normalized.
Ruslan Ermilov <ru@nginx.com>
parents: 7577
diff changeset
1501 goto done;
79bcbe7cd3f2 The "/." and "/.." at the end of URI should be normalized.
Ruslan Ermilov <ru@nginx.com>
parents: 7577
diff changeset
1502 }
79bcbe7cd3f2 The "/." and "/.." at the end of URI should be normalized.
Ruslan Ermilov <ru@nginx.com>
parents: 7577
diff changeset
1503 state = sw_slash;
200
abeaebe0a33c nginx-0.0.1-2003-11-28-20:41:47 import
Igor Sysoev <igor@sysoev.ru>
parents: 194
diff changeset
1504 break;
abeaebe0a33c nginx-0.0.1-2003-11-28-20:41:47 import
Igor Sysoev <igor@sysoev.ru>
parents: 194
diff changeset
1505 case '%':
abeaebe0a33c nginx-0.0.1-2003-11-28-20:41:47 import
Igor Sysoev <igor@sysoev.ru>
parents: 194
diff changeset
1506 quoted_state = state;
abeaebe0a33c nginx-0.0.1-2003-11-28-20:41:47 import
Igor Sysoev <igor@sysoev.ru>
parents: 194
diff changeset
1507 state = sw_quoted;
abeaebe0a33c nginx-0.0.1-2003-11-28-20:41:47 import
Igor Sysoev <igor@sysoev.ru>
parents: 194
diff changeset
1508 break;
657
400711951595 nginx-0.3.50-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
1509 case '+':
400711951595 nginx-0.3.50-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
1510 r->plus_in_uri = 1;
6994
f38647c651a8 Added missing "fall through" comments (ticket #1259).
Maxim Dounin <mdounin@mdounin.ru>
parents: 6993
diff changeset
1511 /* fall through */
200
abeaebe0a33c nginx-0.0.1-2003-11-28-20:41:47 import
Igor Sysoev <igor@sysoev.ru>
parents: 194
diff changeset
1512 default:
abeaebe0a33c nginx-0.0.1-2003-11-28-20:41:47 import
Igor Sysoev <igor@sysoev.ru>
parents: 194
diff changeset
1513 state = sw_usual;
abeaebe0a33c nginx-0.0.1-2003-11-28-20:41:47 import
Igor Sysoev <igor@sysoev.ru>
parents: 194
diff changeset
1514 *u++ = ch;
abeaebe0a33c nginx-0.0.1-2003-11-28-20:41:47 import
Igor Sysoev <igor@sysoev.ru>
parents: 194
diff changeset
1515 break;
abeaebe0a33c nginx-0.0.1-2003-11-28-20:41:47 import
Igor Sysoev <igor@sysoev.ru>
parents: 194
diff changeset
1516 }
823
ccf3c59f8040 optimize the most frequent cases
Igor Sysoev <igor@sysoev.ru>
parents: 822
diff changeset
1517
200
abeaebe0a33c nginx-0.0.1-2003-11-28-20:41:47 import
Igor Sysoev <igor@sysoev.ru>
parents: 194
diff changeset
1518 ch = *p++;
abeaebe0a33c nginx-0.0.1-2003-11-28-20:41:47 import
Igor Sysoev <igor@sysoev.ru>
parents: 194
diff changeset
1519 break;
abeaebe0a33c nginx-0.0.1-2003-11-28-20:41:47 import
Igor Sysoev <igor@sysoev.ru>
parents: 194
diff changeset
1520
abeaebe0a33c nginx-0.0.1-2003-11-28-20:41:47 import
Igor Sysoev <igor@sysoev.ru>
parents: 194
diff changeset
1521 case sw_quoted:
667
63a820b0bc6c nginx-0.3.55-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 657
diff changeset
1522 r->quoted_uri = 1;
63a820b0bc6c nginx-0.3.55-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 657
diff changeset
1523
200
abeaebe0a33c nginx-0.0.1-2003-11-28-20:41:47 import
Igor Sysoev <igor@sysoev.ru>
parents: 194
diff changeset
1524 if (ch >= '0' && ch <= '9') {
291
117ccc7c4055 nginx-0.0.3-2004-03-16-16:35:20 import
Igor Sysoev <igor@sysoev.ru>
parents: 290
diff changeset
1525 decoded = (u_char) (ch - '0');
200
abeaebe0a33c nginx-0.0.1-2003-11-28-20:41:47 import
Igor Sysoev <igor@sysoev.ru>
parents: 194
diff changeset
1526 state = sw_quoted_second;
abeaebe0a33c nginx-0.0.1-2003-11-28-20:41:47 import
Igor Sysoev <igor@sysoev.ru>
parents: 194
diff changeset
1527 ch = *p++;
abeaebe0a33c nginx-0.0.1-2003-11-28-20:41:47 import
Igor Sysoev <igor@sysoev.ru>
parents: 194
diff changeset
1528 break;
abeaebe0a33c nginx-0.0.1-2003-11-28-20:41:47 import
Igor Sysoev <igor@sysoev.ru>
parents: 194
diff changeset
1529 }
abeaebe0a33c nginx-0.0.1-2003-11-28-20:41:47 import
Igor Sysoev <igor@sysoev.ru>
parents: 194
diff changeset
1530
291
117ccc7c4055 nginx-0.0.3-2004-03-16-16:35:20 import
Igor Sysoev <igor@sysoev.ru>
parents: 290
diff changeset
1531 c = (u_char) (ch | 0x20);
200
abeaebe0a33c nginx-0.0.1-2003-11-28-20:41:47 import
Igor Sysoev <igor@sysoev.ru>
parents: 194
diff changeset
1532 if (c >= 'a' && c <= 'f') {
291
117ccc7c4055 nginx-0.0.3-2004-03-16-16:35:20 import
Igor Sysoev <igor@sysoev.ru>
parents: 290
diff changeset
1533 decoded = (u_char) (c - 'a' + 10);
200
abeaebe0a33c nginx-0.0.1-2003-11-28-20:41:47 import
Igor Sysoev <igor@sysoev.ru>
parents: 194
diff changeset
1534 state = sw_quoted_second;
abeaebe0a33c nginx-0.0.1-2003-11-28-20:41:47 import
Igor Sysoev <igor@sysoev.ru>
parents: 194
diff changeset
1535 ch = *p++;
abeaebe0a33c nginx-0.0.1-2003-11-28-20:41:47 import
Igor Sysoev <igor@sysoev.ru>
parents: 194
diff changeset
1536 break;
abeaebe0a33c nginx-0.0.1-2003-11-28-20:41:47 import
Igor Sysoev <igor@sysoev.ru>
parents: 194
diff changeset
1537 }
abeaebe0a33c nginx-0.0.1-2003-11-28-20:41:47 import
Igor Sysoev <igor@sysoev.ru>
parents: 194
diff changeset
1538
abeaebe0a33c nginx-0.0.1-2003-11-28-20:41:47 import
Igor Sysoev <igor@sysoev.ru>
parents: 194
diff changeset
1539 return NGX_HTTP_PARSE_INVALID_REQUEST;
abeaebe0a33c nginx-0.0.1-2003-11-28-20:41:47 import
Igor Sysoev <igor@sysoev.ru>
parents: 194
diff changeset
1540
abeaebe0a33c nginx-0.0.1-2003-11-28-20:41:47 import
Igor Sysoev <igor@sysoev.ru>
parents: 194
diff changeset
1541 case sw_quoted_second:
abeaebe0a33c nginx-0.0.1-2003-11-28-20:41:47 import
Igor Sysoev <igor@sysoev.ru>
parents: 194
diff changeset
1542 if (ch >= '0' && ch <= '9') {
7067
e3723f2a11b7 Parenthesized ASCII-related calculations.
Valentin Bartenev <vbart@nginx.com>
parents: 6994
diff changeset
1543 ch = (u_char) ((decoded << 4) + (ch - '0'));
489
45a460f82aec nginx-0.1.19-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 485
diff changeset
1544
3571
67394153ec39 fix "/dir/%3F../" and "/dir/%23../" cases
Igor Sysoev <igor@sysoev.ru>
parents: 3527
diff changeset
1545 if (ch == '%' || ch == '#') {
204
e0bcfb77d6c7 nginx-0.0.1-2003-12-02-19:57:05 import
Igor Sysoev <igor@sysoev.ru>
parents: 201
diff changeset
1546 state = sw_usual;
e0bcfb77d6c7 nginx-0.0.1-2003-12-02-19:57:05 import
Igor Sysoev <igor@sysoev.ru>
parents: 201
diff changeset
1547 *u++ = ch;
e0bcfb77d6c7 nginx-0.0.1-2003-12-02-19:57:05 import
Igor Sysoev <igor@sysoev.ru>
parents: 201
diff changeset
1548 ch = *p++;
e0bcfb77d6c7 nginx-0.0.1-2003-12-02-19:57:05 import
Igor Sysoev <igor@sysoev.ru>
parents: 201
diff changeset
1549 break;
820
cdbe991cbdf5 omit "#fragment"
Igor Sysoev <igor@sysoev.ru>
parents: 819
diff changeset
1550
cdbe991cbdf5 omit "#fragment"
Igor Sysoev <igor@sysoev.ru>
parents: 819
diff changeset
1551 } else if (ch == '\0') {
3527
84905c7b2aa7 remove r->zero_in_uri
Igor Sysoev <igor@sysoev.ru>
parents: 3161
diff changeset
1552 return NGX_HTTP_PARSE_INVALID_REQUEST;
489
45a460f82aec nginx-0.1.19-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 485
diff changeset
1553 }
45a460f82aec nginx-0.1.19-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 485
diff changeset
1554
200
abeaebe0a33c nginx-0.0.1-2003-11-28-20:41:47 import
Igor Sysoev <igor@sysoev.ru>
parents: 194
diff changeset
1555 state = quoted_state;
abeaebe0a33c nginx-0.0.1-2003-11-28-20:41:47 import
Igor Sysoev <igor@sysoev.ru>
parents: 194
diff changeset
1556 break;
abeaebe0a33c nginx-0.0.1-2003-11-28-20:41:47 import
Igor Sysoev <igor@sysoev.ru>
parents: 194
diff changeset
1557 }
abeaebe0a33c nginx-0.0.1-2003-11-28-20:41:47 import
Igor Sysoev <igor@sysoev.ru>
parents: 194
diff changeset
1558
291
117ccc7c4055 nginx-0.0.3-2004-03-16-16:35:20 import
Igor Sysoev <igor@sysoev.ru>
parents: 290
diff changeset
1559 c = (u_char) (ch | 0x20);
200
abeaebe0a33c nginx-0.0.1-2003-11-28-20:41:47 import
Igor Sysoev <igor@sysoev.ru>
parents: 194
diff changeset
1560 if (c >= 'a' && c <= 'f') {
7067
e3723f2a11b7 Parenthesized ASCII-related calculations.
Valentin Bartenev <vbart@nginx.com>
parents: 6994
diff changeset
1561 ch = (u_char) ((decoded << 4) + (c - 'a') + 10);
657
400711951595 nginx-0.3.50-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
1562
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 473
diff changeset
1563 if (ch == '?') {
3571
67394153ec39 fix "/dir/%3F../" and "/dir/%23../" cases
Igor Sysoev <igor@sysoev.ru>
parents: 3527
diff changeset
1564 state = sw_usual;
204
e0bcfb77d6c7 nginx-0.0.1-2003-12-02-19:57:05 import
Igor Sysoev <igor@sysoev.ru>
parents: 201
diff changeset
1565 *u++ = ch;
e0bcfb77d6c7 nginx-0.0.1-2003-12-02-19:57:05 import
Igor Sysoev <igor@sysoev.ru>
parents: 201
diff changeset
1566 ch = *p++;
3571
67394153ec39 fix "/dir/%3F../" and "/dir/%23../" cases
Igor Sysoev <igor@sysoev.ru>
parents: 3527
diff changeset
1567 break;
657
400711951595 nginx-0.3.50-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
1568
400711951595 nginx-0.3.50-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
1569 } else if (ch == '+') {
400711951595 nginx-0.3.50-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
1570 r->plus_in_uri = 1;
204
e0bcfb77d6c7 nginx-0.0.1-2003-12-02-19:57:05 import
Igor Sysoev <igor@sysoev.ru>
parents: 201
diff changeset
1571 }
657
400711951595 nginx-0.3.50-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
1572
200
abeaebe0a33c nginx-0.0.1-2003-11-28-20:41:47 import
Igor Sysoev <igor@sysoev.ru>
parents: 194
diff changeset
1573 state = quoted_state;
abeaebe0a33c nginx-0.0.1-2003-11-28-20:41:47 import
Igor Sysoev <igor@sysoev.ru>
parents: 194
diff changeset
1574 break;
abeaebe0a33c nginx-0.0.1-2003-11-28-20:41:47 import
Igor Sysoev <igor@sysoev.ru>
parents: 194
diff changeset
1575 }
abeaebe0a33c nginx-0.0.1-2003-11-28-20:41:47 import
Igor Sysoev <igor@sysoev.ru>
parents: 194
diff changeset
1576
abeaebe0a33c nginx-0.0.1-2003-11-28-20:41:47 import
Igor Sysoev <igor@sysoev.ru>
parents: 194
diff changeset
1577 return NGX_HTTP_PARSE_INVALID_REQUEST;
abeaebe0a33c nginx-0.0.1-2003-11-28-20:41:47 import
Igor Sysoev <igor@sysoev.ru>
parents: 194
diff changeset
1578 }
abeaebe0a33c nginx-0.0.1-2003-11-28-20:41:47 import
Igor Sysoev <igor@sysoev.ru>
parents: 194
diff changeset
1579 }
abeaebe0a33c nginx-0.0.1-2003-11-28-20:41:47 import
Igor Sysoev <igor@sysoev.ru>
parents: 194
diff changeset
1580
7577
5a3426683251 Improved detection of broken percent encoding in URI.
Ruslan Ermilov <ru@nginx.com>
parents: 7562
diff changeset
1581 if (state == sw_quoted || state == sw_quoted_second) {
5a3426683251 Improved detection of broken percent encoding in URI.
Ruslan Ermilov <ru@nginx.com>
parents: 7562
diff changeset
1582 return NGX_HTTP_PARSE_INVALID_REQUEST;
5a3426683251 Improved detection of broken percent encoding in URI.
Ruslan Ermilov <ru@nginx.com>
parents: 7562
diff changeset
1583 }
5a3426683251 Improved detection of broken percent encoding in URI.
Ruslan Ermilov <ru@nginx.com>
parents: 7562
diff changeset
1584
7578
79bcbe7cd3f2 The "/." and "/.." at the end of URI should be normalized.
Ruslan Ermilov <ru@nginx.com>
parents: 7577
diff changeset
1585 if (state == sw_dot) {
79bcbe7cd3f2 The "/." and "/.." at the end of URI should be normalized.
Ruslan Ermilov <ru@nginx.com>
parents: 7577
diff changeset
1586 u--;
79bcbe7cd3f2 The "/." and "/.." at the end of URI should be normalized.
Ruslan Ermilov <ru@nginx.com>
parents: 7577
diff changeset
1587
79bcbe7cd3f2 The "/." and "/.." at the end of URI should be normalized.
Ruslan Ermilov <ru@nginx.com>
parents: 7577
diff changeset
1588 } else if (state == sw_dot_dot) {
7579
6208c5418c88 Fixed URI normalization with merge_slashes switched off.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7578
diff changeset
1589 u -= 4;
7578
79bcbe7cd3f2 The "/." and "/.." at the end of URI should be normalized.
Ruslan Ermilov <ru@nginx.com>
parents: 7577
diff changeset
1590
79bcbe7cd3f2 The "/." and "/.." at the end of URI should be normalized.
Ruslan Ermilov <ru@nginx.com>
parents: 7577
diff changeset
1591 for ( ;; ) {
79bcbe7cd3f2 The "/." and "/.." at the end of URI should be normalized.
Ruslan Ermilov <ru@nginx.com>
parents: 7577
diff changeset
1592 if (u < r->uri.data) {
79bcbe7cd3f2 The "/." and "/.." at the end of URI should be normalized.
Ruslan Ermilov <ru@nginx.com>
parents: 7577
diff changeset
1593 return NGX_HTTP_PARSE_INVALID_REQUEST;
79bcbe7cd3f2 The "/." and "/.." at the end of URI should be normalized.
Ruslan Ermilov <ru@nginx.com>
parents: 7577
diff changeset
1594 }
79bcbe7cd3f2 The "/." and "/.." at the end of URI should be normalized.
Ruslan Ermilov <ru@nginx.com>
parents: 7577
diff changeset
1595
79bcbe7cd3f2 The "/." and "/.." at the end of URI should be normalized.
Ruslan Ermilov <ru@nginx.com>
parents: 7577
diff changeset
1596 if (*u == '/') {
79bcbe7cd3f2 The "/." and "/.." at the end of URI should be normalized.
Ruslan Ermilov <ru@nginx.com>
parents: 7577
diff changeset
1597 u++;
79bcbe7cd3f2 The "/." and "/.." at the end of URI should be normalized.
Ruslan Ermilov <ru@nginx.com>
parents: 7577
diff changeset
1598 break;
79bcbe7cd3f2 The "/." and "/.." at the end of URI should be normalized.
Ruslan Ermilov <ru@nginx.com>
parents: 7577
diff changeset
1599 }
79bcbe7cd3f2 The "/." and "/.." at the end of URI should be normalized.
Ruslan Ermilov <ru@nginx.com>
parents: 7577
diff changeset
1600
79bcbe7cd3f2 The "/." and "/.." at the end of URI should be normalized.
Ruslan Ermilov <ru@nginx.com>
parents: 7577
diff changeset
1601 u--;
79bcbe7cd3f2 The "/." and "/.." at the end of URI should be normalized.
Ruslan Ermilov <ru@nginx.com>
parents: 7577
diff changeset
1602 }
79bcbe7cd3f2 The "/." and "/.." at the end of URI should be normalized.
Ruslan Ermilov <ru@nginx.com>
parents: 7577
diff changeset
1603 }
79bcbe7cd3f2 The "/." and "/.." at the end of URI should be normalized.
Ruslan Ermilov <ru@nginx.com>
parents: 7577
diff changeset
1604
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 473
diff changeset
1605 done:
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 473
diff changeset
1606
200
abeaebe0a33c nginx-0.0.1-2003-11-28-20:41:47 import
Igor Sysoev <igor@sysoev.ru>
parents: 194
diff changeset
1607 r->uri.len = u - r->uri.data;
abeaebe0a33c nginx-0.0.1-2003-11-28-20:41:47 import
Igor Sysoev <igor@sysoev.ru>
parents: 194
diff changeset
1608
201
267ea1d98683 nginx-0.0.1-2003-11-30-23:03:18 import
Igor Sysoev <igor@sysoev.ru>
parents: 200
diff changeset
1609 if (r->uri_ext) {
267ea1d98683 nginx-0.0.1-2003-11-30-23:03:18 import
Igor Sysoev <igor@sysoev.ru>
parents: 200
diff changeset
1610 r->exten.len = u - r->uri_ext;
461
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
1611 r->exten.data = r->uri_ext;
201
267ea1d98683 nginx-0.0.1-2003-11-30-23:03:18 import
Igor Sysoev <igor@sysoev.ru>
parents: 200
diff changeset
1612 }
267ea1d98683 nginx-0.0.1-2003-11-30-23:03:18 import
Igor Sysoev <igor@sysoev.ru>
parents: 200
diff changeset
1613
267ea1d98683 nginx-0.0.1-2003-11-30-23:03:18 import
Igor Sysoev <igor@sysoev.ru>
parents: 200
diff changeset
1614 r->uri_ext = NULL;
267ea1d98683 nginx-0.0.1-2003-11-30-23:03:18 import
Igor Sysoev <igor@sysoev.ru>
parents: 200
diff changeset
1615
200
abeaebe0a33c nginx-0.0.1-2003-11-28-20:41:47 import
Igor Sysoev <igor@sysoev.ru>
parents: 194
diff changeset
1616 return NGX_OK;
820
cdbe991cbdf5 omit "#fragment"
Igor Sysoev <igor@sysoev.ru>
parents: 819
diff changeset
1617
cdbe991cbdf5 omit "#fragment"
Igor Sysoev <igor@sysoev.ru>
parents: 819
diff changeset
1618 args:
cdbe991cbdf5 omit "#fragment"
Igor Sysoev <igor@sysoev.ru>
parents: 819
diff changeset
1619
cdbe991cbdf5 omit "#fragment"
Igor Sysoev <igor@sysoev.ru>
parents: 819
diff changeset
1620 while (p < r->uri_end) {
cdbe991cbdf5 omit "#fragment"
Igor Sysoev <igor@sysoev.ru>
parents: 819
diff changeset
1621 if (*p++ != '#') {
cdbe991cbdf5 omit "#fragment"
Igor Sysoev <igor@sysoev.ru>
parents: 819
diff changeset
1622 continue;
cdbe991cbdf5 omit "#fragment"
Igor Sysoev <igor@sysoev.ru>
parents: 819
diff changeset
1623 }
cdbe991cbdf5 omit "#fragment"
Igor Sysoev <igor@sysoev.ru>
parents: 819
diff changeset
1624
cdbe991cbdf5 omit "#fragment"
Igor Sysoev <igor@sysoev.ru>
parents: 819
diff changeset
1625 r->args.len = p - 1 - r->args_start;
cdbe991cbdf5 omit "#fragment"
Igor Sysoev <igor@sysoev.ru>
parents: 819
diff changeset
1626 r->args.data = r->args_start;
cdbe991cbdf5 omit "#fragment"
Igor Sysoev <igor@sysoev.ru>
parents: 819
diff changeset
1627 r->args_start = NULL;
cdbe991cbdf5 omit "#fragment"
Igor Sysoev <igor@sysoev.ru>
parents: 819
diff changeset
1628
cdbe991cbdf5 omit "#fragment"
Igor Sysoev <igor@sysoev.ru>
parents: 819
diff changeset
1629 break;
cdbe991cbdf5 omit "#fragment"
Igor Sysoev <igor@sysoev.ru>
parents: 819
diff changeset
1630 }
cdbe991cbdf5 omit "#fragment"
Igor Sysoev <igor@sysoev.ru>
parents: 819
diff changeset
1631
cdbe991cbdf5 omit "#fragment"
Igor Sysoev <igor@sysoev.ru>
parents: 819
diff changeset
1632 r->uri.len = u - r->uri.data;
cdbe991cbdf5 omit "#fragment"
Igor Sysoev <igor@sysoev.ru>
parents: 819
diff changeset
1633
cdbe991cbdf5 omit "#fragment"
Igor Sysoev <igor@sysoev.ru>
parents: 819
diff changeset
1634 if (r->uri_ext) {
cdbe991cbdf5 omit "#fragment"
Igor Sysoev <igor@sysoev.ru>
parents: 819
diff changeset
1635 r->exten.len = u - r->uri_ext;
cdbe991cbdf5 omit "#fragment"
Igor Sysoev <igor@sysoev.ru>
parents: 819
diff changeset
1636 r->exten.data = r->uri_ext;
cdbe991cbdf5 omit "#fragment"
Igor Sysoev <igor@sysoev.ru>
parents: 819
diff changeset
1637 }
cdbe991cbdf5 omit "#fragment"
Igor Sysoev <igor@sysoev.ru>
parents: 819
diff changeset
1638
cdbe991cbdf5 omit "#fragment"
Igor Sysoev <igor@sysoev.ru>
parents: 819
diff changeset
1639 r->uri_ext = NULL;
cdbe991cbdf5 omit "#fragment"
Igor Sysoev <igor@sysoev.ru>
parents: 819
diff changeset
1640
cdbe991cbdf5 omit "#fragment"
Igor Sysoev <igor@sysoev.ru>
parents: 819
diff changeset
1641 return NGX_OK;
200
abeaebe0a33c nginx-0.0.1-2003-11-28-20:41:47 import
Igor Sysoev <igor@sysoev.ru>
parents: 194
diff changeset
1642 }
509
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
1643
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
1644
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
1645 ngx_int_t
3626
e4cabc48b862 ngx_http_parse_status_line()
Igor Sysoev <igor@sysoev.ru>
parents: 3615
diff changeset
1646 ngx_http_parse_status_line(ngx_http_request_t *r, ngx_buf_t *b,
e4cabc48b862 ngx_http_parse_status_line()
Igor Sysoev <igor@sysoev.ru>
parents: 3615
diff changeset
1647 ngx_http_status_t *status)
e4cabc48b862 ngx_http_parse_status_line()
Igor Sysoev <igor@sysoev.ru>
parents: 3615
diff changeset
1648 {
e4cabc48b862 ngx_http_parse_status_line()
Igor Sysoev <igor@sysoev.ru>
parents: 3615
diff changeset
1649 u_char ch;
e4cabc48b862 ngx_http_parse_status_line()
Igor Sysoev <igor@sysoev.ru>
parents: 3615
diff changeset
1650 u_char *p;
e4cabc48b862 ngx_http_parse_status_line()
Igor Sysoev <igor@sysoev.ru>
parents: 3615
diff changeset
1651 enum {
e4cabc48b862 ngx_http_parse_status_line()
Igor Sysoev <igor@sysoev.ru>
parents: 3615
diff changeset
1652 sw_start = 0,
e4cabc48b862 ngx_http_parse_status_line()
Igor Sysoev <igor@sysoev.ru>
parents: 3615
diff changeset
1653 sw_H,
e4cabc48b862 ngx_http_parse_status_line()
Igor Sysoev <igor@sysoev.ru>
parents: 3615
diff changeset
1654 sw_HT,
e4cabc48b862 ngx_http_parse_status_line()
Igor Sysoev <igor@sysoev.ru>
parents: 3615
diff changeset
1655 sw_HTT,
e4cabc48b862 ngx_http_parse_status_line()
Igor Sysoev <igor@sysoev.ru>
parents: 3615
diff changeset
1656 sw_HTTP,
e4cabc48b862 ngx_http_parse_status_line()
Igor Sysoev <igor@sysoev.ru>
parents: 3615
diff changeset
1657 sw_first_major_digit,
e4cabc48b862 ngx_http_parse_status_line()
Igor Sysoev <igor@sysoev.ru>
parents: 3615
diff changeset
1658 sw_major_digit,
e4cabc48b862 ngx_http_parse_status_line()
Igor Sysoev <igor@sysoev.ru>
parents: 3615
diff changeset
1659 sw_first_minor_digit,
e4cabc48b862 ngx_http_parse_status_line()
Igor Sysoev <igor@sysoev.ru>
parents: 3615
diff changeset
1660 sw_minor_digit,
e4cabc48b862 ngx_http_parse_status_line()
Igor Sysoev <igor@sysoev.ru>
parents: 3615
diff changeset
1661 sw_status,
e4cabc48b862 ngx_http_parse_status_line()
Igor Sysoev <igor@sysoev.ru>
parents: 3615
diff changeset
1662 sw_space_after_status,
e4cabc48b862 ngx_http_parse_status_line()
Igor Sysoev <igor@sysoev.ru>
parents: 3615
diff changeset
1663 sw_status_text,
e4cabc48b862 ngx_http_parse_status_line()
Igor Sysoev <igor@sysoev.ru>
parents: 3615
diff changeset
1664 sw_almost_done
e4cabc48b862 ngx_http_parse_status_line()
Igor Sysoev <igor@sysoev.ru>
parents: 3615
diff changeset
1665 } state;
e4cabc48b862 ngx_http_parse_status_line()
Igor Sysoev <igor@sysoev.ru>
parents: 3615
diff changeset
1666
e4cabc48b862 ngx_http_parse_status_line()
Igor Sysoev <igor@sysoev.ru>
parents: 3615
diff changeset
1667 state = r->state;
e4cabc48b862 ngx_http_parse_status_line()
Igor Sysoev <igor@sysoev.ru>
parents: 3615
diff changeset
1668
e4cabc48b862 ngx_http_parse_status_line()
Igor Sysoev <igor@sysoev.ru>
parents: 3615
diff changeset
1669 for (p = b->pos; p < b->last; p++) {
e4cabc48b862 ngx_http_parse_status_line()
Igor Sysoev <igor@sysoev.ru>
parents: 3615
diff changeset
1670 ch = *p;
e4cabc48b862 ngx_http_parse_status_line()
Igor Sysoev <igor@sysoev.ru>
parents: 3615
diff changeset
1671
e4cabc48b862 ngx_http_parse_status_line()
Igor Sysoev <igor@sysoev.ru>
parents: 3615
diff changeset
1672 switch (state) {
e4cabc48b862 ngx_http_parse_status_line()
Igor Sysoev <igor@sysoev.ru>
parents: 3615
diff changeset
1673
e4cabc48b862 ngx_http_parse_status_line()
Igor Sysoev <igor@sysoev.ru>
parents: 3615
diff changeset
1674 /* "HTTP/" */
e4cabc48b862 ngx_http_parse_status_line()
Igor Sysoev <igor@sysoev.ru>
parents: 3615
diff changeset
1675 case sw_start:
e4cabc48b862 ngx_http_parse_status_line()
Igor Sysoev <igor@sysoev.ru>
parents: 3615
diff changeset
1676 switch (ch) {
e4cabc48b862 ngx_http_parse_status_line()
Igor Sysoev <igor@sysoev.ru>
parents: 3615
diff changeset
1677 case 'H':
e4cabc48b862 ngx_http_parse_status_line()
Igor Sysoev <igor@sysoev.ru>
parents: 3615
diff changeset
1678 state = sw_H;
e4cabc48b862 ngx_http_parse_status_line()
Igor Sysoev <igor@sysoev.ru>
parents: 3615
diff changeset
1679 break;
e4cabc48b862 ngx_http_parse_status_line()
Igor Sysoev <igor@sysoev.ru>
parents: 3615
diff changeset
1680 default:
e4cabc48b862 ngx_http_parse_status_line()
Igor Sysoev <igor@sysoev.ru>
parents: 3615
diff changeset
1681 return NGX_ERROR;
e4cabc48b862 ngx_http_parse_status_line()
Igor Sysoev <igor@sysoev.ru>
parents: 3615
diff changeset
1682 }
e4cabc48b862 ngx_http_parse_status_line()
Igor Sysoev <igor@sysoev.ru>
parents: 3615
diff changeset
1683 break;
e4cabc48b862 ngx_http_parse_status_line()
Igor Sysoev <igor@sysoev.ru>
parents: 3615
diff changeset
1684
e4cabc48b862 ngx_http_parse_status_line()
Igor Sysoev <igor@sysoev.ru>
parents: 3615
diff changeset
1685 case sw_H:
e4cabc48b862 ngx_http_parse_status_line()
Igor Sysoev <igor@sysoev.ru>
parents: 3615
diff changeset
1686 switch (ch) {
e4cabc48b862 ngx_http_parse_status_line()
Igor Sysoev <igor@sysoev.ru>
parents: 3615
diff changeset
1687 case 'T':
e4cabc48b862 ngx_http_parse_status_line()
Igor Sysoev <igor@sysoev.ru>
parents: 3615
diff changeset
1688 state = sw_HT;
e4cabc48b862 ngx_http_parse_status_line()
Igor Sysoev <igor@sysoev.ru>
parents: 3615
diff changeset
1689 break;
e4cabc48b862 ngx_http_parse_status_line()
Igor Sysoev <igor@sysoev.ru>
parents: 3615
diff changeset
1690 default:
e4cabc48b862 ngx_http_parse_status_line()
Igor Sysoev <igor@sysoev.ru>
parents: 3615
diff changeset
1691 return NGX_ERROR;
e4cabc48b862 ngx_http_parse_status_line()
Igor Sysoev <igor@sysoev.ru>
parents: 3615
diff changeset
1692 }
e4cabc48b862 ngx_http_parse_status_line()
Igor Sysoev <igor@sysoev.ru>
parents: 3615
diff changeset
1693 break;
e4cabc48b862 ngx_http_parse_status_line()
Igor Sysoev <igor@sysoev.ru>
parents: 3615
diff changeset
1694
e4cabc48b862 ngx_http_parse_status_line()
Igor Sysoev <igor@sysoev.ru>
parents: 3615
diff changeset
1695 case sw_HT:
e4cabc48b862 ngx_http_parse_status_line()
Igor Sysoev <igor@sysoev.ru>
parents: 3615
diff changeset
1696 switch (ch) {
e4cabc48b862 ngx_http_parse_status_line()
Igor Sysoev <igor@sysoev.ru>
parents: 3615
diff changeset
1697 case 'T':
e4cabc48b862 ngx_http_parse_status_line()
Igor Sysoev <igor@sysoev.ru>
parents: 3615
diff changeset
1698 state = sw_HTT;
e4cabc48b862 ngx_http_parse_status_line()
Igor Sysoev <igor@sysoev.ru>
parents: 3615
diff changeset
1699 break;
e4cabc48b862 ngx_http_parse_status_line()
Igor Sysoev <igor@sysoev.ru>
parents: 3615
diff changeset
1700 default:
e4cabc48b862 ngx_http_parse_status_line()
Igor Sysoev <igor@sysoev.ru>
parents: 3615
diff changeset
1701 return NGX_ERROR;
e4cabc48b862 ngx_http_parse_status_line()
Igor Sysoev <igor@sysoev.ru>
parents: 3615
diff changeset
1702 }
e4cabc48b862 ngx_http_parse_status_line()
Igor Sysoev <igor@sysoev.ru>
parents: 3615
diff changeset
1703 break;
e4cabc48b862 ngx_http_parse_status_line()
Igor Sysoev <igor@sysoev.ru>
parents: 3615
diff changeset
1704
e4cabc48b862 ngx_http_parse_status_line()
Igor Sysoev <igor@sysoev.ru>
parents: 3615
diff changeset
1705 case sw_HTT:
e4cabc48b862 ngx_http_parse_status_line()
Igor Sysoev <igor@sysoev.ru>
parents: 3615
diff changeset
1706 switch (ch) {
e4cabc48b862 ngx_http_parse_status_line()
Igor Sysoev <igor@sysoev.ru>
parents: 3615
diff changeset
1707 case 'P':
e4cabc48b862 ngx_http_parse_status_line()
Igor Sysoev <igor@sysoev.ru>
parents: 3615
diff changeset
1708 state = sw_HTTP;
e4cabc48b862 ngx_http_parse_status_line()
Igor Sysoev <igor@sysoev.ru>
parents: 3615
diff changeset
1709 break;
e4cabc48b862 ngx_http_parse_status_line()
Igor Sysoev <igor@sysoev.ru>
parents: 3615
diff changeset
1710 default:
e4cabc48b862 ngx_http_parse_status_line()
Igor Sysoev <igor@sysoev.ru>
parents: 3615
diff changeset
1711 return NGX_ERROR;
e4cabc48b862 ngx_http_parse_status_line()
Igor Sysoev <igor@sysoev.ru>
parents: 3615
diff changeset
1712 }
e4cabc48b862 ngx_http_parse_status_line()
Igor Sysoev <igor@sysoev.ru>
parents: 3615
diff changeset
1713 break;
e4cabc48b862 ngx_http_parse_status_line()
Igor Sysoev <igor@sysoev.ru>
parents: 3615
diff changeset
1714
e4cabc48b862 ngx_http_parse_status_line()
Igor Sysoev <igor@sysoev.ru>
parents: 3615
diff changeset
1715 case sw_HTTP:
e4cabc48b862 ngx_http_parse_status_line()
Igor Sysoev <igor@sysoev.ru>
parents: 3615
diff changeset
1716 switch (ch) {
e4cabc48b862 ngx_http_parse_status_line()
Igor Sysoev <igor@sysoev.ru>
parents: 3615
diff changeset
1717 case '/':
e4cabc48b862 ngx_http_parse_status_line()
Igor Sysoev <igor@sysoev.ru>
parents: 3615
diff changeset
1718 state = sw_first_major_digit;
e4cabc48b862 ngx_http_parse_status_line()
Igor Sysoev <igor@sysoev.ru>
parents: 3615
diff changeset
1719 break;
e4cabc48b862 ngx_http_parse_status_line()
Igor Sysoev <igor@sysoev.ru>
parents: 3615
diff changeset
1720 default:
e4cabc48b862 ngx_http_parse_status_line()
Igor Sysoev <igor@sysoev.ru>
parents: 3615
diff changeset
1721 return NGX_ERROR;
e4cabc48b862 ngx_http_parse_status_line()
Igor Sysoev <igor@sysoev.ru>
parents: 3615
diff changeset
1722 }
e4cabc48b862 ngx_http_parse_status_line()
Igor Sysoev <igor@sysoev.ru>
parents: 3615
diff changeset
1723 break;
e4cabc48b862 ngx_http_parse_status_line()
Igor Sysoev <igor@sysoev.ru>
parents: 3615
diff changeset
1724
e4cabc48b862 ngx_http_parse_status_line()
Igor Sysoev <igor@sysoev.ru>
parents: 3615
diff changeset
1725 /* the first digit of major HTTP version */
e4cabc48b862 ngx_http_parse_status_line()
Igor Sysoev <igor@sysoev.ru>
parents: 3615
diff changeset
1726 case sw_first_major_digit:
e4cabc48b862 ngx_http_parse_status_line()
Igor Sysoev <igor@sysoev.ru>
parents: 3615
diff changeset
1727 if (ch < '1' || ch > '9') {
e4cabc48b862 ngx_http_parse_status_line()
Igor Sysoev <igor@sysoev.ru>
parents: 3615
diff changeset
1728 return NGX_ERROR;
e4cabc48b862 ngx_http_parse_status_line()
Igor Sysoev <igor@sysoev.ru>
parents: 3615
diff changeset
1729 }
e4cabc48b862 ngx_http_parse_status_line()
Igor Sysoev <igor@sysoev.ru>
parents: 3615
diff changeset
1730
4125
e5df04b05e75 Protocol version parsing in ngx_http_parse_status_line().
Maxim Dounin <mdounin@mdounin.ru>
parents: 3642
diff changeset
1731 r->http_major = ch - '0';
3626
e4cabc48b862 ngx_http_parse_status_line()
Igor Sysoev <igor@sysoev.ru>
parents: 3615
diff changeset
1732 state = sw_major_digit;
e4cabc48b862 ngx_http_parse_status_line()
Igor Sysoev <igor@sysoev.ru>
parents: 3615
diff changeset
1733 break;
e4cabc48b862 ngx_http_parse_status_line()
Igor Sysoev <igor@sysoev.ru>
parents: 3615
diff changeset
1734
e4cabc48b862 ngx_http_parse_status_line()
Igor Sysoev <igor@sysoev.ru>
parents: 3615
diff changeset
1735 /* the major HTTP version or dot */
e4cabc48b862 ngx_http_parse_status_line()
Igor Sysoev <igor@sysoev.ru>
parents: 3615
diff changeset
1736 case sw_major_digit:
e4cabc48b862 ngx_http_parse_status_line()
Igor Sysoev <igor@sysoev.ru>
parents: 3615
diff changeset
1737 if (ch == '.') {
e4cabc48b862 ngx_http_parse_status_line()
Igor Sysoev <igor@sysoev.ru>
parents: 3615
diff changeset
1738 state = sw_first_minor_digit;
e4cabc48b862 ngx_http_parse_status_line()
Igor Sysoev <igor@sysoev.ru>
parents: 3615
diff changeset
1739 break;
e4cabc48b862 ngx_http_parse_status_line()
Igor Sysoev <igor@sysoev.ru>
parents: 3615
diff changeset
1740 }
e4cabc48b862 ngx_http_parse_status_line()
Igor Sysoev <igor@sysoev.ru>
parents: 3615
diff changeset
1741
e4cabc48b862 ngx_http_parse_status_line()
Igor Sysoev <igor@sysoev.ru>
parents: 3615
diff changeset
1742 if (ch < '0' || ch > '9') {
e4cabc48b862 ngx_http_parse_status_line()
Igor Sysoev <igor@sysoev.ru>
parents: 3615
diff changeset
1743 return NGX_ERROR;
e4cabc48b862 ngx_http_parse_status_line()
Igor Sysoev <igor@sysoev.ru>
parents: 3615
diff changeset
1744 }
e4cabc48b862 ngx_http_parse_status_line()
Igor Sysoev <igor@sysoev.ru>
parents: 3615
diff changeset
1745
6543
302ff40c9bc9 Added overflow checks for version numbers (ticket #762).
Maxim Dounin <mdounin@mdounin.ru>
parents: 6014
diff changeset
1746 if (r->http_major > 99) {
302ff40c9bc9 Added overflow checks for version numbers (ticket #762).
Maxim Dounin <mdounin@mdounin.ru>
parents: 6014
diff changeset
1747 return NGX_ERROR;
302ff40c9bc9 Added overflow checks for version numbers (ticket #762).
Maxim Dounin <mdounin@mdounin.ru>
parents: 6014
diff changeset
1748 }
302ff40c9bc9 Added overflow checks for version numbers (ticket #762).
Maxim Dounin <mdounin@mdounin.ru>
parents: 6014
diff changeset
1749
7067
e3723f2a11b7 Parenthesized ASCII-related calculations.
Valentin Bartenev <vbart@nginx.com>
parents: 6994
diff changeset
1750 r->http_major = r->http_major * 10 + (ch - '0');
3626
e4cabc48b862 ngx_http_parse_status_line()
Igor Sysoev <igor@sysoev.ru>
parents: 3615
diff changeset
1751 break;
e4cabc48b862 ngx_http_parse_status_line()
Igor Sysoev <igor@sysoev.ru>
parents: 3615
diff changeset
1752
e4cabc48b862 ngx_http_parse_status_line()
Igor Sysoev <igor@sysoev.ru>
parents: 3615
diff changeset
1753 /* the first digit of minor HTTP version */
e4cabc48b862 ngx_http_parse_status_line()
Igor Sysoev <igor@sysoev.ru>
parents: 3615
diff changeset
1754 case sw_first_minor_digit:
e4cabc48b862 ngx_http_parse_status_line()
Igor Sysoev <igor@sysoev.ru>
parents: 3615
diff changeset
1755 if (ch < '0' || ch > '9') {
e4cabc48b862 ngx_http_parse_status_line()
Igor Sysoev <igor@sysoev.ru>
parents: 3615
diff changeset
1756 return NGX_ERROR;
e4cabc48b862 ngx_http_parse_status_line()
Igor Sysoev <igor@sysoev.ru>
parents: 3615
diff changeset
1757 }
e4cabc48b862 ngx_http_parse_status_line()
Igor Sysoev <igor@sysoev.ru>
parents: 3615
diff changeset
1758
4125
e5df04b05e75 Protocol version parsing in ngx_http_parse_status_line().
Maxim Dounin <mdounin@mdounin.ru>
parents: 3642
diff changeset
1759 r->http_minor = ch - '0';
3626
e4cabc48b862 ngx_http_parse_status_line()
Igor Sysoev <igor@sysoev.ru>
parents: 3615
diff changeset
1760 state = sw_minor_digit;
e4cabc48b862 ngx_http_parse_status_line()
Igor Sysoev <igor@sysoev.ru>
parents: 3615
diff changeset
1761 break;
e4cabc48b862 ngx_http_parse_status_line()
Igor Sysoev <igor@sysoev.ru>
parents: 3615
diff changeset
1762
e4cabc48b862 ngx_http_parse_status_line()
Igor Sysoev <igor@sysoev.ru>
parents: 3615
diff changeset
1763 /* the minor HTTP version or the end of the request line */
e4cabc48b862 ngx_http_parse_status_line()
Igor Sysoev <igor@sysoev.ru>
parents: 3615
diff changeset
1764 case sw_minor_digit:
e4cabc48b862 ngx_http_parse_status_line()
Igor Sysoev <igor@sysoev.ru>
parents: 3615
diff changeset
1765 if (ch == ' ') {
e4cabc48b862 ngx_http_parse_status_line()
Igor Sysoev <igor@sysoev.ru>
parents: 3615
diff changeset
1766 state = sw_status;
e4cabc48b862 ngx_http_parse_status_line()
Igor Sysoev <igor@sysoev.ru>
parents: 3615
diff changeset
1767 break;
e4cabc48b862 ngx_http_parse_status_line()
Igor Sysoev <igor@sysoev.ru>
parents: 3615
diff changeset
1768 }
e4cabc48b862 ngx_http_parse_status_line()
Igor Sysoev <igor@sysoev.ru>
parents: 3615
diff changeset
1769
e4cabc48b862 ngx_http_parse_status_line()
Igor Sysoev <igor@sysoev.ru>
parents: 3615
diff changeset
1770 if (ch < '0' || ch > '9') {
e4cabc48b862 ngx_http_parse_status_line()
Igor Sysoev <igor@sysoev.ru>
parents: 3615
diff changeset
1771 return NGX_ERROR;
e4cabc48b862 ngx_http_parse_status_line()
Igor Sysoev <igor@sysoev.ru>
parents: 3615
diff changeset
1772 }
e4cabc48b862 ngx_http_parse_status_line()
Igor Sysoev <igor@sysoev.ru>
parents: 3615
diff changeset
1773
6543
302ff40c9bc9 Added overflow checks for version numbers (ticket #762).
Maxim Dounin <mdounin@mdounin.ru>
parents: 6014
diff changeset
1774 if (r->http_minor > 99) {
302ff40c9bc9 Added overflow checks for version numbers (ticket #762).
Maxim Dounin <mdounin@mdounin.ru>
parents: 6014
diff changeset
1775 return NGX_ERROR;
302ff40c9bc9 Added overflow checks for version numbers (ticket #762).
Maxim Dounin <mdounin@mdounin.ru>
parents: 6014
diff changeset
1776 }
302ff40c9bc9 Added overflow checks for version numbers (ticket #762).
Maxim Dounin <mdounin@mdounin.ru>
parents: 6014
diff changeset
1777
7067
e3723f2a11b7 Parenthesized ASCII-related calculations.
Valentin Bartenev <vbart@nginx.com>
parents: 6994
diff changeset
1778 r->http_minor = r->http_minor * 10 + (ch - '0');
3626
e4cabc48b862 ngx_http_parse_status_line()
Igor Sysoev <igor@sysoev.ru>
parents: 3615
diff changeset
1779 break;
e4cabc48b862 ngx_http_parse_status_line()
Igor Sysoev <igor@sysoev.ru>
parents: 3615
diff changeset
1780
e4cabc48b862 ngx_http_parse_status_line()
Igor Sysoev <igor@sysoev.ru>
parents: 3615
diff changeset
1781 /* HTTP status code */
e4cabc48b862 ngx_http_parse_status_line()
Igor Sysoev <igor@sysoev.ru>
parents: 3615
diff changeset
1782 case sw_status:
e4cabc48b862 ngx_http_parse_status_line()
Igor Sysoev <igor@sysoev.ru>
parents: 3615
diff changeset
1783 if (ch == ' ') {
e4cabc48b862 ngx_http_parse_status_line()
Igor Sysoev <igor@sysoev.ru>
parents: 3615
diff changeset
1784 break;
e4cabc48b862 ngx_http_parse_status_line()
Igor Sysoev <igor@sysoev.ru>
parents: 3615
diff changeset
1785 }
e4cabc48b862 ngx_http_parse_status_line()
Igor Sysoev <igor@sysoev.ru>
parents: 3615
diff changeset
1786
e4cabc48b862 ngx_http_parse_status_line()
Igor Sysoev <igor@sysoev.ru>
parents: 3615
diff changeset
1787 if (ch < '0' || ch > '9') {
e4cabc48b862 ngx_http_parse_status_line()
Igor Sysoev <igor@sysoev.ru>
parents: 3615
diff changeset
1788 return NGX_ERROR;
e4cabc48b862 ngx_http_parse_status_line()
Igor Sysoev <igor@sysoev.ru>
parents: 3615
diff changeset
1789 }
e4cabc48b862 ngx_http_parse_status_line()
Igor Sysoev <igor@sysoev.ru>
parents: 3615
diff changeset
1790
7067
e3723f2a11b7 Parenthesized ASCII-related calculations.
Valentin Bartenev <vbart@nginx.com>
parents: 6994
diff changeset
1791 status->code = status->code * 10 + (ch - '0');
3626
e4cabc48b862 ngx_http_parse_status_line()
Igor Sysoev <igor@sysoev.ru>
parents: 3615
diff changeset
1792
e4cabc48b862 ngx_http_parse_status_line()
Igor Sysoev <igor@sysoev.ru>
parents: 3615
diff changeset
1793 if (++status->count == 3) {
e4cabc48b862 ngx_http_parse_status_line()
Igor Sysoev <igor@sysoev.ru>
parents: 3615
diff changeset
1794 state = sw_space_after_status;
e4cabc48b862 ngx_http_parse_status_line()
Igor Sysoev <igor@sysoev.ru>
parents: 3615
diff changeset
1795 status->start = p - 2;
e4cabc48b862 ngx_http_parse_status_line()
Igor Sysoev <igor@sysoev.ru>
parents: 3615
diff changeset
1796 }
e4cabc48b862 ngx_http_parse_status_line()
Igor Sysoev <igor@sysoev.ru>
parents: 3615
diff changeset
1797
e4cabc48b862 ngx_http_parse_status_line()
Igor Sysoev <igor@sysoev.ru>
parents: 3615
diff changeset
1798 break;
e4cabc48b862 ngx_http_parse_status_line()
Igor Sysoev <igor@sysoev.ru>
parents: 3615
diff changeset
1799
e4cabc48b862 ngx_http_parse_status_line()
Igor Sysoev <igor@sysoev.ru>
parents: 3615
diff changeset
1800 /* space or end of line */
e4cabc48b862 ngx_http_parse_status_line()
Igor Sysoev <igor@sysoev.ru>
parents: 3615
diff changeset
1801 case sw_space_after_status:
e4cabc48b862 ngx_http_parse_status_line()
Igor Sysoev <igor@sysoev.ru>
parents: 3615
diff changeset
1802 switch (ch) {
e4cabc48b862 ngx_http_parse_status_line()
Igor Sysoev <igor@sysoev.ru>
parents: 3615
diff changeset
1803 case ' ':
e4cabc48b862 ngx_http_parse_status_line()
Igor Sysoev <igor@sysoev.ru>
parents: 3615
diff changeset
1804 state = sw_status_text;
e4cabc48b862 ngx_http_parse_status_line()
Igor Sysoev <igor@sysoev.ru>
parents: 3615
diff changeset
1805 break;
e4cabc48b862 ngx_http_parse_status_line()
Igor Sysoev <igor@sysoev.ru>
parents: 3615
diff changeset
1806 case '.': /* IIS may send 403.1, 403.2, etc */
e4cabc48b862 ngx_http_parse_status_line()
Igor Sysoev <igor@sysoev.ru>
parents: 3615
diff changeset
1807 state = sw_status_text;
e4cabc48b862 ngx_http_parse_status_line()
Igor Sysoev <igor@sysoev.ru>
parents: 3615
diff changeset
1808 break;
e4cabc48b862 ngx_http_parse_status_line()
Igor Sysoev <igor@sysoev.ru>
parents: 3615
diff changeset
1809 case CR:
e4cabc48b862 ngx_http_parse_status_line()
Igor Sysoev <igor@sysoev.ru>
parents: 3615
diff changeset
1810 state = sw_almost_done;
e4cabc48b862 ngx_http_parse_status_line()
Igor Sysoev <igor@sysoev.ru>
parents: 3615
diff changeset
1811 break;
e4cabc48b862 ngx_http_parse_status_line()
Igor Sysoev <igor@sysoev.ru>
parents: 3615
diff changeset
1812 case LF:
e4cabc48b862 ngx_http_parse_status_line()
Igor Sysoev <igor@sysoev.ru>
parents: 3615
diff changeset
1813 goto done;
e4cabc48b862 ngx_http_parse_status_line()
Igor Sysoev <igor@sysoev.ru>
parents: 3615
diff changeset
1814 default:
e4cabc48b862 ngx_http_parse_status_line()
Igor Sysoev <igor@sysoev.ru>
parents: 3615
diff changeset
1815 return NGX_ERROR;
e4cabc48b862 ngx_http_parse_status_line()
Igor Sysoev <igor@sysoev.ru>
parents: 3615
diff changeset
1816 }
e4cabc48b862 ngx_http_parse_status_line()
Igor Sysoev <igor@sysoev.ru>
parents: 3615
diff changeset
1817 break;
e4cabc48b862 ngx_http_parse_status_line()
Igor Sysoev <igor@sysoev.ru>
parents: 3615
diff changeset
1818
e4cabc48b862 ngx_http_parse_status_line()
Igor Sysoev <igor@sysoev.ru>
parents: 3615
diff changeset
1819 /* any text until end of line */
e4cabc48b862 ngx_http_parse_status_line()
Igor Sysoev <igor@sysoev.ru>
parents: 3615
diff changeset
1820 case sw_status_text:
e4cabc48b862 ngx_http_parse_status_line()
Igor Sysoev <igor@sysoev.ru>
parents: 3615
diff changeset
1821 switch (ch) {
e4cabc48b862 ngx_http_parse_status_line()
Igor Sysoev <igor@sysoev.ru>
parents: 3615
diff changeset
1822 case CR:
e4cabc48b862 ngx_http_parse_status_line()
Igor Sysoev <igor@sysoev.ru>
parents: 3615
diff changeset
1823 state = sw_almost_done;
e4cabc48b862 ngx_http_parse_status_line()
Igor Sysoev <igor@sysoev.ru>
parents: 3615
diff changeset
1824
e4cabc48b862 ngx_http_parse_status_line()
Igor Sysoev <igor@sysoev.ru>
parents: 3615
diff changeset
1825 break;
e4cabc48b862 ngx_http_parse_status_line()
Igor Sysoev <igor@sysoev.ru>
parents: 3615
diff changeset
1826 case LF:
e4cabc48b862 ngx_http_parse_status_line()
Igor Sysoev <igor@sysoev.ru>
parents: 3615
diff changeset
1827 goto done;
e4cabc48b862 ngx_http_parse_status_line()
Igor Sysoev <igor@sysoev.ru>
parents: 3615
diff changeset
1828 }
e4cabc48b862 ngx_http_parse_status_line()
Igor Sysoev <igor@sysoev.ru>
parents: 3615
diff changeset
1829 break;
e4cabc48b862 ngx_http_parse_status_line()
Igor Sysoev <igor@sysoev.ru>
parents: 3615
diff changeset
1830
e4cabc48b862 ngx_http_parse_status_line()
Igor Sysoev <igor@sysoev.ru>
parents: 3615
diff changeset
1831 /* end of status line */
e4cabc48b862 ngx_http_parse_status_line()
Igor Sysoev <igor@sysoev.ru>
parents: 3615
diff changeset
1832 case sw_almost_done:
e4cabc48b862 ngx_http_parse_status_line()
Igor Sysoev <igor@sysoev.ru>
parents: 3615
diff changeset
1833 status->end = p - 1;
e4cabc48b862 ngx_http_parse_status_line()
Igor Sysoev <igor@sysoev.ru>
parents: 3615
diff changeset
1834 switch (ch) {
e4cabc48b862 ngx_http_parse_status_line()
Igor Sysoev <igor@sysoev.ru>
parents: 3615
diff changeset
1835 case LF:
e4cabc48b862 ngx_http_parse_status_line()
Igor Sysoev <igor@sysoev.ru>
parents: 3615
diff changeset
1836 goto done;
e4cabc48b862 ngx_http_parse_status_line()
Igor Sysoev <igor@sysoev.ru>
parents: 3615
diff changeset
1837 default:
e4cabc48b862 ngx_http_parse_status_line()
Igor Sysoev <igor@sysoev.ru>
parents: 3615
diff changeset
1838 return NGX_ERROR;
e4cabc48b862 ngx_http_parse_status_line()
Igor Sysoev <igor@sysoev.ru>
parents: 3615
diff changeset
1839 }
e4cabc48b862 ngx_http_parse_status_line()
Igor Sysoev <igor@sysoev.ru>
parents: 3615
diff changeset
1840 }
e4cabc48b862 ngx_http_parse_status_line()
Igor Sysoev <igor@sysoev.ru>
parents: 3615
diff changeset
1841 }
e4cabc48b862 ngx_http_parse_status_line()
Igor Sysoev <igor@sysoev.ru>
parents: 3615
diff changeset
1842
e4cabc48b862 ngx_http_parse_status_line()
Igor Sysoev <igor@sysoev.ru>
parents: 3615
diff changeset
1843 b->pos = p;
e4cabc48b862 ngx_http_parse_status_line()
Igor Sysoev <igor@sysoev.ru>
parents: 3615
diff changeset
1844 r->state = state;
e4cabc48b862 ngx_http_parse_status_line()
Igor Sysoev <igor@sysoev.ru>
parents: 3615
diff changeset
1845
e4cabc48b862 ngx_http_parse_status_line()
Igor Sysoev <igor@sysoev.ru>
parents: 3615
diff changeset
1846 return NGX_AGAIN;
e4cabc48b862 ngx_http_parse_status_line()
Igor Sysoev <igor@sysoev.ru>
parents: 3615
diff changeset
1847
e4cabc48b862 ngx_http_parse_status_line()
Igor Sysoev <igor@sysoev.ru>
parents: 3615
diff changeset
1848 done:
e4cabc48b862 ngx_http_parse_status_line()
Igor Sysoev <igor@sysoev.ru>
parents: 3615
diff changeset
1849
e4cabc48b862 ngx_http_parse_status_line()
Igor Sysoev <igor@sysoev.ru>
parents: 3615
diff changeset
1850 b->pos = p + 1;
e4cabc48b862 ngx_http_parse_status_line()
Igor Sysoev <igor@sysoev.ru>
parents: 3615
diff changeset
1851
e4cabc48b862 ngx_http_parse_status_line()
Igor Sysoev <igor@sysoev.ru>
parents: 3615
diff changeset
1852 if (status->end == NULL) {
e4cabc48b862 ngx_http_parse_status_line()
Igor Sysoev <igor@sysoev.ru>
parents: 3615
diff changeset
1853 status->end = p;
e4cabc48b862 ngx_http_parse_status_line()
Igor Sysoev <igor@sysoev.ru>
parents: 3615
diff changeset
1854 }
e4cabc48b862 ngx_http_parse_status_line()
Igor Sysoev <igor@sysoev.ru>
parents: 3615
diff changeset
1855
4125
e5df04b05e75 Protocol version parsing in ngx_http_parse_status_line().
Maxim Dounin <mdounin@mdounin.ru>
parents: 3642
diff changeset
1856 status->http_version = r->http_major * 1000 + r->http_minor;
3626
e4cabc48b862 ngx_http_parse_status_line()
Igor Sysoev <igor@sysoev.ru>
parents: 3615
diff changeset
1857 r->state = sw_start;
e4cabc48b862 ngx_http_parse_status_line()
Igor Sysoev <igor@sysoev.ru>
parents: 3615
diff changeset
1858
e4cabc48b862 ngx_http_parse_status_line()
Igor Sysoev <igor@sysoev.ru>
parents: 3615
diff changeset
1859 return NGX_OK;
e4cabc48b862 ngx_http_parse_status_line()
Igor Sysoev <igor@sysoev.ru>
parents: 3615
diff changeset
1860 }
e4cabc48b862 ngx_http_parse_status_line()
Igor Sysoev <igor@sysoev.ru>
parents: 3615
diff changeset
1861
e4cabc48b862 ngx_http_parse_status_line()
Igor Sysoev <igor@sysoev.ru>
parents: 3615
diff changeset
1862
e4cabc48b862 ngx_http_parse_status_line()
Igor Sysoev <igor@sysoev.ru>
parents: 3615
diff changeset
1863 ngx_int_t
573
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 521
diff changeset
1864 ngx_http_parse_unsafe_uri(ngx_http_request_t *r, ngx_str_t *uri,
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 521
diff changeset
1865 ngx_str_t *args, ngx_uint_t *flags)
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 521
diff changeset
1866 {
5491
74bfa803a5aa Teach ngx_http_parse_unsafe_uri() how to unescape URIs.
Ruslan Ermilov <ru@nginx.com>
parents: 5490
diff changeset
1867 u_char ch, *p, *src, *dst;
74bfa803a5aa Teach ngx_http_parse_unsafe_uri() how to unescape URIs.
Ruslan Ermilov <ru@nginx.com>
parents: 5490
diff changeset
1868 size_t len;
74bfa803a5aa Teach ngx_http_parse_unsafe_uri() how to unescape URIs.
Ruslan Ermilov <ru@nginx.com>
parents: 5490
diff changeset
1869 ngx_uint_t quoted;
573
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 521
diff changeset
1870
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 521
diff changeset
1871 len = uri->len;
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 521
diff changeset
1872 p = uri->data;
5491
74bfa803a5aa Teach ngx_http_parse_unsafe_uri() how to unescape URIs.
Ruslan Ermilov <ru@nginx.com>
parents: 5490
diff changeset
1873 quoted = 0;
573
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 521
diff changeset
1874
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 521
diff changeset
1875 if (len == 0 || p[0] == '?') {
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 521
diff changeset
1876 goto unsafe;
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 521
diff changeset
1877 }
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 521
diff changeset
1878
5490
b141a7627ac6 Detect more unsafe URIs in ngx_http_parse_unsafe_uri().
Ruslan Ermilov <ru@nginx.com>
parents: 5442
diff changeset
1879 if (p[0] == '.' && len > 1 && p[1] == '.'
b141a7627ac6 Detect more unsafe URIs in ngx_http_parse_unsafe_uri().
Ruslan Ermilov <ru@nginx.com>
parents: 5442
diff changeset
1880 && (len == 2 || ngx_path_separator(p[2])))
b141a7627ac6 Detect more unsafe URIs in ngx_http_parse_unsafe_uri().
Ruslan Ermilov <ru@nginx.com>
parents: 5442
diff changeset
1881 {
573
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 521
diff changeset
1882 goto unsafe;
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 521
diff changeset
1883 }
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 521
diff changeset
1884
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 521
diff changeset
1885 for ( /* void */ ; len; len--) {
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 521
diff changeset
1886
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 521
diff changeset
1887 ch = *p++;
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 521
diff changeset
1888
5491
74bfa803a5aa Teach ngx_http_parse_unsafe_uri() how to unescape URIs.
Ruslan Ermilov <ru@nginx.com>
parents: 5490
diff changeset
1889 if (ch == '%') {
74bfa803a5aa Teach ngx_http_parse_unsafe_uri() how to unescape URIs.
Ruslan Ermilov <ru@nginx.com>
parents: 5490
diff changeset
1890 quoted = 1;
74bfa803a5aa Teach ngx_http_parse_unsafe_uri() how to unescape URIs.
Ruslan Ermilov <ru@nginx.com>
parents: 5490
diff changeset
1891 continue;
74bfa803a5aa Teach ngx_http_parse_unsafe_uri() how to unescape URIs.
Ruslan Ermilov <ru@nginx.com>
parents: 5490
diff changeset
1892 }
74bfa803a5aa Teach ngx_http_parse_unsafe_uri() how to unescape URIs.
Ruslan Ermilov <ru@nginx.com>
parents: 5490
diff changeset
1893
6626
b3682580c1bd Avoid left-shifting integers into the sign bit, which is undefined.
Sergey Kandaurov <pluknet@nginx.com>
parents: 6543
diff changeset
1894 if (usual[ch >> 5] & (1U << (ch & 0x1f))) {
823
ccf3c59f8040 optimize the most frequent cases
Igor Sysoev <igor@sysoev.ru>
parents: 822
diff changeset
1895 continue;
ccf3c59f8040 optimize the most frequent cases
Igor Sysoev <igor@sysoev.ru>
parents: 822
diff changeset
1896 }
ccf3c59f8040 optimize the most frequent cases
Igor Sysoev <igor@sysoev.ru>
parents: 822
diff changeset
1897
573
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 521
diff changeset
1898 if (ch == '?') {
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 521
diff changeset
1899 args->len = len - 1;
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 521
diff changeset
1900 args->data = p;
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 521
diff changeset
1901 uri->len -= len;
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 521
diff changeset
1902
5491
74bfa803a5aa Teach ngx_http_parse_unsafe_uri() how to unescape URIs.
Ruslan Ermilov <ru@nginx.com>
parents: 5490
diff changeset
1903 break;
573
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 521
diff changeset
1904 }
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 521
diff changeset
1905
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 521
diff changeset
1906 if (ch == '\0') {
3527
84905c7b2aa7 remove r->zero_in_uri
Igor Sysoev <igor@sysoev.ru>
parents: 3161
diff changeset
1907 goto unsafe;
573
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 521
diff changeset
1908 }
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 521
diff changeset
1909
2744
e50a2faac31d ngx_path_separator()
Igor Sysoev <igor@sysoev.ru>
parents: 2670
diff changeset
1910 if (ngx_path_separator(ch) && len > 2) {
e50a2faac31d ngx_path_separator()
Igor Sysoev <igor@sysoev.ru>
parents: 2670
diff changeset
1911
5490
b141a7627ac6 Detect more unsafe URIs in ngx_http_parse_unsafe_uri().
Ruslan Ermilov <ru@nginx.com>
parents: 5442
diff changeset
1912 /* detect "/../" and "/.." */
573
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 521
diff changeset
1913
5490
b141a7627ac6 Detect more unsafe URIs in ngx_http_parse_unsafe_uri().
Ruslan Ermilov <ru@nginx.com>
parents: 5442
diff changeset
1914 if (p[0] == '.' && p[1] == '.'
b141a7627ac6 Detect more unsafe URIs in ngx_http_parse_unsafe_uri().
Ruslan Ermilov <ru@nginx.com>
parents: 5442
diff changeset
1915 && (len == 3 || ngx_path_separator(p[2])))
b141a7627ac6 Detect more unsafe URIs in ngx_http_parse_unsafe_uri().
Ruslan Ermilov <ru@nginx.com>
parents: 5442
diff changeset
1916 {
573
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 521
diff changeset
1917 goto unsafe;
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 521
diff changeset
1918 }
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 521
diff changeset
1919 }
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 521
diff changeset
1920 }
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 521
diff changeset
1921
5491
74bfa803a5aa Teach ngx_http_parse_unsafe_uri() how to unescape URIs.
Ruslan Ermilov <ru@nginx.com>
parents: 5490
diff changeset
1922 if (quoted) {
74bfa803a5aa Teach ngx_http_parse_unsafe_uri() how to unescape URIs.
Ruslan Ermilov <ru@nginx.com>
parents: 5490
diff changeset
1923 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
74bfa803a5aa Teach ngx_http_parse_unsafe_uri() how to unescape URIs.
Ruslan Ermilov <ru@nginx.com>
parents: 5490
diff changeset
1924 "escaped URI: \"%V\"", uri);
74bfa803a5aa Teach ngx_http_parse_unsafe_uri() how to unescape URIs.
Ruslan Ermilov <ru@nginx.com>
parents: 5490
diff changeset
1925
74bfa803a5aa Teach ngx_http_parse_unsafe_uri() how to unescape URIs.
Ruslan Ermilov <ru@nginx.com>
parents: 5490
diff changeset
1926 src = uri->data;
74bfa803a5aa Teach ngx_http_parse_unsafe_uri() how to unescape URIs.
Ruslan Ermilov <ru@nginx.com>
parents: 5490
diff changeset
1927
74bfa803a5aa Teach ngx_http_parse_unsafe_uri() how to unescape URIs.
Ruslan Ermilov <ru@nginx.com>
parents: 5490
diff changeset
1928 dst = ngx_pnalloc(r->pool, uri->len);
74bfa803a5aa Teach ngx_http_parse_unsafe_uri() how to unescape URIs.
Ruslan Ermilov <ru@nginx.com>
parents: 5490
diff changeset
1929 if (dst == NULL) {
74bfa803a5aa Teach ngx_http_parse_unsafe_uri() how to unescape URIs.
Ruslan Ermilov <ru@nginx.com>
parents: 5490
diff changeset
1930 return NGX_ERROR;
74bfa803a5aa Teach ngx_http_parse_unsafe_uri() how to unescape URIs.
Ruslan Ermilov <ru@nginx.com>
parents: 5490
diff changeset
1931 }
74bfa803a5aa Teach ngx_http_parse_unsafe_uri() how to unescape URIs.
Ruslan Ermilov <ru@nginx.com>
parents: 5490
diff changeset
1932
74bfa803a5aa Teach ngx_http_parse_unsafe_uri() how to unescape URIs.
Ruslan Ermilov <ru@nginx.com>
parents: 5490
diff changeset
1933 uri->data = dst;
74bfa803a5aa Teach ngx_http_parse_unsafe_uri() how to unescape URIs.
Ruslan Ermilov <ru@nginx.com>
parents: 5490
diff changeset
1934
74bfa803a5aa Teach ngx_http_parse_unsafe_uri() how to unescape URIs.
Ruslan Ermilov <ru@nginx.com>
parents: 5490
diff changeset
1935 ngx_unescape_uri(&dst, &src, uri->len, 0);
74bfa803a5aa Teach ngx_http_parse_unsafe_uri() how to unescape URIs.
Ruslan Ermilov <ru@nginx.com>
parents: 5490
diff changeset
1936
74bfa803a5aa Teach ngx_http_parse_unsafe_uri() how to unescape URIs.
Ruslan Ermilov <ru@nginx.com>
parents: 5490
diff changeset
1937 uri->len = dst - uri->data;
74bfa803a5aa Teach ngx_http_parse_unsafe_uri() how to unescape URIs.
Ruslan Ermilov <ru@nginx.com>
parents: 5490
diff changeset
1938
74bfa803a5aa Teach ngx_http_parse_unsafe_uri() how to unescape URIs.
Ruslan Ermilov <ru@nginx.com>
parents: 5490
diff changeset
1939 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
74bfa803a5aa Teach ngx_http_parse_unsafe_uri() how to unescape URIs.
Ruslan Ermilov <ru@nginx.com>
parents: 5490
diff changeset
1940 "unescaped URI: \"%V\"", uri);
74bfa803a5aa Teach ngx_http_parse_unsafe_uri() how to unescape URIs.
Ruslan Ermilov <ru@nginx.com>
parents: 5490
diff changeset
1941
74bfa803a5aa Teach ngx_http_parse_unsafe_uri() how to unescape URIs.
Ruslan Ermilov <ru@nginx.com>
parents: 5490
diff changeset
1942 len = uri->len;
74bfa803a5aa Teach ngx_http_parse_unsafe_uri() how to unescape URIs.
Ruslan Ermilov <ru@nginx.com>
parents: 5490
diff changeset
1943 p = uri->data;
74bfa803a5aa Teach ngx_http_parse_unsafe_uri() how to unescape URIs.
Ruslan Ermilov <ru@nginx.com>
parents: 5490
diff changeset
1944
74bfa803a5aa Teach ngx_http_parse_unsafe_uri() how to unescape URIs.
Ruslan Ermilov <ru@nginx.com>
parents: 5490
diff changeset
1945 if (p[0] == '.' && len > 1 && p[1] == '.'
74bfa803a5aa Teach ngx_http_parse_unsafe_uri() how to unescape URIs.
Ruslan Ermilov <ru@nginx.com>
parents: 5490
diff changeset
1946 && (len == 2 || ngx_path_separator(p[2])))
74bfa803a5aa Teach ngx_http_parse_unsafe_uri() how to unescape URIs.
Ruslan Ermilov <ru@nginx.com>
parents: 5490
diff changeset
1947 {
74bfa803a5aa Teach ngx_http_parse_unsafe_uri() how to unescape URIs.
Ruslan Ermilov <ru@nginx.com>
parents: 5490
diff changeset
1948 goto unsafe;
74bfa803a5aa Teach ngx_http_parse_unsafe_uri() how to unescape URIs.
Ruslan Ermilov <ru@nginx.com>
parents: 5490
diff changeset
1949 }
74bfa803a5aa Teach ngx_http_parse_unsafe_uri() how to unescape URIs.
Ruslan Ermilov <ru@nginx.com>
parents: 5490
diff changeset
1950
74bfa803a5aa Teach ngx_http_parse_unsafe_uri() how to unescape URIs.
Ruslan Ermilov <ru@nginx.com>
parents: 5490
diff changeset
1951 for ( /* void */ ; len; len--) {
74bfa803a5aa Teach ngx_http_parse_unsafe_uri() how to unescape URIs.
Ruslan Ermilov <ru@nginx.com>
parents: 5490
diff changeset
1952
74bfa803a5aa Teach ngx_http_parse_unsafe_uri() how to unescape URIs.
Ruslan Ermilov <ru@nginx.com>
parents: 5490
diff changeset
1953 ch = *p++;
74bfa803a5aa Teach ngx_http_parse_unsafe_uri() how to unescape URIs.
Ruslan Ermilov <ru@nginx.com>
parents: 5490
diff changeset
1954
74bfa803a5aa Teach ngx_http_parse_unsafe_uri() how to unescape URIs.
Ruslan Ermilov <ru@nginx.com>
parents: 5490
diff changeset
1955 if (ch == '\0') {
74bfa803a5aa Teach ngx_http_parse_unsafe_uri() how to unescape URIs.
Ruslan Ermilov <ru@nginx.com>
parents: 5490
diff changeset
1956 goto unsafe;
74bfa803a5aa Teach ngx_http_parse_unsafe_uri() how to unescape URIs.
Ruslan Ermilov <ru@nginx.com>
parents: 5490
diff changeset
1957 }
74bfa803a5aa Teach ngx_http_parse_unsafe_uri() how to unescape URIs.
Ruslan Ermilov <ru@nginx.com>
parents: 5490
diff changeset
1958
74bfa803a5aa Teach ngx_http_parse_unsafe_uri() how to unescape URIs.
Ruslan Ermilov <ru@nginx.com>
parents: 5490
diff changeset
1959 if (ngx_path_separator(ch) && len > 2) {
74bfa803a5aa Teach ngx_http_parse_unsafe_uri() how to unescape URIs.
Ruslan Ermilov <ru@nginx.com>
parents: 5490
diff changeset
1960
74bfa803a5aa Teach ngx_http_parse_unsafe_uri() how to unescape URIs.
Ruslan Ermilov <ru@nginx.com>
parents: 5490
diff changeset
1961 /* detect "/../" and "/.." */
74bfa803a5aa Teach ngx_http_parse_unsafe_uri() how to unescape URIs.
Ruslan Ermilov <ru@nginx.com>
parents: 5490
diff changeset
1962
74bfa803a5aa Teach ngx_http_parse_unsafe_uri() how to unescape URIs.
Ruslan Ermilov <ru@nginx.com>
parents: 5490
diff changeset
1963 if (p[0] == '.' && p[1] == '.'
74bfa803a5aa Teach ngx_http_parse_unsafe_uri() how to unescape URIs.
Ruslan Ermilov <ru@nginx.com>
parents: 5490
diff changeset
1964 && (len == 3 || ngx_path_separator(p[2])))
74bfa803a5aa Teach ngx_http_parse_unsafe_uri() how to unescape URIs.
Ruslan Ermilov <ru@nginx.com>
parents: 5490
diff changeset
1965 {
74bfa803a5aa Teach ngx_http_parse_unsafe_uri() how to unescape URIs.
Ruslan Ermilov <ru@nginx.com>
parents: 5490
diff changeset
1966 goto unsafe;
74bfa803a5aa Teach ngx_http_parse_unsafe_uri() how to unescape URIs.
Ruslan Ermilov <ru@nginx.com>
parents: 5490
diff changeset
1967 }
74bfa803a5aa Teach ngx_http_parse_unsafe_uri() how to unescape URIs.
Ruslan Ermilov <ru@nginx.com>
parents: 5490
diff changeset
1968 }
74bfa803a5aa Teach ngx_http_parse_unsafe_uri() how to unescape URIs.
Ruslan Ermilov <ru@nginx.com>
parents: 5490
diff changeset
1969 }
74bfa803a5aa Teach ngx_http_parse_unsafe_uri() how to unescape URIs.
Ruslan Ermilov <ru@nginx.com>
parents: 5490
diff changeset
1970 }
74bfa803a5aa Teach ngx_http_parse_unsafe_uri() how to unescape URIs.
Ruslan Ermilov <ru@nginx.com>
parents: 5490
diff changeset
1971
573
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 521
diff changeset
1972 return NGX_OK;
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 521
diff changeset
1973
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 521
diff changeset
1974 unsafe:
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 521
diff changeset
1975
3161
d430c6ab1c99 check unsafe Destination
Igor Sysoev <igor@sysoev.ru>
parents: 3121
diff changeset
1976 if (*flags & NGX_HTTP_LOG_UNSAFE) {
d430c6ab1c99 check unsafe Destination
Igor Sysoev <igor@sysoev.ru>
parents: 3121
diff changeset
1977 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
d430c6ab1c99 check unsafe Destination
Igor Sysoev <igor@sysoev.ru>
parents: 3121
diff changeset
1978 "unsafe URI \"%V\" was detected", uri);
d430c6ab1c99 check unsafe Destination
Igor Sysoev <igor@sysoev.ru>
parents: 3121
diff changeset
1979 }
573
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 521
diff changeset
1980
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 521
diff changeset
1981 return NGX_ERROR;
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 521
diff changeset
1982 }
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 521
diff changeset
1983
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 521
diff changeset
1984
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 521
diff changeset
1985 ngx_int_t
509
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
1986 ngx_http_parse_multi_header_lines(ngx_array_t *headers, ngx_str_t *name,
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
1987 ngx_str_t *value)
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
1988 {
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
1989 ngx_uint_t i;
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
1990 u_char *start, *last, *end, ch;
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
1991 ngx_table_elt_t **h;
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
1992
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
1993 h = headers->elts;
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
1994
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
1995 for (i = 0; i < headers->nelts; i++) {
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
1996
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
1997 ngx_log_debug2(NGX_LOG_DEBUG_HTTP, headers->pool->log, 0,
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
1998 "parse header: \"%V: %V\"", &h[i]->key, &h[i]->value);
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
1999
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
2000 if (name->len > h[i]->value.len) {
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
2001 continue;
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
2002 }
577
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 575
diff changeset
2003
509
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
2004 start = h[i]->value.data;
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
2005 end = h[i]->value.data + h[i]->value.len;
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
2006
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
2007 while (start < end) {
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
2008
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
2009 if (ngx_strncasecmp(start, name->data, name->len) != 0) {
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
2010 goto skip;
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
2011 }
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
2012
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
2013 for (start += name->len; start < end && *start == ' '; start++) {
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
2014 /* void */
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
2015 }
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
2016
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
2017 if (value == NULL) {
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
2018 if (start == end || *start == ',') {
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
2019 return i;
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
2020 }
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
2021
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
2022 goto skip;
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
2023 }
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
2024
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
2025 if (start == end || *start++ != '=') {
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
2026 /* the invalid header value */
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
2027 goto skip;
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
2028 }
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
2029
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
2030 while (start < end && *start == ' ') { start++; }
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
2031
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
2032 for (last = start; last < end && *last != ';'; last++) {
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
2033 /* void */
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
2034 }
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
2035
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
2036 value->len = last - start;
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
2037 value->data = start;
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
2038
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
2039 return i;
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
2040
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
2041 skip:
573
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 521
diff changeset
2042
509
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
2043 while (start < end) {
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
2044 ch = *start++;
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
2045 if (ch == ';' || ch == ',') {
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
2046 break;
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
2047 }
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
2048 }
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
2049
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
2050 while (start < end && *start == ' ') { start++; }
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
2051 }
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
2052 }
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
2053
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
2054 return NGX_DECLINED;
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
2055 }
2415
d311b7f6a403 ngx_http_arg()
Igor Sysoev <igor@sysoev.ru>
parents: 2256
diff changeset
2056
d311b7f6a403 ngx_http_arg()
Igor Sysoev <igor@sysoev.ru>
parents: 2256
diff changeset
2057
d311b7f6a403 ngx_http_arg()
Igor Sysoev <igor@sysoev.ru>
parents: 2256
diff changeset
2058 ngx_int_t
5677
3a48775f1535 Upstream: added the "$upstream_cookie_<name>" variables.
Vladimir Homutov <vl@nginx.com>
parents: 5624
diff changeset
2059 ngx_http_parse_set_cookie_lines(ngx_array_t *headers, ngx_str_t *name,
3a48775f1535 Upstream: added the "$upstream_cookie_<name>" variables.
Vladimir Homutov <vl@nginx.com>
parents: 5624
diff changeset
2060 ngx_str_t *value)
3a48775f1535 Upstream: added the "$upstream_cookie_<name>" variables.
Vladimir Homutov <vl@nginx.com>
parents: 5624
diff changeset
2061 {
3a48775f1535 Upstream: added the "$upstream_cookie_<name>" variables.
Vladimir Homutov <vl@nginx.com>
parents: 5624
diff changeset
2062 ngx_uint_t i;
3a48775f1535 Upstream: added the "$upstream_cookie_<name>" variables.
Vladimir Homutov <vl@nginx.com>
parents: 5624
diff changeset
2063 u_char *start, *last, *end;
3a48775f1535 Upstream: added the "$upstream_cookie_<name>" variables.
Vladimir Homutov <vl@nginx.com>
parents: 5624
diff changeset
2064 ngx_table_elt_t **h;
3a48775f1535 Upstream: added the "$upstream_cookie_<name>" variables.
Vladimir Homutov <vl@nginx.com>
parents: 5624
diff changeset
2065
3a48775f1535 Upstream: added the "$upstream_cookie_<name>" variables.
Vladimir Homutov <vl@nginx.com>
parents: 5624
diff changeset
2066 h = headers->elts;
3a48775f1535 Upstream: added the "$upstream_cookie_<name>" variables.
Vladimir Homutov <vl@nginx.com>
parents: 5624
diff changeset
2067
3a48775f1535 Upstream: added the "$upstream_cookie_<name>" variables.
Vladimir Homutov <vl@nginx.com>
parents: 5624
diff changeset
2068 for (i = 0; i < headers->nelts; i++) {
3a48775f1535 Upstream: added the "$upstream_cookie_<name>" variables.
Vladimir Homutov <vl@nginx.com>
parents: 5624
diff changeset
2069
3a48775f1535 Upstream: added the "$upstream_cookie_<name>" variables.
Vladimir Homutov <vl@nginx.com>
parents: 5624
diff changeset
2070 ngx_log_debug2(NGX_LOG_DEBUG_HTTP, headers->pool->log, 0,
3a48775f1535 Upstream: added the "$upstream_cookie_<name>" variables.
Vladimir Homutov <vl@nginx.com>
parents: 5624
diff changeset
2071 "parse header: \"%V: %V\"", &h[i]->key, &h[i]->value);
3a48775f1535 Upstream: added the "$upstream_cookie_<name>" variables.
Vladimir Homutov <vl@nginx.com>
parents: 5624
diff changeset
2072
3a48775f1535 Upstream: added the "$upstream_cookie_<name>" variables.
Vladimir Homutov <vl@nginx.com>
parents: 5624
diff changeset
2073 if (name->len >= h[i]->value.len) {
3a48775f1535 Upstream: added the "$upstream_cookie_<name>" variables.
Vladimir Homutov <vl@nginx.com>
parents: 5624
diff changeset
2074 continue;
3a48775f1535 Upstream: added the "$upstream_cookie_<name>" variables.
Vladimir Homutov <vl@nginx.com>
parents: 5624
diff changeset
2075 }
3a48775f1535 Upstream: added the "$upstream_cookie_<name>" variables.
Vladimir Homutov <vl@nginx.com>
parents: 5624
diff changeset
2076
3a48775f1535 Upstream: added the "$upstream_cookie_<name>" variables.
Vladimir Homutov <vl@nginx.com>
parents: 5624
diff changeset
2077 start = h[i]->value.data;
3a48775f1535 Upstream: added the "$upstream_cookie_<name>" variables.
Vladimir Homutov <vl@nginx.com>
parents: 5624
diff changeset
2078 end = h[i]->value.data + h[i]->value.len;
3a48775f1535 Upstream: added the "$upstream_cookie_<name>" variables.
Vladimir Homutov <vl@nginx.com>
parents: 5624
diff changeset
2079
3a48775f1535 Upstream: added the "$upstream_cookie_<name>" variables.
Vladimir Homutov <vl@nginx.com>
parents: 5624
diff changeset
2080 if (ngx_strncasecmp(start, name->data, name->len) != 0) {
3a48775f1535 Upstream: added the "$upstream_cookie_<name>" variables.
Vladimir Homutov <vl@nginx.com>
parents: 5624
diff changeset
2081 continue;
3a48775f1535 Upstream: added the "$upstream_cookie_<name>" variables.
Vladimir Homutov <vl@nginx.com>
parents: 5624
diff changeset
2082 }
3a48775f1535 Upstream: added the "$upstream_cookie_<name>" variables.
Vladimir Homutov <vl@nginx.com>
parents: 5624
diff changeset
2083
3a48775f1535 Upstream: added the "$upstream_cookie_<name>" variables.
Vladimir Homutov <vl@nginx.com>
parents: 5624
diff changeset
2084 for (start += name->len; start < end && *start == ' '; start++) {
3a48775f1535 Upstream: added the "$upstream_cookie_<name>" variables.
Vladimir Homutov <vl@nginx.com>
parents: 5624
diff changeset
2085 /* void */
3a48775f1535 Upstream: added the "$upstream_cookie_<name>" variables.
Vladimir Homutov <vl@nginx.com>
parents: 5624
diff changeset
2086 }
3a48775f1535 Upstream: added the "$upstream_cookie_<name>" variables.
Vladimir Homutov <vl@nginx.com>
parents: 5624
diff changeset
2087
3a48775f1535 Upstream: added the "$upstream_cookie_<name>" variables.
Vladimir Homutov <vl@nginx.com>
parents: 5624
diff changeset
2088 if (start == end || *start++ != '=') {
3a48775f1535 Upstream: added the "$upstream_cookie_<name>" variables.
Vladimir Homutov <vl@nginx.com>
parents: 5624
diff changeset
2089 /* the invalid header value */
3a48775f1535 Upstream: added the "$upstream_cookie_<name>" variables.
Vladimir Homutov <vl@nginx.com>
parents: 5624
diff changeset
2090 continue;
3a48775f1535 Upstream: added the "$upstream_cookie_<name>" variables.
Vladimir Homutov <vl@nginx.com>
parents: 5624
diff changeset
2091 }
3a48775f1535 Upstream: added the "$upstream_cookie_<name>" variables.
Vladimir Homutov <vl@nginx.com>
parents: 5624
diff changeset
2092
3a48775f1535 Upstream: added the "$upstream_cookie_<name>" variables.
Vladimir Homutov <vl@nginx.com>
parents: 5624
diff changeset
2093 while (start < end && *start == ' ') { start++; }
3a48775f1535 Upstream: added the "$upstream_cookie_<name>" variables.
Vladimir Homutov <vl@nginx.com>
parents: 5624
diff changeset
2094
3a48775f1535 Upstream: added the "$upstream_cookie_<name>" variables.
Vladimir Homutov <vl@nginx.com>
parents: 5624
diff changeset
2095 for (last = start; last < end && *last != ';'; last++) {
3a48775f1535 Upstream: added the "$upstream_cookie_<name>" variables.
Vladimir Homutov <vl@nginx.com>
parents: 5624
diff changeset
2096 /* void */
3a48775f1535 Upstream: added the "$upstream_cookie_<name>" variables.
Vladimir Homutov <vl@nginx.com>
parents: 5624
diff changeset
2097 }
3a48775f1535 Upstream: added the "$upstream_cookie_<name>" variables.
Vladimir Homutov <vl@nginx.com>
parents: 5624
diff changeset
2098
3a48775f1535 Upstream: added the "$upstream_cookie_<name>" variables.
Vladimir Homutov <vl@nginx.com>
parents: 5624
diff changeset
2099 value->len = last - start;
3a48775f1535 Upstream: added the "$upstream_cookie_<name>" variables.
Vladimir Homutov <vl@nginx.com>
parents: 5624
diff changeset
2100 value->data = start;
3a48775f1535 Upstream: added the "$upstream_cookie_<name>" variables.
Vladimir Homutov <vl@nginx.com>
parents: 5624
diff changeset
2101
3a48775f1535 Upstream: added the "$upstream_cookie_<name>" variables.
Vladimir Homutov <vl@nginx.com>
parents: 5624
diff changeset
2102 return i;
3a48775f1535 Upstream: added the "$upstream_cookie_<name>" variables.
Vladimir Homutov <vl@nginx.com>
parents: 5624
diff changeset
2103 }
3a48775f1535 Upstream: added the "$upstream_cookie_<name>" variables.
Vladimir Homutov <vl@nginx.com>
parents: 5624
diff changeset
2104
3a48775f1535 Upstream: added the "$upstream_cookie_<name>" variables.
Vladimir Homutov <vl@nginx.com>
parents: 5624
diff changeset
2105 return NGX_DECLINED;
3a48775f1535 Upstream: added the "$upstream_cookie_<name>" variables.
Vladimir Homutov <vl@nginx.com>
parents: 5624
diff changeset
2106 }
3a48775f1535 Upstream: added the "$upstream_cookie_<name>" variables.
Vladimir Homutov <vl@nginx.com>
parents: 5624
diff changeset
2107
3a48775f1535 Upstream: added the "$upstream_cookie_<name>" variables.
Vladimir Homutov <vl@nginx.com>
parents: 5624
diff changeset
2108
3a48775f1535 Upstream: added the "$upstream_cookie_<name>" variables.
Vladimir Homutov <vl@nginx.com>
parents: 5624
diff changeset
2109 ngx_int_t
2415
d311b7f6a403 ngx_http_arg()
Igor Sysoev <igor@sysoev.ru>
parents: 2256
diff changeset
2110 ngx_http_arg(ngx_http_request_t *r, u_char *name, size_t len, ngx_str_t *value)
d311b7f6a403 ngx_http_arg()
Igor Sysoev <igor@sysoev.ru>
parents: 2256
diff changeset
2111 {
2670
20a655d8a1f8 refactor ngx_http_arg() using ngx_strcasestrn(),
Igor Sysoev <igor@sysoev.ru>
parents: 2625
diff changeset
2112 u_char *p, *last;
2415
d311b7f6a403 ngx_http_arg()
Igor Sysoev <igor@sysoev.ru>
parents: 2256
diff changeset
2113
d311b7f6a403 ngx_http_arg()
Igor Sysoev <igor@sysoev.ru>
parents: 2256
diff changeset
2114 if (r->args.len == 0) {
d311b7f6a403 ngx_http_arg()
Igor Sysoev <igor@sysoev.ru>
parents: 2256
diff changeset
2115 return NGX_DECLINED;
d311b7f6a403 ngx_http_arg()
Igor Sysoev <igor@sysoev.ru>
parents: 2256
diff changeset
2116 }
d311b7f6a403 ngx_http_arg()
Igor Sysoev <igor@sysoev.ru>
parents: 2256
diff changeset
2117
2670
20a655d8a1f8 refactor ngx_http_arg() using ngx_strcasestrn(),
Igor Sysoev <igor@sysoev.ru>
parents: 2625
diff changeset
2118 p = r->args.data;
20a655d8a1f8 refactor ngx_http_arg() using ngx_strcasestrn(),
Igor Sysoev <igor@sysoev.ru>
parents: 2625
diff changeset
2119 last = p + r->args.len;
2415
d311b7f6a403 ngx_http_arg()
Igor Sysoev <igor@sysoev.ru>
parents: 2256
diff changeset
2120
2670
20a655d8a1f8 refactor ngx_http_arg() using ngx_strcasestrn(),
Igor Sysoev <igor@sysoev.ru>
parents: 2625
diff changeset
2121 for ( /* void */ ; p < last; p++) {
2415
d311b7f6a403 ngx_http_arg()
Igor Sysoev <igor@sysoev.ru>
parents: 2256
diff changeset
2122
2670
20a655d8a1f8 refactor ngx_http_arg() using ngx_strcasestrn(),
Igor Sysoev <igor@sysoev.ru>
parents: 2625
diff changeset
2123 /* we need '=' after name, so drop one char from last */
20a655d8a1f8 refactor ngx_http_arg() using ngx_strcasestrn(),
Igor Sysoev <igor@sysoev.ru>
parents: 2625
diff changeset
2124
20a655d8a1f8 refactor ngx_http_arg() using ngx_strcasestrn(),
Igor Sysoev <igor@sysoev.ru>
parents: 2625
diff changeset
2125 p = ngx_strlcasestrn(p, last - 1, name, len - 1);
2415
d311b7f6a403 ngx_http_arg()
Igor Sysoev <igor@sysoev.ru>
parents: 2256
diff changeset
2126
d311b7f6a403 ngx_http_arg()
Igor Sysoev <igor@sysoev.ru>
parents: 2256
diff changeset
2127 if (p == NULL) {
d311b7f6a403 ngx_http_arg()
Igor Sysoev <igor@sysoev.ru>
parents: 2256
diff changeset
2128 return NGX_DECLINED;
d311b7f6a403 ngx_http_arg()
Igor Sysoev <igor@sysoev.ru>
parents: 2256
diff changeset
2129 }
d311b7f6a403 ngx_http_arg()
Igor Sysoev <igor@sysoev.ru>
parents: 2256
diff changeset
2130
d311b7f6a403 ngx_http_arg()
Igor Sysoev <igor@sysoev.ru>
parents: 2256
diff changeset
2131 if ((p == r->args.data || *(p - 1) == '&') && *(p + len) == '=') {
d311b7f6a403 ngx_http_arg()
Igor Sysoev <igor@sysoev.ru>
parents: 2256
diff changeset
2132
d311b7f6a403 ngx_http_arg()
Igor Sysoev <igor@sysoev.ru>
parents: 2256
diff changeset
2133 value->data = p + len + 1;
d311b7f6a403 ngx_http_arg()
Igor Sysoev <igor@sysoev.ru>
parents: 2256
diff changeset
2134
2670
20a655d8a1f8 refactor ngx_http_arg() using ngx_strcasestrn(),
Igor Sysoev <igor@sysoev.ru>
parents: 2625
diff changeset
2135 p = ngx_strlchr(p, last, '&');
2415
d311b7f6a403 ngx_http_arg()
Igor Sysoev <igor@sysoev.ru>
parents: 2256
diff changeset
2136
d311b7f6a403 ngx_http_arg()
Igor Sysoev <igor@sysoev.ru>
parents: 2256
diff changeset
2137 if (p == NULL) {
d311b7f6a403 ngx_http_arg()
Igor Sysoev <igor@sysoev.ru>
parents: 2256
diff changeset
2138 p = r->args.data + r->args.len;
d311b7f6a403 ngx_http_arg()
Igor Sysoev <igor@sysoev.ru>
parents: 2256
diff changeset
2139 }
d311b7f6a403 ngx_http_arg()
Igor Sysoev <igor@sysoev.ru>
parents: 2256
diff changeset
2140
d311b7f6a403 ngx_http_arg()
Igor Sysoev <igor@sysoev.ru>
parents: 2256
diff changeset
2141 value->len = p - value->data;
d311b7f6a403 ngx_http_arg()
Igor Sysoev <igor@sysoev.ru>
parents: 2256
diff changeset
2142
d311b7f6a403 ngx_http_arg()
Igor Sysoev <igor@sysoev.ru>
parents: 2256
diff changeset
2143 return NGX_OK;
d311b7f6a403 ngx_http_arg()
Igor Sysoev <igor@sysoev.ru>
parents: 2256
diff changeset
2144 }
d311b7f6a403 ngx_http_arg()
Igor Sysoev <igor@sysoev.ru>
parents: 2256
diff changeset
2145 }
d311b7f6a403 ngx_http_arg()
Igor Sysoev <igor@sysoev.ru>
parents: 2256
diff changeset
2146
d311b7f6a403 ngx_http_arg()
Igor Sysoev <igor@sysoev.ru>
parents: 2256
diff changeset
2147 return NGX_DECLINED;
d311b7f6a403 ngx_http_arg()
Igor Sysoev <igor@sysoev.ru>
parents: 2256
diff changeset
2148 }
2578
c7bdd722532f ngx_http_split_args()
Igor Sysoev <igor@sysoev.ru>
parents: 2415
diff changeset
2149
c7bdd722532f ngx_http_split_args()
Igor Sysoev <igor@sysoev.ru>
parents: 2415
diff changeset
2150
c7bdd722532f ngx_http_split_args()
Igor Sysoev <igor@sysoev.ru>
parents: 2415
diff changeset
2151 void
c7bdd722532f ngx_http_split_args()
Igor Sysoev <igor@sysoev.ru>
parents: 2415
diff changeset
2152 ngx_http_split_args(ngx_http_request_t *r, ngx_str_t *uri, ngx_str_t *args)
c7bdd722532f ngx_http_split_args()
Igor Sysoev <igor@sysoev.ru>
parents: 2415
diff changeset
2153 {
3527
84905c7b2aa7 remove r->zero_in_uri
Igor Sysoev <igor@sysoev.ru>
parents: 3161
diff changeset
2154 u_char *p, *last;
2578
c7bdd722532f ngx_http_split_args()
Igor Sysoev <igor@sysoev.ru>
parents: 2415
diff changeset
2155
3527
84905c7b2aa7 remove r->zero_in_uri
Igor Sysoev <igor@sysoev.ru>
parents: 3161
diff changeset
2156 last = uri->data + uri->len;
2625
754ab3d3fe18 fix r2579
Igor Sysoev <igor@sysoev.ru>
parents: 2590
diff changeset
2157
3527
84905c7b2aa7 remove r->zero_in_uri
Igor Sysoev <igor@sysoev.ru>
parents: 3161
diff changeset
2158 p = ngx_strlchr(uri->data, last, '?');
2578
c7bdd722532f ngx_http_split_args()
Igor Sysoev <igor@sysoev.ru>
parents: 2415
diff changeset
2159
3527
84905c7b2aa7 remove r->zero_in_uri
Igor Sysoev <igor@sysoev.ru>
parents: 3161
diff changeset
2160 if (p) {
84905c7b2aa7 remove r->zero_in_uri
Igor Sysoev <igor@sysoev.ru>
parents: 3161
diff changeset
2161 uri->len = p - uri->data;
84905c7b2aa7 remove r->zero_in_uri
Igor Sysoev <igor@sysoev.ru>
parents: 3161
diff changeset
2162 p++;
84905c7b2aa7 remove r->zero_in_uri
Igor Sysoev <igor@sysoev.ru>
parents: 3161
diff changeset
2163 args->len = last - p;
84905c7b2aa7 remove r->zero_in_uri
Igor Sysoev <igor@sysoev.ru>
parents: 3161
diff changeset
2164 args->data = p;
2578
c7bdd722532f ngx_http_split_args()
Igor Sysoev <igor@sysoev.ru>
parents: 2415
diff changeset
2165
3527
84905c7b2aa7 remove r->zero_in_uri
Igor Sysoev <igor@sysoev.ru>
parents: 3161
diff changeset
2166 } else {
84905c7b2aa7 remove r->zero_in_uri
Igor Sysoev <igor@sysoev.ru>
parents: 3161
diff changeset
2167 args->len = 0;
2578
c7bdd722532f ngx_http_split_args()
Igor Sysoev <igor@sysoev.ru>
parents: 2415
diff changeset
2168 }
c7bdd722532f ngx_http_split_args()
Igor Sysoev <igor@sysoev.ru>
parents: 2415
diff changeset
2169 }
4925
32030fa8cb14 Request body: chunked parsing moved to ngx_http_parse.c from proxy.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4674
diff changeset
2170
32030fa8cb14 Request body: chunked parsing moved to ngx_http_parse.c from proxy.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4674
diff changeset
2171
32030fa8cb14 Request body: chunked parsing moved to ngx_http_parse.c from proxy.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4674
diff changeset
2172 ngx_int_t
32030fa8cb14 Request body: chunked parsing moved to ngx_http_parse.c from proxy.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4674
diff changeset
2173 ngx_http_parse_chunked(ngx_http_request_t *r, ngx_buf_t *b,
32030fa8cb14 Request body: chunked parsing moved to ngx_http_parse.c from proxy.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4674
diff changeset
2174 ngx_http_chunked_t *ctx)
32030fa8cb14 Request body: chunked parsing moved to ngx_http_parse.c from proxy.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4674
diff changeset
2175 {
32030fa8cb14 Request body: chunked parsing moved to ngx_http_parse.c from proxy.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4674
diff changeset
2176 u_char *pos, ch, c;
32030fa8cb14 Request body: chunked parsing moved to ngx_http_parse.c from proxy.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4674
diff changeset
2177 ngx_int_t rc;
32030fa8cb14 Request body: chunked parsing moved to ngx_http_parse.c from proxy.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4674
diff changeset
2178 enum {
32030fa8cb14 Request body: chunked parsing moved to ngx_http_parse.c from proxy.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4674
diff changeset
2179 sw_chunk_start = 0,
32030fa8cb14 Request body: chunked parsing moved to ngx_http_parse.c from proxy.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4674
diff changeset
2180 sw_chunk_size,
32030fa8cb14 Request body: chunked parsing moved to ngx_http_parse.c from proxy.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4674
diff changeset
2181 sw_chunk_extension,
32030fa8cb14 Request body: chunked parsing moved to ngx_http_parse.c from proxy.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4674
diff changeset
2182 sw_chunk_extension_almost_done,
32030fa8cb14 Request body: chunked parsing moved to ngx_http_parse.c from proxy.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4674
diff changeset
2183 sw_chunk_data,
32030fa8cb14 Request body: chunked parsing moved to ngx_http_parse.c from proxy.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4674
diff changeset
2184 sw_after_data,
32030fa8cb14 Request body: chunked parsing moved to ngx_http_parse.c from proxy.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4674
diff changeset
2185 sw_after_data_almost_done,
32030fa8cb14 Request body: chunked parsing moved to ngx_http_parse.c from proxy.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4674
diff changeset
2186 sw_last_chunk_extension,
32030fa8cb14 Request body: chunked parsing moved to ngx_http_parse.c from proxy.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4674
diff changeset
2187 sw_last_chunk_extension_almost_done,
32030fa8cb14 Request body: chunked parsing moved to ngx_http_parse.c from proxy.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4674
diff changeset
2188 sw_trailer,
32030fa8cb14 Request body: chunked parsing moved to ngx_http_parse.c from proxy.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4674
diff changeset
2189 sw_trailer_almost_done,
32030fa8cb14 Request body: chunked parsing moved to ngx_http_parse.c from proxy.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4674
diff changeset
2190 sw_trailer_header,
32030fa8cb14 Request body: chunked parsing moved to ngx_http_parse.c from proxy.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4674
diff changeset
2191 sw_trailer_header_almost_done
32030fa8cb14 Request body: chunked parsing moved to ngx_http_parse.c from proxy.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4674
diff changeset
2192 } state;
32030fa8cb14 Request body: chunked parsing moved to ngx_http_parse.c from proxy.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4674
diff changeset
2193
32030fa8cb14 Request body: chunked parsing moved to ngx_http_parse.c from proxy.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4674
diff changeset
2194 state = ctx->state;
32030fa8cb14 Request body: chunked parsing moved to ngx_http_parse.c from proxy.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4674
diff changeset
2195
32030fa8cb14 Request body: chunked parsing moved to ngx_http_parse.c from proxy.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4674
diff changeset
2196 if (state == sw_chunk_data && ctx->size == 0) {
32030fa8cb14 Request body: chunked parsing moved to ngx_http_parse.c from proxy.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4674
diff changeset
2197 state = sw_after_data;
32030fa8cb14 Request body: chunked parsing moved to ngx_http_parse.c from proxy.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4674
diff changeset
2198 }
32030fa8cb14 Request body: chunked parsing moved to ngx_http_parse.c from proxy.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4674
diff changeset
2199
32030fa8cb14 Request body: chunked parsing moved to ngx_http_parse.c from proxy.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4674
diff changeset
2200 rc = NGX_AGAIN;
32030fa8cb14 Request body: chunked parsing moved to ngx_http_parse.c from proxy.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4674
diff changeset
2201
32030fa8cb14 Request body: chunked parsing moved to ngx_http_parse.c from proxy.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4674
diff changeset
2202 for (pos = b->pos; pos < b->last; pos++) {
32030fa8cb14 Request body: chunked parsing moved to ngx_http_parse.c from proxy.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4674
diff changeset
2203
32030fa8cb14 Request body: chunked parsing moved to ngx_http_parse.c from proxy.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4674
diff changeset
2204 ch = *pos;
32030fa8cb14 Request body: chunked parsing moved to ngx_http_parse.c from proxy.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4674
diff changeset
2205
32030fa8cb14 Request body: chunked parsing moved to ngx_http_parse.c from proxy.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4674
diff changeset
2206 ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
32030fa8cb14 Request body: chunked parsing moved to ngx_http_parse.c from proxy.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4674
diff changeset
2207 "http chunked byte: %02Xd s:%d", ch, state);
32030fa8cb14 Request body: chunked parsing moved to ngx_http_parse.c from proxy.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4674
diff changeset
2208
32030fa8cb14 Request body: chunked parsing moved to ngx_http_parse.c from proxy.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4674
diff changeset
2209 switch (state) {
32030fa8cb14 Request body: chunked parsing moved to ngx_http_parse.c from proxy.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4674
diff changeset
2210
32030fa8cb14 Request body: chunked parsing moved to ngx_http_parse.c from proxy.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4674
diff changeset
2211 case sw_chunk_start:
32030fa8cb14 Request body: chunked parsing moved to ngx_http_parse.c from proxy.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4674
diff changeset
2212 if (ch >= '0' && ch <= '9') {
32030fa8cb14 Request body: chunked parsing moved to ngx_http_parse.c from proxy.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4674
diff changeset
2213 state = sw_chunk_size;
32030fa8cb14 Request body: chunked parsing moved to ngx_http_parse.c from proxy.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4674
diff changeset
2214 ctx->size = ch - '0';
32030fa8cb14 Request body: chunked parsing moved to ngx_http_parse.c from proxy.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4674
diff changeset
2215 break;
32030fa8cb14 Request body: chunked parsing moved to ngx_http_parse.c from proxy.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4674
diff changeset
2216 }
32030fa8cb14 Request body: chunked parsing moved to ngx_http_parse.c from proxy.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4674
diff changeset
2217
32030fa8cb14 Request body: chunked parsing moved to ngx_http_parse.c from proxy.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4674
diff changeset
2218 c = (u_char) (ch | 0x20);
32030fa8cb14 Request body: chunked parsing moved to ngx_http_parse.c from proxy.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4674
diff changeset
2219
32030fa8cb14 Request body: chunked parsing moved to ngx_http_parse.c from proxy.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4674
diff changeset
2220 if (c >= 'a' && c <= 'f') {
32030fa8cb14 Request body: chunked parsing moved to ngx_http_parse.c from proxy.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4674
diff changeset
2221 state = sw_chunk_size;
32030fa8cb14 Request body: chunked parsing moved to ngx_http_parse.c from proxy.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4674
diff changeset
2222 ctx->size = c - 'a' + 10;
32030fa8cb14 Request body: chunked parsing moved to ngx_http_parse.c from proxy.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4674
diff changeset
2223 break;
32030fa8cb14 Request body: chunked parsing moved to ngx_http_parse.c from proxy.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4674
diff changeset
2224 }
32030fa8cb14 Request body: chunked parsing moved to ngx_http_parse.c from proxy.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4674
diff changeset
2225
32030fa8cb14 Request body: chunked parsing moved to ngx_http_parse.c from proxy.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4674
diff changeset
2226 goto invalid;
32030fa8cb14 Request body: chunked parsing moved to ngx_http_parse.c from proxy.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4674
diff changeset
2227
32030fa8cb14 Request body: chunked parsing moved to ngx_http_parse.c from proxy.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4674
diff changeset
2228 case sw_chunk_size:
6014
e370c5fdf4c8 Overflow detection in ngx_http_parse_chunked().
Ruslan Ermilov <ru@nginx.com>
parents: 5757
diff changeset
2229 if (ctx->size > NGX_MAX_OFF_T_VALUE / 16) {
e370c5fdf4c8 Overflow detection in ngx_http_parse_chunked().
Ruslan Ermilov <ru@nginx.com>
parents: 5757
diff changeset
2230 goto invalid;
e370c5fdf4c8 Overflow detection in ngx_http_parse_chunked().
Ruslan Ermilov <ru@nginx.com>
parents: 5757
diff changeset
2231 }
e370c5fdf4c8 Overflow detection in ngx_http_parse_chunked().
Ruslan Ermilov <ru@nginx.com>
parents: 5757
diff changeset
2232
4925
32030fa8cb14 Request body: chunked parsing moved to ngx_http_parse.c from proxy.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4674
diff changeset
2233 if (ch >= '0' && ch <= '9') {
32030fa8cb14 Request body: chunked parsing moved to ngx_http_parse.c from proxy.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4674
diff changeset
2234 ctx->size = ctx->size * 16 + (ch - '0');
32030fa8cb14 Request body: chunked parsing moved to ngx_http_parse.c from proxy.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4674
diff changeset
2235 break;
32030fa8cb14 Request body: chunked parsing moved to ngx_http_parse.c from proxy.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4674
diff changeset
2236 }
32030fa8cb14 Request body: chunked parsing moved to ngx_http_parse.c from proxy.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4674
diff changeset
2237
32030fa8cb14 Request body: chunked parsing moved to ngx_http_parse.c from proxy.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4674
diff changeset
2238 c = (u_char) (ch | 0x20);
32030fa8cb14 Request body: chunked parsing moved to ngx_http_parse.c from proxy.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4674
diff changeset
2239
32030fa8cb14 Request body: chunked parsing moved to ngx_http_parse.c from proxy.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4674
diff changeset
2240 if (c >= 'a' && c <= 'f') {
32030fa8cb14 Request body: chunked parsing moved to ngx_http_parse.c from proxy.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4674
diff changeset
2241 ctx->size = ctx->size * 16 + (c - 'a' + 10);
32030fa8cb14 Request body: chunked parsing moved to ngx_http_parse.c from proxy.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4674
diff changeset
2242 break;
32030fa8cb14 Request body: chunked parsing moved to ngx_http_parse.c from proxy.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4674
diff changeset
2243 }
32030fa8cb14 Request body: chunked parsing moved to ngx_http_parse.c from proxy.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4674
diff changeset
2244
32030fa8cb14 Request body: chunked parsing moved to ngx_http_parse.c from proxy.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4674
diff changeset
2245 if (ctx->size == 0) {
32030fa8cb14 Request body: chunked parsing moved to ngx_http_parse.c from proxy.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4674
diff changeset
2246
32030fa8cb14 Request body: chunked parsing moved to ngx_http_parse.c from proxy.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4674
diff changeset
2247 switch (ch) {
32030fa8cb14 Request body: chunked parsing moved to ngx_http_parse.c from proxy.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4674
diff changeset
2248 case CR:
32030fa8cb14 Request body: chunked parsing moved to ngx_http_parse.c from proxy.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4674
diff changeset
2249 state = sw_last_chunk_extension_almost_done;
32030fa8cb14 Request body: chunked parsing moved to ngx_http_parse.c from proxy.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4674
diff changeset
2250 break;
32030fa8cb14 Request body: chunked parsing moved to ngx_http_parse.c from proxy.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4674
diff changeset
2251 case LF:
32030fa8cb14 Request body: chunked parsing moved to ngx_http_parse.c from proxy.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4674
diff changeset
2252 state = sw_trailer;
32030fa8cb14 Request body: chunked parsing moved to ngx_http_parse.c from proxy.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4674
diff changeset
2253 break;
32030fa8cb14 Request body: chunked parsing moved to ngx_http_parse.c from proxy.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4674
diff changeset
2254 case ';':
32030fa8cb14 Request body: chunked parsing moved to ngx_http_parse.c from proxy.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4674
diff changeset
2255 case ' ':
32030fa8cb14 Request body: chunked parsing moved to ngx_http_parse.c from proxy.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4674
diff changeset
2256 case '\t':
32030fa8cb14 Request body: chunked parsing moved to ngx_http_parse.c from proxy.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4674
diff changeset
2257 state = sw_last_chunk_extension;
32030fa8cb14 Request body: chunked parsing moved to ngx_http_parse.c from proxy.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4674
diff changeset
2258 break;
32030fa8cb14 Request body: chunked parsing moved to ngx_http_parse.c from proxy.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4674
diff changeset
2259 default:
32030fa8cb14 Request body: chunked parsing moved to ngx_http_parse.c from proxy.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4674
diff changeset
2260 goto invalid;
32030fa8cb14 Request body: chunked parsing moved to ngx_http_parse.c from proxy.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4674
diff changeset
2261 }
32030fa8cb14 Request body: chunked parsing moved to ngx_http_parse.c from proxy.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4674
diff changeset
2262
32030fa8cb14 Request body: chunked parsing moved to ngx_http_parse.c from proxy.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4674
diff changeset
2263 break;
32030fa8cb14 Request body: chunked parsing moved to ngx_http_parse.c from proxy.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4674
diff changeset
2264 }
32030fa8cb14 Request body: chunked parsing moved to ngx_http_parse.c from proxy.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4674
diff changeset
2265
32030fa8cb14 Request body: chunked parsing moved to ngx_http_parse.c from proxy.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4674
diff changeset
2266 switch (ch) {
32030fa8cb14 Request body: chunked parsing moved to ngx_http_parse.c from proxy.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4674
diff changeset
2267 case CR:
32030fa8cb14 Request body: chunked parsing moved to ngx_http_parse.c from proxy.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4674
diff changeset
2268 state = sw_chunk_extension_almost_done;
32030fa8cb14 Request body: chunked parsing moved to ngx_http_parse.c from proxy.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4674
diff changeset
2269 break;
32030fa8cb14 Request body: chunked parsing moved to ngx_http_parse.c from proxy.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4674
diff changeset
2270 case LF:
32030fa8cb14 Request body: chunked parsing moved to ngx_http_parse.c from proxy.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4674
diff changeset
2271 state = sw_chunk_data;
32030fa8cb14 Request body: chunked parsing moved to ngx_http_parse.c from proxy.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4674
diff changeset
2272 break;
32030fa8cb14 Request body: chunked parsing moved to ngx_http_parse.c from proxy.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4674
diff changeset
2273 case ';':
32030fa8cb14 Request body: chunked parsing moved to ngx_http_parse.c from proxy.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4674
diff changeset
2274 case ' ':
32030fa8cb14 Request body: chunked parsing moved to ngx_http_parse.c from proxy.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4674
diff changeset
2275 case '\t':
32030fa8cb14 Request body: chunked parsing moved to ngx_http_parse.c from proxy.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4674
diff changeset
2276 state = sw_chunk_extension;
32030fa8cb14 Request body: chunked parsing moved to ngx_http_parse.c from proxy.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4674
diff changeset
2277 break;
32030fa8cb14 Request body: chunked parsing moved to ngx_http_parse.c from proxy.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4674
diff changeset
2278 default:
32030fa8cb14 Request body: chunked parsing moved to ngx_http_parse.c from proxy.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4674
diff changeset
2279 goto invalid;
32030fa8cb14 Request body: chunked parsing moved to ngx_http_parse.c from proxy.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4674
diff changeset
2280 }
32030fa8cb14 Request body: chunked parsing moved to ngx_http_parse.c from proxy.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4674
diff changeset
2281
32030fa8cb14 Request body: chunked parsing moved to ngx_http_parse.c from proxy.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4674
diff changeset
2282 break;
32030fa8cb14 Request body: chunked parsing moved to ngx_http_parse.c from proxy.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4674
diff changeset
2283
32030fa8cb14 Request body: chunked parsing moved to ngx_http_parse.c from proxy.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4674
diff changeset
2284 case sw_chunk_extension:
32030fa8cb14 Request body: chunked parsing moved to ngx_http_parse.c from proxy.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4674
diff changeset
2285 switch (ch) {
32030fa8cb14 Request body: chunked parsing moved to ngx_http_parse.c from proxy.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4674
diff changeset
2286 case CR:
32030fa8cb14 Request body: chunked parsing moved to ngx_http_parse.c from proxy.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4674
diff changeset
2287 state = sw_chunk_extension_almost_done;
32030fa8cb14 Request body: chunked parsing moved to ngx_http_parse.c from proxy.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4674
diff changeset
2288 break;
32030fa8cb14 Request body: chunked parsing moved to ngx_http_parse.c from proxy.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4674
diff changeset
2289 case LF:
32030fa8cb14 Request body: chunked parsing moved to ngx_http_parse.c from proxy.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4674
diff changeset
2290 state = sw_chunk_data;
32030fa8cb14 Request body: chunked parsing moved to ngx_http_parse.c from proxy.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4674
diff changeset
2291 }
32030fa8cb14 Request body: chunked parsing moved to ngx_http_parse.c from proxy.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4674
diff changeset
2292 break;
32030fa8cb14 Request body: chunked parsing moved to ngx_http_parse.c from proxy.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4674
diff changeset
2293
32030fa8cb14 Request body: chunked parsing moved to ngx_http_parse.c from proxy.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4674
diff changeset
2294 case sw_chunk_extension_almost_done:
32030fa8cb14 Request body: chunked parsing moved to ngx_http_parse.c from proxy.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4674
diff changeset
2295 if (ch == LF) {
32030fa8cb14 Request body: chunked parsing moved to ngx_http_parse.c from proxy.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4674
diff changeset
2296 state = sw_chunk_data;
32030fa8cb14 Request body: chunked parsing moved to ngx_http_parse.c from proxy.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4674
diff changeset
2297 break;
32030fa8cb14 Request body: chunked parsing moved to ngx_http_parse.c from proxy.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4674
diff changeset
2298 }
32030fa8cb14 Request body: chunked parsing moved to ngx_http_parse.c from proxy.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4674
diff changeset
2299 goto invalid;
32030fa8cb14 Request body: chunked parsing moved to ngx_http_parse.c from proxy.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4674
diff changeset
2300
32030fa8cb14 Request body: chunked parsing moved to ngx_http_parse.c from proxy.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4674
diff changeset
2301 case sw_chunk_data:
32030fa8cb14 Request body: chunked parsing moved to ngx_http_parse.c from proxy.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4674
diff changeset
2302 rc = NGX_OK;
32030fa8cb14 Request body: chunked parsing moved to ngx_http_parse.c from proxy.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4674
diff changeset
2303 goto data;
32030fa8cb14 Request body: chunked parsing moved to ngx_http_parse.c from proxy.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4674
diff changeset
2304
32030fa8cb14 Request body: chunked parsing moved to ngx_http_parse.c from proxy.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4674
diff changeset
2305 case sw_after_data:
32030fa8cb14 Request body: chunked parsing moved to ngx_http_parse.c from proxy.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4674
diff changeset
2306 switch (ch) {
32030fa8cb14 Request body: chunked parsing moved to ngx_http_parse.c from proxy.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4674
diff changeset
2307 case CR:
32030fa8cb14 Request body: chunked parsing moved to ngx_http_parse.c from proxy.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4674
diff changeset
2308 state = sw_after_data_almost_done;
32030fa8cb14 Request body: chunked parsing moved to ngx_http_parse.c from proxy.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4674
diff changeset
2309 break;
32030fa8cb14 Request body: chunked parsing moved to ngx_http_parse.c from proxy.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4674
diff changeset
2310 case LF:
32030fa8cb14 Request body: chunked parsing moved to ngx_http_parse.c from proxy.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4674
diff changeset
2311 state = sw_chunk_start;
7562
52b5ee64fe11 Detect runaway chunks in ngx_http_parse_chunked().
Sergey Kandaurov <pluknet@nginx.com>
parents: 7292
diff changeset
2312 break;
52b5ee64fe11 Detect runaway chunks in ngx_http_parse_chunked().
Sergey Kandaurov <pluknet@nginx.com>
parents: 7292
diff changeset
2313 default:
52b5ee64fe11 Detect runaway chunks in ngx_http_parse_chunked().
Sergey Kandaurov <pluknet@nginx.com>
parents: 7292
diff changeset
2314 goto invalid;
4925
32030fa8cb14 Request body: chunked parsing moved to ngx_http_parse.c from proxy.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4674
diff changeset
2315 }
32030fa8cb14 Request body: chunked parsing moved to ngx_http_parse.c from proxy.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4674
diff changeset
2316 break;
32030fa8cb14 Request body: chunked parsing moved to ngx_http_parse.c from proxy.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4674
diff changeset
2317
32030fa8cb14 Request body: chunked parsing moved to ngx_http_parse.c from proxy.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4674
diff changeset
2318 case sw_after_data_almost_done:
32030fa8cb14 Request body: chunked parsing moved to ngx_http_parse.c from proxy.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4674
diff changeset
2319 if (ch == LF) {
32030fa8cb14 Request body: chunked parsing moved to ngx_http_parse.c from proxy.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4674
diff changeset
2320 state = sw_chunk_start;
32030fa8cb14 Request body: chunked parsing moved to ngx_http_parse.c from proxy.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4674
diff changeset
2321 break;
32030fa8cb14 Request body: chunked parsing moved to ngx_http_parse.c from proxy.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4674
diff changeset
2322 }
32030fa8cb14 Request body: chunked parsing moved to ngx_http_parse.c from proxy.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4674
diff changeset
2323 goto invalid;
32030fa8cb14 Request body: chunked parsing moved to ngx_http_parse.c from proxy.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4674
diff changeset
2324
32030fa8cb14 Request body: chunked parsing moved to ngx_http_parse.c from proxy.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4674
diff changeset
2325 case sw_last_chunk_extension:
32030fa8cb14 Request body: chunked parsing moved to ngx_http_parse.c from proxy.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4674
diff changeset
2326 switch (ch) {
32030fa8cb14 Request body: chunked parsing moved to ngx_http_parse.c from proxy.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4674
diff changeset
2327 case CR:
32030fa8cb14 Request body: chunked parsing moved to ngx_http_parse.c from proxy.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4674
diff changeset
2328 state = sw_last_chunk_extension_almost_done;
32030fa8cb14 Request body: chunked parsing moved to ngx_http_parse.c from proxy.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4674
diff changeset
2329 break;
32030fa8cb14 Request body: chunked parsing moved to ngx_http_parse.c from proxy.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4674
diff changeset
2330 case LF:
32030fa8cb14 Request body: chunked parsing moved to ngx_http_parse.c from proxy.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4674
diff changeset
2331 state = sw_trailer;
32030fa8cb14 Request body: chunked parsing moved to ngx_http_parse.c from proxy.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4674
diff changeset
2332 }
32030fa8cb14 Request body: chunked parsing moved to ngx_http_parse.c from proxy.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4674
diff changeset
2333 break;
32030fa8cb14 Request body: chunked parsing moved to ngx_http_parse.c from proxy.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4674
diff changeset
2334
32030fa8cb14 Request body: chunked parsing moved to ngx_http_parse.c from proxy.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4674
diff changeset
2335 case sw_last_chunk_extension_almost_done:
32030fa8cb14 Request body: chunked parsing moved to ngx_http_parse.c from proxy.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4674
diff changeset
2336 if (ch == LF) {
32030fa8cb14 Request body: chunked parsing moved to ngx_http_parse.c from proxy.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4674
diff changeset
2337 state = sw_trailer;
32030fa8cb14 Request body: chunked parsing moved to ngx_http_parse.c from proxy.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4674
diff changeset
2338 break;
32030fa8cb14 Request body: chunked parsing moved to ngx_http_parse.c from proxy.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4674
diff changeset
2339 }
32030fa8cb14 Request body: chunked parsing moved to ngx_http_parse.c from proxy.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4674
diff changeset
2340 goto invalid;
32030fa8cb14 Request body: chunked parsing moved to ngx_http_parse.c from proxy.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4674
diff changeset
2341
32030fa8cb14 Request body: chunked parsing moved to ngx_http_parse.c from proxy.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4674
diff changeset
2342 case sw_trailer:
32030fa8cb14 Request body: chunked parsing moved to ngx_http_parse.c from proxy.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4674
diff changeset
2343 switch (ch) {
32030fa8cb14 Request body: chunked parsing moved to ngx_http_parse.c from proxy.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4674
diff changeset
2344 case CR:
32030fa8cb14 Request body: chunked parsing moved to ngx_http_parse.c from proxy.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4674
diff changeset
2345 state = sw_trailer_almost_done;
32030fa8cb14 Request body: chunked parsing moved to ngx_http_parse.c from proxy.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4674
diff changeset
2346 break;
32030fa8cb14 Request body: chunked parsing moved to ngx_http_parse.c from proxy.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4674
diff changeset
2347 case LF:
32030fa8cb14 Request body: chunked parsing moved to ngx_http_parse.c from proxy.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4674
diff changeset
2348 goto done;
32030fa8cb14 Request body: chunked parsing moved to ngx_http_parse.c from proxy.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4674
diff changeset
2349 default:
32030fa8cb14 Request body: chunked parsing moved to ngx_http_parse.c from proxy.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4674
diff changeset
2350 state = sw_trailer_header;
32030fa8cb14 Request body: chunked parsing moved to ngx_http_parse.c from proxy.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4674
diff changeset
2351 }
32030fa8cb14 Request body: chunked parsing moved to ngx_http_parse.c from proxy.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4674
diff changeset
2352 break;
32030fa8cb14 Request body: chunked parsing moved to ngx_http_parse.c from proxy.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4674
diff changeset
2353
32030fa8cb14 Request body: chunked parsing moved to ngx_http_parse.c from proxy.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4674
diff changeset
2354 case sw_trailer_almost_done:
32030fa8cb14 Request body: chunked parsing moved to ngx_http_parse.c from proxy.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4674
diff changeset
2355 if (ch == LF) {
32030fa8cb14 Request body: chunked parsing moved to ngx_http_parse.c from proxy.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4674
diff changeset
2356 goto done;
32030fa8cb14 Request body: chunked parsing moved to ngx_http_parse.c from proxy.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4674
diff changeset
2357 }
32030fa8cb14 Request body: chunked parsing moved to ngx_http_parse.c from proxy.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4674
diff changeset
2358 goto invalid;
32030fa8cb14 Request body: chunked parsing moved to ngx_http_parse.c from proxy.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4674
diff changeset
2359
32030fa8cb14 Request body: chunked parsing moved to ngx_http_parse.c from proxy.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4674
diff changeset
2360 case sw_trailer_header:
32030fa8cb14 Request body: chunked parsing moved to ngx_http_parse.c from proxy.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4674
diff changeset
2361 switch (ch) {
32030fa8cb14 Request body: chunked parsing moved to ngx_http_parse.c from proxy.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4674
diff changeset
2362 case CR:
32030fa8cb14 Request body: chunked parsing moved to ngx_http_parse.c from proxy.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4674
diff changeset
2363 state = sw_trailer_header_almost_done;
32030fa8cb14 Request body: chunked parsing moved to ngx_http_parse.c from proxy.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4674
diff changeset
2364 break;
32030fa8cb14 Request body: chunked parsing moved to ngx_http_parse.c from proxy.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4674
diff changeset
2365 case LF:
32030fa8cb14 Request body: chunked parsing moved to ngx_http_parse.c from proxy.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4674
diff changeset
2366 state = sw_trailer;
32030fa8cb14 Request body: chunked parsing moved to ngx_http_parse.c from proxy.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4674
diff changeset
2367 }
32030fa8cb14 Request body: chunked parsing moved to ngx_http_parse.c from proxy.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4674
diff changeset
2368 break;
32030fa8cb14 Request body: chunked parsing moved to ngx_http_parse.c from proxy.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4674
diff changeset
2369
32030fa8cb14 Request body: chunked parsing moved to ngx_http_parse.c from proxy.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4674
diff changeset
2370 case sw_trailer_header_almost_done:
32030fa8cb14 Request body: chunked parsing moved to ngx_http_parse.c from proxy.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4674
diff changeset
2371 if (ch == LF) {
32030fa8cb14 Request body: chunked parsing moved to ngx_http_parse.c from proxy.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4674
diff changeset
2372 state = sw_trailer;
32030fa8cb14 Request body: chunked parsing moved to ngx_http_parse.c from proxy.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4674
diff changeset
2373 break;
32030fa8cb14 Request body: chunked parsing moved to ngx_http_parse.c from proxy.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4674
diff changeset
2374 }
32030fa8cb14 Request body: chunked parsing moved to ngx_http_parse.c from proxy.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4674
diff changeset
2375 goto invalid;
32030fa8cb14 Request body: chunked parsing moved to ngx_http_parse.c from proxy.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4674
diff changeset
2376
32030fa8cb14 Request body: chunked parsing moved to ngx_http_parse.c from proxy.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4674
diff changeset
2377 }
32030fa8cb14 Request body: chunked parsing moved to ngx_http_parse.c from proxy.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4674
diff changeset
2378 }
32030fa8cb14 Request body: chunked parsing moved to ngx_http_parse.c from proxy.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4674
diff changeset
2379
32030fa8cb14 Request body: chunked parsing moved to ngx_http_parse.c from proxy.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4674
diff changeset
2380 data:
32030fa8cb14 Request body: chunked parsing moved to ngx_http_parse.c from proxy.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4674
diff changeset
2381
32030fa8cb14 Request body: chunked parsing moved to ngx_http_parse.c from proxy.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4674
diff changeset
2382 ctx->state = state;
32030fa8cb14 Request body: chunked parsing moved to ngx_http_parse.c from proxy.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4674
diff changeset
2383 b->pos = pos;
32030fa8cb14 Request body: chunked parsing moved to ngx_http_parse.c from proxy.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4674
diff changeset
2384
6014
e370c5fdf4c8 Overflow detection in ngx_http_parse_chunked().
Ruslan Ermilov <ru@nginx.com>
parents: 5757
diff changeset
2385 if (ctx->size > NGX_MAX_OFF_T_VALUE - 5) {
e370c5fdf4c8 Overflow detection in ngx_http_parse_chunked().
Ruslan Ermilov <ru@nginx.com>
parents: 5757
diff changeset
2386 goto invalid;
e370c5fdf4c8 Overflow detection in ngx_http_parse_chunked().
Ruslan Ermilov <ru@nginx.com>
parents: 5757
diff changeset
2387 }
e370c5fdf4c8 Overflow detection in ngx_http_parse_chunked().
Ruslan Ermilov <ru@nginx.com>
parents: 5757
diff changeset
2388
4925
32030fa8cb14 Request body: chunked parsing moved to ngx_http_parse.c from proxy.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4674
diff changeset
2389 switch (state) {
32030fa8cb14 Request body: chunked parsing moved to ngx_http_parse.c from proxy.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4674
diff changeset
2390
32030fa8cb14 Request body: chunked parsing moved to ngx_http_parse.c from proxy.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4674
diff changeset
2391 case sw_chunk_start:
32030fa8cb14 Request body: chunked parsing moved to ngx_http_parse.c from proxy.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4674
diff changeset
2392 ctx->length = 3 /* "0" LF LF */;
32030fa8cb14 Request body: chunked parsing moved to ngx_http_parse.c from proxy.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4674
diff changeset
2393 break;
32030fa8cb14 Request body: chunked parsing moved to ngx_http_parse.c from proxy.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4674
diff changeset
2394 case sw_chunk_size:
5256
b66ec10e901a Fixed ngx_http_parse_chunked() minimal length calculation.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5247
diff changeset
2395 ctx->length = 1 /* LF */
b66ec10e901a Fixed ngx_http_parse_chunked() minimal length calculation.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5247
diff changeset
2396 + (ctx->size ? ctx->size + 4 /* LF "0" LF LF */
b66ec10e901a Fixed ngx_http_parse_chunked() minimal length calculation.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5247
diff changeset
2397 : 1 /* LF */);
4925
32030fa8cb14 Request body: chunked parsing moved to ngx_http_parse.c from proxy.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4674
diff changeset
2398 break;
32030fa8cb14 Request body: chunked parsing moved to ngx_http_parse.c from proxy.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4674
diff changeset
2399 case sw_chunk_extension:
32030fa8cb14 Request body: chunked parsing moved to ngx_http_parse.c from proxy.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4674
diff changeset
2400 case sw_chunk_extension_almost_done:
32030fa8cb14 Request body: chunked parsing moved to ngx_http_parse.c from proxy.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4674
diff changeset
2401 ctx->length = 1 /* LF */ + ctx->size + 4 /* LF "0" LF LF */;
32030fa8cb14 Request body: chunked parsing moved to ngx_http_parse.c from proxy.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4674
diff changeset
2402 break;
32030fa8cb14 Request body: chunked parsing moved to ngx_http_parse.c from proxy.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4674
diff changeset
2403 case sw_chunk_data:
32030fa8cb14 Request body: chunked parsing moved to ngx_http_parse.c from proxy.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4674
diff changeset
2404 ctx->length = ctx->size + 4 /* LF "0" LF LF */;
32030fa8cb14 Request body: chunked parsing moved to ngx_http_parse.c from proxy.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4674
diff changeset
2405 break;
32030fa8cb14 Request body: chunked parsing moved to ngx_http_parse.c from proxy.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4674
diff changeset
2406 case sw_after_data:
32030fa8cb14 Request body: chunked parsing moved to ngx_http_parse.c from proxy.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4674
diff changeset
2407 case sw_after_data_almost_done:
32030fa8cb14 Request body: chunked parsing moved to ngx_http_parse.c from proxy.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4674
diff changeset
2408 ctx->length = 4 /* LF "0" LF LF */;
32030fa8cb14 Request body: chunked parsing moved to ngx_http_parse.c from proxy.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4674
diff changeset
2409 break;
32030fa8cb14 Request body: chunked parsing moved to ngx_http_parse.c from proxy.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4674
diff changeset
2410 case sw_last_chunk_extension:
32030fa8cb14 Request body: chunked parsing moved to ngx_http_parse.c from proxy.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4674
diff changeset
2411 case sw_last_chunk_extension_almost_done:
32030fa8cb14 Request body: chunked parsing moved to ngx_http_parse.c from proxy.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4674
diff changeset
2412 ctx->length = 2 /* LF LF */;
32030fa8cb14 Request body: chunked parsing moved to ngx_http_parse.c from proxy.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4674
diff changeset
2413 break;
32030fa8cb14 Request body: chunked parsing moved to ngx_http_parse.c from proxy.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4674
diff changeset
2414 case sw_trailer:
32030fa8cb14 Request body: chunked parsing moved to ngx_http_parse.c from proxy.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4674
diff changeset
2415 case sw_trailer_almost_done:
32030fa8cb14 Request body: chunked parsing moved to ngx_http_parse.c from proxy.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4674
diff changeset
2416 ctx->length = 1 /* LF */;
32030fa8cb14 Request body: chunked parsing moved to ngx_http_parse.c from proxy.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4674
diff changeset
2417 break;
32030fa8cb14 Request body: chunked parsing moved to ngx_http_parse.c from proxy.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4674
diff changeset
2418 case sw_trailer_header:
32030fa8cb14 Request body: chunked parsing moved to ngx_http_parse.c from proxy.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4674
diff changeset
2419 case sw_trailer_header_almost_done:
32030fa8cb14 Request body: chunked parsing moved to ngx_http_parse.c from proxy.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4674
diff changeset
2420 ctx->length = 2 /* LF LF */;
32030fa8cb14 Request body: chunked parsing moved to ngx_http_parse.c from proxy.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4674
diff changeset
2421 break;
32030fa8cb14 Request body: chunked parsing moved to ngx_http_parse.c from proxy.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4674
diff changeset
2422
32030fa8cb14 Request body: chunked parsing moved to ngx_http_parse.c from proxy.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4674
diff changeset
2423 }
32030fa8cb14 Request body: chunked parsing moved to ngx_http_parse.c from proxy.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4674
diff changeset
2424
32030fa8cb14 Request body: chunked parsing moved to ngx_http_parse.c from proxy.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4674
diff changeset
2425 return rc;
32030fa8cb14 Request body: chunked parsing moved to ngx_http_parse.c from proxy.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4674
diff changeset
2426
32030fa8cb14 Request body: chunked parsing moved to ngx_http_parse.c from proxy.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4674
diff changeset
2427 done:
32030fa8cb14 Request body: chunked parsing moved to ngx_http_parse.c from proxy.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4674
diff changeset
2428
4926
1c9d8b6523c0 Request body: adjust b->pos when chunked parsing done.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4925
diff changeset
2429 ctx->state = 0;
1c9d8b6523c0 Request body: adjust b->pos when chunked parsing done.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4925
diff changeset
2430 b->pos = pos + 1;
1c9d8b6523c0 Request body: adjust b->pos when chunked parsing done.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4925
diff changeset
2431
4925
32030fa8cb14 Request body: chunked parsing moved to ngx_http_parse.c from proxy.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4674
diff changeset
2432 return NGX_DONE;
32030fa8cb14 Request body: chunked parsing moved to ngx_http_parse.c from proxy.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4674
diff changeset
2433
32030fa8cb14 Request body: chunked parsing moved to ngx_http_parse.c from proxy.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4674
diff changeset
2434 invalid:
32030fa8cb14 Request body: chunked parsing moved to ngx_http_parse.c from proxy.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4674
diff changeset
2435
32030fa8cb14 Request body: chunked parsing moved to ngx_http_parse.c from proxy.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4674
diff changeset
2436 return NGX_ERROR;
32030fa8cb14 Request body: chunked parsing moved to ngx_http_parse.c from proxy.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4674
diff changeset
2437 }