rfuzz 0.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (136) hide show
  1. data/COPYING +55 -0
  2. data/LICENSE +55 -0
  3. data/README +252 -0
  4. data/Rakefile +48 -0
  5. data/doc/rdoc/classes/RFuzz.html +146 -0
  6. data/doc/rdoc/classes/RFuzz/HttpClient.html +481 -0
  7. data/doc/rdoc/classes/RFuzz/HttpClient.src/M000010.html +24 -0
  8. data/doc/rdoc/classes/RFuzz/HttpClient.src/M000011.html +34 -0
  9. data/doc/rdoc/classes/RFuzz/HttpClient.src/M000012.html +49 -0
  10. data/doc/rdoc/classes/RFuzz/HttpClient.src/M000013.html +49 -0
  11. data/doc/rdoc/classes/RFuzz/HttpClient.src/M000014.html +57 -0
  12. data/doc/rdoc/classes/RFuzz/HttpClient.src/M000015.html +37 -0
  13. data/doc/rdoc/classes/RFuzz/HttpClient.src/M000016.html +26 -0
  14. data/doc/rdoc/classes/RFuzz/HttpClient.src/M000017.html +34 -0
  15. data/doc/rdoc/classes/RFuzz/HttpClient.src/M000018.html +18 -0
  16. data/doc/rdoc/classes/RFuzz/HttpClient.src/M000019.html +26 -0
  17. data/doc/rdoc/classes/RFuzz/HttpEncoding.html +294 -0
  18. data/doc/rdoc/classes/RFuzz/HttpEncoding.src/M000001.html +26 -0
  19. data/doc/rdoc/classes/RFuzz/HttpEncoding.src/M000002.html +18 -0
  20. data/doc/rdoc/classes/RFuzz/HttpEncoding.src/M000003.html +26 -0
  21. data/doc/rdoc/classes/RFuzz/HttpEncoding.src/M000004.html +18 -0
  22. data/doc/rdoc/classes/RFuzz/HttpEncoding.src/M000005.html +32 -0
  23. data/doc/rdoc/classes/RFuzz/HttpEncoding.src/M000006.html +18 -0
  24. data/doc/rdoc/classes/RFuzz/HttpEncoding.src/M000007.html +20 -0
  25. data/doc/rdoc/classes/RFuzz/HttpEncoding.src/M000008.html +20 -0
  26. data/doc/rdoc/classes/RFuzz/HttpEncoding.src/M000009.html +32 -0
  27. data/doc/rdoc/classes/RFuzz/HttpResponse.html +180 -0
  28. data/doc/rdoc/classes/RFuzz/Notifier.html +252 -0
  29. data/doc/rdoc/classes/RFuzz/Notifier.src/M000044.html +17 -0
  30. data/doc/rdoc/classes/RFuzz/Notifier.src/M000045.html +17 -0
  31. data/doc/rdoc/classes/RFuzz/Notifier.src/M000046.html +17 -0
  32. data/doc/rdoc/classes/RFuzz/Notifier.src/M000047.html +17 -0
  33. data/doc/rdoc/classes/RFuzz/Notifier.src/M000048.html +17 -0
  34. data/doc/rdoc/classes/RFuzz/Notifier.src/M000049.html +17 -0
  35. data/doc/rdoc/classes/RFuzz/RandomGenerator.html +362 -0
  36. data/doc/rdoc/classes/RFuzz/RandomGenerator.src/M000032.html +21 -0
  37. data/doc/rdoc/classes/RFuzz/RandomGenerator.src/M000033.html +23 -0
  38. data/doc/rdoc/classes/RFuzz/RandomGenerator.src/M000036.html +22 -0
  39. data/doc/rdoc/classes/RFuzz/RandomGenerator.src/M000037.html +20 -0
  40. data/doc/rdoc/classes/RFuzz/RandomGenerator.src/M000038.html +22 -0
  41. data/doc/rdoc/classes/RFuzz/RandomGenerator.src/M000039.html +20 -0
  42. data/doc/rdoc/classes/RFuzz/RandomGenerator.src/M000040.html +18 -0
  43. data/doc/rdoc/classes/RFuzz/RandomGenerator.src/M000041.html +18 -0
  44. data/doc/rdoc/classes/RFuzz/RandomGenerator.src/M000042.html +22 -0
  45. data/doc/rdoc/classes/RFuzz/RandomGenerator.src/M000043.html +18 -0
  46. data/doc/rdoc/classes/RFuzz/Sampler.html +383 -0
  47. data/doc/rdoc/classes/RFuzz/Sampler.src/M000056.html +19 -0
  48. data/doc/rdoc/classes/RFuzz/Sampler.src/M000057.html +23 -0
  49. data/doc/rdoc/classes/RFuzz/Sampler.src/M000058.html +26 -0
  50. data/doc/rdoc/classes/RFuzz/Sampler.src/M000059.html +18 -0
  51. data/doc/rdoc/classes/RFuzz/Sampler.src/M000060.html +18 -0
  52. data/doc/rdoc/classes/RFuzz/Sampler.src/M000061.html +18 -0
  53. data/doc/rdoc/classes/RFuzz/Sampler.src/M000062.html +18 -0
  54. data/doc/rdoc/classes/RFuzz/Sampler.src/M000063.html +19 -0
  55. data/doc/rdoc/classes/RFuzz/Sampler.src/M000064.html +18 -0
  56. data/doc/rdoc/classes/RFuzz/Sampler.src/M000065.html +23 -0
  57. data/doc/rdoc/classes/RFuzz/Sampler.src/M000066.html +18 -0
  58. data/doc/rdoc/classes/RFuzz/Sampler.src/M000067.html +20 -0
  59. data/doc/rdoc/classes/RFuzz/Session.html +415 -0
  60. data/doc/rdoc/classes/RFuzz/Session.src/M000020.html +31 -0
  61. data/doc/rdoc/classes/RFuzz/Session.src/M000021.html +18 -0
  62. data/doc/rdoc/classes/RFuzz/Session.src/M000022.html +18 -0
  63. data/doc/rdoc/classes/RFuzz/Session.src/M000023.html +34 -0
  64. data/doc/rdoc/classes/RFuzz/Session.src/M000024.html +19 -0
  65. data/doc/rdoc/classes/RFuzz/Session.src/M000025.html +19 -0
  66. data/doc/rdoc/classes/RFuzz/Session.src/M000026.html +26 -0
  67. data/doc/rdoc/classes/RFuzz/Session.src/M000027.html +29 -0
  68. data/doc/rdoc/classes/RFuzz/Session.src/M000028.html +19 -0
  69. data/doc/rdoc/classes/RFuzz/Session.src/M000029.html +18 -0
  70. data/doc/rdoc/classes/RFuzz/Session.src/M000030.html +18 -0
  71. data/doc/rdoc/classes/RFuzz/Session.src/M000031.html +23 -0
  72. data/doc/rdoc/classes/RFuzz/StatsTracker.html +242 -0
  73. data/doc/rdoc/classes/RFuzz/StatsTracker.src/M000050.html +19 -0
  74. data/doc/rdoc/classes/RFuzz/StatsTracker.src/M000051.html +19 -0
  75. data/doc/rdoc/classes/RFuzz/StatsTracker.src/M000052.html +18 -0
  76. data/doc/rdoc/classes/RFuzz/StatsTracker.src/M000053.html +18 -0
  77. data/doc/rdoc/classes/RFuzz/StatsTracker.src/M000054.html +28 -0
  78. data/doc/rdoc/classes/RFuzz/StatsTracker.src/M000055.html +18 -0
  79. data/doc/rdoc/created.rid +1 -0
  80. data/doc/rdoc/files/COPYING.html +168 -0
  81. data/doc/rdoc/files/LICENSE.html +168 -0
  82. data/doc/rdoc/files/README.html +473 -0
  83. data/doc/rdoc/files/lib/rfuzz/client_rb.html +111 -0
  84. data/doc/rdoc/files/lib/rfuzz/random_rb.html +116 -0
  85. data/doc/rdoc/files/lib/rfuzz/rfuzz_rb.html +109 -0
  86. data/doc/rdoc/files/lib/rfuzz/session_rb.html +111 -0
  87. data/doc/rdoc/files/lib/rfuzz/stats_rb.html +113 -0
  88. data/doc/rdoc/fr_class_index.html +35 -0
  89. data/doc/rdoc/fr_file_index.html +34 -0
  90. data/doc/rdoc/fr_method_index.html +93 -0
  91. data/doc/rdoc/index.html +24 -0
  92. data/doc/rdoc/rdoc-style.css +208 -0
  93. data/examples/amazon_headers.rb +38 -0
  94. data/examples/hpricot_pudding.rb +22 -0
  95. data/examples/kill_routes.rb +26 -0
  96. data/examples/mongrel_test_suite/lib/gen.rb +24 -0
  97. data/examples/mongrel_test_suite/test/camping/static_files.rb +9 -0
  98. data/examples/mongrel_test_suite/test/camping/upload_file.rb +9 -0
  99. data/examples/mongrel_test_suite/test/camping/upload_progress.rb +9 -0
  100. data/examples/mongrel_test_suite/test/http/base_protocol.rb +23 -0
  101. data/examples/mongrel_test_suite/test/nitro/upload_file.rb +9 -0
  102. data/examples/mongrel_test_suite/test/nitro/upload_progress.rb +9 -0
  103. data/examples/mongrel_test_suite/test/rails/static_files.rb +9 -0
  104. data/examples/mongrel_test_suite/test/rails/upload_file.rb +9 -0
  105. data/examples/mongrel_test_suite/test/rails/upload_progress.rb +9 -0
  106. data/examples/perftest.rb +30 -0
  107. data/ext/fuzzrnd/ext_help.h +14 -0
  108. data/ext/fuzzrnd/extconf.rb +6 -0
  109. data/ext/fuzzrnd/fuzzrnd.c +149 -0
  110. data/ext/http11_client/ext_help.h +14 -0
  111. data/ext/http11_client/extconf.rb +6 -0
  112. data/ext/http11_client/http11_client.c +288 -0
  113. data/ext/http11_client/http11_parser.c +629 -0
  114. data/ext/http11_client/http11_parser.h +46 -0
  115. data/ext/http11_client/http11_parser.rl +169 -0
  116. data/lib/rfuzz/client.rb +498 -0
  117. data/lib/rfuzz/random.rb +110 -0
  118. data/lib/rfuzz/rfuzz.rb +12 -0
  119. data/lib/rfuzz/session.rb +154 -0
  120. data/lib/rfuzz/stats.rb +159 -0
  121. data/resources/defaults.yaml +2 -0
  122. data/resources/words.txt +3310 -0
  123. data/test/coverage/index.html +388 -0
  124. data/test/coverage/lib-rfuzz-client_rb.html +1127 -0
  125. data/test/coverage/lib-rfuzz-random_rb.html +739 -0
  126. data/test/coverage/lib-rfuzz-session_rb.html +783 -0
  127. data/test/coverage/lib-rfuzz-stats_rb.html +788 -0
  128. data/test/server.rb +101 -0
  129. data/test/test_client.rb +164 -0
  130. data/test/test_fuzzrnd.rb +31 -0
  131. data/test/test_httpparser.rb +48 -0
  132. data/test/test_random.rb +75 -0
  133. data/test/test_session.rb +33 -0
  134. data/test/test_stats.rb +45 -0
  135. data/tools/rakehelp.rb +119 -0
  136. metadata +201 -0
