1 #include "HttpParser.h"
2
3 #include <chrono>
4 #include <iostream>
5
6 // todo: random test of chunked http parsing of randomly generated requests
testHttpParser()7 void testHttpParser() {
8
9 char headers[] = "GET /hello.htm HTTP/1.1\r\n"
10 "User-Agent: Mozilla/4.0 (compatible; MSIE5.01; Windows NT)\r\n"
11 "Host: www.tutorialspoint.com\r\n"
12 "Accept-Language: en-us\r\n"
13 "Accept-Encoding: gzip, deflate\r\n"
14 "Connection: Keep-Alive\r\n"
15 "Content-length: 1048576\r\n\r\n";
16
17 const int requestLength = sizeof(headers) - 1 + 1048576;
18 char *request = (char *) malloc(requestLength + 32);
19 memset(request, 0, requestLength);
20 memcpy(request, headers, sizeof(headers) - 1);
21
22 char *data = (char *) malloc(requestLength * 10);
23 int length = requestLength * 10;
24
25 int maxChunkSize = 10000;
26 char *paddedBuffer = (char *) malloc(maxChunkSize + 32);
27
28 // dela upp dessa 10 i 5 segment
29 HttpParser httpParser;
30 int validRequests = 0, numDataEmits = 0, numChunks = 0;
31 size_t dataBytes = 0;
32
33 for (int i = 0; i < 10; i++) {
34 memcpy(data + requestLength * i, request, requestLength);
35 }
36
37 for (int j = 0; j < 1000; j++) {
38 for (int currentOffset = 0; currentOffset != length; ) {
39
40 int chunkSize = rand() % 10000;
41 if (currentOffset + chunkSize > length) {
42 chunkSize = length - currentOffset;
43 }
44
45 memcpy(paddedBuffer, data + currentOffset, chunkSize);
46
47 httpParser.consumePostPadded(paddedBuffer, chunkSize, nullptr, [&validRequests](void *user, HttpRequest *req) {
48 validRequests++;
49
50 if (req->getUrl() != "/hello.htm") {
51 std::cout << "WRONG URL!" << std::endl;
52 exit(-1);
53 }
54
55 }, [&dataBytes, &numDataEmits](void *, std::string_view data) {
56 numDataEmits++;
57 dataBytes += data.length();
58 }, [](void *) {
59
60 std::cout << "Error!" << std::endl;
61 return;
62 });
63
64 numChunks++;
65
66 currentOffset += chunkSize;
67 }
68 }
69
70 std::cout << "validRequests: " << validRequests << std::endl;
71 std::cout << "Data bytes: " << dataBytes << std::endl;
72 std::cout << "Data emits: " << numDataEmits << std::endl;
73 std::cout << "Chunks parsed: " << numChunks << std::endl;
74
75 validRequests = 0;
76
77 auto start = std::chrono::high_resolution_clock::now();
78 for (int i = 0; i < 10000000; i++) {
79 httpParser.consumePostPadded(request, requestLength, nullptr, [&validRequests](void *user, HttpRequest *req) {
80 validRequests++;
81 }, [](void *, std::string_view data) {
82
83 }, [](void *) {
84
85 });
86 }
87 auto stop = std::chrono::high_resolution_clock::now();
88
89 std::cout << "Parsed " << validRequests << " in " << std::chrono::duration_cast<std::chrono::milliseconds>(stop - start).count() << "ms" << std::endl;
90 }
91
main()92 int main() {
93 testHttpParser();
94 }
95