annotate dreactor/protocol/http11_parser.d @ 11:5836613d16ac

reorg! reorg!
author rick@minifunk
date Tue, 12 Aug 2008 16:59:56 -0400
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
11
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
1 module dreactor.protocol.http11_parser;
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
2
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
3 //#line 1 "http11_parser.rl"
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
4 /**
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
5 * Copyright (c) 2005 Zed A. Shaw,
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
6 * Modified for D by Rick Richardson, 2008
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
7 * You can redistribute it and/or modify it under the same terms as Ruby.
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
8 */
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
9
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
10
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
11 alias void delegate (Object data, char[] buf) element_cb;
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
12 alias void delegate (Object data, char[] field, char[] value) field_cb;
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
13
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
14 class Http11Parser
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
15 {
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
16 private
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
17 int cs;
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
18 size_t body_start;
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
19 int content_len;
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
20 size_t nread;
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
21 size_t mark;
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
22 size_t field_start;
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
23 size_t field_len;
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
24 size_t query_start;
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
25
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
26 Object data;
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
27
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
28 field_cb http_field;
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
29 element_cb request_method;
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
30 element_cb request_uri;
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
31 element_cb fragment;
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
32 element_cb request_path;
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
33 element_cb query_string;
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
34 element_cb http_version;
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
35 element_cb header_done;
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
36
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
37 /*
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
38 * capitalizes all lower-case ASCII characters,
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
39 * converts dashes to underscores.
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
40 */
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
41 private void snake_upcase_char(char *c)
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
42 {
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
43 if (*c >= 'a' && *c <= 'z')
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
44 *c &= ~0x20;
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
45 else if (*c == '-')
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
46 *c = '_';
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
47 }
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
48
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
49 //#define LEN(AT, FPC) (FPC - buffer - parser->AT)
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
50 private size_t LEN(char[] buffer, size_t at, char* fpc)
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
51 {
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
52 return (fpc - buffer.ptr - at);
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
53 }
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
54
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
55 //#define MARK(M,FPC) (parser->M = (FPC) - buffer)
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
56 private void MARK(char[] buffer, size_t* item, char* fpc)
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
57 {
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
58 *item = fpc - buffer.ptr;
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
59 }
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
60
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
61 /** Machine **/
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
62
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
63 //#line 126 "http11_parser.rl"
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
64
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
65
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
66 /** Data **/
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
67
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
68 //#line 70 "http11_parser.d"
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
69 static byte[] _http_parser_actions = [
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
70 0, 1, 0, 1, 2, 1, 3, 1,
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
71 4, 1, 5, 1, 6, 1, 7, 1,
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
72 8, 1, 9, 1, 11, 1, 12, 1,
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
73 13, 2, 1, 2, 2, 10, 7, 2,
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
74 12, 7, 3, 9, 10, 7
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
75 ];
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
76
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
77 static short[] _http_parser_key_offsets = [
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
78 0, 0, 8, 17, 27, 29, 30, 31,
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
79 32, 33, 34, 36, 39, 41, 44, 45,
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
80 61, 62, 78, 80, 81, 90, 99, 105,
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
81 111, 121, 130, 136, 142, 153, 159, 165,
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
82 175, 181, 187, 196, 205, 211, 217, 226,
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
83 235, 244, 253, 262, 271, 280, 289, 298,
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
84 307, 316, 325, 334, 343, 352, 361, 370,
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
85 379, 380
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
86 ];
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
87
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
88 static char[] _http_parser_trans_keys = [
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
89 36u, 95u, 45u, 46u, 48u, 57u, 65u, 90u,
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
90 32u, 36u, 95u, 45u, 46u, 48u, 57u, 65u,
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
91 90u, 42u, 43u, 47u, 58u, 45u, 57u, 65u,
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
92 90u, 97u, 122u, 32u, 35u, 72u, 84u, 84u,
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
93 80u, 47u, 48u, 57u, 46u, 48u, 57u, 48u,
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
94 57u, 13u, 48u, 57u, 10u, 13u, 33u, 124u,
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
95 126u, 35u, 39u, 42u, 43u, 45u, 46u, 48u,
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
96 57u, 65u, 90u, 94u, 122u, 10u, 33u, 58u,
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
97 124u, 126u, 35u, 39u, 42u, 43u, 45u, 46u,
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
98 48u, 57u, 65u, 90u, 94u, 122u, 13u, 32u,
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
99 13u, 32u, 37u, 60u, 62u, 127u, 0u, 31u,
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
100 34u, 35u, 32u, 37u, 60u, 62u, 127u, 0u,
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
101 31u, 34u, 35u, 48u, 57u, 65u, 70u, 97u,
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
102 102u, 48u, 57u, 65u, 70u, 97u, 102u, 43u,
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
103 58u, 45u, 46u, 48u, 57u, 65u, 90u, 97u,
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
104 122u, 32u, 34u, 35u, 37u, 60u, 62u, 127u,
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
105 0u, 31u, 48u, 57u, 65u, 70u, 97u, 102u,
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
106 48u, 57u, 65u, 70u, 97u, 102u, 32u, 34u,
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
107 35u, 37u, 59u, 60u, 62u, 63u, 127u, 0u,
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
108 31u, 48u, 57u, 65u, 70u, 97u, 102u, 48u,
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
109 57u, 65u, 70u, 97u, 102u, 32u, 34u, 35u,
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
110 37u, 60u, 62u, 63u, 127u, 0u, 31u, 48u,
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
111 57u, 65u, 70u, 97u, 102u, 48u, 57u, 65u,
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
112 70u, 97u, 102u, 32u, 34u, 35u, 37u, 60u,
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
113 62u, 127u, 0u, 31u, 32u, 34u, 35u, 37u,
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
114 60u, 62u, 127u, 0u, 31u, 48u, 57u, 65u,
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
115 70u, 97u, 102u, 48u, 57u, 65u, 70u, 97u,
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
116 102u, 32u, 36u, 95u, 45u, 46u, 48u, 57u,
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
117 65u, 90u, 32u, 36u, 95u, 45u, 46u, 48u,
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
118 57u, 65u, 90u, 32u, 36u, 95u, 45u, 46u,
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
119 48u, 57u, 65u, 90u, 32u, 36u, 95u, 45u,
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
120 46u, 48u, 57u, 65u, 90u, 32u, 36u, 95u,
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
121 45u, 46u, 48u, 57u, 65u, 90u, 32u, 36u,
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
122 95u, 45u, 46u, 48u, 57u, 65u, 90u, 32u,
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
123 36u, 95u, 45u, 46u, 48u, 57u, 65u, 90u,
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
124 32u, 36u, 95u, 45u, 46u, 48u, 57u, 65u,
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
125 90u, 32u, 36u, 95u, 45u, 46u, 48u, 57u,
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
126 65u, 90u, 32u, 36u, 95u, 45u, 46u, 48u,
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
127 57u, 65u, 90u, 32u, 36u, 95u, 45u, 46u,
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
128 48u, 57u, 65u, 90u, 32u, 36u, 95u, 45u,
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
129 46u, 48u, 57u, 65u, 90u, 32u, 36u, 95u,
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
130 45u, 46u, 48u, 57u, 65u, 90u, 32u, 36u,
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
131 95u, 45u, 46u, 48u, 57u, 65u, 90u, 32u,
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
132 36u, 95u, 45u, 46u, 48u, 57u, 65u, 90u,
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
133 32u, 36u, 95u, 45u, 46u, 48u, 57u, 65u,
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
134 90u, 32u, 36u, 95u, 45u, 46u, 48u, 57u,
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
135 65u, 90u, 32u, 36u, 95u, 45u, 46u, 48u,
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
136 57u, 65u, 90u, 32u, 0
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
137 ];
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
138
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
139 static byte[] _http_parser_single_lengths = [
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
140 0, 2, 3, 4, 2, 1, 1, 1,
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
141 1, 1, 0, 1, 0, 1, 1, 4,
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
142 1, 4, 2, 1, 5, 5, 0, 0,
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
143 2, 7, 0, 0, 9, 0, 0, 8,
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
144 0, 0, 7, 7, 0, 0, 3, 3,
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
145 3, 3, 3, 3, 3, 3, 3, 3,
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
146 3, 3, 3, 3, 3, 3, 3, 3,
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
147 1, 0
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
148 ];
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
149
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
150 static byte[] _http_parser_range_lengths = [
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
151 0, 3, 3, 3, 0, 0, 0, 0,
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
152 0, 0, 1, 1, 1, 1, 0, 6,
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
153 0, 6, 0, 0, 2, 2, 3, 3,
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
154 4, 1, 3, 3, 1, 3, 3, 1,
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
155 3, 3, 1, 1, 3, 3, 3, 3,
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
156 3, 3, 3, 3, 3, 3, 3, 3,
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
157 3, 3, 3, 3, 3, 3, 3, 3,
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
158 0, 0
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
159 ];
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
160
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
161 static short[] _http_parser_index_offsets = [
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
162 0, 0, 6, 13, 21, 24, 26, 28,
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
163 30, 32, 34, 36, 39, 41, 44, 46,
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
164 57, 59, 70, 73, 75, 83, 91, 95,
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
165 99, 106, 115, 119, 123, 134, 138, 142,
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
166 152, 156, 160, 169, 178, 182, 186, 193,
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
167 200, 207, 214, 221, 228, 235, 242, 249,
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
168 256, 263, 270, 277, 284, 291, 298, 305,
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
169 312, 314
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
170 ];
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
171
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
172 static byte[] _http_parser_indicies = [
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
173 0, 0, 0, 0, 0, 1, 2, 3,
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
174 3, 3, 3, 3, 1, 4, 5, 6,
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
175 7, 5, 5, 5, 1, 8, 9, 1,
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
176 10, 1, 11, 1, 12, 1, 13, 1,
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
177 14, 1, 15, 1, 16, 15, 1, 17,
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
178 1, 18, 17, 1, 19, 1, 20, 21,
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
179 21, 21, 21, 21, 21, 21, 21, 21,
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
180 1, 22, 1, 23, 24, 23, 23, 23,
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
181 23, 23, 23, 23, 23, 1, 26, 27,
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
182 25, 26, 28, 29, 31, 1, 1, 1,
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
183 1, 1, 30, 29, 33, 1, 1, 1,
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
184 1, 1, 32, 34, 34, 34, 1, 32,
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
185 32, 32, 1, 35, 36, 35, 35, 35,
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
186 35, 1, 8, 1, 9, 37, 1, 1,
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
187 1, 1, 36, 38, 38, 38, 1, 36,
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
188 36, 36, 1, 39, 1, 41, 42, 43,
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
189 1, 1, 44, 1, 1, 40, 45, 45,
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
190 45, 1, 40, 40, 40, 1, 8, 1,
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
191 9, 47, 1, 1, 48, 1, 1, 46,
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
192 49, 49, 49, 1, 46, 46, 46, 1,
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
193 50, 1, 52, 53, 1, 1, 1, 1,
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
194 51, 54, 1, 56, 57, 1, 1, 1,
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
195 1, 55, 58, 58, 58, 1, 55, 55,
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
196 55, 1, 2, 59, 59, 59, 59, 59,
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
197 1, 2, 60, 60, 60, 60, 60, 1,
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
198 2, 61, 61, 61, 61, 61, 1, 2,
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
199 62, 62, 62, 62, 62, 1, 2, 63,
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
200 63, 63, 63, 63, 1, 2, 64, 64,
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
201 64, 64, 64, 1, 2, 65, 65, 65,
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
202 65, 65, 1, 2, 66, 66, 66, 66,
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
203 66, 1, 2, 67, 67, 67, 67, 67,
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
204 1, 2, 68, 68, 68, 68, 68, 1,
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
205 2, 69, 69, 69, 69, 69, 1, 2,
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
206 70, 70, 70, 70, 70, 1, 2, 71,
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
207 71, 71, 71, 71, 1, 2, 72, 72,
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
208 72, 72, 72, 1, 2, 73, 73, 73,
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
209 73, 73, 1, 2, 74, 74, 74, 74,
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
210 74, 1, 2, 75, 75, 75, 75, 75,
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
211 1, 2, 76, 76, 76, 76, 76, 1,
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
212 2, 1, 1, 0
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
213 ];
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
214
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
215 static byte[] _http_parser_trans_targs_wi = [
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
216 2, 0, 3, 38, 4, 24, 28, 25,
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
217 5, 20, 6, 7, 8, 9, 10, 11,
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
218 12, 13, 14, 15, 16, 17, 57, 17,
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
219 18, 19, 14, 18, 19, 5, 21, 22,
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
220 21, 22, 23, 24, 25, 26, 27, 5,
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
221 28, 20, 29, 31, 34, 30, 31, 32,
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
222 34, 33, 5, 35, 20, 36, 5, 35,
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
223 20, 36, 37, 39, 40, 41, 42, 43,
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
224 44, 45, 46, 47, 48, 49, 50, 51,
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
225 52, 53, 54, 55, 56
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
226 ];
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
227
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
228 static byte[] _http_parser_trans_actions_wi = [
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
229 1, 0, 11, 0, 1, 1, 1, 1,
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
230 13, 13, 1, 0, 0, 0, 0, 0,
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
231 0, 0, 19, 0, 0, 25, 23, 3,
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
232 5, 7, 9, 7, 0, 15, 1, 1,
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
233 0, 0, 0, 0, 0, 0, 0, 31,
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
234 0, 31, 0, 21, 21, 0, 0, 0,
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
235 0, 0, 34, 17, 34, 17, 28, 0,
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
236 28, 0, 0, 0, 0, 0, 0, 0,
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
237 0, 0, 0, 0, 0, 0, 0, 0,
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
238 0, 0, 0, 0, 0
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
239 ];
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
240
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
241 static int http_parser_start = 1;
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
242 static int http_parser_first_final = 57;
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
243 static int http_parser_error = 0;
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
244
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
245 static int http_parser_en_main = 1;
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
246
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
247 //#line 130 "http11_parser.rl"
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
248
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
249 this ()
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
250 {
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
251 cs = 0;
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
252
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
253 //#line 255 "http11_parser.d"
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
254 {
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
255 cs = http_parser_start;
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
256 }
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
257 //#line 135 "http11_parser.rl"
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
258
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
259 body_start = 0;
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
260 content_len = 0;
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
261 mark = 0;
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
262 nread = 0;
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
263 field_len = 0;
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
264 field_start = 0;
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
265 }
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
266
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
267
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
268 /** exec **/
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
269 public size_t execute(char[] buffer, size_t off = 0) {
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
270 char* p, pe;
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
271 int len = buffer.length;
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
272
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
273 assert(off <= len && "offset past end of buffer");
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
274
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
275 p = buffer.ptr+off;
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
276 pe = buffer.ptr+len;
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
277
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
278 /* assert(*pe == '\0' && "pointer does not end on NUL"); */
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
279 assert(pe - p == len - off && "pointers aren't same distance");
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
280
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
281
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
282 //#line 284 "http11_parser.d"
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
283 {
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
284 int _klen;
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
285 uint _trans;
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
286 byte* _acts;
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
287 uint _nacts;
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
288 char* _keys;
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
289
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
290 if ( p == pe )
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
291 goto _out;
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
292 if ( cs == 0 )
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
293 goto _out;
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
294 _resume:
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
295 _keys = &_http_parser_trans_keys[_http_parser_key_offsets[cs]];
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
296 _trans = _http_parser_index_offsets[cs];
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
297
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
298 _klen = _http_parser_single_lengths[cs];
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
299 if ( _klen > 0 ) {
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
300 char* _lower = _keys;
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
301 char* _mid;
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
302 char* _upper = _keys + _klen - 1;
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
303 while (1) {
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
304 if ( _upper < _lower )
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
305 break;
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
306
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
307 _mid = _lower + ((_upper-_lower) >> 1);
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
308 if ( (*p) < *_mid )
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
309 _upper = _mid - 1;
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
310 else if ( (*p) > *_mid )
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
311 _lower = _mid + 1;
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
312 else {
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
313 _trans += (_mid - _keys);
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
314 goto _match;
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
315 }
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
316 }
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
317 _keys += _klen;
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
318 _trans += _klen;
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
319 }
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
320
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
321 _klen = _http_parser_range_lengths[cs];
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
322 if ( _klen > 0 ) {
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
323 char* _lower = _keys;
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
324 char* _mid;
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
325 char* _upper = _keys + (_klen<<1) - 2;
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
326 while (1) {
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
327 if ( _upper < _lower )
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
328 break;
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
329
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
330 _mid = _lower + (((_upper-_lower) >> 1) & ~1);
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
331 if ( (*p) < _mid[0] )
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
332 _upper = _mid - 2;
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
333 else if ( (*p) > _mid[1] )
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
334 _lower = _mid + 2;
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
335 else {
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
336 _trans += ((_mid - _keys)>>1);
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
337 goto _match;
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
338 }
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
339 }
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
340 _trans += _klen;
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
341 }
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
342
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
343 _match:
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
344 _trans = _http_parser_indicies[_trans];
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
345 cs = _http_parser_trans_targs_wi[_trans];
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
346
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
347 if ( _http_parser_trans_actions_wi[_trans] == 0 )
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
348 goto _again;
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
349
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
350 _acts = &_http_parser_actions[_http_parser_trans_actions_wi[_trans]];
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
351 _nacts = cast(uint) *_acts++;
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
352 while ( _nacts-- > 0 )
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
353 {
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
354 switch ( *_acts++ )
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
355 {
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
356 case 0:
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
357 //#line 67 "http11_parser.rl"
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
358 {buffer.MARK(&mark, p); }
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
359 break;
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
360 case 1:
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
361 //#line 70 "http11_parser.rl"
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
362 { buffer.MARK(&field_start, p); }
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
363 break;
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
364 case 2:
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
365 //#line 71 "http11_parser.rl"
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
366 { snake_upcase_char(cast(char *)p); }
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
367 break;
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
368 case 3:
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
369 //#line 72 "http11_parser.rl"
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
370 {
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
371 field_len = buffer.LEN(field_start, p);
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
372 }
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
373 break;
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
374 case 4:
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
375 //#line 76 "http11_parser.rl"
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
376 { buffer.MARK(&mark, p); }
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
377 break;
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
378 case 5:
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
379 //#line 77 "http11_parser.rl"
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
380 {
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
381 if(http_field)
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
382 http_field(data,
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
383 buffer[field_start .. field_start+field_len],
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
384 buffer[mark .. $]);
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
385 }
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
386 break;
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
387 case 6:
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
388 //#line 85 "http11_parser.rl"
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
389 {
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
390 if(request_method)
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
391 request_method(data, buffer[mark .. $]);
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
392 }
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
393 break;
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
394 case 7:
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
395 //#line 90 "http11_parser.rl"
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
396 {
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
397 if(request_uri)
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
398 request_uri(data, buffer[mark .. $]);
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
399 }
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
400 break;
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
401 case 8:
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
402 //#line 95 "http11_parser.rl"
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
403 {
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
404 if(fragment)
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
405 fragment(data, buffer[mark .. $]);
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
406 }
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
407 break;
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
408 case 9:
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
409 //#line 100 "http11_parser.rl"
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
410 {buffer.MARK(&query_start, p); }
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
411 break;
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
412 case 10:
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
413 //#line 102 "http11_parser.rl"
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
414 {
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
415 if(query_string)
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
416 query_string(data, buffer[query_start .. $]);
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
417 }
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
418 break;
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
419 case 11:
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
420 //#line 107 "http11_parser.rl"
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
421 {
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
422 if(http_version)
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
423 http_version(data, buffer[mark .. $]);
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
424 }
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
425 break;
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
426 case 12:
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
427 //#line 112 "http11_parser.rl"
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
428 {
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
429 if(request_path)
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
430 request_path(data, buffer[mark .. $]);
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
431 }
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
432 break;
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
433 case 13:
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
434 //#line 117 "http11_parser.rl"
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
435 {
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
436 body_start = p - buffer.ptr + 1;
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
437 if(header_done)
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
438 header_done(data, p[1 .. (pe - p - 1)]);
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
439 if (true) goto _out;
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
440 }
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
441 break;
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
442 //#line 446 "http11_parser.d"
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
443 default: break;
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
444 }
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
445 }
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
446
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
447 _again:
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
448 if ( cs == 0 )
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
449 goto _out;
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
450 if ( ++p != pe )
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
451 goto _resume;
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
452 _out: {}
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
453 }
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
454 //#line 159 "http11_parser.rl"
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
455
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
456 //parser->cs = cs;
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
457 nread += p - (buffer.ptr + off);
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
458
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
459 assert(p <= pe && "buffer overflow after parsing execute");
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
460 assert(nread <= len && "nread longer than length");
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
461 assert(body_start <= len && "body starts after buffer end");
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
462 assert(mark < len && "mark is after buffer end");
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
463 assert(field_len <= len && "field has length longer than whole buffer");
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
464 assert(field_start < len && "field starts after buffer end");
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
465
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
466 return(nread);
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
467 }
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
468
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
469 public int finish()
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
470 {
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
471 if (has_error() ) {
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
472 return -1;
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
473 } else if (is_finished() ) {
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
474 return 1;
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
475 } else {
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
476 return 0;
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
477 }
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
478 }
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
479
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
480 public bool has_error() {
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
481 return cs == http_parser_error;
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
482 }
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
483
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
484 public bool is_finished() {
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
485 return cs >= http_parser_first_final;
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
486 }
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
487
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
488 public void setData(Object d)
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
489 {
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
490 data = d;
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
491 }
5836613d16ac reorg! reorg!
rick@minifunk
parents:
diff changeset
492 }