@@ -0,0 +1,6 @@
1
+ require 'mkmf'
2
+
3
+ dir_config("http11_client")
4
+ have_library("c", "main")
5
+
6
+ create_makefile("http11_client")
@@ -0,0 +1,288 @@
1
+ /**
2
+ * Copyright (c) 2005 Zed A. Shaw
3
+ * You can redistribute it and/or modify it under the same terms as Ruby.
4
+ */
5
+
6
+ #include "ruby.h"
7
+ #include "ext_help.h"
8
+ #include <assert.h>
9
+ #include <string.h>
10
+ #include "http11_parser.h"
11
+ #include <ctype.h>
12
+
13
+ static VALUE mRFuzz;
14
+ static VALUE cHttpClientParser;
15
+ static VALUE eHttpClientParserError;
16
+
17
+ #define id_reason rb_intern("@http_reason")
18
+ #define id_status rb_intern("@http_status")
19
+ #define id_version rb_intern("@http_version")
20
+ #define id_body rb_intern("@http_body")
21
+ #define id_chunk_size rb_intern("@http_chunk_size")
22
+
23
+ void client_http_field(void *data, const char *field, size_t flen, const char *value, size_t vlen)
24
+ {
25
+ char *ch, *end;
26
+ VALUE req = (VALUE)data;
27
+ VALUE v = Qnil;
28
+ VALUE f = Qnil;
29
+
30
+ v = rb_str_new(value, vlen);
31
+ f = rb_str_new(field, flen);
32
+
33
+ /* Yes Children, rb_str_upcase_bang isn't even available as an intern.h function.
34
+ * how incredibly handy to not have that. Nope, I have to do it by hand.*/
35
+ for(ch = RSTRING(f)->ptr, end = ch + RSTRING(f)->len; ch < end; ch++) {
36
+ if(*ch == '-') {
37
+ *ch = '_';
38
+ } else {
39
+ *ch = toupper(*ch);
40
+ }
41
+ }
42
+
43
+ rb_hash_aset(req, f, v);
44
+ }
45
+
46
+ void client_reason_phrase(void *data, const char *at, size_t length)
47
+ {
48
+ VALUE req = (VALUE)data;
49
+ VALUE v = Qnil;
50
+
51
+ v = rb_str_new(at, length);
52
+
53
+ rb_ivar_set(req, id_reason, v);
54
+ }
55
+
56
+ void client_status_code(void *data, const char *at, size_t length)
57
+ {
58
+ VALUE req = (VALUE)data;
59
+ VALUE v = Qnil;
60
+
61
+ v = rb_str_new(at, length);
62
+
63
+ rb_ivar_set(req, id_status, v);
64
+ }
65
+
66
+ void client_http_version(void *data, const char *at, size_t length)
67
+ {
68
+ VALUE req = (VALUE)data;
69
+ VALUE v = Qnil;
70
+
71
+ v = rb_str_new(at, length);
72
+
73
+ rb_ivar_set(req, id_version, v);
74
+ }
75
+
76
+ /** Finalizes the request header to have a bunch of stuff that's
77
+ needed. */
78
+
79
+ void client_header_done(void *data, const char *at, size_t length)
80
+ {
81
+ VALUE req = (VALUE)data;
82
+ VALUE v = Qnil;
83
+
84
+ v = rb_str_new(at, length);
85
+ rb_ivar_set(req, id_body, v);
86
+ }
87
+
88
+ void client_chunk_size(void *data, const char *at, size_t length)
89
+ {
90
+ VALUE req = (VALUE)data;
91
+ VALUE v = Qnil;
92
+
93
+ v = rb_str_new(at, length);
94
+
95
+ rb_ivar_set(req, id_chunk_size, v);
96
+ }
97
+
98
+
99
+ void HttpClientParser_free(void *data) {
100
+ TRACE();
101
+
102
+ if(data) {
103
+ free(data);
104
+ }
105
+ }
106
+
107
+
108
+ VALUE HttpClientParser_alloc(VALUE klass)
109
+ {
110
+ VALUE obj;
111
+ httpclient_parser *hp = ALLOC_N(httpclient_parser, 1);
112
+ TRACE();
113
+ hp->http_field = client_http_field;
114
+ hp->status_code = client_status_code;
115
+ hp->reason_phrase = client_reason_phrase;
116
+ hp->http_version = client_http_version;
117
+ hp->header_done = client_header_done;
118
+ hp->chunk_size = client_chunk_size;
119
+ httpclient_parser_init(hp);
120
+
121
+ obj = Data_Wrap_Struct(klass, NULL, HttpClientParser_free, hp);
122
+
123
+ return obj;
124
+ }
125
+
126
+
127
+ /**
128
+ * call-seq:
129
+ * parser.new -> parser
130
+ *
131
+ * Creates a new parser.
132
+ */
133
+ VALUE HttpClientParser_init(VALUE self)
134
+ {
135
+ httpclient_parser *http = NULL;
136
+ DATA_GET(self, httpclient_parser, http);
137
+ httpclient_parser_init(http);
138
+
139
+ return self;
140
+ }
141
+
142
+
143
+ /**
144
+ * call-seq:
145
+ * parser.reset -> nil
146
+ *
147
+ * Resets the parser to it's initial state so that you can reuse it
148
+ * rather than making new ones.
149
+ */
150
+ VALUE HttpClientParser_reset(VALUE self)
151
+ {
152
+ httpclient_parser *http = NULL;
153
+ DATA_GET(self, httpclient_parser, http);
154
+ httpclient_parser_init(http);
155
+
156
+ return Qnil;
157
+ }
158
+
159
+
160
+ /**
161
+ * call-seq:
162
+ * parser.finish -> true/false
163
+ *
164
+ * Finishes a parser early which could put in a "good" or bad state.
165
+ * You should call reset after finish it or bad things will happen.
166
+ */
167
+ VALUE HttpClientParser_finish(VALUE self)
168
+ {
169
+ httpclient_parser *http = NULL;
170
+ DATA_GET(self, httpclient_parser, http);
171
+ httpclient_parser_finish(http);
172
+
173
+ return httpclient_parser_is_finished(http) ? Qtrue : Qfalse;
174
+ }
175
+
176
+
177
+ /**
178
+ * call-seq:
179
+ * parser.execute(req_hash, data, start) -> Integer
180
+ *
181
+ * Takes a Hash and a String of data, parses the String of data filling in the Hash
182
+ * returning an Integer to indicate how much of the data has been read. No matter
183
+ * what the return value, you should call HttpClientParser#finished? and HttpClientParser#error?
184
+ * to figure out if it's done parsing or there was an error.
185
+ *
186
+ * This function now throws an exception when there is a parsing error. This makes
187
+ * the logic for working with the parser much easier. You can still test for an
188
+ * error, but now you need to wrap the parser with an exception handling block.
189
+ *
190
+ * The third argument allows for parsing a partial request and then continuing
191
+ * the parsing from that position. It needs all of the original data as well
192
+ * so you have to append to the data buffer as you read.
193
+ */
194
+ VALUE HttpClientParser_execute(VALUE self, VALUE req_hash, VALUE data, VALUE start)
195
+ {
196
+ httpclient_parser *http = NULL;
197
+ int from = 0;
198
+ char *dptr = NULL;
199
+ long dlen = 0;
200
+
201
+ DATA_GET(self, httpclient_parser, http);
202
+
203
+ from = FIX2INT(start);
204
+ dptr = RSTRING(data)->ptr;
205
+ dlen = RSTRING(data)->len;
206
+
207
+ if(from >= dlen) {
208
+ rb_raise(eHttpClientParserError, "Requested start is after data buffer end.");
209
+ } else {
210
+ http->data = (void *)req_hash;
211
+ httpclient_parser_execute(http, dptr, dlen, from);
212
+
213
+ if(httpclient_parser_has_error(http)) {
214
+ rb_raise(eHttpClientParserError, "Invalid HTTP format, parsing fails.");
215
+ } else {
216
+ return INT2FIX(httpclient_parser_nread(http));
217
+ }
218
+ }
219
+ }
220
+
221
+
222
+
223
+ /**
224
+ * call-seq:
225
+ * parser.error? -> true/false
226
+ *
227
+ * Tells you whether the parser is in an error state.
228
+ */
229
+ VALUE HttpClientParser_has_error(VALUE self)
230
+ {
231
+ httpclient_parser *http = NULL;
232
+ DATA_GET(self, httpclient_parser, http);
233
+
234
+ return httpclient_parser_has_error(http) ? Qtrue : Qfalse;
235
+ }
236
+
237
+
238
+ /**
239
+ * call-seq:
240
+ * parser.finished? -> true/false
241
+ *
242
+ * Tells you whether the parser is finished or not and in a good state.
243
+ */
244
+ VALUE HttpClientParser_is_finished(VALUE self)
245
+ {
246
+ httpclient_parser *http = NULL;
247
+ DATA_GET(self, httpclient_parser, http);
248
+
249
+ return httpclient_parser_is_finished(http) ? Qtrue : Qfalse;
250
+ }
251
+
252
+
253
+ /**
254
+ * call-seq:
255
+ * parser.nread -> Integer
256
+ *
257
+ * Returns the amount of data processed so far during this processing cycle. It is
258
+ * set to 0 on initialize or reset calls and is incremented each time execute is called.
259
+ */
260
+ VALUE HttpClientParser_nread(VALUE self)
261
+ {
262
+ httpclient_parser *http = NULL;
263
+ DATA_GET(self, httpclient_parser, http);
264
+
265
+ return INT2FIX(http->nread);
266
+ }
267
+
268
+
269
+
270
+ void Init_http11_client()
271
+ {
272
+
273
+ mRFuzz = rb_define_module("RFuzz");
274
+
275
+ eHttpClientParserError = rb_define_class_under(mRFuzz, "HttpClientParserError", rb_eIOError);
276
+
277
+ cHttpClientParser = rb_define_class_under(mRFuzz, "HttpClientParser", rb_cObject);
278
+ rb_define_alloc_func(cHttpClientParser, HttpClientParser_alloc);
279
+ rb_define_method(cHttpClientParser, "initialize", HttpClientParser_init,0);
280
+ rb_define_method(cHttpClientParser, "reset", HttpClientParser_reset,0);
281
+ rb_define_method(cHttpClientParser, "finish", HttpClientParser_finish,0);
282
+ rb_define_method(cHttpClientParser, "execute", HttpClientParser_execute,3);
283
+ rb_define_method(cHttpClientParser, "error?", HttpClientParser_has_error,0);
284
+ rb_define_method(cHttpClientParser, "finished?", HttpClientParser_is_finished,0);
285
+ rb_define_method(cHttpClientParser, "nread", HttpClientParser_nread,0);
286
+ }
287
+
288
+
@@ -0,0 +1,629 @@
1
+ #line 1 "ext/http11_client/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
+
7
+ #include "http11_parser.h"
8
+ #include <stdio.h>
9
+ #include <assert.h>
10
+ #include <stdlib.h>
11
+ #include <ctype.h>
12
+ #include <string.h>
13
+
14
+ #define LEN(AT, FPC) (FPC - buffer - parser->AT)
15
+ #define MARK(M,FPC) (parser->M = (FPC) - buffer)
16
+ #define PTR_TO(F) (buffer + parser->F)
17
+ #define L(M) fprintf(stderr, "" # M "\n");
18
+
19
+
20
+ /** machine **/
21
+ #line 91 "ext/http11_client/http11_parser.rl"
22
+
23
+
24
+ /** Data **/
25
+
26
+ #line 27 "ext/http11_client/http11_parser.c"
27
+ static int httpclient_parser_start = 0;
28
+
29
+ static int httpclient_parser_first_final = 26;
30
+
31
+ static int httpclient_parser_error = 1;
32
+
33
+ #line 95 "ext/http11_client/http11_parser.rl"
34
+
35
+ int httpclient_parser_init(httpclient_parser *parser) {
36
+ int cs = 0;
37
+
38
+ #line 39 "ext/http11_client/http11_parser.c"
39
+ {
40
+ cs = httpclient_parser_start;
41
+ }
42
+ #line 99 "ext/http11_client/http11_parser.rl"
43
+ parser->cs = cs;
44
+ parser->body_start = 0;
45
+ parser->content_len = 0;
46
+ parser->mark = 0;
47
+ parser->nread = 0;
48
+ parser->field_len = 0;
49
+ parser->field_start = 0;
50
+
51
+ return(1);
52
+ }
53
+
54
+
55
+ /** exec **/
56
+ size_t httpclient_parser_execute(httpclient_parser *parser, const char *buffer, size_t len, size_t off) {
57
+ const char *p, *pe;
58
+ int cs = parser->cs;
59
+
60
+ assert(off <= len && "offset past end of buffer");
61
+
62
+ p = buffer+off;
63
+ pe = buffer+len;
64
+
65
+ assert(*pe == '\0' && "pointer does not end on NUL");
66
+ assert(pe - p == len - off && "pointers aren't same distance");
67
+
68
+
69
+
70
+ #line 71 "ext/http11_client/http11_parser.c"
71
+ {
72
+ p -= 1;
73
+ if ( ++p == pe )
74
+ goto _out;
75
+ switch ( cs )
76
+ {
77
+ case 0:
78
+ switch( (*p) ) {
79
+ case 13: goto st2;
80
+ case 59: goto st4;
81
+ case 72: goto tr19;
82
+ }
83
+ if ( (*p) < 65 ) {
84
+ if ( 48 <= (*p) && (*p) <= 57 )
85
+ goto tr17;
86
+ } else if ( (*p) > 70 ) {
87
+ if ( 97 <= (*p) && (*p) <= 102 )
88
+ goto tr17;
89
+ } else
90
+ goto tr17;
91
+ goto st1;
92
+ st1:
93
+ goto _out1;
94
+ tr21:
95
+ #line 33 "ext/http11_client/http11_parser.rl"
96
+ {
97
+ parser->http_field(parser->data, PTR_TO(field_start), parser->field_len, PTR_TO(mark), LEN(mark, p));
98
+ }
99
+ goto st2;
100
+ tr24:
101
+ #line 49 "ext/http11_client/http11_parser.rl"
102
+ {
103
+ parser->chunk_size(parser->data, PTR_TO(mark), LEN(mark, p));
104
+ }
105
+ goto st2;
106
+ tr27:
107
+ #line 27 "ext/http11_client/http11_parser.rl"
108
+ {
109
+ parser->field_len = LEN(field_start, p);
110
+ }
111
+ #line 31 "ext/http11_client/http11_parser.rl"
112
+ { MARK(mark, p); }
113
+ #line 33 "ext/http11_client/http11_parser.rl"
114
+ {
115
+ parser->http_field(parser->data, PTR_TO(field_start), parser->field_len, PTR_TO(mark), LEN(mark, p));
116
+ }
117
+ goto st2;
118
+ st2:
119
+ if ( ++p == pe )
120
+ goto _out2;
121
+ case 2:
122
+ #line 123 "ext/http11_client/http11_parser.c"
123
+ if ( (*p) == 10 )
124
+ goto tr32;
125
+ goto st1;
126
+ tr32:
127
+ #line 53 "ext/http11_client/http11_parser.rl"
128
+ {
129
+ parser->body_start = p - buffer + 1;
130
+ if(parser->header_done != NULL)
131
+ parser->header_done(parser->data, p + 1, pe - p - 1);
132
+ goto _out26;
133
+ }
134
+ goto st26;
135
+ st26:
136
+ if ( ++p == pe )
137
+ goto _out26;
138
+ case 26:
139
+ #line 140 "ext/http11_client/http11_parser.c"
140
+ goto st1;
141
+ tr17:
142
+ #line 23 "ext/http11_client/http11_parser.rl"
143
+ {MARK(mark, p); }
144
+ goto st3;
145
+ st3:
146
+ if ( ++p == pe )
147
+ goto _out3;
148
+ case 3:
149
+ #line 150 "ext/http11_client/http11_parser.c"
150
+ switch( (*p) ) {
151
+ case 13: goto tr24;
152
+ case 59: goto tr26;
153
+ }
154
+ if ( (*p) < 65 ) {
155
+ if ( 48 <= (*p) && (*p) <= 57 )
156
+ goto st3;
157
+ } else if ( (*p) > 70 ) {
158
+ if ( 97 <= (*p) && (*p) <= 102 )
159
+ goto st3;
160
+ } else
161
+ goto st3;
162
+ goto st1;
163
+ tr23:
164
+ #line 33 "ext/http11_client/http11_parser.rl"
165
+ {
166
+ parser->http_field(parser->data, PTR_TO(field_start), parser->field_len, PTR_TO(mark), LEN(mark, p));
167
+ }
168
+ goto st4;
169
+ tr26:
170
+ #line 49 "ext/http11_client/http11_parser.rl"
171
+ {
172
+ parser->chunk_size(parser->data, PTR_TO(mark), LEN(mark, p));
173
+ }
174
+ goto st4;
175
+ tr29:
176
+ #line 27 "ext/http11_client/http11_parser.rl"
177
+ {
178
+ parser->field_len = LEN(field_start, p);
179
+ }
180
+ #line 31 "ext/http11_client/http11_parser.rl"
181
+ { MARK(mark, p); }
182
+ #line 33 "ext/http11_client/http11_parser.rl"
183
+ {
184
+ parser->http_field(parser->data, PTR_TO(field_start), parser->field_len, PTR_TO(mark), LEN(mark, p));
185
+ }
186
+ goto st4;
187
+ st4:
188
+ if ( ++p == pe )
189
+ goto _out4;
190
+ case 4:
191
+ #line 192 "ext/http11_client/http11_parser.c"
192
+ switch( (*p) ) {
193
+ case 33: goto tr9;
194
+ case 124: goto tr9;
195
+ case 126: goto tr9;
196
+ }
197
+ if ( (*p) < 45 ) {
198
+ if ( (*p) > 39 ) {
199
+ if ( 42 <= (*p) && (*p) <= 43 )
200
+ goto tr9;
201
+ } else if ( (*p) >= 35 )
202
+ goto tr9;
203
+ } else if ( (*p) > 46 ) {
204
+ if ( (*p) < 65 ) {
205
+ if ( 48 <= (*p) && (*p) <= 57 )
206
+ goto tr9;
207
+ } else if ( (*p) > 90 ) {
208
+ if ( 94 <= (*p) && (*p) <= 122 )
209
+ goto tr9;
210
+ } else
211
+ goto tr9;
212
+ } else
213
+ goto tr9;
214
+ goto st1;
215
+ tr9:
216
+ #line 25 "ext/http11_client/http11_parser.rl"
217
+ { MARK(field_start, p); }
218
+ goto st5;
219
+ st5:
220
+ if ( ++p == pe )
221
+ goto _out5;
222
+ case 5:
223
+ #line 224 "ext/http11_client/http11_parser.c"
224
+ switch( (*p) ) {
225
+ case 13: goto tr27;
226
+ case 33: goto st5;
227
+ case 59: goto tr29;
228
+ case 61: goto tr30;
229
+ case 124: goto st5;
230
+ case 126: goto st5;
231
+ }
232
+ if ( (*p) < 45 ) {
233
+ if ( (*p) > 39 ) {
234
+ if ( 42 <= (*p) && (*p) <= 43 )
235
+ goto st5;
236
+ } else if ( (*p) >= 35 )
237
+ goto st5;
238
+ } else if ( (*p) > 46 ) {
239
+ if ( (*p) < 65 ) {
240
+ if ( 48 <= (*p) && (*p) <= 57 )
241
+ goto st5;
242
+ } else if ( (*p) > 90 ) {
243
+ if ( 94 <= (*p) && (*p) <= 122 )
244
+ goto st5;
245
+ } else
246
+ goto st5;
247
+ } else
248
+ goto st5;
249
+ goto st1;
250
+ tr30:
251
+ #line 27 "ext/http11_client/http11_parser.rl"
252
+ {
253
+ parser->field_len = LEN(field_start, p);
254
+ }
255
+ #line 31 "ext/http11_client/http11_parser.rl"
256
+ { MARK(mark, p); }
257
+ goto st6;
258
+ st6:
259
+ if ( ++p == pe )
260
+ goto _out6;
261
+ case 6:
262
+ #line 263 "ext/http11_client/http11_parser.c"
263
+ switch( (*p) ) {
264
+ case 33: goto tr10;
265
+ case 124: goto tr10;
266
+ case 126: goto tr10;
267
+ }
268
+ if ( (*p) < 45 ) {
269
+ if ( (*p) > 39 ) {
270
+ if ( 42 <= (*p) && (*p) <= 43 )
271
+ goto tr10;
272
+ } else if ( (*p) >= 35 )
273
+ goto tr10;
274
+ } else if ( (*p) > 46 ) {
275
+ if ( (*p) < 65 ) {
276
+ if ( 48 <= (*p) && (*p) <= 57 )
277
+ goto tr10;
278
+ } else if ( (*p) > 90 ) {
279
+ if ( 94 <= (*p) && (*p) <= 122 )
280
+ goto tr10;
281
+ } else
282
+ goto tr10;
283
+ } else
284
+ goto tr10;
285
+ goto st1;
286
+ tr10:
287
+ #line 31 "ext/http11_client/http11_parser.rl"
288
+ { MARK(mark, p); }
289
+ goto st7;
290
+ st7:
291
+ if ( ++p == pe )
292
+ goto _out7;
293
+ case 7:
294
+ #line 295 "ext/http11_client/http11_parser.c"
295
+ switch( (*p) ) {
296
+ case 13: goto tr21;
297
+ case 33: goto st7;
298
+ case 59: goto tr23;
299
+ case 124: goto st7;
300
+ case 126: goto st7;
301
+ }
302
+ if ( (*p) < 45 ) {
303
+ if ( (*p) > 39 ) {
304
+ if ( 42 <= (*p) && (*p) <= 43 )
305
+ goto st7;
306
+ } else if ( (*p) >= 35 )
307
+ goto st7;
308
+ } else if ( (*p) > 46 ) {
309
+ if ( (*p) < 65 ) {
310
+ if ( 48 <= (*p) && (*p) <= 57 )
311
+ goto st7;
312
+ } else if ( (*p) > 90 ) {
313
+ if ( 94 <= (*p) && (*p) <= 122 )
314
+ goto st7;
315
+ } else
316
+ goto st7;
317
+ } else
318
+ goto st7;
319
+ goto st1;
320
+ tr19:
321
+ #line 23 "ext/http11_client/http11_parser.rl"
322
+ {MARK(mark, p); }
323
+ goto st8;
324
+ st8:
325
+ if ( ++p == pe )
326
+ goto _out8;
327
+ case 8:
328
+ #line 329 "ext/http11_client/http11_parser.c"
329
+ if ( (*p) == 84 )
330
+ goto st9;
331
+ goto st1;
332
+ st9:
333
+ if ( ++p == pe )
334
+ goto _out9;
335
+ case 9:
336
+ if ( (*p) == 84 )
337
+ goto st10;
338
+ goto st1;
339
+ st10:
340
+ if ( ++p == pe )
341
+ goto _out10;
342
+ case 10:
343
+ if ( (*p) == 80 )
344
+ goto st11;
345
+ goto st1;
346
+ st11:
347
+ if ( ++p == pe )
348
+ goto _out11;
349
+ case 11:
350
+ if ( (*p) == 47 )
351
+ goto st12;
352
+ goto st1;
353
+ st12:
354
+ if ( ++p == pe )
355
+ goto _out12;
356
+ case 12:
357
+ if ( 48 <= (*p) && (*p) <= 57 )
358
+ goto st13;
359
+ goto st1;
360
+ st13:
361
+ if ( ++p == pe )
362
+ goto _out13;
363
+ case 13:
364
+ if ( (*p) == 46 )
365
+ goto st14;
366
+ if ( 48 <= (*p) && (*p) <= 57 )
367
+ goto st13;
368
+ goto st1;
369
+ st14:
370
+ if ( ++p == pe )
371
+ goto _out14;
372
+ case 14:
373
+ if ( 48 <= (*p) && (*p) <= 57 )
374
+ goto st15;
375
+ goto st1;
376
+ st15:
377
+ if ( ++p == pe )
378
+ goto _out15;
379
+ case 15:
380
+ if ( (*p) == 32 )
381
+ goto tr14;
382
+ if ( 48 <= (*p) && (*p) <= 57 )
383
+ goto st15;
384
+ goto st1;
385
+ tr14:
386
+ #line 45 "ext/http11_client/http11_parser.rl"
387
+ {
388
+ parser->http_version(parser->data, PTR_TO(mark), LEN(mark, p));
389
+ }
390
+ goto st16;
391
+ st16:
392
+ if ( ++p == pe )
393
+ goto _out16;
394
+ case 16:
395
+ #line 396 "ext/http11_client/http11_parser.c"
396
+ if ( 48 <= (*p) && (*p) <= 57 )
397
+ goto tr4;
398
+ goto st1;
399
+ tr4:
400
+ #line 23 "ext/http11_client/http11_parser.rl"
401
+ {MARK(mark, p); }
402
+ goto st17;
403
+ st17:
404
+ if ( ++p == pe )
405
+ goto _out17;
406
+ case 17:
407
+ #line 408 "ext/http11_client/http11_parser.c"
408
+ if ( (*p) == 32 )
409
+ goto tr12;
410
+ if ( 48 <= (*p) && (*p) <= 57 )
411
+ goto st17;
412
+ goto st1;
413
+ tr12:
414
+ #line 41 "ext/http11_client/http11_parser.rl"
415
+ {
416
+ parser->status_code(parser->data, PTR_TO(mark), LEN(mark, p));
417
+ }
418
+ goto st18;
419
+ st18:
420
+ if ( ++p == pe )
421
+ goto _out18;
422
+ case 18:
423
+ #line 424 "ext/http11_client/http11_parser.c"
424
+ goto tr37;
425
+ tr37:
426
+ #line 23 "ext/http11_client/http11_parser.rl"
427
+ {MARK(mark, p); }
428
+ goto st19;
429
+ st19:
430
+ if ( ++p == pe )
431
+ goto _out19;
432
+ case 19:
433
+ #line 434 "ext/http11_client/http11_parser.c"
434
+ if ( (*p) == 13 )
435
+ goto tr36;
436
+ goto st19;
437
+ tr34:
438
+ #line 33 "ext/http11_client/http11_parser.rl"
439
+ {
440
+ parser->http_field(parser->data, PTR_TO(field_start), parser->field_len, PTR_TO(mark), LEN(mark, p));
441
+ }
442
+ goto st20;
443
+ tr36:
444
+ #line 37 "ext/http11_client/http11_parser.rl"
445
+ {
446
+ parser->reason_phrase(parser->data, PTR_TO(mark), LEN(mark, p));
447
+ }
448
+ goto st20;
449
+ st20:
450
+ if ( ++p == pe )
451
+ goto _out20;
452
+ case 20:
453
+ #line 454 "ext/http11_client/http11_parser.c"
454
+ if ( (*p) == 10 )
455
+ goto st21;
456
+ goto st1;
457
+ st21:
458
+ if ( ++p == pe )
459
+ goto _out21;
460
+ case 21:
461
+ switch( (*p) ) {
462
+ case 13: goto st2;
463
+ case 33: goto tr20;
464
+ case 124: goto tr20;
465
+ case 126: goto tr20;
466
+ }
467
+ if ( (*p) < 45 ) {
468
+ if ( (*p) > 39 ) {
469
+ if ( 42 <= (*p) && (*p) <= 43 )
470
+ goto tr20;
471
+ } else if ( (*p) >= 35 )
472
+ goto tr20;
473
+ } else if ( (*p) > 46 ) {
474
+ if ( (*p) < 65 ) {
475
+ if ( 48 <= (*p) && (*p) <= 57 )
476
+ goto tr20;
477
+ } else if ( (*p) > 90 ) {
478
+ if ( 94 <= (*p) && (*p) <= 122 )
479
+ goto tr20;
480
+ } else
481
+ goto tr20;
482
+ } else
483
+ goto tr20;
484
+ goto st1;
485
+ tr20:
486
+ #line 25 "ext/http11_client/http11_parser.rl"
487
+ { MARK(field_start, p); }
488
+ goto st22;
489
+ st22:
490
+ if ( ++p == pe )
491
+ goto _out22;
492
+ case 22:
493
+ #line 494 "ext/http11_client/http11_parser.c"
494
+ switch( (*p) ) {
495
+ case 33: goto st22;
496
+ case 58: goto tr8;
497
+ case 124: goto st22;
498
+ case 126: goto st22;
499
+ }
500
+ if ( (*p) < 45 ) {
501
+ if ( (*p) > 39 ) {
502
+ if ( 42 <= (*p) && (*p) <= 43 )
503
+ goto st22;
504
+ } else if ( (*p) >= 35 )
505
+ goto st22;
506
+ } else if ( (*p) > 46 ) {
507
+ if ( (*p) < 65 ) {
508
+ if ( 48 <= (*p) && (*p) <= 57 )
509
+ goto st22;
510
+ } else if ( (*p) > 90 ) {
511
+ if ( 94 <= (*p) && (*p) <= 122 )
512
+ goto st22;
513
+ } else
514
+ goto st22;
515
+ } else
516
+ goto st22;
517
+ goto st1;
518
+ tr8:
519
+ #line 27 "ext/http11_client/http11_parser.rl"
520
+ {
521
+ parser->field_len = LEN(field_start, p);
522
+ }
523
+ goto st23;
524
+ st23:
525
+ if ( ++p == pe )
526
+ goto _out23;
527
+ case 23:
528
+ #line 529 "ext/http11_client/http11_parser.c"
529
+ if ( (*p) == 32 )
530
+ goto st24;
531
+ goto st1;
532
+ st24:
533
+ if ( ++p == pe )
534
+ goto _out24;
535
+ case 24:
536
+ if ( (*p) == 13 )
537
+ goto tr34;
538
+ goto tr38;
539
+ tr38:
540
+ #line 31 "ext/http11_client/http11_parser.rl"
541
+ { MARK(mark, p); }
542
+ goto st25;
543
+ st25:
544
+ if ( ++p == pe )
545
+ goto _out25;
546
+ case 25:
547
+ #line 548 "ext/http11_client/http11_parser.c"
548
+ if ( (*p) == 13 )
549
+ goto tr34;
550
+ goto st25;
551
+ }
552
+ _out1: cs = 1; goto _out;
553
+ _out2: cs = 2; goto _out;
554
+ _out26: cs = 26; goto _out;
555
+ _out3: cs = 3; goto _out;
556
+ _out4: cs = 4; goto _out;
557
+ _out5: cs = 5; goto _out;
558
+ _out6: cs = 6; goto _out;
559
+ _out7: cs = 7; goto _out;
560
+ _out8: cs = 8; goto _out;
561
+ _out9: cs = 9; goto _out;
562
+ _out10: cs = 10; goto _out;
563
+ _out11: cs = 11; goto _out;
564
+ _out12: cs = 12; goto _out;
565
+ _out13: cs = 13; goto _out;
566
+ _out14: cs = 14; goto _out;
567
+ _out15: cs = 15; goto _out;
568
+ _out16: cs = 16; goto _out;
569
+ _out17: cs = 17; goto _out;
570
+ _out18: cs = 18; goto _out;
571
+ _out19: cs = 19; goto _out;
572
+ _out20: cs = 20; goto _out;
573
+ _out21: cs = 21; goto _out;
574
+ _out22: cs = 22; goto _out;
575
+ _out23: cs = 23; goto _out;
576
+ _out24: cs = 24; goto _out;
577
+ _out25: cs = 25; goto _out;
578
+
579
+ _out: {}
580
+ }
581
+ #line 126 "ext/http11_client/http11_parser.rl"
582
+
583
+ parser->cs = cs;
584
+ parser->nread += p - (buffer + off);
585
+
586
+ assert(p <= pe && "buffer overflow after parsing execute");
587
+ assert(parser->nread <= len && "nread longer than length");
588
+ assert(parser->body_start <= len && "body starts after buffer end");
589
+ assert(parser->mark < len && "mark is after buffer end");
590
+ assert(parser->field_len <= len && "field has length longer than whole buffer");
591
+ assert(parser->field_start < len && "field starts after buffer end");
592
+
593
+ if(parser->body_start) {
594
+ /* final \r\n combo encountered so stop right here */
595
+
596
+ #line 597 "ext/http11_client/http11_parser.c"
597
+ #line 140 "ext/http11_client/http11_parser.rl"
598
+ parser->nread++;
599
+ }
600
+
601
+ return(parser->nread);
602
+ }
603
+
604
+ int httpclient_parser_finish(httpclient_parser *parser)
605
+ {
606
+ int cs = parser->cs;
607
+
608
+
609
+ #line 610 "ext/http11_client/http11_parser.c"
610
+ #line 151 "ext/http11_client/http11_parser.rl"
611
+
612
+ parser->cs = cs;
613
+
614
+ if (httpclient_parser_has_error(parser) ) {
615
+ return -1;
616
+ } else if (httpclient_parser_is_finished(parser) ) {
617
+ return 1;
618
+ } else {
619
+ return 0;
620
+ }
621
+ }
622
+
623
+ int httpclient_parser_has_error(httpclient_parser *parser) {
624
+ return parser->cs == httpclient_parser_error;
625
+ }
626
+
627
+ int httpclient_parser_is_finished(httpclient_parser *parser) {
628
+ return parser->cs == httpclient_parser_first_final;
629
+ }