mongrel 1.1.5-x86-mingw32 → 1.2.0.pre2-x86-mingw32
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.
- data/History.txt +68 -0
- data/{Manifest → Manifest.txt} +15 -15
- data/{README → README.txt} +6 -0
- data/Rakefile +8 -0
- data/bin/mongrel_rails +5 -4
- data/examples/camping/blog.rb +0 -0
- data/ext/{http11_java → http11}/Http11Service.java +0 -0
- data/ext/http11/ext_help.h +1 -0
- data/ext/http11/http11.c +152 -20
- data/ext/http11/http11_parser.c +262 -240
- data/ext/http11/http11_parser.java.rl +3 -14
- data/ext/http11/http11_parser.rl +19 -18
- data/ext/http11/http11_parser_common.rl +1 -1
- data/ext/{http11_java → http11}/org/jruby/mongrel/Http11.java +37 -62
- data/ext/http11/org/jruby/mongrel/Http11Parser.java +486 -0
- data/lib/1.8/http11.so +0 -0
- data/lib/1.9/http11.so +0 -0
- data/lib/mongrel.rb +16 -5
- data/lib/mongrel/cgi.rb +2 -2
- data/lib/mongrel/command.rb +1 -3
- data/lib/mongrel/configurator.rb +5 -5
- data/lib/mongrel/const.rb +1 -1
- data/lib/mongrel/handlers.rb +5 -5
- data/lib/mongrel/http_request.rb +1 -1
- data/lib/mongrel/http_response.rb +4 -1
- data/lib/mongrel/rails.rb +1 -1
- data/tasks/gem.rake +28 -0
- data/tasks/native.rake +24 -0
- data/tasks/ragel.rake +20 -0
- data/test/test_conditional.rb +2 -2
- data/test/test_configurator.rb +4 -5
- data/test/test_handlers.rb +33 -24
- data/test/test_redirect_handler.rb +2 -3
- data/test/test_request_progress.rb +4 -5
- data/test/test_ws.rb +2 -0
- data/test/testhelp.rb +1 -9
- metadata +86 -86
- data.tar.gz.sig +0 -4
- data/CHANGELOG +0 -18
- data/examples/mongrel_simple_ctrl.rb +0 -92
- data/examples/mongrel_simple_service.rb +0 -116
- data/ext/http11_java/org/jruby/mongrel/Http11Parser.java +0 -572
- data/lib/http11.so +0 -0
- data/mongrel-public_cert.pem +0 -20
- data/mongrel.gemspec +0 -242
- metadata.gz.sig +0 -1
@@ -13,6 +13,7 @@ public class Http11Parser {
|
|
13
13
|
action mark {parser.mark = fpc; }
|
14
14
|
|
15
15
|
action start_field { parser.field_start = fpc; }
|
16
|
+
action snake_upcase_field { /* FIXME stub */ }
|
16
17
|
action write_field {
|
17
18
|
parser.field_len = fpc-parser.field_start;
|
18
19
|
}
|
@@ -115,12 +116,12 @@ public class Http11Parser {
|
|
115
116
|
public int execute(ByteList buffer, int off) {
|
116
117
|
int p, pe;
|
117
118
|
int cs = parser.cs;
|
118
|
-
int len = buffer.
|
119
|
+
int len = buffer.length();
|
119
120
|
assert off<=len : "offset past end of buffer";
|
120
121
|
|
121
122
|
p = off;
|
122
123
|
pe = len;
|
123
|
-
byte[] data = buffer.
|
124
|
+
byte[] data = buffer.unsafeBytes();
|
124
125
|
parser.buffer = buffer;
|
125
126
|
|
126
127
|
%% write exec;
|
@@ -135,22 +136,10 @@ public class Http11Parser {
|
|
135
136
|
assert parser.field_len <= len : "field has length longer than whole buffer";
|
136
137
|
assert parser.field_start < len : "field starts after buffer end";
|
137
138
|
|
138
|
-
if(parser.body_start>0) {
|
139
|
-
/* final \r\n combo encountered so stop right here */
|
140
|
-
%%write eof;
|
141
|
-
parser.nread++;
|
142
|
-
}
|
143
|
-
|
144
139
|
return parser.nread;
|
145
140
|
}
|
146
141
|
|
147
142
|
public int finish() {
|
148
|
-
int cs = parser.cs;
|
149
|
-
|
150
|
-
%%write eof;
|
151
|
-
|
152
|
-
parser.cs = cs;
|
153
|
-
|
154
143
|
if(has_error()) {
|
155
144
|
return -1;
|
156
145
|
} else if(is_finished()) {
|
data/ext/http11/http11_parser.rl
CHANGED
@@ -9,6 +9,18 @@
|
|
9
9
|
#include <ctype.h>
|
10
10
|
#include <string.h>
|
11
11
|
|
12
|
+
/*
|
13
|
+
* capitalizes all lower-case ASCII characters,
|
14
|
+
* converts dashes to underscores.
|
15
|
+
*/
|
16
|
+
static void snake_upcase_char(char *c)
|
17
|
+
{
|
18
|
+
if (*c >= 'a' && *c <= 'z')
|
19
|
+
*c &= ~0x20;
|
20
|
+
else if (*c == '-')
|
21
|
+
*c = '_';
|
22
|
+
}
|
23
|
+
|
12
24
|
#define LEN(AT, FPC) (FPC - buffer - parser->AT)
|
13
25
|
#define MARK(M,FPC) (parser->M = (FPC) - buffer)
|
14
26
|
#define PTR_TO(F) (buffer + parser->F)
|
@@ -23,12 +35,13 @@
|
|
23
35
|
|
24
36
|
|
25
37
|
action start_field { MARK(field_start, fpc); }
|
38
|
+
action snake_upcase_field { snake_upcase_char((char *)fpc); }
|
26
39
|
action write_field {
|
27
40
|
parser->field_len = LEN(field_start, fpc);
|
28
41
|
}
|
29
42
|
|
30
43
|
action start_value { MARK(mark, fpc); }
|
31
|
-
action write_value {
|
44
|
+
action write_value {
|
32
45
|
if(parser->http_field != NULL) {
|
33
46
|
parser->http_field(parser->data, PTR_TO(field_start), parser->field_len, PTR_TO(mark), LEN(mark, fpc));
|
34
47
|
}
|
@@ -41,7 +54,7 @@
|
|
41
54
|
if(parser->request_uri != NULL)
|
42
55
|
parser->request_uri(parser->data, PTR_TO(mark), LEN(mark, fpc));
|
43
56
|
}
|
44
|
-
action fragment {
|
57
|
+
action fragment {
|
45
58
|
if(parser->fragment != NULL)
|
46
59
|
parser->fragment(parser->data, PTR_TO(mark), LEN(mark, fpc));
|
47
60
|
}
|
@@ -101,13 +114,13 @@ size_t http_parser_execute(http_parser *parser, const char *buffer, size_t len,
|
|
101
114
|
p = buffer+off;
|
102
115
|
pe = buffer+len;
|
103
116
|
|
104
|
-
assert(*pe == '\0' && "pointer does not end on NUL");
|
117
|
+
/* assert(*pe == '\0' && "pointer does not end on NUL"); */
|
105
118
|
assert(pe - p == len - off && "pointers aren't same distance");
|
106
119
|
|
107
|
-
|
108
120
|
%% write exec;
|
109
121
|
|
110
|
-
parser
|
122
|
+
if (!http_parser_has_error(parser))
|
123
|
+
parser->cs = cs;
|
111
124
|
parser->nread += p - (buffer + off);
|
112
125
|
|
113
126
|
assert(p <= pe && "buffer overflow after parsing execute");
|
@@ -117,23 +130,11 @@ size_t http_parser_execute(http_parser *parser, const char *buffer, size_t len,
|
|
117
130
|
assert(parser->field_len <= len && "field has length longer than whole buffer");
|
118
131
|
assert(parser->field_start < len && "field starts after buffer end");
|
119
132
|
|
120
|
-
if(parser->body_start) {
|
121
|
-
/* final \r\n combo encountered so stop right here */
|
122
|
-
%%write eof;
|
123
|
-
parser->nread++;
|
124
|
-
}
|
125
|
-
|
126
133
|
return(parser->nread);
|
127
134
|
}
|
128
135
|
|
129
136
|
int http_parser_finish(http_parser *parser)
|
130
137
|
{
|
131
|
-
int cs = parser->cs;
|
132
|
-
|
133
|
-
%%write eof;
|
134
|
-
|
135
|
-
parser->cs = cs;
|
136
|
-
|
137
138
|
if (http_parser_has_error(parser) ) {
|
138
139
|
return -1;
|
139
140
|
} else if (http_parser_is_finished(parser) ) {
|
@@ -148,5 +149,5 @@ int http_parser_has_error(http_parser *parser) {
|
|
148
149
|
}
|
149
150
|
|
150
151
|
int http_parser_is_finished(http_parser *parser) {
|
151
|
-
return parser->cs
|
152
|
+
return parser->cs >= http_parser_first_final;
|
152
153
|
}
|
@@ -41,7 +41,7 @@
|
|
41
41
|
HTTP_Version = ( "HTTP/" http_number ) >mark %http_version ;
|
42
42
|
Request_Line = ( Method " " Request_URI ("#" Fragment){0,1} " " HTTP_Version CRLF ) ;
|
43
43
|
|
44
|
-
field_name = ( token -- ":" )+ >start_field %write_field;
|
44
|
+
field_name = ( token -- ":" )+ >start_field $snake_upcase_field %write_field;
|
45
45
|
|
46
46
|
field_value = any* >start_value %write_value;
|
47
47
|
|
@@ -1,30 +1,3 @@
|
|
1
|
-
/***** BEGIN LICENSE BLOCK *****
|
2
|
-
* Version: CPL 1.0/GPL 2.0/LGPL 2.1
|
3
|
-
*
|
4
|
-
* The contents of this file are subject to the Common Public
|
5
|
-
* License Version 1.0 (the "License"); you may not use this file
|
6
|
-
* except in compliance with the License. You may obtain a copy of
|
7
|
-
* the License at http://www.eclipse.org/legal/cpl-v10.html
|
8
|
-
*
|
9
|
-
* Software distributed under the License is distributed on an "AS
|
10
|
-
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
|
11
|
-
* implied. See the License for the specific language governing
|
12
|
-
* rights and limitations under the License.
|
13
|
-
*
|
14
|
-
* Copyright (C) 2007 Ola Bini <ola@ologix.com>
|
15
|
-
*
|
16
|
-
* Alternatively, the contents of this file may be used under the terms of
|
17
|
-
* either of the GNU General Public License Version 2 or later (the "GPL"),
|
18
|
-
* or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
|
19
|
-
* in which case the provisions of the GPL or the LGPL are applicable instead
|
20
|
-
* of those above. If you wish to allow use of your version of this file only
|
21
|
-
* under the terms of either the GPL or the LGPL, and not to allow others to
|
22
|
-
* use your version of this file under the terms of the CPL, indicate your
|
23
|
-
* decision by deleting the provisions above and replace them with the notice
|
24
|
-
* and other provisions required by the GPL or the LGPL. If you do not delete
|
25
|
-
* the provisions above, a recipient may use your version of this file under
|
26
|
-
* the terms of any one of the CPL, the GPL or the LGPL.
|
27
|
-
***** END LICENSE BLOCK *****/
|
28
1
|
package org.jruby.mongrel;
|
29
2
|
|
30
3
|
import org.jruby.Ruby;
|
@@ -35,8 +8,10 @@ import org.jruby.RubyNumeric;
|
|
35
8
|
import org.jruby.RubyObject;
|
36
9
|
import org.jruby.RubyString;
|
37
10
|
|
38
|
-
import org.jruby.
|
11
|
+
import org.jruby.anno.JRubyMethod;
|
12
|
+
|
39
13
|
import org.jruby.runtime.ObjectAllocator;
|
14
|
+
import org.jruby.runtime.ThreadContext;
|
40
15
|
import org.jruby.runtime.builtin.IRubyObject;
|
41
16
|
|
42
17
|
import org.jruby.exceptions.RaiseException;
|
@@ -73,16 +48,8 @@ public class Http11 extends RubyObject {
|
|
73
48
|
RubyModule mMongrel = runtime.defineModule("Mongrel");
|
74
49
|
mMongrel.defineClassUnder("HttpParserError",runtime.getClass("IOError"),runtime.getClass("IOError").getAllocator());
|
75
50
|
|
76
|
-
CallbackFactory cf = runtime.callbackFactory(Http11.class);
|
77
|
-
|
78
51
|
RubyClass cHttpParser = mMongrel.defineClassUnder("HttpParser",runtime.getObject(),ALLOCATOR);
|
79
|
-
cHttpParser.
|
80
|
-
cHttpParser.defineFastMethod("reset",cf.getFastMethod("reset"));
|
81
|
-
cHttpParser.defineFastMethod("finish",cf.getFastMethod("finish"));
|
82
|
-
cHttpParser.defineFastMethod("execute",cf.getFastMethod("execute", IRubyObject.class, IRubyObject.class, IRubyObject.class));
|
83
|
-
cHttpParser.defineFastMethod("error?",cf.getFastMethod("has_error"));
|
84
|
-
cHttpParser.defineFastMethod("finished?",cf.getFastMethod("is_finished"));
|
85
|
-
cHttpParser.defineFastMethod("nread",cf.getFastMethod("nread"));
|
52
|
+
cHttpParser.defineAnnotatedMethods(Http11.class);
|
86
53
|
}
|
87
54
|
|
88
55
|
private Ruby runtime;
|
@@ -121,15 +88,15 @@ public class Http11 extends RubyObject {
|
|
121
88
|
v = RubyString.newString(runtime, new ByteList(Http11.this.hp.parser.buffer,value,vlen));
|
122
89
|
f = RubyString.newString(runtime, "HTTP_");
|
123
90
|
ByteList b = new ByteList(Http11.this.hp.parser.buffer,field,flen);
|
124
|
-
for(int i=0,j=b.
|
125
|
-
if((b.
|
126
|
-
b.
|
91
|
+
for(int i = 0,j = b.length();i<j;i++) {
|
92
|
+
if((b.get(i) & 0xFF) == '-') {
|
93
|
+
b.set(i, (byte)'_');
|
127
94
|
} else {
|
128
|
-
b.
|
95
|
+
b.set(i, (byte)Character.toUpperCase((char)b.get(i)));
|
129
96
|
}
|
130
97
|
}
|
131
98
|
f.cat(b);
|
132
|
-
req.
|
99
|
+
req.op_aset(req.getRuntime().getCurrentContext(), f,v);
|
133
100
|
}
|
134
101
|
};
|
135
102
|
|
@@ -137,7 +104,7 @@ public class Http11 extends RubyObject {
|
|
137
104
|
public void call(Object data, int at, int length) {
|
138
105
|
RubyHash req = (RubyHash)data;
|
139
106
|
RubyString val = RubyString.newString(runtime,new ByteList(hp.parser.buffer,at,length));
|
140
|
-
req.
|
107
|
+
req.op_aset(req.getRuntime().getCurrentContext(), runtime.newString("REQUEST_METHOD"),val);
|
141
108
|
}
|
142
109
|
};
|
143
110
|
|
@@ -146,7 +113,7 @@ public class Http11 extends RubyObject {
|
|
146
113
|
RubyHash req = (RubyHash)data;
|
147
114
|
validateMaxLength(length, MAX_REQUEST_URI_LENGTH, MAX_REQUEST_URI_LENGTH_ERR);
|
148
115
|
RubyString val = RubyString.newString(runtime,new ByteList(hp.parser.buffer,at,length));
|
149
|
-
req.
|
116
|
+
req.op_aset(req.getRuntime().getCurrentContext(), runtime.newString("REQUEST_URI"),val);
|
150
117
|
}
|
151
118
|
};
|
152
119
|
|
@@ -155,7 +122,7 @@ public class Http11 extends RubyObject {
|
|
155
122
|
RubyHash req = (RubyHash)data;
|
156
123
|
validateMaxLength(length, MAX_FRAGMENT_LENGTH, MAX_FRAGMENT_LENGTH_ERR);
|
157
124
|
RubyString val = RubyString.newString(runtime,new ByteList(hp.parser.buffer,at,length));
|
158
|
-
req.
|
125
|
+
req.op_aset(req.getRuntime().getCurrentContext(), runtime.newString("FRAGMENT"),val);
|
159
126
|
}
|
160
127
|
};
|
161
128
|
|
@@ -164,7 +131,7 @@ public class Http11 extends RubyObject {
|
|
164
131
|
RubyHash req = (RubyHash)data;
|
165
132
|
validateMaxLength(length, MAX_REQUEST_PATH_LENGTH, MAX_REQUEST_PATH_LENGTH_ERR);
|
166
133
|
RubyString val = RubyString.newString(runtime,new ByteList(hp.parser.buffer,at,length));
|
167
|
-
req.
|
134
|
+
req.op_aset(req.getRuntime().getCurrentContext(), runtime.newString("REQUEST_PATH"),val);
|
168
135
|
}
|
169
136
|
};
|
170
137
|
|
@@ -173,7 +140,7 @@ public class Http11 extends RubyObject {
|
|
173
140
|
RubyHash req = (RubyHash)data;
|
174
141
|
validateMaxLength(length, MAX_QUERY_STRING_LENGTH, MAX_QUERY_STRING_LENGTH_ERR);
|
175
142
|
RubyString val = RubyString.newString(runtime,new ByteList(hp.parser.buffer,at,length));
|
176
|
-
req.
|
143
|
+
req.op_aset(req.getRuntime().getCurrentContext(), runtime.newString("QUERY_STRING"),val);
|
177
144
|
}
|
178
145
|
};
|
179
146
|
|
@@ -181,64 +148,69 @@ public class Http11 extends RubyObject {
|
|
181
148
|
public void call(Object data, int at, int length) {
|
182
149
|
RubyHash req = (RubyHash)data;
|
183
150
|
RubyString val = RubyString.newString(runtime,new ByteList(hp.parser.buffer,at,length));
|
184
|
-
req.
|
151
|
+
req.op_aset(req.getRuntime().getCurrentContext(), runtime.newString("HTTP_VERSION"),val);
|
185
152
|
}
|
186
153
|
};
|
187
154
|
|
188
155
|
private Http11Parser.ElementCB header_done = new Http11Parser.ElementCB() {
|
189
156
|
public void call(Object data, int at, int length) {
|
190
157
|
RubyHash req = (RubyHash)data;
|
158
|
+
ThreadContext context = req.getRuntime().getCurrentContext();
|
191
159
|
IRubyObject temp,ctype,clen;
|
192
160
|
|
193
|
-
clen = req.
|
161
|
+
clen = req.op_aref(context, runtime.newString("HTTP_CONTENT_LENGTH"));
|
194
162
|
if(!clen.isNil()) {
|
195
|
-
req.
|
163
|
+
req.op_aset(context, runtime.newString("CONTENT_LENGTH"),clen);
|
196
164
|
}
|
197
165
|
|
198
|
-
ctype = req.
|
166
|
+
ctype = req.op_aref(context, runtime.newString("HTTP_CONTENT_TYPE"));
|
199
167
|
if(!ctype.isNil()) {
|
200
|
-
req.
|
168
|
+
req.op_aset(context, runtime.newString("CONTENT_TYPE"),ctype);
|
201
169
|
}
|
202
170
|
|
203
|
-
req.
|
204
|
-
if(!(temp = req.
|
171
|
+
req.op_aset(context, runtime.newString("GATEWAY_INTERFACE"),runtime.newString("CGI/1.2"));
|
172
|
+
if(!(temp = req.op_aref(context, runtime.newString("HTTP_HOST"))).isNil()) {
|
205
173
|
String s = temp.toString();
|
206
174
|
int colon = s.indexOf(':');
|
207
175
|
if(colon != -1) {
|
208
|
-
req.
|
209
|
-
req.
|
176
|
+
req.op_aset(context, runtime.newString("SERVER_NAME"),runtime.newString(s.substring(0,colon)));
|
177
|
+
req.op_aset(context, runtime.newString("SERVER_PORT"),runtime.newString(s.substring(colon+1)));
|
210
178
|
} else {
|
211
|
-
req.
|
212
|
-
req.
|
179
|
+
req.op_aset(context, runtime.newString("SERVER_NAME"),temp);
|
180
|
+
req.op_aset(context, runtime.newString("SERVER_PORT"),runtime.newString("80"));
|
213
181
|
}
|
214
182
|
}
|
215
183
|
|
216
184
|
req.setInstanceVariable("@http_body", RubyString.newString(runtime, new ByteList(hp.parser.buffer, at, length)));
|
217
|
-
req.
|
218
|
-
req.
|
185
|
+
req.op_aset(context, runtime.newString("SERVER_PROTOCOL"),runtime.newString("HTTP/1.1"));
|
186
|
+
req.op_aset(context, runtime.newString("SERVER_SOFTWARE"),runtime.newString("Mongrel 1.2.0.pre2"));
|
219
187
|
}
|
220
188
|
};
|
221
189
|
|
190
|
+
@JRubyMethod
|
222
191
|
public IRubyObject initialize() {
|
223
192
|
this.hp.parser.init();
|
224
193
|
return this;
|
225
194
|
}
|
226
195
|
|
196
|
+
@JRubyMethod
|
227
197
|
public IRubyObject reset() {
|
228
198
|
this.hp.parser.init();
|
229
199
|
return runtime.getNil();
|
230
200
|
}
|
231
201
|
|
202
|
+
@JRubyMethod
|
232
203
|
public IRubyObject finish() {
|
233
204
|
this.hp.finish();
|
234
205
|
return this.hp.is_finished() ? runtime.getTrue() : runtime.getFalse();
|
235
206
|
}
|
236
207
|
|
208
|
+
@JRubyMethod
|
237
209
|
public IRubyObject execute(IRubyObject req_hash, IRubyObject data, IRubyObject start) {
|
238
210
|
int from = 0;
|
239
211
|
from = RubyNumeric.fix2int(start);
|
240
212
|
ByteList d = ((RubyString)data).getByteList();
|
241
|
-
if(from >= d.
|
213
|
+
if(from >= d.length()) {
|
242
214
|
throw new RaiseException(runtime, eHttpParserError, "Requested start is after data buffer end.", true);
|
243
215
|
} else {
|
244
216
|
this.hp.parser.data = req_hash;
|
@@ -247,19 +219,22 @@ public class Http11 extends RubyObject {
|
|
247
219
|
if(this.hp.has_error()) {
|
248
220
|
throw new RaiseException(runtime, eHttpParserError, "Invalid HTTP format, parsing fails.", true);
|
249
221
|
} else {
|
250
|
-
return runtime.newFixnum(
|
222
|
+
return runtime.newFixnum(this.hp.parser.nread);
|
251
223
|
}
|
252
224
|
}
|
253
225
|
}
|
254
226
|
|
227
|
+
@JRubyMethod(name = "error?")
|
255
228
|
public IRubyObject has_error() {
|
256
229
|
return this.hp.has_error() ? runtime.getTrue() : runtime.getFalse();
|
257
230
|
}
|
258
231
|
|
232
|
+
@JRubyMethod(name = "finished?")
|
259
233
|
public IRubyObject is_finished() {
|
260
234
|
return this.hp.is_finished() ? runtime.getTrue() : runtime.getFalse();
|
261
235
|
}
|
262
236
|
|
237
|
+
@JRubyMethod
|
263
238
|
public IRubyObject nread() {
|
264
239
|
return runtime.newFixnum(this.hp.parser.nread);
|
265
240
|
}
|
@@ -0,0 +1,486 @@
|
|
1
|
+
|
2
|
+
// line 1 "ext/http11/http11_parser.java.rl"
|
3
|
+
package org.jruby.mongrel;
|
4
|
+
|
5
|
+
import org.jruby.util.ByteList;
|
6
|
+
|
7
|
+
public class Http11Parser {
|
8
|
+
|
9
|
+
/** Machine **/
|
10
|
+
|
11
|
+
|
12
|
+
// line 65 "ext/http11/http11_parser.java.rl"
|
13
|
+
|
14
|
+
|
15
|
+
/** Data **/
|
16
|
+
|
17
|
+
// line 18 "ext/http11/org/jruby/mongrel/Http11Parser.java"
|
18
|
+
private static byte[] init__http_parser_actions_0()
|
19
|
+
{
|
20
|
+
return new byte [] {
|
21
|
+
0, 1, 0, 1, 2, 1, 3, 1, 4, 1, 5, 1,
|
22
|
+
6, 1, 7, 1, 8, 1, 9, 1, 11, 1, 12, 1,
|
23
|
+
13, 2, 0, 8, 2, 1, 2, 2, 4, 5, 2, 10,
|
24
|
+
7, 2, 12, 7, 3, 9, 10, 7
|
25
|
+
};
|
26
|
+
}
|
27
|
+
|
28
|
+
private static final byte _http_parser_actions[] = init__http_parser_actions_0();
|
29
|
+
|
30
|
+
|
31
|
+
private static short[] init__http_parser_key_offsets_0()
|
32
|
+
{
|
33
|
+
return new short [] {
|
34
|
+
0, 0, 8, 17, 27, 29, 30, 31, 32, 33, 34, 36,
|
35
|
+
39, 41, 44, 45, 61, 62, 78, 80, 81, 90, 99, 105,
|
36
|
+
111, 121, 130, 136, 142, 153, 159, 165, 175, 181, 187, 196,
|
37
|
+
205, 211, 217, 226, 235, 244, 253, 262, 271, 280, 289, 298,
|
38
|
+
307, 316, 325, 334, 343, 352, 361, 370, 379, 380
|
39
|
+
};
|
40
|
+
}
|
41
|
+
|
42
|
+
private static final short _http_parser_key_offsets[] = init__http_parser_key_offsets_0();
|
43
|
+
|
44
|
+
|
45
|
+
private static char[] init__http_parser_trans_keys_0()
|
46
|
+
{
|
47
|
+
return new char [] {
|
48
|
+
36, 95, 45, 46, 48, 57, 65, 90, 32, 36, 95, 45,
|
49
|
+
46, 48, 57, 65, 90, 42, 43, 47, 58, 45, 57, 65,
|
50
|
+
90, 97, 122, 32, 35, 72, 84, 84, 80, 47, 48, 57,
|
51
|
+
46, 48, 57, 48, 57, 13, 48, 57, 10, 13, 33, 124,
|
52
|
+
126, 35, 39, 42, 43, 45, 46, 48, 57, 65, 90, 94,
|
53
|
+
122, 10, 33, 58, 124, 126, 35, 39, 42, 43, 45, 46,
|
54
|
+
48, 57, 65, 90, 94, 122, 13, 32, 13, 32, 37, 60,
|
55
|
+
62, 127, 0, 31, 34, 35, 32, 37, 60, 62, 127, 0,
|
56
|
+
31, 34, 35, 48, 57, 65, 70, 97, 102, 48, 57, 65,
|
57
|
+
70, 97, 102, 43, 58, 45, 46, 48, 57, 65, 90, 97,
|
58
|
+
122, 32, 34, 35, 37, 60, 62, 127, 0, 31, 48, 57,
|
59
|
+
65, 70, 97, 102, 48, 57, 65, 70, 97, 102, 32, 34,
|
60
|
+
35, 37, 59, 60, 62, 63, 127, 0, 31, 48, 57, 65,
|
61
|
+
70, 97, 102, 48, 57, 65, 70, 97, 102, 32, 34, 35,
|
62
|
+
37, 60, 62, 63, 127, 0, 31, 48, 57, 65, 70, 97,
|
63
|
+
102, 48, 57, 65, 70, 97, 102, 32, 34, 35, 37, 60,
|
64
|
+
62, 127, 0, 31, 32, 34, 35, 37, 60, 62, 127, 0,
|
65
|
+
31, 48, 57, 65, 70, 97, 102, 48, 57, 65, 70, 97,
|
66
|
+
102, 32, 36, 95, 45, 46, 48, 57, 65, 90, 32, 36,
|
67
|
+
95, 45, 46, 48, 57, 65, 90, 32, 36, 95, 45, 46,
|
68
|
+
48, 57, 65, 90, 32, 36, 95, 45, 46, 48, 57, 65,
|
69
|
+
90, 32, 36, 95, 45, 46, 48, 57, 65, 90, 32, 36,
|
70
|
+
95, 45, 46, 48, 57, 65, 90, 32, 36, 95, 45, 46,
|
71
|
+
48, 57, 65, 90, 32, 36, 95, 45, 46, 48, 57, 65,
|
72
|
+
90, 32, 36, 95, 45, 46, 48, 57, 65, 90, 32, 36,
|
73
|
+
95, 45, 46, 48, 57, 65, 90, 32, 36, 95, 45, 46,
|
74
|
+
48, 57, 65, 90, 32, 36, 95, 45, 46, 48, 57, 65,
|
75
|
+
90, 32, 36, 95, 45, 46, 48, 57, 65, 90, 32, 36,
|
76
|
+
95, 45, 46, 48, 57, 65, 90, 32, 36, 95, 45, 46,
|
77
|
+
48, 57, 65, 90, 32, 36, 95, 45, 46, 48, 57, 65,
|
78
|
+
90, 32, 36, 95, 45, 46, 48, 57, 65, 90, 32, 36,
|
79
|
+
95, 45, 46, 48, 57, 65, 90, 32, 0
|
80
|
+
};
|
81
|
+
}
|
82
|
+
|
83
|
+
private static final char _http_parser_trans_keys[] = init__http_parser_trans_keys_0();
|
84
|
+
|
85
|
+
|
86
|
+
private static byte[] init__http_parser_single_lengths_0()
|
87
|
+
{
|
88
|
+
return new byte [] {
|
89
|
+
0, 2, 3, 4, 2, 1, 1, 1, 1, 1, 0, 1,
|
90
|
+
0, 1, 1, 4, 1, 4, 2, 1, 5, 5, 0, 0,
|
91
|
+
2, 7, 0, 0, 9, 0, 0, 8, 0, 0, 7, 7,
|
92
|
+
0, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
|
93
|
+
3, 3, 3, 3, 3, 3, 3, 3, 1, 0
|
94
|
+
};
|
95
|
+
}
|
96
|
+
|
97
|
+
private static final byte _http_parser_single_lengths[] = init__http_parser_single_lengths_0();
|
98
|
+
|
99
|
+
|
100
|
+
private static byte[] init__http_parser_range_lengths_0()
|
101
|
+
{
|
102
|
+
return new byte [] {
|
103
|
+
0, 3, 3, 3, 0, 0, 0, 0, 0, 0, 1, 1,
|
104
|
+
1, 1, 0, 6, 0, 6, 0, 0, 2, 2, 3, 3,
|
105
|
+
4, 1, 3, 3, 1, 3, 3, 1, 3, 3, 1, 1,
|
106
|
+
3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
|
107
|
+
3, 3, 3, 3, 3, 3, 3, 3, 0, 0
|
108
|
+
};
|
109
|
+
}
|
110
|
+
|
111
|
+
private static final byte _http_parser_range_lengths[] = init__http_parser_range_lengths_0();
|
112
|
+
|
113
|
+
|
114
|
+
private static short[] init__http_parser_index_offsets_0()
|
115
|
+
{
|
116
|
+
return new short [] {
|
117
|
+
0, 0, 6, 13, 21, 24, 26, 28, 30, 32, 34, 36,
|
118
|
+
39, 41, 44, 46, 57, 59, 70, 73, 75, 83, 91, 95,
|
119
|
+
99, 106, 115, 119, 123, 134, 138, 142, 152, 156, 160, 169,
|
120
|
+
178, 182, 186, 193, 200, 207, 214, 221, 228, 235, 242, 249,
|
121
|
+
256, 263, 270, 277, 284, 291, 298, 305, 312, 314
|
122
|
+
};
|
123
|
+
}
|
124
|
+
|
125
|
+
private static final short _http_parser_index_offsets[] = init__http_parser_index_offsets_0();
|
126
|
+
|
127
|
+
|
128
|
+
private static byte[] init__http_parser_indicies_0()
|
129
|
+
{
|
130
|
+
return new byte [] {
|
131
|
+
0, 0, 0, 0, 0, 1, 2, 3, 3, 3, 3, 3,
|
132
|
+
1, 4, 5, 6, 7, 5, 5, 5, 1, 8, 9, 1,
|
133
|
+
10, 1, 11, 1, 12, 1, 13, 1, 14, 1, 15, 1,
|
134
|
+
16, 15, 1, 17, 1, 18, 17, 1, 19, 1, 20, 21,
|
135
|
+
21, 21, 21, 21, 21, 21, 21, 21, 1, 22, 1, 23,
|
136
|
+
24, 23, 23, 23, 23, 23, 23, 23, 23, 1, 26, 27,
|
137
|
+
25, 29, 28, 30, 32, 1, 1, 1, 1, 1, 31, 33,
|
138
|
+
35, 1, 1, 1, 1, 1, 34, 36, 36, 36, 1, 34,
|
139
|
+
34, 34, 1, 37, 38, 37, 37, 37, 37, 1, 8, 1,
|
140
|
+
9, 39, 1, 1, 1, 1, 38, 40, 40, 40, 1, 38,
|
141
|
+
38, 38, 1, 41, 1, 43, 44, 45, 1, 1, 46, 1,
|
142
|
+
1, 42, 47, 47, 47, 1, 42, 42, 42, 1, 8, 1,
|
143
|
+
9, 49, 1, 1, 50, 1, 1, 48, 51, 51, 51, 1,
|
144
|
+
48, 48, 48, 1, 52, 1, 54, 55, 1, 1, 1, 1,
|
145
|
+
53, 56, 1, 58, 59, 1, 1, 1, 1, 57, 60, 60,
|
146
|
+
60, 1, 57, 57, 57, 1, 2, 61, 61, 61, 61, 61,
|
147
|
+
1, 2, 62, 62, 62, 62, 62, 1, 2, 63, 63, 63,
|
148
|
+
63, 63, 1, 2, 64, 64, 64, 64, 64, 1, 2, 65,
|
149
|
+
65, 65, 65, 65, 1, 2, 66, 66, 66, 66, 66, 1,
|
150
|
+
2, 67, 67, 67, 67, 67, 1, 2, 68, 68, 68, 68,
|
151
|
+
68, 1, 2, 69, 69, 69, 69, 69, 1, 2, 70, 70,
|
152
|
+
70, 70, 70, 1, 2, 71, 71, 71, 71, 71, 1, 2,
|
153
|
+
72, 72, 72, 72, 72, 1, 2, 73, 73, 73, 73, 73,
|
154
|
+
1, 2, 74, 74, 74, 74, 74, 1, 2, 75, 75, 75,
|
155
|
+
75, 75, 1, 2, 76, 76, 76, 76, 76, 1, 2, 77,
|
156
|
+
77, 77, 77, 77, 1, 2, 78, 78, 78, 78, 78, 1,
|
157
|
+
2, 1, 1, 0
|
158
|
+
};
|
159
|
+
}
|
160
|
+
|
161
|
+
private static final byte _http_parser_indicies[] = init__http_parser_indicies_0();
|
162
|
+
|
163
|
+
|
164
|
+
private static byte[] init__http_parser_trans_targs_0()
|
165
|
+
{
|
166
|
+
return new byte [] {
|
167
|
+
2, 0, 3, 38, 4, 24, 28, 25, 5, 20, 6, 7,
|
168
|
+
8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 57, 17,
|
169
|
+
18, 19, 14, 18, 19, 14, 5, 21, 22, 5, 21, 22,
|
170
|
+
23, 24, 25, 26, 27, 5, 28, 20, 29, 31, 34, 30,
|
171
|
+
31, 32, 34, 33, 5, 35, 20, 36, 5, 35, 20, 36,
|
172
|
+
37, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49,
|
173
|
+
50, 51, 52, 53, 54, 55, 56
|
174
|
+
};
|
175
|
+
}
|
176
|
+
|
177
|
+
private static final byte _http_parser_trans_targs[] = init__http_parser_trans_targs_0();
|
178
|
+
|
179
|
+
|
180
|
+
private static byte[] init__http_parser_trans_actions_0()
|
181
|
+
{
|
182
|
+
return new byte [] {
|
183
|
+
1, 0, 11, 0, 1, 1, 1, 1, 13, 13, 1, 0,
|
184
|
+
0, 0, 0, 0, 0, 0, 19, 0, 0, 28, 23, 3,
|
185
|
+
5, 7, 31, 7, 0, 9, 25, 1, 1, 15, 0, 0,
|
186
|
+
0, 0, 0, 0, 0, 37, 0, 37, 0, 21, 21, 0,
|
187
|
+
0, 0, 0, 0, 40, 17, 40, 17, 34, 0, 34, 0,
|
188
|
+
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
189
|
+
0, 0, 0, 0, 0, 0, 0
|
190
|
+
};
|
191
|
+
}
|
192
|
+
|
193
|
+
private static final byte _http_parser_trans_actions[] = init__http_parser_trans_actions_0();
|
194
|
+
|
195
|
+
|
196
|
+
static final int http_parser_start = 1;
|
197
|
+
static final int http_parser_first_final = 57;
|
198
|
+
static final int http_parser_error = 0;
|
199
|
+
|
200
|
+
static final int http_parser_en_main = 1;
|
201
|
+
|
202
|
+
|
203
|
+
// line 69 "ext/http11/http11_parser.java.rl"
|
204
|
+
|
205
|
+
public static interface ElementCB {
|
206
|
+
public void call(Object data, int at, int length);
|
207
|
+
}
|
208
|
+
|
209
|
+
public static interface FieldCB {
|
210
|
+
public void call(Object data, int field, int flen, int value, int vlen);
|
211
|
+
}
|
212
|
+
|
213
|
+
public static class HttpParser {
|
214
|
+
int cs;
|
215
|
+
int body_start;
|
216
|
+
int content_len;
|
217
|
+
int nread;
|
218
|
+
int mark;
|
219
|
+
int field_start;
|
220
|
+
int field_len;
|
221
|
+
int query_start;
|
222
|
+
|
223
|
+
Object data;
|
224
|
+
ByteList buffer;
|
225
|
+
|
226
|
+
public FieldCB http_field;
|
227
|
+
public ElementCB request_method;
|
228
|
+
public ElementCB request_uri;
|
229
|
+
public ElementCB fragment;
|
230
|
+
public ElementCB request_path;
|
231
|
+
public ElementCB query_string;
|
232
|
+
public ElementCB http_version;
|
233
|
+
public ElementCB header_done;
|
234
|
+
|
235
|
+
public void init() {
|
236
|
+
cs = 0;
|
237
|
+
|
238
|
+
|
239
|
+
// line 240 "ext/http11/org/jruby/mongrel/Http11Parser.java"
|
240
|
+
{
|
241
|
+
cs = http_parser_start;
|
242
|
+
}
|
243
|
+
|
244
|
+
// line 104 "ext/http11/http11_parser.java.rl"
|
245
|
+
|
246
|
+
body_start = 0;
|
247
|
+
content_len = 0;
|
248
|
+
mark = 0;
|
249
|
+
nread = 0;
|
250
|
+
field_len = 0;
|
251
|
+
field_start = 0;
|
252
|
+
}
|
253
|
+
}
|
254
|
+
|
255
|
+
public final HttpParser parser = new HttpParser();
|
256
|
+
|
257
|
+
public int execute(ByteList buffer, int off) {
|
258
|
+
int p, pe;
|
259
|
+
int cs = parser.cs;
|
260
|
+
int len = buffer.length();
|
261
|
+
assert off<=len : "offset past end of buffer";
|
262
|
+
|
263
|
+
p = off;
|
264
|
+
pe = len;
|
265
|
+
byte[] data = buffer.unsafeBytes();
|
266
|
+
parser.buffer = buffer;
|
267
|
+
|
268
|
+
|
269
|
+
// line 270 "ext/http11/org/jruby/mongrel/Http11Parser.java"
|
270
|
+
{
|
271
|
+
int _klen;
|
272
|
+
int _trans = 0;
|
273
|
+
int _acts;
|
274
|
+
int _nacts;
|
275
|
+
int _keys;
|
276
|
+
int _goto_targ = 0;
|
277
|
+
|
278
|
+
_goto: while (true) {
|
279
|
+
switch ( _goto_targ ) {
|
280
|
+
case 0:
|
281
|
+
if ( p == pe ) {
|
282
|
+
_goto_targ = 4;
|
283
|
+
continue _goto;
|
284
|
+
}
|
285
|
+
if ( cs == 0 ) {
|
286
|
+
_goto_targ = 5;
|
287
|
+
continue _goto;
|
288
|
+
}
|
289
|
+
case 1:
|
290
|
+
_match: do {
|
291
|
+
_keys = _http_parser_key_offsets[cs];
|
292
|
+
_trans = _http_parser_index_offsets[cs];
|
293
|
+
_klen = _http_parser_single_lengths[cs];
|
294
|
+
if ( _klen > 0 ) {
|
295
|
+
int _lower = _keys;
|
296
|
+
int _mid;
|
297
|
+
int _upper = _keys + _klen - 1;
|
298
|
+
while (true) {
|
299
|
+
if ( _upper < _lower )
|
300
|
+
break;
|
301
|
+
|
302
|
+
_mid = _lower + ((_upper-_lower) >> 1);
|
303
|
+
if ( data[p] < _http_parser_trans_keys[_mid] )
|
304
|
+
_upper = _mid - 1;
|
305
|
+
else if ( data[p] > _http_parser_trans_keys[_mid] )
|
306
|
+
_lower = _mid + 1;
|
307
|
+
else {
|
308
|
+
_trans += (_mid - _keys);
|
309
|
+
break _match;
|
310
|
+
}
|
311
|
+
}
|
312
|
+
_keys += _klen;
|
313
|
+
_trans += _klen;
|
314
|
+
}
|
315
|
+
|
316
|
+
_klen = _http_parser_range_lengths[cs];
|
317
|
+
if ( _klen > 0 ) {
|
318
|
+
int _lower = _keys;
|
319
|
+
int _mid;
|
320
|
+
int _upper = _keys + (_klen<<1) - 2;
|
321
|
+
while (true) {
|
322
|
+
if ( _upper < _lower )
|
323
|
+
break;
|
324
|
+
|
325
|
+
_mid = _lower + (((_upper-_lower) >> 1) & ~1);
|
326
|
+
if ( data[p] < _http_parser_trans_keys[_mid] )
|
327
|
+
_upper = _mid - 2;
|
328
|
+
else if ( data[p] > _http_parser_trans_keys[_mid+1] )
|
329
|
+
_lower = _mid + 2;
|
330
|
+
else {
|
331
|
+
_trans += ((_mid - _keys)>>1);
|
332
|
+
break _match;
|
333
|
+
}
|
334
|
+
}
|
335
|
+
_trans += _klen;
|
336
|
+
}
|
337
|
+
} while (false);
|
338
|
+
|
339
|
+
_trans = _http_parser_indicies[_trans];
|
340
|
+
cs = _http_parser_trans_targs[_trans];
|
341
|
+
|
342
|
+
if ( _http_parser_trans_actions[_trans] != 0 ) {
|
343
|
+
_acts = _http_parser_trans_actions[_trans];
|
344
|
+
_nacts = (int) _http_parser_actions[_acts++];
|
345
|
+
while ( _nacts-- > 0 )
|
346
|
+
{
|
347
|
+
switch ( _http_parser_actions[_acts++] )
|
348
|
+
{
|
349
|
+
case 0:
|
350
|
+
// line 13 "ext/http11/http11_parser.java.rl"
|
351
|
+
{parser.mark = p; }
|
352
|
+
break;
|
353
|
+
case 1:
|
354
|
+
// line 15 "ext/http11/http11_parser.java.rl"
|
355
|
+
{ parser.field_start = p; }
|
356
|
+
break;
|
357
|
+
case 2:
|
358
|
+
// line 16 "ext/http11/http11_parser.java.rl"
|
359
|
+
{ /* FIXME stub */ }
|
360
|
+
break;
|
361
|
+
case 3:
|
362
|
+
// line 17 "ext/http11/http11_parser.java.rl"
|
363
|
+
{
|
364
|
+
parser.field_len = p-parser.field_start;
|
365
|
+
}
|
366
|
+
break;
|
367
|
+
case 4:
|
368
|
+
// line 21 "ext/http11/http11_parser.java.rl"
|
369
|
+
{ parser.mark = p; }
|
370
|
+
break;
|
371
|
+
case 5:
|
372
|
+
// line 22 "ext/http11/http11_parser.java.rl"
|
373
|
+
{
|
374
|
+
if(parser.http_field != null) {
|
375
|
+
parser.http_field.call(parser.data, parser.field_start, parser.field_len, parser.mark, p-parser.mark);
|
376
|
+
}
|
377
|
+
}
|
378
|
+
break;
|
379
|
+
case 6:
|
380
|
+
// line 27 "ext/http11/http11_parser.java.rl"
|
381
|
+
{
|
382
|
+
if(parser.request_method != null)
|
383
|
+
parser.request_method.call(parser.data, parser.mark, p-parser.mark);
|
384
|
+
}
|
385
|
+
break;
|
386
|
+
case 7:
|
387
|
+
// line 31 "ext/http11/http11_parser.java.rl"
|
388
|
+
{
|
389
|
+
if(parser.request_uri != null)
|
390
|
+
parser.request_uri.call(parser.data, parser.mark, p-parser.mark);
|
391
|
+
}
|
392
|
+
break;
|
393
|
+
case 8:
|
394
|
+
// line 35 "ext/http11/http11_parser.java.rl"
|
395
|
+
{
|
396
|
+
if(parser.fragment != null)
|
397
|
+
parser.fragment.call(parser.data, parser.mark, p-parser.mark);
|
398
|
+
}
|
399
|
+
break;
|
400
|
+
case 9:
|
401
|
+
// line 40 "ext/http11/http11_parser.java.rl"
|
402
|
+
{parser.query_start = p; }
|
403
|
+
break;
|
404
|
+
case 10:
|
405
|
+
// line 41 "ext/http11/http11_parser.java.rl"
|
406
|
+
{
|
407
|
+
if(parser.query_string != null)
|
408
|
+
parser.query_string.call(parser.data, parser.query_start, p-parser.query_start);
|
409
|
+
}
|
410
|
+
break;
|
411
|
+
case 11:
|
412
|
+
// line 46 "ext/http11/http11_parser.java.rl"
|
413
|
+
{
|
414
|
+
if(parser.http_version != null)
|
415
|
+
parser.http_version.call(parser.data, parser.mark, p-parser.mark);
|
416
|
+
}
|
417
|
+
break;
|
418
|
+
case 12:
|
419
|
+
// line 51 "ext/http11/http11_parser.java.rl"
|
420
|
+
{
|
421
|
+
if(parser.request_path != null)
|
422
|
+
parser.request_path.call(parser.data, parser.mark, p-parser.mark);
|
423
|
+
}
|
424
|
+
break;
|
425
|
+
case 13:
|
426
|
+
// line 56 "ext/http11/http11_parser.java.rl"
|
427
|
+
{
|
428
|
+
parser.body_start = p + 1;
|
429
|
+
if(parser.header_done != null)
|
430
|
+
parser.header_done.call(parser.data, p + 1, pe - p - 1);
|
431
|
+
{ p += 1; _goto_targ = 5; if (true) continue _goto;}
|
432
|
+
}
|
433
|
+
break;
|
434
|
+
// line 435 "ext/http11/org/jruby/mongrel/Http11Parser.java"
|
435
|
+
}
|
436
|
+
}
|
437
|
+
}
|
438
|
+
|
439
|
+
case 2:
|
440
|
+
if ( cs == 0 ) {
|
441
|
+
_goto_targ = 5;
|
442
|
+
continue _goto;
|
443
|
+
}
|
444
|
+
if ( ++p != pe ) {
|
445
|
+
_goto_targ = 1;
|
446
|
+
continue _goto;
|
447
|
+
}
|
448
|
+
case 4:
|
449
|
+
case 5:
|
450
|
+
}
|
451
|
+
break; }
|
452
|
+
}
|
453
|
+
|
454
|
+
// line 128 "ext/http11/http11_parser.java.rl"
|
455
|
+
|
456
|
+
parser.cs = cs;
|
457
|
+
parser.nread += (p - off);
|
458
|
+
|
459
|
+
assert p <= pe : "buffer overflow after parsing execute";
|
460
|
+
assert parser.nread <= len : "nread longer than length";
|
461
|
+
assert parser.body_start <= len : "body starts after buffer end";
|
462
|
+
assert parser.mark < len : "mark is after buffer end";
|
463
|
+
assert parser.field_len <= len : "field has length longer than whole buffer";
|
464
|
+
assert parser.field_start < len : "field starts after buffer end";
|
465
|
+
|
466
|
+
return parser.nread;
|
467
|
+
}
|
468
|
+
|
469
|
+
public int finish() {
|
470
|
+
if(has_error()) {
|
471
|
+
return -1;
|
472
|
+
} else if(is_finished()) {
|
473
|
+
return 1;
|
474
|
+
} else {
|
475
|
+
return 0;
|
476
|
+
}
|
477
|
+
}
|
478
|
+
|
479
|
+
public boolean has_error() {
|
480
|
+
return parser.cs == http_parser_error;
|
481
|
+
}
|
482
|
+
|
483
|
+
public boolean is_finished() {
|
484
|
+
return parser.cs == http_parser_first_final;
|
485
|
+
}
|
486
|
+
}
|