annotate src/http/ngx_http_parse.c @ 7842:4b15f1b92100

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