Skip to content

Commit add139a

Browse files
committed
upgrade bug fixed (finally)
1 parent bf61d63 commit add139a

5 files changed

Lines changed: 54 additions & 12 deletions

File tree

src/impl/http_parser/lolevel/HTTPParser.java

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -177,7 +177,7 @@ public int execute(ParserSettings settings, ByteBuffer data) {
177177
settings.call_on_error(this, "possible buffer overflow", data, p_err);
178178
}
179179
}
180-
p(state + ":" + ch +":"+p);
180+
//p(state + ":" + ch +":"+p);
181181
switch (state) {
182182
/*
183183
* this state is used after a 'Connection: close' message
@@ -547,8 +547,6 @@ public int execute(ParserSettings settings, ByteBuffer data) {
547547
break;
548548

549549
case req_path:
550-
p(chi);
551-
p(normal_url_char[chi]);
552550
if (normal_url_char[chi]) break;
553551
switch (ch) {
554552
case SPACE:
@@ -902,6 +900,9 @@ public int execute(ParserSettings settings, ByteBuffer data) {
902900
if (!headers_almost_done(ch, settings)) {
903901
settings.call_on_error(this, "header not properly completed", data, p_err);
904902
}
903+
if (upgrade) {
904+
return data.position() - start_position;
905+
}
905906
break;
906907
}
907908

@@ -1243,6 +1244,9 @@ public int execute(ParserSettings settings, ByteBuffer data) {
12431244
if (!headers_almost_done(ch, settings)) {
12441245
settings.call_on_error(this, "header not properly completed", data, p_err);
12451246
}
1247+
if (upgrade) {
1248+
return data.position()-start_position ;
1249+
}
12461250
break;
12471251

12481252
/******************* Header *******************/

src/test/http_parser/lolevel/Message.java

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@
1010
import http_parser.lolevel.TestLoaderNG.Header;
1111
import http_parser.lolevel.TestLoaderNG.LastHeader;
1212

13+
import static http_parser.lolevel.Util.str;
14+
1315
public class Message {
1416
String name;
1517
byte [] raw;
@@ -84,14 +86,6 @@ void check (boolean val, String mes) {
8486
}
8587
}
8688

87-
String str (ByteBuffer b, int pos, int len) {
88-
byte [] by = new byte[len];
89-
int saved = b.position();
90-
b.position(pos);
91-
b.get(by);
92-
b.position(saved);
93-
return new String(by);
94-
}
9589

9690
HTTPDataCallback getCB (final String value, final String mes, final TestSettings settings) {
9791
return new HTTPDataCallback() {

src/test/http_parser/lolevel/Test.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,8 @@ public static void main (String [] args) {
77
TestHeaderOverflowError.test();
88
TestNoOverflowLongBody.test();
99
Responses.test();
10-
Requests.test();
10+
//Requests.test();
11+
Upgrade.test();
1112
}
1213

1314
}
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
package http_parser.lolevel;
2+
3+
import java.nio.*;
4+
import java.util.*;
5+
6+
import http_parser.ParserType;
7+
8+
import static http_parser.lolevel.Util.*;
9+
10+
public class Upgrade {
11+
static final String upgrade = "GET /demo HTTP/1.1\r\n" +
12+
"Connection: Upgrade\r\n" +
13+
"Upgrade: WebSocket\r\n\r\n" +
14+
"third key data";
15+
static void test () {
16+
HTTPParser parser = new HTTPParser(ParserType.HTTP_REQUEST);
17+
ByteBuffer buf = buffer(upgrade);
18+
19+
int read = parser.execute(Util.SETTINGS_NULL, buf);
20+
check (63 == read);
21+
String s = str(buf);
22+
check ("third key data".equals(str(buf)));
23+
24+
}
25+
26+
}

src/test/http_parser/lolevel/Util.java

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,23 @@ public class Util {
1111

1212
static final ParserSettings SETTINGS_NULL = new ParserSettings();
1313

14+
static String str (ByteBuffer b, int pos, int len) {
15+
byte [] by = new byte[len];
16+
int saved = b.position();
17+
b.position(pos);
18+
b.get(by);
19+
b.position(saved);
20+
return new String(by);
21+
}
22+
static String str (ByteBuffer b) {
23+
int len = b.limit() - b.position();
24+
byte [] by = new byte[len];
25+
int saved = b.position();
26+
b.get(by);
27+
b.position(saved);
28+
return new String(by);
29+
}
30+
1431
static ByteBuffer buffer(String str) {
1532
return ByteBuffer.wrap(str.getBytes());
1633
}

0 commit comments

Comments
 (0)