95 char* request = strdup(
97 "x-dpl-pid: 124679842\r\n\r\nCONTROL QUIT");
100 REQUIRE(std::string(parser.
mMethod) == std::string(
"GET"));
101 REQUIRE(std::string(parser.
mPath) == std::string(
"/"));
102 REQUIRE(std::string(parser.
mVersion) == std::string(
"HTTP/1.1"));
103 REQUIRE(parser.
mHeaders.size() == 1);
106 char* request = strdup(
108 "x-dpl-pid: 124679842\r\n"
109 "Somethingelse: cjnjsdnjks\r\n\r\nCONTROL QUIT");
112 REQUIRE(std::string(parser.
mMethod) == std::string(
"GET"));
113 REQUIRE(std::string(parser.
mPath) == std::string(
"/"));
114 REQUIRE(std::string(parser.
mVersion) == std::string(
"HTTP/1.1"));
115 REQUIRE(parser.
mHeaders.size() == 2);
116 REQUIRE(parser.
mHeaders[
"x-dpl-pid"] ==
"124679842");
117 REQUIRE(parser.
mHeaders[
"Somethingelse"] ==
"cjnjsdnjks");
118 REQUIRE(parser.
mBody ==
"CONTROL QUIT");
122 char* request = strdup(
124 "x-dpl-pid: 124679842\r\n"
125 "Somethingelse: cjnjsdnjks\r\n\r\nCONTROL QUIT");
126 char* request2 = strdup(
"FOO BAR");
129 REQUIRE(std::string(parser.
mMethod) == std::string(
"GET"));
130 REQUIRE(std::string(parser.
mPath) == std::string(
"/"));
131 REQUIRE(std::string(parser.
mVersion) == std::string(
"HTTP/1.1"));
132 REQUIRE(parser.
mHeaders.size() == 2);
133 REQUIRE(parser.
mHeaders[
"x-dpl-pid"] ==
"124679842");
134 REQUIRE(parser.
mHeaders[
"Somethingelse"] ==
"cjnjsdnjks");
135 REQUIRE(parser.
mBody ==
"CONTROL QUIT");
137 REQUIRE(parser.
mBody ==
"FOO BAR");
142 char* request = strdup(
143 "GET /chat HTTP/1.1\r\n"
144 "Host: server.example.com\r\n"
145 "Upgrade: websocket\r\n"
146 "Connection: Upgrade\r\n"
147 "Sec-WebSocket-Key: x3JJHMbDL1EzLkh9GBhXDw==\r\n"
148 "Sec-WebSocket-Protocol: chat, superchat\r\n"
149 "Sec-WebSocket-Version: 13\r\n"
150 "Origin: http://example.com\r\n\r\n");
154 REQUIRE(std::string(parser.
mMethod) == std::string(
"GET"));
155 REQUIRE(std::string(parser.
mPath) == std::string(
"/chat"));
156 REQUIRE(std::string(parser.
mVersion) == std::string(
"HTTP/1.1"));
157 REQUIRE(parser.
mHeaders.size() == 7);
158 REQUIRE(parser.
mHeaders[
"Sec-WebSocket-Protocol"] ==
"chat, superchat");
162 char* request = strdup(
163 "HTTP/1.1 101 Switching Protocols\r\n"
164 "Upgrade: websocket\r\n"
165 "Connection: Upgrade\r\n"
166 "Access-Control-Allow-Origin: \"*\"\r\n"
167 "Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=\r\n\r\n");
170 parser.
states.push_back(HTTPState::IN_START_REPLY);
172 REQUIRE(std::string(parser.
mReplyCode) == std::string(
"101"));
173 REQUIRE(std::string(parser.
mReplyMessage) == std::string(
"Switching Protocols"));
174 REQUIRE(std::string(parser.
mReplyVersion) == std::string(
"HTTP/1.1"));
175 REQUIRE(parser.
mHeaders.size() == 4);
176 REQUIRE(parser.
mHeaders[
"Sec-WebSocket-Accept"] ==
"s3pPLMBiTxaQ9kYGzzhZRbK+xOo=");
177 REQUIRE(parser.
mBody ==
"");
181 char*
buffer = strdup(
"hello websockets!");
182 std::vector<uv_buf_t> encoded;
184 REQUIRE(encoded.size() == 1);
186 REQUIRE(encoded[0].
len == strlen(
buffer) + 1 + 2);
190 REQUIRE(std::string(handler.
mFrame[0], handler.
mSize[0] - 1) == std::string(
buffer));
194 char*
buffer = strdup(
"hello websockets!");
195 std::vector<uv_buf_t> encoded;
197 REQUIRE(encoded.size() == 1);
198 char const* prototype =
"and again.";
199 char* buffer2 = (
char*)malloc(0x20000);
201 size_t mod = strlen(prototype);
202 for (
size_t i = 0;
i < 0x20000;
i++) {
203 buffer2[
i] = prototype[
i % mod];
205 buffer2[0x20000 - 1] =
'\0';
207 REQUIRE(encoded.size() == 2);
208 REQUIRE(encoded[1].
len == 0x20000 + 10);
209 char* multiBuffer = (
char*)malloc(encoded[0].
len + encoded[1].
len);
210 memcpy(multiBuffer, encoded[0].base, encoded[0].
len);
211 memcpy(multiBuffer + encoded[0].
len, encoded[1].base, encoded[1].
len);
215 REQUIRE(handler.
mFrame.size() == 2);
216 REQUIRE(handler.
mSize.size() == 2);
217 REQUIRE(std::string(handler.
mFrame[0], handler.
mSize[0] - 1) == std::string(
buffer));
218 REQUIRE(std::string(handler.
mFrame[1], handler.
mSize[1] - 1) == std::string(buffer2));
222 char*
buffer = strdup(
"hello websockets!1");
223 std::vector<uv_buf_t> encoded;
225 REQUIRE(encoded.size() == 1);
230 REQUIRE(handler.
mFrame.size() == 1);
231 REQUIRE(handler.
mSize.size() == 1);
232 REQUIRE(std::string(handler.
mFrame[0], handler.
mSize[0] - 1) == std::string(
buffer));
236 char*
buffer = strdup(
"string with more than 127 characters: cdsklcmalkmc cdmslkc adslkccmkadsc adslkmc dsa ckdls cdksclknds lkndnc anslkc klsad ckl lksad clkas ccdascnkjancjnjkascsa cdascds clsad nclksad ncklsd clkadns lkc sadnlk cklsa cnaksld csad");
237 std::vector<uv_buf_t> encoded;
239 REQUIRE(encoded.size() == 1);
244 REQUIRE(handler.
mFrame.size() == 1);
245 REQUIRE(handler.
mSize.size() == 1);
246 REQUIRE(std::string(handler.
mFrame[0], handler.
mSize[0] - 1) == std::string(
buffer));
250 char*
buffer = strdup(
"dwqnocewnclkanklcdanslkcndklsnclkdsnckldsnclk cnldcl dsklc dslk cljdnsck sdlakcn askc sdkla cnsd c sdcn dsklncn dklsc nsdkl cklds clkds ckls dklc shello websockets!");
251 std::vector<uv_buf_t> encoded;
253 REQUIRE(encoded.size() == 1);
254 char const* buffer2 =
"xsanjkcnsadjknc dsjc nsdnc dlscndsck dsc ds clds cds vnlsfl nklnjk nj nju n nio nkmnklfmdkl mkld mkl mkl mkl mlk m lkm klfdnkln jkafdnk nk mkldfm lkdamlkdmlkdmlk m klml km lkm kl.";
256 REQUIRE(encoded.size() == 1);
260 REQUIRE(handler.
mFrame.size() == 2);
261 REQUIRE(handler.
mSize.size() == 2);
262 REQUIRE(std::string(handler.
mFrame[0], handler.
mSize[0] - 1) == std::string(
buffer));
263 REQUIRE(std::string(handler.
mFrame[1], handler.
mSize[1] - 1) == std::string(buffer2));
267 char*
buffer = strdup(
"string with more than 127 characters: cdsklcmalkmc cdmslkc adslkccmkadsc adslkmc dsa ckdls cdksclknds lkndnc anslkc klsad ckl lksad clkas ccdascnkjancjnjkascsa cdascds clsad nclksad ncklsd clkadns lkc sadnlk cklsa cnaksld csad");
268 std::vector<uv_buf_t> encoded;
270 REQUIRE(encoded.size() == 1);
272 for (
size_t i = 1;
i < strlen(
buffer); ++
i) {
275 memset(buffer1, 0xfa, 1024);
276 memset(buffer2, 0xfb, 1024);
277 memcpy(buffer1, encoded[0].base,
i);
278 memcpy(buffer2, encoded[0].base +
i, encoded[0].
len -
i);
282 REQUIRE(handler.
mFrame.size() == 1);
283 REQUIRE(handler.
mSize.size() == 1);
284 REQUIRE(std::string(handler.
mFrame[0], handler.
mSize[0] - 1) == std::string(
buffer));
289 char*
buffer = strdup(
"string with more than 127 characters: cdsklcmalkmc cdmslkc adslkccmkadsc adslkmc dsa ckdls cdksclknds lkndnc anslkc klsad ckl lksad clkas ccdascnkjancjnjkascsa cdascds clsad nclksad ncklsd clkadns lkc sadnlk cklsa cnaksld csad");
290 std::vector<uv_buf_t> encoded;
292 REQUIRE(encoded.size() == 1);
294 for (
size_t i = 0;
i < strlen(
buffer) - 1; ++
i) {
295 for (
size_t j =
i + 1;
j < strlen(
buffer); ++
j) {
299 memset(buffer1, 0xfa, 1024);
300 memset(buffer2, 0xfb, 1024);
301 memset(buffer3, 0xfc, 1024);
302 memcpy(buffer1, encoded[0].base,
i);
303 memcpy(buffer2, encoded[0].base +
i, (
j -
i));
304 memcpy(buffer3, encoded[0].base +
j, encoded[0].
len -
j);
307 REQUIRE(handler.
mFrame.size() == 0);
309 REQUIRE(handler.
mFrame.size() == 0);
311 REQUIRE(handler.
mFrame.size() == 1);
312 REQUIRE(handler.
mSize.size() == 1);
313 REQUIRE(std::string(handler.
mFrame[0], handler.
mSize[0] - 1) == std::string(
buffer));
318 std::string checkRequest =
319 "GET /chat HTTP/1.1\r\n"
320 "Upgrade: websocket\r\n"
321 "Connection: Upgrade\r\n"
322 "Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==\r\n"
323 "Sec-WebSocket-Protocol: myprotocol\r\n"
324 "Sec-WebSocket-Version: 13\r\n\r\n";
325 std::string checkReply =
326 "HTTP/1.1 101 Switching Protocols\r\n"
327 "Upgrade: websocket\r\n"
328 "Connection: Upgrade\r\n"
329 "Access-Control-Allow-Origin: \"*\"\r\n"
330 "Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=\r\n\r\n";
333 REQUIRE(
result == checkRequest);
336 REQUIRE(reply == checkReply);