annotate src/http/ngx_http_parse.c @ 7882:b4073527be81

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