http_parser.rb 0.5.1-x86-mswin32-60 → 0.5.2-x86-mswin32-60
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/Gemfile.lock +16 -16
- data/LICENSE-MIT +20 -0
- data/ext/ruby_http_parser/org/ruby_http_parser/RubyHttpParser.java +68 -11
- data/ext/ruby_http_parser/ruby_http_parser.c +74 -6
- data/ext/ruby_http_parser/vendor/http-parser-java/LICENSE-MIT +26 -1
- data/ext/ruby_http_parser/vendor/http-parser-java/README.md +23 -143
- data/ext/ruby_http_parser/vendor/http-parser-java/TODO +3 -0
- data/ext/ruby_http_parser/vendor/http-parser-java/build.xml +74 -0
- data/ext/ruby_http_parser/vendor/http-parser-java/http_parser.c +115 -61
- data/ext/ruby_http_parser/vendor/http-parser-java/http_parser.h +19 -3
- data/ext/ruby_http_parser/vendor/http-parser-java/src/impl/http_parser/HTTPCallback.java +8 -0
- data/ext/ruby_http_parser/vendor/http-parser-java/src/impl/http_parser/HTTPDataCallback.java +34 -0
- data/ext/ruby_http_parser/vendor/http-parser-java/src/impl/http_parser/HTTPErrorCallback.java +12 -0
- data/ext/ruby_http_parser/vendor/http-parser-java/src/impl/http_parser/HTTPException.java +4 -2
- data/ext/ruby_http_parser/vendor/http-parser-java/src/impl/http_parser/HTTPMethod.java +64 -52
- data/ext/ruby_http_parser/vendor/http-parser-java/src/impl/http_parser/HTTPParser.java +5 -0
- data/ext/ruby_http_parser/vendor/http-parser-java/src/impl/http_parser/ParserSettings.java +323 -0
- data/ext/ruby_http_parser/vendor/http-parser-java/src/impl/http_parser/{lolevel/Util.java → Util.java} +27 -28
- data/ext/ruby_http_parser/vendor/http-parser-java/src/impl/http_parser/lolevel/HTTPParser.java +259 -85
- data/ext/ruby_http_parser/vendor/http-parser-java/src/impl/http_parser/lolevel/ParserSettings.java +1 -0
- data/ext/ruby_http_parser/vendor/http-parser-java/src/test/http_parser/lolevel/Message.java +324 -0
- data/ext/ruby_http_parser/vendor/http-parser-java/src/test/http_parser/lolevel/Requests.java +69 -0
- data/ext/ruby_http_parser/vendor/http-parser-java/src/test/http_parser/lolevel/Responses.java +51 -0
- data/ext/ruby_http_parser/vendor/http-parser-java/src/test/http_parser/lolevel/Test.java +15 -0
- data/ext/ruby_http_parser/vendor/http-parser-java/src/test/http_parser/lolevel/TestHeaderOverflowError.java +47 -0
- data/ext/ruby_http_parser/vendor/http-parser-java/src/test/http_parser/lolevel/TestLoaderNG.java +183 -447
- data/ext/ruby_http_parser/vendor/http-parser-java/src/test/http_parser/lolevel/TestNoOverflowLongBody.java +61 -0
- data/ext/ruby_http_parser/vendor/http-parser-java/src/test/http_parser/lolevel/UnitTest.java +2 -1
- data/ext/ruby_http_parser/vendor/http-parser-java/src/test/http_parser/lolevel/Upgrade.java +26 -0
- data/ext/ruby_http_parser/vendor/http-parser-java/src/test/http_parser/lolevel/Util.java +165 -0
- data/ext/ruby_http_parser/vendor/http-parser-java/src/test/http_parser/lolevel/WrongContentLength.java +58 -0
- data/ext/ruby_http_parser/vendor/http-parser-java/test.c +232 -29
- data/ext/ruby_http_parser/vendor/http-parser-java/test_permutations +1 -1
- data/ext/ruby_http_parser/vendor/http-parser-java/test_unit +1 -1
- data/ext/ruby_http_parser/vendor/http-parser-java/test_utf8 +1 -0
- data/ext/ruby_http_parser/vendor/http-parser-java/tests.dumped +154 -7
- data/ext/ruby_http_parser/vendor/http-parser-java/tests.utf8 +17 -0
- data/ext/ruby_http_parser/vendor/http-parser/LICENSE-MIT +1 -1
- data/ext/ruby_http_parser/vendor/http-parser/http_parser.c +52 -10
- data/ext/ruby_http_parser/vendor/http-parser/http_parser.h +3 -1
- data/ext/ruby_http_parser/vendor/http-parser/test.c +89 -3
- data/http_parser.rb.gemspec +8 -2
- data/lib/http_parser.rb +17 -0
- data/spec/parser_spec.rb +97 -6
- data/tasks/compile.rake +3 -1
- metadata +83 -20
- data/ext/ruby_http_parser/vendor/http-parser-java/CONTRIBUTIONS +0 -4
@@ -0,0 +1,15 @@
|
|
1
|
+
package http_parser.lolevel;
|
2
|
+
|
3
|
+
|
4
|
+
public class Test {
|
5
|
+
public static void main (String [] args) {
|
6
|
+
UnitTest.test();
|
7
|
+
TestHeaderOverflowError.test();
|
8
|
+
TestNoOverflowLongBody.test();
|
9
|
+
Responses.test();
|
10
|
+
//Requests.test();
|
11
|
+
Upgrade.test();
|
12
|
+
WrongContentLength.test();
|
13
|
+
}
|
14
|
+
|
15
|
+
}
|
@@ -0,0 +1,47 @@
|
|
1
|
+
package http_parser.lolevel;
|
2
|
+
|
3
|
+
import java.nio.*;
|
4
|
+
|
5
|
+
import static http_parser.lolevel.Util.*;
|
6
|
+
|
7
|
+
public class TestHeaderOverflowError {
|
8
|
+
|
9
|
+
public static void test (http_parser.ParserType type) {
|
10
|
+
HTTPParser parser = new HTTPParser(type);
|
11
|
+
ByteBuffer buf = getBytes(type);
|
12
|
+
|
13
|
+
int numbytes = buf.limit();
|
14
|
+
|
15
|
+
parser.execute(Util.SETTINGS_NULL, buf);
|
16
|
+
|
17
|
+
check(numbytes == buf.position());
|
18
|
+
|
19
|
+
buf = buffer("header-key: header-value\r\n");
|
20
|
+
numbytes = buf.limit();
|
21
|
+
for (int i = 0; i!= 1000; ++i) {
|
22
|
+
parser.execute(Util.SETTINGS_NULL, buf);
|
23
|
+
check(numbytes == buf.position());
|
24
|
+
|
25
|
+
buf.rewind();
|
26
|
+
|
27
|
+
}
|
28
|
+
}
|
29
|
+
|
30
|
+
static ByteBuffer getBytes (http_parser.ParserType type) {
|
31
|
+
if (http_parser.ParserType.HTTP_BOTH == type) {
|
32
|
+
throw new RuntimeException("only HTTP_REQUEST and HTTP_RESPONSE");
|
33
|
+
}
|
34
|
+
|
35
|
+
if (http_parser.ParserType.HTTP_REQUEST == type) {
|
36
|
+
return buffer("GET / HTTP/1.1\r\n");
|
37
|
+
}
|
38
|
+
return buffer("HTTP/1.0 200 OK\r\n");
|
39
|
+
}
|
40
|
+
|
41
|
+
public static void test () {
|
42
|
+
test(http_parser.ParserType.HTTP_REQUEST);
|
43
|
+
test(http_parser.ParserType.HTTP_RESPONSE);
|
44
|
+
}
|
45
|
+
|
46
|
+
|
47
|
+
}
|
data/ext/ruby_http_parser/vendor/http-parser-java/src/test/http_parser/lolevel/TestLoaderNG.java
CHANGED
@@ -20,6 +20,10 @@ package http_parser.lolevel;
|
|
20
20
|
|
21
21
|
import java.io.FileReader;
|
22
22
|
import java.io.BufferedReader;
|
23
|
+
import java.io.StringReader;
|
24
|
+
import java.io.Reader;
|
25
|
+
import java.io.Reader;
|
26
|
+
import java.io.IOException;
|
23
27
|
|
24
28
|
import java.util.*;
|
25
29
|
import java.util.regex.*;
|
@@ -30,458 +34,190 @@ import http_parser.HTTPMethod;
|
|
30
34
|
import http_parser.ParserType;
|
31
35
|
|
32
36
|
public class TestLoaderNG {
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
if ("".equals(line.trim())) {
|
48
|
-
list.add (curr);
|
49
|
-
curr = new Test();
|
50
|
-
continue;
|
51
|
-
}
|
52
|
-
Matcher m = pattern.matcher(line);
|
53
|
-
if (m.matches()) {
|
54
|
-
// you can not be fucking serious!?
|
55
|
-
// this has got to be the most retarded regex
|
56
|
-
// interface in the history of the world ...
|
57
|
-
// (though I'm sure there's worse c++ regexp libs...)
|
58
|
-
MatchResult r = m.toMatchResult();
|
59
|
-
String key = r.group(1).trim();
|
60
|
-
String value = r.group(2).trim();
|
61
|
-
if ("name".equals(key)) {curr.name = value;}
|
62
|
-
else if ("raw".equals(key)) {curr.raw = toByteArray(value);} //!
|
63
|
-
else if ("type".equals(key)) {curr.type = ParserType.parse(value);}
|
64
|
-
else if ("method".equals(key)) {curr.method = HTTPMethod.parse(value);}
|
65
|
-
else if ("status_code".equals(key)) {curr.status_code = Integer.parseInt(value);}
|
66
|
-
else if ("request_path".equals(key)) {curr.request_path = value;}
|
67
|
-
else if ("request_url".equals(key)) {curr.request_url = value;}
|
68
|
-
|
69
|
-
else if ("fragment".equals(key)) {curr.fragment = value;}
|
70
|
-
else if ("query_string".equals(key)) {curr.query_string = value;}
|
71
|
-
else if ("body".equals(key)) {curr.body = toByteArray(value);} //!
|
72
|
-
else if ("body_size".equals(key)) {curr.body_size = Integer.parseInt(value);}
|
73
|
-
else if (key.startsWith("header")) {
|
74
|
-
String [] h = getHeader(value);
|
75
|
-
curr.header.put(h[0], h[1]);
|
76
|
-
}
|
77
|
-
else if ("should_keep_alive".equals(key))
|
78
|
-
{curr.should_keep_alive = (1 == Integer.parseInt(value));}
|
79
|
-
else if ("upgrade".equals(key)) {curr.upgrade = (1 == Integer.parseInt(value));}
|
80
|
-
else if ("http_major".equals(key)) {curr.http_major = Integer.parseInt(value);}
|
81
|
-
else if ("http_minor".equals(key)) {curr.http_minor = Integer.parseInt(value);}
|
82
|
-
} else {
|
83
|
-
p("WTF?"+line);
|
84
|
-
}
|
85
|
-
|
86
|
-
}
|
87
|
-
return list;
|
88
|
-
}
|
89
|
-
|
90
|
-
String [] getHeader(String value) {
|
91
|
-
// { "Host": "0.0.0.0=5000"}
|
92
|
-
Pattern p = Pattern.compile("\\{ ?\"([^\"]*)\": ?\"([^\"]*)\"}");
|
93
|
-
Matcher m = p.matcher(value);
|
94
|
-
if (!m.matches()) {
|
95
|
-
p(value);
|
96
|
-
throw new RuntimeException("something wrong");
|
97
|
-
}
|
98
|
-
String [] result = new String[2];
|
99
|
-
MatchResult r = m.toMatchResult();
|
100
|
-
result[0] = r.group(1).trim();
|
101
|
-
result[1] = r.group(2).trim();
|
102
|
-
return result;
|
103
|
-
}
|
104
|
-
|
105
|
-
static final byte BSLASH = 0x5c;
|
106
|
-
static final byte QUOT = 0x22;
|
107
|
-
static final byte CR = 0x0d;
|
108
|
-
static final byte LF = 0x0a;
|
109
|
-
static final byte n = 0x6e;
|
110
|
-
static final byte r = 0x72;
|
111
|
-
|
112
|
-
static final Byte[] JAVA_GENERICS_ROCK_HARD = new Byte[0];
|
113
|
-
|
114
|
-
|
115
|
-
static byte [] toByteArray (String quotedString) {
|
116
|
-
ArrayList<Byte> bytes = new ArrayList<Byte>();
|
117
|
-
String s = quotedString.substring(1, quotedString.length()-1);
|
118
|
-
byte [] byts = s.getBytes(java.nio.charset.Charset.forName("ASCII"));
|
119
|
-
boolean escaped = false;
|
120
|
-
for (byte b : byts) {
|
121
|
-
switch (b) {
|
122
|
-
case BSLASH:
|
123
|
-
escaped = true;
|
124
|
-
break;
|
125
|
-
case n:
|
126
|
-
if (escaped) {
|
127
|
-
bytes.add(LF);
|
128
|
-
escaped = false;
|
129
|
-
} else {
|
130
|
-
bytes.add(b);
|
131
|
-
}
|
132
|
-
break;
|
133
|
-
case r:
|
134
|
-
if (escaped) {
|
135
|
-
escaped = false;
|
136
|
-
bytes.add(CR);
|
137
|
-
} else {
|
138
|
-
bytes.add(b);
|
139
|
-
}
|
140
|
-
break;
|
141
|
-
case QUOT:
|
142
|
-
escaped = false;
|
143
|
-
bytes.add(QUOT);
|
144
|
-
break;
|
145
|
-
default:
|
146
|
-
bytes.add(b);
|
147
|
-
}
|
148
|
-
|
149
|
-
}
|
150
|
-
//Byte [] fuckyou = bytes.toArray(JAVA_GENERICS_ROCK_HARD);
|
151
|
-
//return (byte[])fuckyou;
|
152
|
-
byts = new byte[bytes.size()];
|
153
|
-
int i = 0;
|
154
|
-
for (Byte b : bytes) {
|
155
|
-
byts[i++]=b;
|
156
|
-
// OMG, WFTBBQ!?
|
157
|
-
}
|
158
|
-
return byts;
|
159
|
-
}
|
160
|
-
|
161
|
-
public static void main(String [] args) throws Throwable {
|
162
|
-
TestLoaderNG l = new TestLoaderNG(args[0]);
|
163
|
-
List<Test> ts = l.load();
|
164
|
-
|
165
|
-
for (Test t : ts) {
|
166
|
-
t.execute_permutations();
|
167
|
-
// t.execute();
|
168
|
-
// System.exit(0);
|
169
|
-
}
|
170
|
-
}
|
171
|
-
|
172
|
-
|
173
|
-
class Test {
|
174
|
-
String name;
|
175
|
-
byte [] raw;
|
176
|
-
ParserType type;
|
177
|
-
HTTPMethod method;
|
178
|
-
int status_code;
|
179
|
-
String request_path; // byte [] ?
|
180
|
-
String request_url;
|
181
|
-
String fragment ;
|
182
|
-
String query_string;
|
183
|
-
byte [] body;
|
184
|
-
int body_size;
|
185
|
-
Map<String,String> header;
|
186
|
-
boolean should_keep_alive;
|
187
|
-
boolean upgrade;
|
188
|
-
int http_major;
|
189
|
-
int http_minor;
|
190
|
-
|
191
|
-
boolean message_begin_called;
|
192
|
-
boolean message_complete_called;
|
193
|
-
boolean headers_complete_called;
|
194
|
-
|
195
|
-
|
196
|
-
Map<String,String> parsed_header;
|
197
|
-
String currHField;
|
198
|
-
String currHValue;
|
199
|
-
byte [] pbody;
|
200
|
-
|
201
|
-
public String toString() {
|
202
|
-
StringBuilder b = new StringBuilder();
|
203
|
-
b.append("type: "); b.append(type);b.append("\n");
|
204
|
-
b.append("method: "); b.append(method);b.append("\n");
|
205
|
-
b.append("status_code: "); b.append(status_code);b.append("\n");
|
206
|
-
b.append("request_path: "); b.append(request_path);b.append("\n");
|
207
|
-
b.append("request_url: "); b.append(request_url);b.append("\n");
|
208
|
-
b.append("fragment: "); b.append(fragment);b.append("\n");
|
209
|
-
b.append("query_string: "); b.append(query_string);b.append("\n");
|
210
|
-
b.append("body:\n"); b.append(new String(body));b.append("\n");
|
211
|
-
b.append("should_keep_alive: "); b.append(should_keep_alive);b.append("\n");
|
212
|
-
b.append("upgrade: "); b.append(upgrade);b.append("\n");
|
213
|
-
b.append("http_major: "); b.append(http_major);b.append("\n");
|
214
|
-
b.append("http_minor: "); b.append(http_minor);b.append("\n");
|
215
|
-
b.append("message_complete_called: "); b.append(message_complete_called);b.append("\n");
|
216
|
-
return b.toString();
|
37
|
+
String fn;
|
38
|
+
public TestLoaderNG(String filename) {
|
39
|
+
this.fn = filename;
|
40
|
+
}
|
41
|
+
static void p(Object o) {
|
42
|
+
System.out.println(o);
|
43
|
+
}
|
44
|
+
public static List<Message> load (String fn) {
|
45
|
+
List<Message> list = null;
|
46
|
+
try {
|
47
|
+
BufferedReader buf = new BufferedReader(new FileReader(fn));
|
48
|
+
list = load(buf);
|
49
|
+
} catch (Throwable t) {
|
50
|
+
throw new RuntimeException(t);
|
217
51
|
}
|
52
|
+
return list;
|
53
|
+
|
54
|
+
}
|
55
|
+
public static Message parse (String message) {
|
56
|
+
List<Message> list = load(new BufferedReader(new StringReader(message)));
|
57
|
+
if (null == list || 0 == list.size() ) {
|
58
|
+
return null;
|
59
|
+
}
|
60
|
+
return list.get(0);
|
61
|
+
}
|
62
|
+
|
63
|
+
public static List<Message> load (BufferedReader buf) {
|
64
|
+
List<Message> list = new LinkedList<Message>();
|
65
|
+
String line = null;
|
66
|
+
Message curr = new Message();
|
67
|
+
Pattern pattern = Pattern.compile("(\\S+)\\s*:(.*)");
|
68
|
+
try {
|
69
|
+
while (null != (line = buf.readLine()) ){
|
70
|
+
if ("".equals(line.trim())) {
|
71
|
+
list.add (curr);
|
72
|
+
curr = new Message();
|
73
|
+
continue;
|
74
|
+
}
|
75
|
+
Matcher m = pattern.matcher(line);
|
76
|
+
if (m.matches()) {
|
77
|
+
// you can not be fucking serious!?
|
78
|
+
// this has got to be the most retarded regex
|
79
|
+
// interface in the history of the world ...
|
80
|
+
// (though I'm sure there's worse c++ regexp libs...)
|
81
|
+
MatchResult r = m.toMatchResult();
|
82
|
+
String key = r.group(1).trim();
|
83
|
+
String value = r.group(2).trim();
|
84
|
+
if ("name".equals(key)) {curr.name = value;}
|
85
|
+
else if ("raw".equals(key)) {curr.raw = toByteArray(value);} //!
|
86
|
+
else if ("type".equals(key)) {curr.type = ParserType.parse(value);}
|
87
|
+
else if ("method".equals(key)) {curr.method = HTTPMethod.parse(value);}
|
88
|
+
else if ("status_code".equals(key)) {curr.status_code = Integer.parseInt(value);}
|
89
|
+
else if ("request_path".equals(key)) {curr.request_path = value;}
|
90
|
+
else if ("request_url".equals(key)) {curr.request_url = value;}
|
91
|
+
|
92
|
+
else if ("fragment".equals(key)) {curr.fragment = value;}
|
93
|
+
else if ("query_string".equals(key)) {curr.query_string = value;}
|
94
|
+
else if ("body".equals(key)) {curr.body = toByteArray(value);} //!
|
95
|
+
else if ("body_size".equals(key)) {curr.body_size = Integer.parseInt(value);}
|
96
|
+
else if (key.startsWith("header")) {
|
97
|
+
String [] h = getHeader(value);
|
98
|
+
curr.header.put(h[0], h[1]);
|
99
|
+
}
|
100
|
+
else if ("should_keep_alive".equals(key))
|
101
|
+
{curr.should_keep_alive = (1 == Integer.parseInt(value));}
|
102
|
+
else if ("upgrade".equals(key)) {curr.upgrade = (1 == Integer.parseInt(value));}
|
103
|
+
else if ("http_major".equals(key)) {curr.http_major = Integer.parseInt(value);}
|
104
|
+
else if ("http_minor".equals(key)) {curr.http_minor = Integer.parseInt(value);}
|
105
|
+
} else {
|
106
|
+
p("WTF?"+line);
|
107
|
+
}
|
218
108
|
|
219
|
-
|
220
|
-
|
221
|
-
|
222
|
-
}
|
223
|
-
/*
|
224
|
-
*prepare this Test Instance for reuse.
|
225
|
-
* */
|
226
|
-
void reset () {
|
227
|
-
this.parsed_header = new HashMap<String, String>();
|
228
|
-
this.pbody = null;
|
229
|
-
|
109
|
+
}
|
110
|
+
} catch (Throwable t) {
|
111
|
+
throw new RuntimeException(t);
|
230
112
|
}
|
231
|
-
|
232
|
-
|
233
|
-
|
234
|
-
|
235
|
-
|
236
|
-
|
237
|
-
|
238
|
-
|
239
|
-
|
240
|
-
|
241
|
-
|
242
|
-
|
243
|
-
|
244
|
-
|
245
|
-
|
246
|
-
|
247
|
-
|
248
|
-
|
249
|
-
|
250
|
-
|
251
|
-
|
252
|
-
|
253
|
-
|
254
|
-
|
255
|
-
|
256
|
-
|
257
|
-
|
258
|
-
|
259
|
-
|
260
|
-
|
261
|
-
|
262
|
-
|
263
|
-
|
264
|
-
|
265
|
-
|
266
|
-
|
267
|
-
|
268
|
-
|
269
|
-
|
270
|
-
|
271
|
-
|
272
|
-
|
273
|
-
TestSettings s = settings();
|
274
|
-
|
275
|
-
|
276
|
-
|
277
|
-
p.execute(s, buf);
|
278
|
-
if (!s.success) {
|
279
|
-
throw new RuntimeException("Test: "+name+"failed");
|
280
|
-
}
|
281
|
-
} // execute
|
282
|
-
|
283
|
-
void execute_permutations() {
|
284
|
-
/*
|
285
|
-
|-|---------------|
|
286
|
-
|--|--------------|
|
287
|
-
|---|-------------|
|
288
|
-
(...)
|
289
|
-
|---------------|-|
|
290
|
-
|-----------------|
|
291
|
-
*/
|
292
|
-
p(name);
|
293
|
-
for (int i = 2; i != raw.length; ++i) {
|
294
|
-
// p(i);
|
295
|
-
HTTPParser p = new HTTPParser();
|
296
|
-
TestSettings s = settings();
|
297
|
-
ByteBuffer buf = ByteBuffer.wrap(raw);
|
298
|
-
int olimit = buf.limit();
|
299
|
-
buf.limit(i);
|
300
|
-
|
301
|
-
parse(p,s,buf);
|
302
|
-
|
303
|
-
buf.position(i);
|
304
|
-
buf.limit(olimit);
|
305
|
-
|
306
|
-
parse(p,s,buf);
|
307
|
-
parse(p,s,buf);
|
308
|
-
|
309
|
-
if (!s.success) {
|
310
|
-
p(this);
|
311
|
-
throw new RuntimeException("Test: "+name+" failed");
|
312
|
-
}
|
313
|
-
reset();
|
314
|
-
}
|
315
|
-
//System.exit(0);
|
316
|
-
} // execute_permutations
|
317
|
-
void parse(HTTPParser p, ParserSettings s, ByteBuffer b) {
|
318
|
-
//p("About to parse: "+b.position() + "->" + b.limit());
|
319
|
-
p.execute(s, b);
|
320
|
-
}
|
321
|
-
|
322
|
-
TestSettings settings() {
|
323
|
-
final TestSettings s = new TestSettings();
|
324
|
-
s.on_path = getCB(request_path, "path", s);
|
325
|
-
s.on_query_string = getCB(query_string, "query_string", s);
|
326
|
-
s.on_url = getCB(request_url, "url", s);
|
327
|
-
s.on_fragment = getCB(fragment, "fragment", s);
|
328
|
-
s.on_message_begin = new HTTPCallback() {
|
329
|
-
public int cb (HTTPParser p) {
|
330
|
-
message_begin_called = true;
|
331
|
-
return -1;
|
332
|
-
}
|
333
|
-
};
|
334
|
-
s.on_header_field = new HTTPDataCallback() {
|
335
|
-
public int cb (HTTPParser p, ByteBuffer b, int pos, int len){
|
336
|
-
if (null != currHValue && null == currHField) {
|
337
|
-
throw new RuntimeException(name+": shouldn't happen");
|
338
|
-
}
|
339
|
-
if (null != currHField) {
|
340
|
-
if (null == currHValue) {
|
341
|
-
currHField += str(b,pos,len);
|
342
|
-
return 0;
|
343
|
-
} else {
|
344
|
-
parsed_header.put(currHField, currHValue);
|
345
|
-
currHField = null;
|
346
|
-
currHValue = null;
|
347
|
-
}
|
348
|
-
}
|
349
|
-
currHField = str(b,pos,len);
|
350
|
-
return 0;
|
351
|
-
}
|
352
|
-
};
|
353
|
-
s.on_header_value = new HTTPDataCallback() {
|
354
|
-
public int cb (HTTPParser p, ByteBuffer b, int pos, int len){
|
355
|
-
if (null == currHField) {
|
356
|
-
throw new RuntimeException(name+" :shouldn't happen field");
|
357
|
-
}
|
358
|
-
if (null == currHValue) {
|
359
|
-
currHValue = str(b,pos,len);
|
113
|
+
return list;
|
114
|
+
}
|
115
|
+
|
116
|
+
static String [] getHeader(String value) {
|
117
|
+
// { "Host": "0.0.0.0=5000"}
|
118
|
+
Pattern p = Pattern.compile("\\{ ?\"([^\"]*)\": ?\"(.*)\"}");
|
119
|
+
Matcher m = p.matcher(value);
|
120
|
+
if (!m.matches()) {
|
121
|
+
p(value);
|
122
|
+
throw new RuntimeException("something wrong");
|
123
|
+
}
|
124
|
+
String [] result = new String[2];
|
125
|
+
MatchResult r = m.toMatchResult();
|
126
|
+
result[0] = r.group(1).trim();
|
127
|
+
result[1] = r.group(2); //.trim();
|
128
|
+
return result;
|
129
|
+
}
|
130
|
+
|
131
|
+
static final byte BSLASH = 0x5c;
|
132
|
+
static final byte QUOT = 0x22;
|
133
|
+
static final byte CR = 0x0d;
|
134
|
+
static final byte LF = 0x0a;
|
135
|
+
static final byte n = 0x6e;
|
136
|
+
static final byte r = 0x72;
|
137
|
+
|
138
|
+
static final Byte[] JAVA_GENERICS_ROCK_HARD = new Byte[0];
|
139
|
+
|
140
|
+
|
141
|
+
static byte [] toByteArray (String quotedString) {
|
142
|
+
ArrayList<Byte> bytes = new ArrayList<Byte>();
|
143
|
+
String s = quotedString.substring(1, quotedString.length()-1);
|
144
|
+
byte [] byts = s.getBytes(java.nio.charset.Charset.forName("UTF8"));
|
145
|
+
boolean escaped = false;
|
146
|
+
for (byte b : byts) {
|
147
|
+
switch (b) {
|
148
|
+
case BSLASH:
|
149
|
+
escaped = true;
|
150
|
+
break;
|
151
|
+
case n:
|
152
|
+
if (escaped) {
|
153
|
+
bytes.add(LF);
|
154
|
+
escaped = false;
|
360
155
|
} else {
|
361
|
-
|
156
|
+
bytes.add(b);
|
362
157
|
}
|
363
|
-
|
364
|
-
|
365
|
-
|
366
|
-
|
367
|
-
|
368
|
-
|
369
|
-
|
370
|
-
|
371
|
-
|
372
|
-
|
373
|
-
|
374
|
-
|
375
|
-
|
376
|
-
|
377
|
-
|
378
|
-
|
379
|
-
}
|
380
|
-
if (!request_url.equals(parsed_url)) {
|
381
|
-
throw new RuntimeException(">"+name+"<: invalid url: >"+parsed_url+"< should be: >"+request_url+"<");
|
382
|
-
}
|
383
|
-
if (!fragment.equals(parsed_frag)) {
|
384
|
-
throw new RuntimeException(name+": invalid fragement: "+parsed_frag+" should be: "+fragment);
|
385
|
-
}
|
386
|
-
if (null != currHValue || null != currHField) {
|
387
|
-
if (null == currHField || null == currHValue) {
|
388
|
-
throw new RuntimeException("shouldn't happen");
|
389
|
-
}
|
390
|
-
}
|
391
|
-
if (null != currHField) {
|
392
|
-
parsed_header.put(currHField, currHValue);
|
393
|
-
currHField = null;
|
394
|
-
currHValue = null;
|
395
|
-
}
|
396
|
-
|
397
|
-
|
398
|
-
return 0;
|
399
|
-
}
|
400
|
-
};
|
401
|
-
// s.on_headers_complete = new HTTPCallback() {
|
402
|
-
// public int cb (HTTPParser p) {
|
403
|
-
// p("Complete:"+name);
|
404
|
-
// return 0;
|
405
|
-
// }
|
406
|
-
// };
|
407
|
-
|
408
|
-
s.on_body = new HTTPDataCallback() {
|
409
|
-
public int cb (HTTPParser p, ByteBuffer b, int pos, int len){
|
410
|
-
int l = pbody == null ? len : len + pbody.length;
|
411
|
-
int off = pbody == null ? 0 : pbody.length;
|
412
|
-
byte [] nbody = new byte[l];
|
413
|
-
|
414
|
-
if (null != pbody) {
|
415
|
-
System.arraycopy(pbody, 0, nbody, 0, pbody.length);
|
416
|
-
}
|
417
|
-
|
418
|
-
int saved = b.position();
|
419
|
-
b.position(pos);
|
420
|
-
b.get(nbody, off, len);
|
421
|
-
b.position(saved);
|
422
|
-
pbody = nbody;
|
423
|
-
return 0;
|
424
|
-
}
|
425
|
-
};
|
426
|
-
|
427
|
-
s.on_message_complete = new HTTPCallback() {
|
428
|
-
public int cb(HTTPParser p) {
|
429
|
-
message_complete_called = true;
|
430
|
-
if ( p.http_minor != http_minor
|
431
|
-
|| p.http_major != http_major
|
432
|
-
|| p.status_code != status_code ) {
|
433
|
-
|
434
|
-
throw new RuntimeException("major/minor/status_code mismatch");
|
435
|
-
}
|
158
|
+
break;
|
159
|
+
case r:
|
160
|
+
if (escaped) {
|
161
|
+
escaped = false;
|
162
|
+
bytes.add(CR);
|
163
|
+
} else {
|
164
|
+
bytes.add(b);
|
165
|
+
}
|
166
|
+
break;
|
167
|
+
case QUOT:
|
168
|
+
escaped = false;
|
169
|
+
bytes.add(QUOT);
|
170
|
+
break;
|
171
|
+
default:
|
172
|
+
bytes.add(b);
|
173
|
+
}
|
436
174
|
|
437
|
-
|
175
|
+
}
|
438
176
|
|
439
|
-
|
440
|
-
|
441
|
-
|
442
|
-
|
443
|
-
|
444
|
-
|
445
|
-
|
446
|
-
|
447
|
-
|
448
|
-
|
449
|
-
|
450
|
-
|
451
|
-
|
452
|
-
|
453
|
-
|
454
|
-
|
455
|
-
|
456
|
-
|
457
|
-
|
458
|
-
|
459
|
-
|
460
|
-
|
461
|
-
|
462
|
-
|
463
|
-
|
464
|
-
|
465
|
-
|
466
|
-
|
467
|
-
|
468
|
-
|
469
|
-
|
470
|
-
|
471
|
-
|
472
|
-
|
473
|
-
|
474
|
-
|
475
|
-
|
476
|
-
|
477
|
-
|
478
|
-
|
479
|
-
|
480
|
-
|
481
|
-
|
482
|
-
|
483
|
-
|
484
|
-
|
485
|
-
}
|
486
|
-
}
|
177
|
+
byts = new byte[bytes.size()];
|
178
|
+
int i = 0;
|
179
|
+
for (Byte b : bytes) {
|
180
|
+
byts[i++]=b;
|
181
|
+
}
|
182
|
+
return byts;
|
183
|
+
}
|
184
|
+
|
185
|
+
public static void main(String [] args) throws Throwable {
|
186
|
+
//TestLoaderNG l = new TestLoaderNG(args[0]);
|
187
|
+
List<Message> ts = load(args[0]);
|
188
|
+
for (Message t : ts) {
|
189
|
+
// for (int i =0; i!= t.raw.length; ++i) {
|
190
|
+
// p(i+":"+t.raw[i]);
|
191
|
+
// }
|
192
|
+
try {
|
193
|
+
t.execute_permutations();
|
194
|
+
} catch (Throwable th) {
|
195
|
+
p("failed: "+t.name);
|
196
|
+
}
|
197
|
+
// t.execute();
|
198
|
+
// System.exit(0);
|
199
|
+
}
|
200
|
+
}
|
201
|
+
|
202
|
+
class Header {
|
203
|
+
String field;
|
204
|
+
String value;
|
205
|
+
}
|
206
|
+
enum LastHeader {
|
207
|
+
NONE
|
208
|
+
,FIELD
|
209
|
+
,VALUE
|
210
|
+
}
|
211
|
+
|
212
|
+
static class TestSettings extends ParserSettings {
|
213
|
+
public boolean success;
|
214
|
+
Map<String, String> map;
|
215
|
+
TestSettings () {
|
216
|
+
map = new HashMap<String, String>();
|
217
|
+
map.put("path", "");
|
218
|
+
map.put("query_string", "");
|
219
|
+
map.put("url", "");
|
220
|
+
map.put("fragment", "");
|
221
|
+
}
|
222
|
+
}
|
487
223
|
}
|