97 char* request = strdup(
99 "x-dpl-pid: 124679842\r\n\r\nCONTROL QUIT");
102 REQUIRE(std::string(parser.
mMethod) == std::string(
"GET"));
103 REQUIRE(std::string(parser.
mPath) == std::string(
"/"));
104 REQUIRE(std::string(parser.
mVersion) == std::string(
"HTTP/1.1"));
105 REQUIRE(parser.
mHeaders.size() == 1);
108 char* request = strdup(
110 "x-dpl-pid: 124679842\r\n"
111 "Somethingelse: cjnjsdnjks\r\n\r\nCONTROL QUIT");
114 REQUIRE(std::string(parser.
mMethod) == std::string(
"GET"));
115 REQUIRE(std::string(parser.
mPath) == std::string(
"/"));
116 REQUIRE(std::string(parser.
mVersion) == std::string(
"HTTP/1.1"));
117 REQUIRE(parser.
mHeaders.size() == 2);
118 REQUIRE(parser.
mHeaders[
"x-dpl-pid"] ==
"124679842");
119 REQUIRE(parser.
mHeaders[
"Somethingelse"] ==
"cjnjsdnjks");
120 REQUIRE(parser.
mBody ==
"CONTROL QUIT");
124 char* request = strdup(
126 "x-dpl-pid: 124679842\r\n"
127 "Somethingelse: cjnjsdnjks\r\n\r\nCONTROL QUIT");
128 char* request2 = strdup(
"FOO BAR");
131 REQUIRE(std::string(parser.
mMethod) == std::string(
"GET"));
132 REQUIRE(std::string(parser.
mPath) == std::string(
"/"));
133 REQUIRE(std::string(parser.
mVersion) == std::string(
"HTTP/1.1"));
134 REQUIRE(parser.
mHeaders.size() == 2);
135 REQUIRE(parser.
mHeaders[
"x-dpl-pid"] ==
"124679842");
136 REQUIRE(parser.
mHeaders[
"Somethingelse"] ==
"cjnjsdnjks");
137 REQUIRE(parser.
mBody ==
"CONTROL QUIT");
139 REQUIRE(parser.
mBody ==
"FOO BAR");
144 char* request = strdup(
145 "GET /chat HTTP/1.1\r\n"
146 "Host: server.example.com\r\n"
147 "Upgrade: websocket\r\n"
148 "Connection: Upgrade\r\n"
149 "Sec-WebSocket-Key: x3JJHMbDL1EzLkh9GBhXDw==\r\n"
150 "Sec-WebSocket-Protocol: chat, superchat\r\n"
151 "Sec-WebSocket-Version: 13\r\n"
152 "Origin: http://example.com\r\n\r\n");
156 REQUIRE(std::string(parser.
mMethod) == std::string(
"GET"));
157 REQUIRE(std::string(parser.
mPath) == std::string(
"/chat"));
158 REQUIRE(std::string(parser.
mVersion) == std::string(
"HTTP/1.1"));
159 REQUIRE(parser.
mHeaders.size() == 7);
160 REQUIRE(parser.
mHeaders[
"Sec-WebSocket-Protocol"] ==
"chat, superchat");
164 char* request = strdup(
165 "HTTP/1.1 101 Switching Protocols\r\n"
166 "Upgrade: websocket\r\n"
167 "Connection: Upgrade\r\n"
168 "Access-Control-Allow-Origin: \"*\"\r\n"
169 "Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=\r\n\r\n");
172 parser.
states.push_back(HTTPState::IN_START_REPLY);
174 REQUIRE(std::string(parser.
mReplyCode) == std::string(
"101"));
175 REQUIRE(std::string(parser.
mReplyMessage) == std::string(
"Switching Protocols"));
176 REQUIRE(std::string(parser.
mReplyVersion) == std::string(
"HTTP/1.1"));
177 REQUIRE(parser.
mHeaders.size() == 4);
178 REQUIRE(parser.
mHeaders[
"Sec-WebSocket-Accept"] ==
"s3pPLMBiTxaQ9kYGzzhZRbK+xOo=");
179 REQUIRE(parser.
mBody ==
"");
183 char*
buffer = strdup(
"hello websockets!");
184 std::vector<uv_buf_t> encoded;
186 REQUIRE(encoded.size() == 1);
188 REQUIRE(encoded[0].
len == strlen(
buffer) + 1 + 2);
192 REQUIRE(std::string(handler.
mFrame[0], handler.
mSize[0] - 1) == std::string(
buffer));
196 char*
buffer = strdup(
"hello websockets!");
197 std::vector<uv_buf_t> encoded;
199 REQUIRE(encoded.size() == 1);
200 char const* prototype =
"and again.";
201 char* buffer2 = (
char*)malloc(0x20000);
203 size_t mod = strlen(prototype);
204 for (
size_t i = 0;
i < 0x20000;
i++) {
205 buffer2[
i] = prototype[
i % mod];
207 buffer2[0x20000 - 1] =
'\0';
209 REQUIRE(encoded.size() == 2);
210 REQUIRE(encoded[1].
len == 0x20000 + 10);
211 char* multiBuffer = (
char*)malloc(encoded[0].
len + encoded[1].
len);
212 memcpy(multiBuffer, encoded[0].base, encoded[0].
len);
213 memcpy(multiBuffer + encoded[0].
len, encoded[1].base, encoded[1].
len);
217 REQUIRE(handler.
mFrame.size() == 2);
218 REQUIRE(handler.
mSize.size() == 2);
219 REQUIRE(std::string(handler.
mFrame[0], handler.
mSize[0] - 1) == std::string(
buffer));
220 REQUIRE(std::string(handler.
mFrame[1], handler.
mSize[1] - 1) == std::string(buffer2));
224 char*
buffer = strdup(
"hello websockets!1");
225 std::vector<uv_buf_t> encoded;
227 REQUIRE(encoded.size() == 1);
232 REQUIRE(handler.
mFrame.size() == 1);
233 REQUIRE(handler.
mSize.size() == 1);
234 REQUIRE(std::string(handler.
mFrame[0], handler.
mSize[0] - 1) == std::string(
buffer));
238 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");
239 std::vector<uv_buf_t> encoded;
241 REQUIRE(encoded.size() == 1);
246 REQUIRE(handler.
mFrame.size() == 1);
247 REQUIRE(handler.
mSize.size() == 1);
248 REQUIRE(std::string(handler.
mFrame[0], handler.
mSize[0] - 1) == std::string(
buffer));
252 char*
buffer = strdup(
"dwqnocewnclkanklcdanslkcndklsnclkdsnckldsnclk cnldcl dsklc dslk cljdnsck sdlakcn askc sdkla cnsd c sdcn dsklncn dklsc nsdkl cklds clkds ckls dklc shello websockets!");
253 std::vector<uv_buf_t> encoded;
255 REQUIRE(encoded.size() == 1);
256 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.";
258 REQUIRE(encoded.size() == 1);
262 REQUIRE(handler.
mFrame.size() == 2);
263 REQUIRE(handler.
mSize.size() == 2);
264 REQUIRE(std::string(handler.
mFrame[0], handler.
mSize[0] - 1) == std::string(
buffer));
265 REQUIRE(std::string(handler.
mFrame[1], handler.
mSize[1] - 1) == std::string(buffer2));
269 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");
270 std::vector<uv_buf_t> encoded;
272 REQUIRE(encoded.size() == 1);
274 for (
size_t i = 1;
i < strlen(
buffer); ++
i) {
277 memset(buffer1, 0xfa, 1024);
278 memset(buffer2, 0xfb, 1024);
279 memcpy(buffer1, encoded[0].base,
i);
280 memcpy(buffer2, encoded[0].base +
i, encoded[0].
len -
i);
284 REQUIRE(handler.
mFrame.size() == 1);
285 REQUIRE(handler.
mSize.size() == 1);
286 REQUIRE(std::string(handler.
mFrame[0], handler.
mSize[0] - 1) == std::string(
buffer));
291 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");
292 std::vector<uv_buf_t> encoded;
294 REQUIRE(encoded.size() == 1);
296 for (
size_t i = 0;
i < strlen(
buffer) - 1; ++
i) {
297 for (
size_t j =
i + 1;
j < strlen(
buffer); ++
j) {
301 memset(buffer1, 0xfa, 1024);
302 memset(buffer2, 0xfb, 1024);
303 memset(buffer3, 0xfc, 1024);
304 memcpy(buffer1, encoded[0].base,
i);
305 memcpy(buffer2, encoded[0].base +
i, (
j -
i));
306 memcpy(buffer3, encoded[0].base +
j, encoded[0].
len -
j);
309 REQUIRE(handler.
mFrame.size() == 0);
311 REQUIRE(handler.
mFrame.size() == 0);
313 REQUIRE(handler.
mFrame.size() == 1);
314 REQUIRE(handler.
mSize.size() == 1);
315 REQUIRE(std::string(handler.
mFrame[0], handler.
mSize[0] - 1) == std::string(
buffer));
320 std::string checkRequest =
321 "GET /chat HTTP/1.1\r\n"
322 "Upgrade: websocket\r\n"
323 "Connection: Upgrade\r\n"
324 "Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==\r\n"
325 "Sec-WebSocket-Protocol: myprotocol\r\n"
326 "Sec-WebSocket-Version: 13\r\n\r\n";
327 std::string checkReply =
328 "HTTP/1.1 101 Switching Protocols\r\n"
329 "Upgrade: websocket\r\n"
330 "Connection: Upgrade\r\n"
331 "Access-Control-Allow-Origin: \"*\"\r\n"
332 "Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=\r\n\r\n";
335 REQUIRE(
result == checkRequest);
338 REQUIRE(reply == checkReply);