engineyard-mongrel 1.1.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (72) hide show
  1. data/CHANGELOG +16 -0
  2. data/CONTRIBUTORS +17 -0
  3. data/COPYING +55 -0
  4. data/LICENSE +55 -0
  5. data/Manifest +71 -0
  6. data/README +74 -0
  7. data/bin/mongrel_rails +285 -0
  8. data/examples/builder.rb +29 -0
  9. data/examples/camping/README +3 -0
  10. data/examples/camping/blog.rb +294 -0
  11. data/examples/camping/tepee.rb +149 -0
  12. data/examples/httpd.conf +474 -0
  13. data/examples/mime.yaml +3 -0
  14. data/examples/mongrel.conf +9 -0
  15. data/examples/mongrel_simple_ctrl.rb +92 -0
  16. data/examples/mongrel_simple_service.rb +116 -0
  17. data/examples/monitrc +57 -0
  18. data/examples/random_thrash.rb +19 -0
  19. data/examples/simpletest.rb +52 -0
  20. data/examples/webrick_compare.rb +20 -0
  21. data/ext/http11/ext_help.h +15 -0
  22. data/ext/http11/extconf.rb +6 -0
  23. data/ext/http11/http11.c +527 -0
  24. data/ext/http11/http11_parser.c +1243 -0
  25. data/ext/http11/http11_parser.h +49 -0
  26. data/ext/http11/http11_parser.java.rl +171 -0
  27. data/ext/http11/http11_parser.rl +152 -0
  28. data/ext/http11/http11_parser_common.rl +54 -0
  29. data/ext/http11_java/Http11Service.java +13 -0
  30. data/ext/http11_java/org/jruby/mongrel/Http11.java +266 -0
  31. data/ext/http11_java/org/jruby/mongrel/Http11Parser.java +474 -0
  32. data/lib/mongrel.rb +360 -0
  33. data/lib/mongrel/camping.rb +107 -0
  34. data/lib/mongrel/cgi.rb +181 -0
  35. data/lib/mongrel/command.rb +222 -0
  36. data/lib/mongrel/configurator.rb +389 -0
  37. data/lib/mongrel/const.rb +110 -0
  38. data/lib/mongrel/debug.rb +203 -0
  39. data/lib/mongrel/gems.rb +22 -0
  40. data/lib/mongrel/handlers.rb +468 -0
  41. data/lib/mongrel/header_out.rb +28 -0
  42. data/lib/mongrel/http_request.rb +155 -0
  43. data/lib/mongrel/http_response.rb +166 -0
  44. data/lib/mongrel/init.rb +10 -0
  45. data/lib/mongrel/mime_types.yml +616 -0
  46. data/lib/mongrel/rails.rb +214 -0
  47. data/lib/mongrel/stats.rb +89 -0
  48. data/lib/mongrel/tcphack.rb +18 -0
  49. data/lib/mongrel/uri_classifier.rb +76 -0
  50. data/mongrel-public_cert.pem +20 -0
  51. data/setup.rb +1585 -0
  52. data/test/benchmark/previous.rb +11 -0
  53. data/test/benchmark/simple.rb +11 -0
  54. data/test/benchmark/utils.rb +82 -0
  55. data/test/mime.yaml +3 -0
  56. data/test/mongrel.conf +1 -0
  57. data/test/test_helper.rb +79 -0
  58. data/test/tools/trickletest.rb +45 -0
  59. data/test/unit/test_cgi_wrapper.rb +26 -0
  60. data/test/unit/test_command.rb +86 -0
  61. data/test/unit/test_conditional.rb +107 -0
  62. data/test/unit/test_configurator.rb +88 -0
  63. data/test/unit/test_debug.rb +25 -0
  64. data/test/unit/test_handlers.rb +136 -0
  65. data/test/unit/test_http_parser.rb +156 -0
  66. data/test/unit/test_redirect_handler.rb +45 -0
  67. data/test/unit/test_request_progress.rb +100 -0
  68. data/test/unit/test_response.rb +127 -0
  69. data/test/unit/test_stats.rb +35 -0
  70. data/test/unit/test_uriclassifier.rb +261 -0
  71. data/test/unit/test_ws.rb +116 -0
  72. metadata +158 -0
