Skip to content

Commit 00e0dd7

Browse files
author
Tim Becker
committed
take upgrade fields of test data into account
1 parent ab819e5 commit 00e0dd7

7 files changed

Lines changed: 111 additions & 21 deletions

File tree

src/test/http_parser/lolevel/Message.java

Lines changed: 28 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,10 @@ public class Message {
3232
List<Header> headers;
3333
boolean should_keep_alive;
3434

35-
boolean upgrade;
35+
byte[] upgrade;
36+
boolean upgrade() {
37+
return null != upgrade;
38+
}
3639

3740
int http_major;
3841
int http_minor;
@@ -124,8 +127,13 @@ void execute () {
124127

125128

126129
p.execute(s, buf);
130+
if (!p.upgrade) {
131+
// call execute again, else parser can't know message is done
132+
// if no content length is set.
133+
p.execute(s, buf);
134+
}
127135
if (!s.success) {
128-
throw new RuntimeException("Test: "+name+"failed");
136+
throw new RuntimeException("Test: "+name+" failed");
129137
}
130138
} // execute
131139

@@ -140,21 +148,32 @@ void execute_permutations() {
140148
*/
141149
p(name);
142150
for (int i = 2; i != raw.length; ++i) {
143-
// p(i);
151+
// p(i);
144152
HTTPParser p = new HTTPParser();
145153
TestSettings s = settings();
146154
ByteBuffer buf = ByteBuffer.wrap(raw);
147155
int olimit = buf.limit();
148156
buf.limit(i);
149157

150158
parse(p,s,buf);
159+
if (!p.upgrade) {
160+
buf.position(i);
161+
buf.limit(olimit);
151162

152-
buf.position(i);
153-
buf.limit(olimit);
154-
155-
parse(p,s,buf);
156-
parse(p,s,buf);
157-
163+
parse(p,s,buf);
164+
if (!p.upgrade) {
165+
parse(p,s,buf);
166+
} else {
167+
if (!upgrade()) {
168+
throw new RuntimeException("Test:"+name+"parsed as upgrade, is not");
169+
}
170+
}
171+
172+
} else {
173+
if (!upgrade()) {
174+
throw new RuntimeException("Test:"+name+"parsed as upgrade, is not");
175+
}
176+
}
158177
if (!s.success) {
159178
p(this);
160179
throw new RuntimeException("Test: "+name+" failed");

src/test/http_parser/lolevel/Requests.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,6 @@ public static void test () {
4646
}
4747
}
4848
for (Message m : requests) {
49-
p(m.name);
5049
test_message(m);
5150
}
5251

src/test/http_parser/lolevel/TestLoaderNG.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,7 @@ else if (key.startsWith("header")) {
9999
}
100100
else if ("should_keep_alive".equals(key))
101101
{curr.should_keep_alive = (1 == Integer.parseInt(value));}
102-
else if ("upgrade".equals(key)) {curr.upgrade = (1 == Integer.parseInt(value));}
102+
else if ("upgrade".equals(key)) { curr.upgrade = toByteArray(value);}
103103
else if ("http_major".equals(key)) {curr.http_major = Integer.parseInt(value);}
104104
else if ("http_minor".equals(key)) {curr.http_minor = Integer.parseInt(value);}
105105
} else {

src/test/http_parser/lolevel/Util.java

Lines changed: 72 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ static void test_message(Message mes) {
6060
int read = 0;
6161
if (msg1len !=0) {
6262
read = parser.execute(settings, msg1);
63-
if (mes.upgrade && parser.upgrade) {
63+
if (mes.upgrade() && parser.upgrade) {
6464
// Messages have a settings() that checks itself...
6565
check(1 == mes.num_called);
6666
continue;
@@ -69,8 +69,7 @@ static void test_message(Message mes) {
6969
}
7070

7171
read = parser.execute(settings, msg2);
72-
if (mes.upgrade && parser.upgrade) {
73-
p("here");
72+
if (mes.upgrade() && parser.upgrade) {
7473
check(1 == mes.num_called);
7574
continue;
7675
}
@@ -80,7 +79,7 @@ static void test_message(Message mes) {
8079
ByteBuffer empty = Util.empty();
8180
read = parser.execute(settings, empty);
8281

83-
if (mes.upgrade && parser.upgrade) {
82+
if (mes.upgrade() && parser.upgrade) {
8483
check(1 == mes.num_called);
8584
continue;
8685
}
@@ -93,13 +92,13 @@ static void test_message(Message mes) {
9392

9493
static void test_multiple3(Message r1, Message r2, Message r3) {
9594
int message_count = 1;
96-
if (!r1.upgrade) {
95+
if (!r1.upgrade()) {
9796
message_count++;
98-
if (!r2.upgrade) {
97+
if (!r2.upgrade()) {
9998
message_count++;
10099
}
101100
}
102-
boolean has_upgrade = (message_count < 3 || r3.upgrade);
101+
boolean has_upgrade = (message_count < 3 || r3.upgrade());
103102

104103
ByteList blist = new ByteList();
105104
blist.addAll(r1.raw);
@@ -114,6 +113,7 @@ static void test_multiple3(Message r1, Message r2, Message r3) {
114113

115114
int read = parser.execute(settings, buf);
116115
if (has_upgrade && parser.upgrade) {
116+
raw = upgrade_message_fix(raw, read, r1,r2,r3);
117117
check(settings.numCalled == message_count);
118118
return;
119119
}
@@ -130,6 +130,71 @@ static void test_multiple3(Message r1, Message r2, Message r3) {
130130
check(0 == read);
131131
check(settings.numCalled == message_count);
132132
}
133+
134+
/* Given a sequence of bytes and the number of these that we were able to
135+
* parse, verify that upgrade bodies are correct.
136+
*/
137+
static byte [] upgrade_message_fix(byte[] body, int nread, Message... msgs) {
138+
int off = 0;
139+
for (Message m : msgs) {
140+
off += m.raw.length;
141+
if (m.upgrade()) {
142+
off -= m.upgrade.length;
143+
// Original C:
144+
// Check the portion of the response after its specified upgrade
145+
// if (!check_str_eq(m, "upgrade", body + off, body + nread)) {
146+
// abort();
147+
// }
148+
// to me, this seems to be equivalent to comparing off and nread ...
149+
check (off, nread);
150+
151+
// Original C:
152+
// Fix up the response so that message_eq() will verify the beginning
153+
// of the upgrade */
154+
//
155+
// *(body + nread + strlen(m->upgrade)) = '\0';
156+
// This only shortens body so the strlen check passes.
157+
return new byte[off];
158+
159+
}
160+
}
161+
return null;
162+
}
163+
//upgrade_message_fix(char *body, const size_t nread, const size_t nmsgs, ...) {
164+
// va_list ap;
165+
// size_t i;
166+
// size_t off = 0;
167+
//
168+
// va_start(ap, nmsgs);
169+
//
170+
// for (i = 0; i < nmsgs; i++) {
171+
// struct message *m = va_arg(ap, struct message *);
172+
//
173+
// off += strlen(m->raw);
174+
//
175+
// if (m->upgrade) {
176+
// off -= strlen(m->upgrade);
177+
//
178+
// /* Check the portion of the response after its specified upgrade */
179+
// if (!check_str_eq(m, "upgrade", body + off, body + nread)) {
180+
// abort();
181+
// }
182+
//
183+
// /* Fix up the response so that message_eq() will verify the beginning
184+
// * of the upgrade */
185+
// *(body + nread + strlen(m->upgrade)) = '\0';
186+
// messages[num_messages -1 ].upgrade = body + nread;
187+
//
188+
// va_end(ap);
189+
// return;
190+
// }
191+
// }
192+
//
193+
// va_end(ap);
194+
// printf("\n\n*** Error: expected a message with upgrade ***\n");
195+
//
196+
// abort();
197+
//}
133198
static void p (Object o) {
134199
System.out.println(o);
135200
}

src/test/http_parser/lolevel/WrongContentLength.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ public int cb (HTTPParser p) {
4444
this.on_body = new HTTPDataCallback() {
4545
public int cb (HTTPParser p, ByteBuffer b, int pos, int len) {
4646
bodyCount += len;
47-
p(str(b, pos, len));
47+
check ("hello".equals(str(b, pos, len)));
4848
return 0;
4949
}
5050
};

test.c

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2566,6 +2566,7 @@ create_large_chunked_message (int body_size_in_kb, const char* headers)
25662566

25672567
char *
25682568
quote(const char * orig) {
2569+
if (!orig) return NULL;
25692570
size_t j, i, len = strlen(orig);
25702571
char * quoted = malloc(len == 0 ? 1 : len*2); // hm..
25712572
bzero(quoted, len == 0 ? 1 : len*2);
@@ -2652,7 +2653,11 @@ dump_message(const struct message * m)
26522653
}
26532654

26542655
printf("should_keep_alive :%d\n", m->should_keep_alive);
2655-
// printf("upgrade :%d\n", m->upgrade);
2656+
bla = quote(m->upgrade);
2657+
if (bla) {
2658+
printf("upgrade :\"%s\"\n", bla);
2659+
}
2660+
free(bla);
26562661
printf("http_major :%d\n", m->http_major);
26572662
printf("http_minor :%d\n", m->http_minor);
26582663
// printf("message_begin_cb_called :%d\n", m->message_begin_cb_called);

tests.dumped

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -283,7 +283,7 @@ header_4 :{ "Upgrade": "WebSocket"}
283283
header_5 :{ "Sec-WebSocket-Key1": "4 @1 46546xW%0l 1 5"}
284284
header_6 :{ "Origin": "http://example.com"}
285285
should_keep_alive :1
286-
upgrade :1
286+
upgrade :"Hot diggity dogg"
287287
http_major :1
288288
http_minor :1
289289

@@ -301,6 +301,7 @@ body_size :0
301301
header_0 :{ "User-agent": "Mozilla/1.1N"}
302302
header_1 :{ "Proxy-authorization": "basic aGVsbG86d29ybGQ="}
303303
should_keep_alive :0
304+
upgrade :"some data\r\nand yet even more data"
304305
http_major :1
305306
http_minor :0
306307

@@ -447,6 +448,7 @@ body_size :0
447448
header_0 :{ "User-agent": "Mozilla/1.1N"}
448449
header_1 :{ "Proxy-authorization": "basic aGVsbG86d29ybGQ="}
449450
should_keep_alive :0
451+
upgrade :""
450452
http_major :1
451453
http_minor :0
452454

0 commit comments

Comments
 (0)