|
@ -52,6 +52,8 @@ struct message { |
|
|
char headers [MAX_HEADERS][2][MAX_ELEMENT_SIZE]; |
|
|
char headers [MAX_HEADERS][2][MAX_ELEMENT_SIZE]; |
|
|
int should_keep_alive; |
|
|
int should_keep_alive; |
|
|
|
|
|
|
|
|
|
|
|
int upgrade; |
|
|
|
|
|
|
|
|
unsigned short http_major; |
|
|
unsigned short http_major; |
|
|
unsigned short http_minor; |
|
|
unsigned short http_minor; |
|
|
|
|
|
|
|
@ -456,6 +458,40 @@ const struct message requests[] = |
|
|
,.body= "" |
|
|
,.body= "" |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
#define UPGRADE_REQUEST 16 |
|
|
|
|
|
, {.name = "upgrade request" |
|
|
|
|
|
,.type= HTTP_REQUEST |
|
|
|
|
|
,.raw= "GET /demo HTTP/1.1\r\n" |
|
|
|
|
|
"Host: example.com\r\n" |
|
|
|
|
|
"Connection: Upgrade\r\n" |
|
|
|
|
|
"Sec-WebSocket-Key2: 12998 5 Y3 1 .P00\r\n" |
|
|
|
|
|
"Sec-WebSocket-Protocol: sample\r\n" |
|
|
|
|
|
"Upgrade: WebSocket\r\n" |
|
|
|
|
|
"Sec-WebSocket-Key1: 4 @1 46546xW%0l 1 5\r\n" |
|
|
|
|
|
"Origin: http://example.com\r\n" |
|
|
|
|
|
"\r\n" |
|
|
|
|
|
,.should_keep_alive= TRUE |
|
|
|
|
|
,.message_complete_on_eof= FALSE |
|
|
|
|
|
,.http_major= 1 |
|
|
|
|
|
,.http_minor= 1 |
|
|
|
|
|
,.method= HTTP_GET |
|
|
|
|
|
,.query_string= "" |
|
|
|
|
|
,.fragment= "" |
|
|
|
|
|
,.request_path= "/demo" |
|
|
|
|
|
,.request_url= "/demo" |
|
|
|
|
|
,.num_headers= 7 |
|
|
|
|
|
,.upgrade=1 |
|
|
|
|
|
,.headers= { { "Host", "example.com" } |
|
|
|
|
|
, { "Connection", "Upgrade" } |
|
|
|
|
|
, { "Sec-WebSocket-Key2", "12998 5 Y3 1 .P00" } |
|
|
|
|
|
, { "Sec-WebSocket-Protocol", "sample" } |
|
|
|
|
|
, { "Upgrade", "WebSocket" } |
|
|
|
|
|
, { "Sec-WebSocket-Key1", "4 @1 46546xW%0l 1 5" } |
|
|
|
|
|
, { "Origin", "http://example.com" } |
|
|
|
|
|
} |
|
|
|
|
|
,.body= "" |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
, {.name= NULL } /* sentinel */ |
|
|
, {.name= NULL } /* sentinel */ |
|
|
}; |
|
|
}; |
|
|
|
|
|
|
|
@ -965,17 +1001,25 @@ test_message (const struct message *message) |
|
|
size_t read; |
|
|
size_t read; |
|
|
|
|
|
|
|
|
read = parse(message->raw, strlen(message->raw)); |
|
|
read = parse(message->raw, strlen(message->raw)); |
|
|
|
|
|
|
|
|
|
|
|
if (message->upgrade && parser->upgrade) goto test; |
|
|
|
|
|
|
|
|
if (read != strlen(message->raw)) { |
|
|
if (read != strlen(message->raw)) { |
|
|
print_error(message->raw, read); |
|
|
print_error(message->raw, read); |
|
|
exit(1); |
|
|
exit(1); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
read = parse(NULL, 0); |
|
|
read = parse(NULL, 0); |
|
|
|
|
|
|
|
|
|
|
|
if (message->upgrade && parser->upgrade) goto test; |
|
|
|
|
|
|
|
|
if (read != 0) { |
|
|
if (read != 0) { |
|
|
print_error(message->raw, read); |
|
|
print_error(message->raw, read); |
|
|
exit(1); |
|
|
exit(1); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
test: |
|
|
|
|
|
|
|
|
if (num_messages != 1) { |
|
|
if (num_messages != 1) { |
|
|
printf("\n*** num_messages != 1 after testing '%s' ***\n\n", message->name); |
|
|
printf("\n*** num_messages != 1 after testing '%s' ***\n\n", message->name); |
|
|
exit(1); |
|
|
exit(1); |
|
@ -1009,6 +1053,13 @@ out: |
|
|
void |
|
|
void |
|
|
test_multiple3 (const struct message *r1, const struct message *r2, const struct message *r3) |
|
|
test_multiple3 (const struct message *r1, const struct message *r2, const struct message *r3) |
|
|
{ |
|
|
{ |
|
|
|
|
|
int message_count = 1; |
|
|
|
|
|
if (!r1->upgrade) { |
|
|
|
|
|
message_count++; |
|
|
|
|
|
if (!r2->upgrade) message_count++; |
|
|
|
|
|
} |
|
|
|
|
|
int has_upgrade = (message_count < 3 || r3->upgrade); |
|
|
|
|
|
|
|
|
char total[ strlen(r1->raw) |
|
|
char total[ strlen(r1->raw) |
|
|
+ strlen(r2->raw) |
|
|
+ strlen(r2->raw) |
|
|
+ strlen(r3->raw) |
|
|
+ strlen(r3->raw) |
|
@ -1025,25 +1076,37 @@ test_multiple3 (const struct message *r1, const struct message *r2, const struct |
|
|
size_t read; |
|
|
size_t read; |
|
|
|
|
|
|
|
|
read = parse(total, strlen(total)); |
|
|
read = parse(total, strlen(total)); |
|
|
|
|
|
|
|
|
|
|
|
if (has_upgrade && parser->upgrade) goto test; |
|
|
|
|
|
|
|
|
if (read != strlen(total)) { |
|
|
if (read != strlen(total)) { |
|
|
print_error(total, read); |
|
|
print_error(total, read); |
|
|
exit(1); |
|
|
exit(1); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
read = parse(NULL, 0); |
|
|
read = parse(NULL, 0); |
|
|
|
|
|
|
|
|
|
|
|
if (has_upgrade && parser->upgrade) goto test; |
|
|
|
|
|
|
|
|
if (read != 0) { |
|
|
if (read != 0) { |
|
|
print_error(total, read); |
|
|
print_error(total, read); |
|
|
exit(1); |
|
|
exit(1); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
if (3 != num_messages) { |
|
|
test: |
|
|
|
|
|
|
|
|
|
|
|
if (message_count != num_messages) { |
|
|
fprintf(stderr, "\n\n*** Parser didn't see 3 messages only %d *** \n", num_messages); |
|
|
fprintf(stderr, "\n\n*** Parser didn't see 3 messages only %d *** \n", num_messages); |
|
|
exit(1); |
|
|
exit(1); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
if (!message_eq(0, r1)) exit(1); |
|
|
if (!message_eq(0, r1)) exit(1); |
|
|
if (!message_eq(1, r2)) exit(1); |
|
|
if (message_count > 1) { |
|
|
if (!message_eq(2, r3)) exit(1); |
|
|
if (!message_eq(1, r2)) exit(1); |
|
|
|
|
|
if (message_count > 2) { |
|
|
|
|
|
if (!message_eq(2, r3)) exit(1); |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
parser_free(); |
|
|
parser_free(); |
|
|
} |
|
|
} |
|
|