@@ -0,0 +1,474 @@
1
+ // line 1 "http11_parser.rl"
2
+ /**
3
+ * Copyright (c) 2005 Zed A. Shaw
4
+ * You can redistribute it and/or modify it under the same terms as Ruby.
5
+ */
6
+ #include "http11_parser.h"
7
+ #include <stdio.h>
8
+ #include <assert.h>
9
+ #include <stdlib.h>
10
+ #include <ctype.h>
11
+ #include <string.h>
12
+
13
+ /*
14
+ * capitalizes all lower-case ASCII characters,
15
+ * converts dashes to underscores.
16
+ */
17
+ static void snake_upcase_char(char *c)
18
+ {
19
+ if (*c >= 'a' && *c <= 'z')
20
+ *c &= ~0x20;
21
+ else if (*c == '-')
22
+ *c = '_';
23
+ }
24
+
25
+ #define LEN(AT, FPC) (FPC - buffer - parser->AT)
26
+ #define MARK(M,FPC) (parser->M = (FPC) - buffer)
27
+ #define PTR_TO(F) (buffer + parser->F)
28
+
29
+ /** Machine **/
30
+
31
+ // line 87 "http11_parser.rl"
32
+
33
+
34
+ /** Data **/
35
+
36
+ // line 37 "../../ext/http11_java/org/jruby/mongrel/Http11Parser.java"
37
+ private static byte[] init__http_parser_actions_0()
38
+ {
39
+ return new byte [] {
40
+ 0, 1, 0, 1, 2, 1, 3, 1, 4, 1, 5, 1,
41
+ 6, 1, 7, 1, 8, 1, 9, 1, 11, 1, 12, 1,
42
+ 13, 2, 0, 8, 2, 1, 2, 2, 4, 5, 2, 10,
43
+ 7, 2, 12, 7, 3, 9, 10, 7
44
+ };
45
+ }
46
+
47
+ private static final byte _http_parser_actions[] = init__http_parser_actions_0();
48
+
49
+
50
+ private static short[] init__http_parser_key_offsets_0()
51
+ {
52
+ return new short [] {
53
+ 0, 0, 8, 17, 27, 29, 30, 31, 32, 33, 34, 36,
54
+ 39, 41, 44, 45, 61, 62, 78, 80, 81, 90, 99, 105,
55
+ 111, 121, 130, 136, 142, 153, 159, 165, 175, 181, 187, 196,
56
+ 205, 211, 217, 226, 235, 244, 253, 262, 271, 280, 289, 298,
57
+ 307, 316, 325, 334, 343, 352, 361, 370, 379, 380
58
+ };
59
+ }
60
+
61
+ private static final short _http_parser_key_offsets[] = init__http_parser_key_offsets_0();
62
+
63
+
64
+ private static char[] init__http_parser_trans_keys_0()
65
+ {
66
+ return new char [] {
67
+ 36, 95, 45, 46, 48, 57, 65, 90, 32, 36, 95, 45,
68
+ 46, 48, 57, 65, 90, 42, 43, 47, 58, 45, 57, 65,
69
+ 90, 97, 122, 32, 35, 72, 84, 84, 80, 47, 48, 57,
70
+ 46, 48, 57, 48, 57, 13, 48, 57, 10, 13, 33, 124,
71
+ 126, 35, 39, 42, 43, 45, 46, 48, 57, 65, 90, 94,
72
+ 122, 10, 33, 58, 124, 126, 35, 39, 42, 43, 45, 46,
73
+ 48, 57, 65, 90, 94, 122, 13, 32, 13, 32, 37, 60,
74
+ 62, 127, 0, 31, 34, 35, 32, 37, 60, 62, 127, 0,
75
+ 31, 34, 35, 48, 57, 65, 70, 97, 102, 48, 57, 65,
76
+ 70, 97, 102, 43, 58, 45, 46, 48, 57, 65, 90, 97,
77
+ 122, 32, 34, 35, 37, 60, 62, 127, 0, 31, 48, 57,
78
+ 65, 70, 97, 102, 48, 57, 65, 70, 97, 102, 32, 34,
79
+ 35, 37, 59, 60, 62, 63, 127, 0, 31, 48, 57, 65,
80
+ 70, 97, 102, 48, 57, 65, 70, 97, 102, 32, 34, 35,
81
+ 37, 60, 62, 63, 127, 0, 31, 48, 57, 65, 70, 97,
82
+ 102, 48, 57, 65, 70, 97, 102, 32, 34, 35, 37, 60,
83
+ 62, 127, 0, 31, 32, 34, 35, 37, 60, 62, 127, 0,
84
+ 31, 48, 57, 65, 70, 97, 102, 48, 57, 65, 70, 97,
85
+ 102, 32, 36, 95, 45, 46, 48, 57, 65, 90, 32, 36,
86
+ 95, 45, 46, 48, 57, 65, 90, 32, 36, 95, 45, 46,
87
+ 48, 57, 65, 90, 32, 36, 95, 45, 46, 48, 57, 65,
88
+ 90, 32, 36, 95, 45, 46, 48, 57, 65, 90, 32, 36,
89
+ 95, 45, 46, 48, 57, 65, 90, 32, 36, 95, 45, 46,
90
+ 48, 57, 65, 90, 32, 36, 95, 45, 46, 48, 57, 65,
91
+ 90, 32, 36, 95, 45, 46, 48, 57, 65, 90, 32, 36,
92
+ 95, 45, 46, 48, 57, 65, 90, 32, 36, 95, 45, 46,
93
+ 48, 57, 65, 90, 32, 36, 95, 45, 46, 48, 57, 65,
94
+ 90, 32, 36, 95, 45, 46, 48, 57, 65, 90, 32, 36,
95
+ 95, 45, 46, 48, 57, 65, 90, 32, 36, 95, 45, 46,
96
+ 48, 57, 65, 90, 32, 36, 95, 45, 46, 48, 57, 65,
97
+ 90, 32, 36, 95, 45, 46, 48, 57, 65, 90, 32, 36,
98
+ 95, 45, 46, 48, 57, 65, 90, 32, 0
99
+ };
100
+ }
101
+
102
+ private static final char _http_parser_trans_keys[] = init__http_parser_trans_keys_0();
103
+
104
+
105
+ private static byte[] init__http_parser_single_lengths_0()
106
+ {
107
+ return new byte [] {
108
+ 0, 2, 3, 4, 2, 1, 1, 1, 1, 1, 0, 1,
109
+ 0, 1, 1, 4, 1, 4, 2, 1, 5, 5, 0, 0,
110
+ 2, 7, 0, 0, 9, 0, 0, 8, 0, 0, 7, 7,
111
+ 0, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
112
+ 3, 3, 3, 3, 3, 3, 3, 3, 1, 0
113
+ };
114
+ }
115
+
116
+ private static final byte _http_parser_single_lengths[] = init__http_parser_single_lengths_0();
117
+
118
+
119
+ private static byte[] init__http_parser_range_lengths_0()
120
+ {
121
+ return new byte [] {
122
+ 0, 3, 3, 3, 0, 0, 0, 0, 0, 0, 1, 1,
123
+ 1, 1, 0, 6, 0, 6, 0, 0, 2, 2, 3, 3,
124
+ 4, 1, 3, 3, 1, 3, 3, 1, 3, 3, 1, 1,
125
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
126
+ 3, 3, 3, 3, 3, 3, 3, 3, 0, 0
127
+ };
128
+ }
129
+
130
+ private static final byte _http_parser_range_lengths[] = init__http_parser_range_lengths_0();
131
+
132
+
133
+ private static short[] init__http_parser_index_offsets_0()
134
+ {
135
+ return new short [] {
136
+ 0, 0, 6, 13, 21, 24, 26, 28, 30, 32, 34, 36,
137
+ 39, 41, 44, 46, 57, 59, 70, 73, 75, 83, 91, 95,
138
+ 99, 106, 115, 119, 123, 134, 138, 142, 152, 156, 160, 169,
139
+ 178, 182, 186, 193, 200, 207, 214, 221, 228, 235, 242, 249,
140
+ 256, 263, 270, 277, 284, 291, 298, 305, 312, 314
141
+ };
142
+ }
143
+
144
+ private static final short _http_parser_index_offsets[] = init__http_parser_index_offsets_0();
145
+
146
+
147
+ private static byte[] init__http_parser_indicies_0()
148
+ {
149
+ return new byte [] {
150
+ 0, 0, 0, 0, 0, 1, 2, 3, 3, 3, 3, 3,
151
+ 1, 4, 5, 6, 7, 5, 5, 5, 1, 8, 9, 1,
152
+ 10, 1, 11, 1, 12, 1, 13, 1, 14, 1, 15, 1,
153
+ 16, 15, 1, 17, 1, 18, 17, 1, 19, 1, 20, 21,
154
+ 21, 21, 21, 21, 21, 21, 21, 21, 1, 22, 1, 23,
155
+ 24, 23, 23, 23, 23, 23, 23, 23, 23, 1, 26, 27,
156
+ 25, 29, 28, 30, 32, 1, 1, 1, 1, 1, 31, 33,
157
+ 35, 1, 1, 1, 1, 1, 34, 36, 36, 36, 1, 34,
158
+ 34, 34, 1, 37, 38, 37, 37, 37, 37, 1, 8, 1,
159
+ 9, 39, 1, 1, 1, 1, 38, 40, 40, 40, 1, 38,
160
+ 38, 38, 1, 41, 1, 43, 44, 45, 1, 1, 46, 1,
161
+ 1, 42, 47, 47, 47, 1, 42, 42, 42, 1, 8, 1,
162
+ 9, 49, 1, 1, 50, 1, 1, 48, 51, 51, 51, 1,
163
+ 48, 48, 48, 1, 52, 1, 54, 55, 1, 1, 1, 1,
164
+ 53, 56, 1, 58, 59, 1, 1, 1, 1, 57, 60, 60,
165
+ 60, 1, 57, 57, 57, 1, 2, 61, 61, 61, 61, 61,
166
+ 1, 2, 62, 62, 62, 62, 62, 1, 2, 63, 63, 63,
167
+ 63, 63, 1, 2, 64, 64, 64, 64, 64, 1, 2, 65,
168
+ 65, 65, 65, 65, 1, 2, 66, 66, 66, 66, 66, 1,
169
+ 2, 67, 67, 67, 67, 67, 1, 2, 68, 68, 68, 68,
170
+ 68, 1, 2, 69, 69, 69, 69, 69, 1, 2, 70, 70,
171
+ 70, 70, 70, 1, 2, 71, 71, 71, 71, 71, 1, 2,
172
+ 72, 72, 72, 72, 72, 1, 2, 73, 73, 73, 73, 73,
173
+ 1, 2, 74, 74, 74, 74, 74, 1, 2, 75, 75, 75,
174
+ 75, 75, 1, 2, 76, 76, 76, 76, 76, 1, 2, 77,
175
+ 77, 77, 77, 77, 1, 2, 78, 78, 78, 78, 78, 1,
176
+ 2, 1, 1, 0
177
+ };
178
+ }
179
+
180
+ private static final byte _http_parser_indicies[] = init__http_parser_indicies_0();
181
+
182
+
183
+ private static byte[] init__http_parser_trans_targs_wi_0()
184
+ {
185
+ return new byte [] {
186
+ 2, 0, 3, 38, 4, 24, 28, 25, 5, 20, 6, 7,
187
+ 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 57, 17,
188
+ 18, 19, 14, 18, 19, 14, 5, 21, 22, 5, 21, 22,
189
+ 23, 24, 25, 26, 27, 5, 28, 20, 29, 31, 34, 30,
190
+ 31, 32, 34, 33, 5, 35, 20, 36, 5, 35, 20, 36,
191
+ 37, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49,
192
+ 50, 51, 52, 53, 54, 55, 56
193
+ };
194
+ }
195
+
196
+ private static final byte _http_parser_trans_targs_wi[] = init__http_parser_trans_targs_wi_0();
197
+
198
+
199
+ private static byte[] init__http_parser_trans_actions_wi_0()
200
+ {
201
+ return new byte [] {
202
+ 1, 0, 11, 0, 1, 1, 1, 1, 13, 13, 1, 0,
203
+ 0, 0, 0, 0, 0, 0, 19, 0, 0, 28, 23, 3,
204
+ 5, 7, 31, 7, 0, 9, 25, 1, 1, 15, 0, 0,
205
+ 0, 0, 0, 0, 0, 37, 0, 37, 0, 21, 21, 0,
206
+ 0, 0, 0, 0, 40, 17, 40, 17, 34, 0, 34, 0,
207
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
208
+ 0, 0, 0, 0, 0, 0, 0
209
+ };
210
+ }
211
+
212
+ private static final byte _http_parser_trans_actions_wi[] = init__http_parser_trans_actions_wi_0();
213
+
214
+
215
+ static final int http_parser_start = 1;
216
+ static final int http_parser_first_final = 57;
217
+ static final int http_parser_error = 0;
218
+
219
+ static final int http_parser_en_main = 1;
220
+
221
+ // line 91 "http11_parser.rl"
222
+
223
+ int http_parser_init(http_parser *parser) {
224
+ int cs = 0;
225
+
226
+ // line 227 "../../ext/http11_java/org/jruby/mongrel/Http11Parser.java"
227
+ {
228
+ cs = http_parser_start;
229
+ }
230
+ // line 95 "http11_parser.rl"
231
+ parser->cs = cs;
232
+ parser->body_start = 0;
233
+ parser->content_len = 0;
234
+ parser->mark = 0;
235
+ parser->nread = 0;
236
+ parser->field_len = 0;
237
+ parser->field_start = 0;
238
+
239
+ return(1);
240
+ }
241
+
242
+
243
+ /** exec **/
244
+ size_t http_parser_execute(http_parser *parser, const char *buffer, size_t len, size_t off) {
245
+ const char *p, *pe;
246
+ int cs = parser->cs;
247
+
248
+ assert(off <= len && "offset past end of buffer");
249
+
250
+ p = buffer+off;
251
+ pe = buffer+len;
252
+
253
+ /* assert(*pe == '\0' && "pointer does not end on NUL"); */
254
+ assert(pe - p == len - off && "pointers aren't same distance");
255
+
256
+
257
+
258
+ // line 259 "../../ext/http11_java/org/jruby/mongrel/Http11Parser.java"
259
+ {
260
+ int _klen;
261
+ int _trans = 0;
262
+ int _acts;
263
+ int _nacts;
264
+ int _keys;
265
+ int _goto_targ = 0;
266
+
267
+ _goto: while (true) {
268
+ switch ( _goto_targ ) {
269
+ case 0:
270
+ if ( p == pe ) {
271
+ _goto_targ = 4;
272
+ continue _goto;
273
+ }
274
+ if ( cs == 0 ) {
275
+ _goto_targ = 5;
276
+ continue _goto;
277
+ }
278
+ case 1:
279
+ _match: do {
280
+ _keys = _http_parser_key_offsets[cs];
281
+ _trans = _http_parser_index_offsets[cs];
282
+ _klen = _http_parser_single_lengths[cs];
283
+ if ( _klen > 0 ) {
284
+ int _lower = _keys;
285
+ int _mid;
286
+ int _upper = _keys + _klen - 1;
287
+ while (true) {
288
+ if ( _upper < _lower )
289
+ break;
290
+
291
+ _mid = _lower + ((_upper-_lower) >> 1);
292
+ if ( data[p] < _http_parser_trans_keys[_mid] )
293
+ _upper = _mid - 1;
294
+ else if ( data[p] > _http_parser_trans_keys[_mid] )
295
+ _lower = _mid + 1;
296
+ else {
297
+ _trans += (_mid - _keys);
298
+ break _match;
299
+ }
300
+ }
301
+ _keys += _klen;
302
+ _trans += _klen;
303
+ }
304
+
305
+ _klen = _http_parser_range_lengths[cs];
306
+ if ( _klen > 0 ) {
307
+ int _lower = _keys;
308
+ int _mid;
309
+ int _upper = _keys + (_klen<<1) - 2;
310
+ while (true) {
311
+ if ( _upper < _lower )
312
+ break;
313
+
314
+ _mid = _lower + (((_upper-_lower) >> 1) & ~1);
315
+ if ( data[p] < _http_parser_trans_keys[_mid] )
316
+ _upper = _mid - 2;
317
+ else if ( data[p] > _http_parser_trans_keys[_mid+1] )
318
+ _lower = _mid + 2;
319
+ else {
320
+ _trans += ((_mid - _keys)>>1);
321
+ break _match;
322
+ }
323
+ }
324
+ _trans += _klen;
325
+ }
326
+ } while (false);
327
+
328
+ _trans = _http_parser_indicies[_trans];
329
+ cs = _http_parser_trans_targs_wi[_trans];
330
+
331
+ if ( _http_parser_trans_actions_wi[_trans] != 0 ) {
332
+ _acts = _http_parser_trans_actions_wi[_trans];
333
+ _nacts = (int) _http_parser_actions[_acts++];
334
+ while ( _nacts-- > 0 )
335
+ {
336
+ switch ( _http_parser_actions[_acts++] )
337
+ {
338
+ case 0:
339
+ // line 34 "http11_parser.rl"
340
+ {MARK(mark, p); }
341
+ break;
342
+ case 1:
343
+ // line 37 "http11_parser.rl"
344
+ { MARK(field_start, p); }
345
+ break;
346
+ case 2:
347
+ // line 38 "http11_parser.rl"
348
+ { snake_upcase_char((char *)p); }
349
+ break;
350
+ case 3:
351
+ // line 39 "http11_parser.rl"
352
+ {
353
+ parser->field_len = LEN(field_start, p);
354
+ }
355
+ break;
356
+ case 4:
357
+ // line 43 "http11_parser.rl"
358
+ { MARK(mark, p); }
359
+ break;
360
+ case 5:
361
+ // line 44 "http11_parser.rl"
362
+ {
363
+ if(parser->http_field != NULL) {
364
+ parser->http_field(parser->data, PTR_TO(field_start), parser->field_len, PTR_TO(mark), LEN(mark, p));
365
+ }
366
+ }
367
+ break;
368
+ case 6:
369
+ // line 49 "http11_parser.rl"
370
+ {
371
+ if(parser->request_method != NULL)
372
+ parser->request_method(parser->data, PTR_TO(mark), LEN(mark, p));
373
+ }
374
+ break;
375
+ case 7:
376
+ // line 53 "http11_parser.rl"
377
+ {
378
+ if(parser->request_uri != NULL)
379
+ parser->request_uri(parser->data, PTR_TO(mark), LEN(mark, p));
380
+ }
381
+ break;
382
+ case 8:
383
+ // line 57 "http11_parser.rl"
384
+ {
385
+ if(parser->fragment != NULL)
386
+ parser->fragment(parser->data, PTR_TO(mark), LEN(mark, p));
387
+ }
388
+ break;
389
+ case 9:
390
+ // line 62 "http11_parser.rl"
391
+ {MARK(query_start, p); }
392
+ break;
393
+ case 10:
394
+ // line 63 "http11_parser.rl"
395
+ {
396
+ if(parser->query_string != NULL)
397
+ parser->query_string(parser->data, PTR_TO(query_start), LEN(query_start, p));
398
+ }
399
+ break;
400
+ case 11:
401
+ // line 68 "http11_parser.rl"
402
+ {
403
+ if(parser->http_version != NULL)
404
+ parser->http_version(parser->data, PTR_TO(mark), LEN(mark, p));
405
+ }
406
+ break;
407
+ case 12:
408
+ // line 73 "http11_parser.rl"
409
+ {
410
+ if(parser->request_path != NULL)
411
+ parser->request_path(parser->data, PTR_TO(mark), LEN(mark,p));
412
+ }
413
+ break;
414
+ case 13:
415
+ // line 78 "http11_parser.rl"
416
+ {
417
+ parser->body_start = p - buffer + 1;
418
+ if(parser->header_done != NULL)
419
+ parser->header_done(parser->data, p + 1, pe - p - 1);
420
+ { p += 1; _goto_targ = 5; if (true) continue _goto;}
421
+ }
422
+ break;
423
+ // line 424 "../../ext/http11_java/org/jruby/mongrel/Http11Parser.java"
424
+ }
425
+ }
426
+ }
427
+
428
+ case 2:
429
+ if ( cs == 0 ) {
430
+ _goto_targ = 5;
431
+ continue _goto;
432
+ }
433
+ if ( ++p != pe ) {
434
+ _goto_targ = 1;
435
+ continue _goto;
436
+ }
437
+ case 4:
438
+ case 5:
439
+ }
440
+ break; }
441
+ }
442
+ // line 122 "http11_parser.rl"
443
+
444
+ parser->cs = cs;
445
+ parser->nread += p - (buffer + off);
446
+
447
+ assert(p <= pe && "buffer overflow after parsing execute");
448
+ assert(parser->nread <= len && "nread longer than length");
449
+ assert(parser->body_start <= len && "body starts after buffer end");
450
+ assert(parser->mark < len && "mark is after buffer end");
451
+ assert(parser->field_len <= len && "field has length longer than whole buffer");
452
+ assert(parser->field_start < len && "field starts after buffer end");
453
+
454
+ return(parser->nread);
455
+ }
456
+
457
+ int http_parser_finish(http_parser *parser)
458
+ {
459
+ if (http_parser_has_error(parser) ) {
460
+ return -1;
461
+ } else if (http_parser_is_finished(parser) ) {
462
+ return 1;
463
+ } else {
464
+ return 0;
465
+ }
466
+ }
467
+
468
+ int http_parser_has_error(http_parser *parser) {
469
+ return parser->cs == http_parser_error;
470
+ }
471
+
472
+ int http_parser_is_finished(http_parser *parser) {
473
+ return parser->cs >= http_parser_first_final;
474
+ }