Connections can now be interrupted anywhere in the headers
[Arachnida.git] / tests / lib / Spin / Listener.cpp
blobea9f8843313761ccefc5e70739c242937b241980
1 #include "Listener.h"
2 #include <Spin/Listener.h>
3 #include <Spin/Connector.h>
4 #include <Spin/Details/Request.h>
5 #include <Spin/Handlers/NewConnectionHandler.h>
6 #include <Spin/Handlers/HTTPConnectionHandler.h>
7 #include <Spin/Handlers/HTTPRequestHandler.h>
8 #include <boost/filesystem/path.hpp>
9 #include <boost/filesystem/operations.hpp>
10 #include <loki/ScopeGuard.h>
11 #if defined(_WIN32) && ! defined(__CYGWIN__)
12 #include <Windows.h>
13 #else
14 extern "C" {
15 #include <unistd.h>
17 #define Sleep(t) sleep((t) / 1000)
18 #endif
20 extern boost::filesystem::path cert_path__;
22 namespace Tests
24 namespace Spin
26 namespace
28 class NewConnectionHandler : public ::Spin::Handlers::NewConnectionHandler
30 public :
31 ::Spin::Connection getConnection()
33 CPPUNIT_ASSERT(connection_.get());
34 return ::Spin::Connection(*connection_);
37 protected :
38 /*virtual */void handleNewConnection(const ::Spin::Connection & connection)
40 connection_.reset(new ::Spin::Connection(connection));
43 private :
44 std::auto_ptr< ::Spin::Connection > connection_;
47 class NewConnectionHandler2 : public ::Spin::Handlers::NewConnectionHandler
49 public :
50 NewConnectionHandler2(::Spin::Listener & listener)
51 : listener_(listener)
52 { /* no-op */ }
54 ::Spin::Connection getConnection()
56 CPPUNIT_ASSERT(connection_.get());
57 return ::Spin::Connection(*connection_);
60 protected :
61 /*virtual */void handleNewConnection(const ::Spin::Connection & connection)
63 connection_.reset(new ::Spin::Connection(connection));
64 listener_.clearNewConnectionHandler();
67 private :
68 ::Spin::Listener & listener_;
69 std::auto_ptr< ::Spin::Connection > connection_;
73 CPPUNIT_TEST_SUITE_REGISTRATION(Listener);
75 void Listener::setUp()
76 { /* no-op */ }
78 void Listener::tearDown()
79 { /* no-op */ }
81 void Listener::tryCreateInstance()
83 ::Spin::Listener listener(0, 4096);
86 void Listener::tryAccept()
88 ::Spin::Listener listener(0, 4097);
89 ::Spin::Connection connection_out(::Spin::Connector::getInstance().connect("127.0.0.1", 4097));
90 ::Spin::Connection accepted_connection(listener.accept());
91 connection_out.write("Hello, world!");
92 std::vector< char > buffer;
93 std::pair< std::size_t, int > results(accepted_connection.read(buffer));
94 buffer.resize(results.first);
95 CPPUNIT_ASSERT(std::string(buffer.begin(), buffer.end()) == "Hello, world!");
98 void Listener::tryAcceptSSL()
100 NewConnectionHandler handler;
102 CPPUNIT_ASSERT(!cert_path__.empty());
103 CPPUNIT_ASSERT(boost::filesystem::exists(cert_path__));
104 ::Spin::Listener listener(cert_path__, 0, 4098);
105 listener.setNewConnectionHandler(handler);
106 Loki::ScopeGuard attachment_handler = Loki::MakeObjGuard(listener, &::Spin::Listener::clearNewConnectionHandler);
107 ::Spin::Connection connection_out(::Spin::Connector::getInstance().connect("127.0.0.1", 4098, true));
108 ::Spin::Connection accepted_connection(handler.getConnection());
109 connection_out.write("Hello, world!");
110 std::vector< char > buffer;
111 std::pair< std::size_t, int > results(accepted_connection.read(buffer));
112 buffer.resize(results.first);
113 CPPUNIT_ASSERT(std::string(buffer.begin(), buffer.end()) == "Hello, world!");
116 void Listener::tryAsyncAcceptAndDetach()
118 ::Spin::Listener listener(0, 4099);
119 NewConnectionHandler2 handler(listener);
120 listener.setNewConnectionHandler(handler);
121 Loki::ScopeGuard attachment_handler = Loki::MakeObjGuard(listener, &::Spin::Listener::clearNewConnectionHandler);
122 ::Spin::Connection connection_out(::Spin::Connector::getInstance().connect("127.0.0.1", 4099));
123 Sleep(1000);
124 ::Spin::Connection accepted_connection(handler.getConnection());
125 connection_out.write("Hello, world!");
126 std::vector< char > buffer;
127 std::pair< std::size_t, int > results(accepted_connection.read(buffer));
128 buffer.resize(results.first);
129 CPPUNIT_ASSERT(std::string(buffer.begin(), buffer.end()) == "Hello, world!");
132 void Listener::tryAcceptWithHTTPHandler01()
134 ::Spin::Listener listener(0, 4100);
135 ::Spin::Handlers::HTTPRequestHandler request_handler;
136 ::Spin::Handlers::HTTPConnectionHandler connection_handler(request_handler);
137 listener.setNewConnectionHandler(connection_handler);
138 Loki::ScopeGuard attachment_handler = Loki::MakeObjGuard(listener, &::Spin::Listener::clearNewConnectionHandler);
139 ::Spin::Connection connection_out(::Spin::Connector::getInstance().connect("127.0.0.1", 4100));
140 connection_out.write(
141 "POST / HTTP/1.1\r\n"
142 "Content-Length: 8\r\n"
143 "\r\n"
144 "01234567"
146 boost::shared_ptr< ::Spin::Details::Request > request(request_handler.getNextRequest());
147 CPPUNIT_ASSERT(request->method_ == "POST");
148 CPPUNIT_ASSERT(request->url_ == "/");
149 CPPUNIT_ASSERT(request->protocol_and_version_ == "HTTP/1.1");
150 CPPUNIT_ASSERT(request->body_.size() == 8);
151 CPPUNIT_ASSERT(std::string(request->body_.begin(), request->body_.end()) == "01234567");
154 void Listener::tryAcceptWithHTTPHandler02()
156 ::Spin::Listener listener(0, 4101);
157 ::Spin::Handlers::HTTPRequestHandler request_handler;
158 ::Spin::Handlers::HTTPConnectionHandler connection_handler(request_handler);
159 listener.setNewConnectionHandler(connection_handler);
160 Loki::ScopeGuard attachment_handler = Loki::MakeObjGuard(listener, &::Spin::Listener::clearNewConnectionHandler);
161 ::Spin::Connection connection_out(::Spin::Connector::getInstance().connect("127.0.0.1", 4101));
162 connection_out.write(
163 "GET / HTTP/1.1\r\n"
164 "\r\n"
166 boost::shared_ptr< ::Spin::Details::Request > request(request_handler.getNextRequest());
167 CPPUNIT_ASSERT(request->method_ == "GET");
168 CPPUNIT_ASSERT(request->url_ == "/");
169 CPPUNIT_ASSERT(request->protocol_and_version_ == "HTTP/1.1");
170 CPPUNIT_ASSERT(request->body_.empty());
173 void Listener::tryAcceptWithHTTPHandler03()
175 ::Spin::Listener listener(0, 4102);
176 ::Spin::Handlers::HTTPRequestHandler request_handler;
177 ::Spin::Handlers::HTTPConnectionHandler connection_handler(request_handler);
178 listener.setNewConnectionHandler(connection_handler);
179 Loki::ScopeGuard attachment_handler = Loki::MakeObjGuard(listener, &::Spin::Listener::clearNewConnectionHandler);
180 ::Spin::Connection connection_out(::Spin::Connector::getInstance().connect("127.0.0.1", 4102));
181 connection_out.write(
182 "GET /index.html HTTP/1.1\r\n"
183 "\r\n"
184 "GET /images/logo.png HTTP/1.1\r\n"
185 "\r\n"
187 boost::shared_ptr< ::Spin::Details::Request > request(request_handler.getNextRequest());
188 CPPUNIT_ASSERT(request->method_ == "GET");
189 CPPUNIT_ASSERT(request->url_ == "/index.html");
190 CPPUNIT_ASSERT(request->protocol_and_version_ == "HTTP/1.1");
191 CPPUNIT_ASSERT(request->body_.empty());
192 request = request_handler.getNextRequest();
193 CPPUNIT_ASSERT(request->method_ == "GET");
194 CPPUNIT_ASSERT(request->url_ == "/images/logo.png");
195 CPPUNIT_ASSERT(request->protocol_and_version_ == "HTTP/1.1");
196 CPPUNIT_ASSERT(request->body_.empty());
199 void Listener::tryAcceptWithHTTPHandler04()
201 ::Spin::Listener listener(0, 4103);
202 ::Spin::Handlers::HTTPRequestHandler request_handler;
203 ::Spin::Handlers::HTTPConnectionHandler connection_handler(request_handler);
204 listener.setNewConnectionHandler(connection_handler);
205 Loki::ScopeGuard attachment_handler = Loki::MakeObjGuard(listener, &::Spin::Listener::clearNewConnectionHandler);
206 ::Spin::Connection connection_out(::Spin::Connector::getInstance().connect("127.0.0.1", 4103));
207 connection_out.write(
208 "GET /index.html HTTP/1.1\r\n"
209 "User-Agent: test\r\n"
210 "Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5\r\n"
211 "Accept-Language: en-us,en;q=0\r\n"
212 "Accept-Encoding: gzip,deflate\r\n"
213 "Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7\r\n"
214 "Keep-Alive: 300\r\n"
215 "Connection: keep-alive\r\n"
216 "\r\n"
218 boost::shared_ptr< ::Spin::Details::Request > request(request_handler.getNextRequest());
219 CPPUNIT_ASSERT(request->method_ == "GET");
220 CPPUNIT_ASSERT(request->url_ == "/index.html");
221 CPPUNIT_ASSERT(request->protocol_and_version_ == "HTTP/1.1");
222 CPPUNIT_ASSERT(request->body_.empty());
223 CPPUNIT_ASSERT(request->header_fields_.size() == 7);
224 ::Spin::Details::Request::HeaderFields::const_iterator where(request->header_fields_.begin());
225 CPPUNIT_ASSERT(where->name_ == "User-Agent");
226 CPPUNIT_ASSERT(where->value_ == "test");
227 ++where;
228 CPPUNIT_ASSERT(where->name_ == "Accept");
229 CPPUNIT_ASSERT(where->value_ == "text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5");
230 ++where;
231 CPPUNIT_ASSERT(where->name_ == "Accept-Language");
232 CPPUNIT_ASSERT(where->value_ == "en-us,en;q=0");
233 ++where;
234 CPPUNIT_ASSERT(where->name_ == "Accept-Encoding");
235 CPPUNIT_ASSERT(where->value_ == "gzip,deflate");
236 ++where;
237 CPPUNIT_ASSERT(where->name_ == "Accept-Charset");
238 CPPUNIT_ASSERT(where->value_ == "ISO-8859-1,utf-8;q=0.7,*;q=0.7");
239 ++where;
240 CPPUNIT_ASSERT(where->name_ == "Keep-Alive");
241 CPPUNIT_ASSERT(where->value_ == "300");
242 ++where;
243 CPPUNIT_ASSERT(where->name_ == "Connection");
244 CPPUNIT_ASSERT(where->value_ == "keep-alive");
245 ++where;
248 void Listener::tryAcceptWithHTTPHandler05()
250 ::Spin::Listener listener(0, 4104);
251 ::Spin::Handlers::HTTPRequestHandler request_handler;
252 ::Spin::Handlers::HTTPConnectionHandler connection_handler(request_handler);
253 listener.setNewConnectionHandler(connection_handler);
254 Loki::ScopeGuard attachment_handler = Loki::MakeObjGuard(listener, &::Spin::Listener::clearNewConnectionHandler);
255 ::Spin::Connection connection_out(::Spin::Connector::getInstance().connect("127.0.0.1", 4104));
256 connection_out.write(
257 "GET /index.html HTTP/1.1\r\n"
258 "User-Agent: test\r\n"
259 "Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5\r\n"
260 "Accept-Language: en-us,en;q=0\r\n"
261 "Accept-Encoding: gzip,deflate\r\n"
263 Sleep(1000);
264 connection_out.write(
265 "Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7\r\n"
266 "Keep-Alive: 300\r\n"
267 "Connection: keep-alive\r\n"
268 "\r\n"
270 boost::shared_ptr< ::Spin::Details::Request > request(request_handler.getNextRequest());
271 CPPUNIT_ASSERT(request->method_ == "GET");
272 CPPUNIT_ASSERT(request->url_ == "/index.html");
273 CPPUNIT_ASSERT(request->protocol_and_version_ == "HTTP/1.1");
274 CPPUNIT_ASSERT(request->body_.empty());
275 CPPUNIT_ASSERT(request->header_fields_.size() == 7);
276 ::Spin::Details::Request::HeaderFields::const_iterator where(request->header_fields_.begin());
277 CPPUNIT_ASSERT(where->name_ == "User-Agent");
278 CPPUNIT_ASSERT(where->value_ == "test");
279 ++where;
280 CPPUNIT_ASSERT(where->name_ == "Accept");
281 CPPUNIT_ASSERT(where->value_ == "text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5");
282 ++where;
283 CPPUNIT_ASSERT(where->name_ == "Accept-Language");
284 CPPUNIT_ASSERT(where->value_ == "en-us,en;q=0");
285 ++where;
286 CPPUNIT_ASSERT(where->name_ == "Accept-Encoding");
287 CPPUNIT_ASSERT(where->value_ == "gzip,deflate");
288 ++where;
289 CPPUNIT_ASSERT(where->name_ == "Accept-Charset");
290 CPPUNIT_ASSERT(where->value_ == "ISO-8859-1,utf-8;q=0.7,*;q=0.7");
291 ++where;
292 CPPUNIT_ASSERT(where->name_ == "Keep-Alive");
293 CPPUNIT_ASSERT(where->value_ == "300");
294 ++where;
295 CPPUNIT_ASSERT(where->name_ == "Connection");
296 CPPUNIT_ASSERT(where->value_ == "keep-alive");
297 ++where;
300 void Listener::tryAcceptWithHTTPHandler06()
302 ::Spin::Listener listener(0, 4105);
303 ::Spin::Handlers::HTTPRequestHandler request_handler;
304 ::Spin::Handlers::HTTPConnectionHandler connection_handler(request_handler);
305 listener.setNewConnectionHandler(connection_handler);
306 Loki::ScopeGuard attachment_handler = Loki::MakeObjGuard(listener, &::Spin::Listener::clearNewConnectionHandler);
307 ::Spin::Connection connection_out(::Spin::Connector::getInstance().connect("127.0.0.1", 4105));
308 connection_out.write(
309 "GET /index.html HTTP/1.1\r\n"
310 "User-Agent: test\r\n"
311 "Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5\r\n"
312 "Accept-Language: en-us,en;q=0\r\n"
313 "Accept-Encoding: gzip,deflate"
315 Sleep(1000);
316 connection_out.write(
317 "\r\n"
318 "Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7\r\n"
319 "Keep-Alive: 300\r\n"
320 "Connection: keep-alive\r\n"
321 "\r\n"
323 boost::shared_ptr< ::Spin::Details::Request > request(request_handler.getNextRequest());
324 CPPUNIT_ASSERT(request->method_ == "GET");
325 CPPUNIT_ASSERT(request->url_ == "/index.html");
326 CPPUNIT_ASSERT(request->protocol_and_version_ == "HTTP/1.1");
327 CPPUNIT_ASSERT(request->body_.empty());
328 CPPUNIT_ASSERT(request->header_fields_.size() == 7);
329 ::Spin::Details::Request::HeaderFields::const_iterator where(request->header_fields_.begin());
330 CPPUNIT_ASSERT(where->name_ == "User-Agent");
331 CPPUNIT_ASSERT(where->value_ == "test");
332 ++where;
333 CPPUNIT_ASSERT(where->name_ == "Accept");
334 CPPUNIT_ASSERT(where->value_ == "text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5");
335 ++where;
336 CPPUNIT_ASSERT(where->name_ == "Accept-Language");
337 CPPUNIT_ASSERT(where->value_ == "en-us,en;q=0");
338 ++where;
339 CPPUNIT_ASSERT(where->name_ == "Accept-Encoding");
340 CPPUNIT_ASSERT(where->value_ == "gzip,deflate");
341 ++where;
342 CPPUNIT_ASSERT(where->name_ == "Accept-Charset");
343 CPPUNIT_ASSERT(where->value_ == "ISO-8859-1,utf-8;q=0.7,*;q=0.7");
344 ++where;
345 CPPUNIT_ASSERT(where->name_ == "Keep-Alive");
346 CPPUNIT_ASSERT(where->value_ == "300");
347 ++where;
348 CPPUNIT_ASSERT(where->name_ == "Connection");
349 CPPUNIT_ASSERT(where->value_ == "keep-alive");
350 ++where;
353 void Listener::tryAcceptWithHTTPHandler07()
355 ::Spin::Listener listener(0, 4106);
356 ::Spin::Handlers::HTTPRequestHandler request_handler;
357 ::Spin::Handlers::HTTPConnectionHandler connection_handler(request_handler);
358 listener.setNewConnectionHandler(connection_handler);
359 Loki::ScopeGuard attachment_handler = Loki::MakeObjGuard(listener, &::Spin::Listener::clearNewConnectionHandler);
360 ::Spin::Connection connection_out(::Spin::Connector::getInstance().connect("127.0.0.1", 4106));
361 connection_out.write(
362 "GET /index.html HTTP/1.1\r\n"
363 "User-Agent: test\r\n"
364 "Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5\r\n"
365 "Accept-Language: en-us,en;q=0\r\n"
366 "Accept-Encoding: gzip,"
368 Sleep(1000);
369 connection_out.write(
370 "deflate\r\n"
371 "Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7\r\n"
372 "Keep-Alive: 300\r\n"
373 "Connection: keep-alive\r\n"
374 "\r\n"
376 boost::shared_ptr< ::Spin::Details::Request > request(request_handler.getNextRequest());
377 CPPUNIT_ASSERT(request->method_ == "GET");
378 CPPUNIT_ASSERT(request->url_ == "/index.html");
379 CPPUNIT_ASSERT(request->protocol_and_version_ == "HTTP/1.1");
380 CPPUNIT_ASSERT(request->body_.empty());
381 CPPUNIT_ASSERT(request->header_fields_.size() == 7);
382 ::Spin::Details::Request::HeaderFields::const_iterator where(request->header_fields_.begin());
383 CPPUNIT_ASSERT(where->name_ == "User-Agent");
384 CPPUNIT_ASSERT(where->value_ == "test");
385 ++where;
386 CPPUNIT_ASSERT(where->name_ == "Accept");
387 CPPUNIT_ASSERT(where->value_ == "text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5");
388 ++where;
389 CPPUNIT_ASSERT(where->name_ == "Accept-Language");
390 CPPUNIT_ASSERT(where->value_ == "en-us,en;q=0");
391 ++where;
392 CPPUNIT_ASSERT(where->name_ == "Accept-Encoding");
393 CPPUNIT_ASSERT(where->value_ == "gzip,deflate");
394 ++where;
395 CPPUNIT_ASSERT(where->name_ == "Accept-Charset");
396 CPPUNIT_ASSERT(where->value_ == "ISO-8859-1,utf-8;q=0.7,*;q=0.7");
397 ++where;
398 CPPUNIT_ASSERT(where->name_ == "Keep-Alive");
399 CPPUNIT_ASSERT(where->value_ == "300");
400 ++where;
401 CPPUNIT_ASSERT(where->name_ == "Connection");
402 CPPUNIT_ASSERT(where->value_ == "keep-alive");
403 ++where;
406 void Listener::tryAcceptWithHTTPHandler08()
408 ::Spin::Listener listener(0, 4107);
409 ::Spin::Handlers::HTTPRequestHandler request_handler;
410 ::Spin::Handlers::HTTPConnectionHandler connection_handler(request_handler);
411 listener.setNewConnectionHandler(connection_handler);
412 Loki::ScopeGuard attachment_handler = Loki::MakeObjGuard(listener, &::Spin::Listener::clearNewConnectionHandler);
413 ::Spin::Connection connection_out(::Spin::Connector::getInstance().connect("127.0.0.1", 4107));
414 connection_out.write(
415 "GET /index.html HTTP/1.1\r\n"
416 "User-Agent: test\r\n"
417 "Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5\r\n"
418 "Accept-Language: en-us,en;q=0\r\n"
419 "Accept-Encoding: gzip,\r\n"
421 Sleep(1000);
422 connection_out.write(
423 "\tdeflate\r\n"
424 "Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7\r\n"
425 "Keep-Alive: 300\r\n"
426 "Connection: keep-alive\r\n"
427 "\r\n"
429 boost::shared_ptr< ::Spin::Details::Request > request(request_handler.getNextRequest());
430 CPPUNIT_ASSERT(request->method_ == "GET");
431 CPPUNIT_ASSERT(request->url_ == "/index.html");
432 CPPUNIT_ASSERT(request->protocol_and_version_ == "HTTP/1.1");
433 CPPUNIT_ASSERT(request->body_.empty());
434 CPPUNIT_ASSERT(request->header_fields_.size() == 7);
435 ::Spin::Details::Request::HeaderFields::const_iterator where(request->header_fields_.begin());
436 CPPUNIT_ASSERT(where->name_ == "User-Agent");
437 CPPUNIT_ASSERT(where->value_ == "test");
438 ++where;
439 CPPUNIT_ASSERT(where->name_ == "Accept");
440 CPPUNIT_ASSERT(where->value_ == "text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5");
441 ++where;
442 CPPUNIT_ASSERT(where->name_ == "Accept-Language");
443 CPPUNIT_ASSERT(where->value_ == "en-us,en;q=0");
444 ++where;
445 CPPUNIT_ASSERT(where->name_ == "Accept-Encoding");
446 CPPUNIT_ASSERT(where->value_ == "gzip,\r\n\tdeflate");
447 ++where;
448 CPPUNIT_ASSERT(where->name_ == "Accept-Charset");
449 CPPUNIT_ASSERT(where->value_ == "ISO-8859-1,utf-8;q=0.7,*;q=0.7");
450 ++where;
451 CPPUNIT_ASSERT(where->name_ == "Keep-Alive");
452 CPPUNIT_ASSERT(where->value_ == "300");
453 ++where;
454 CPPUNIT_ASSERT(where->name_ == "Connection");
455 CPPUNIT_ASSERT(where->value_ == "keep-alive");
456 ++where;
459 void Listener::tryAcceptWithHTTPHandler09()
461 ::Spin::Listener listener(0, 4107);
462 ::Spin::Handlers::HTTPRequestHandler request_handler;
463 ::Spin::Handlers::HTTPConnectionHandler connection_handler(request_handler);
464 listener.setNewConnectionHandler(connection_handler);
465 Loki::ScopeGuard attachment_handler = Loki::MakeObjGuard(listener, &::Spin::Listener::clearNewConnectionHandler);
466 ::Spin::Connection connection_out(::Spin::Connector::getInstance().connect("127.0.0.1", 4107));
467 connection_out.write(
468 "GET /index.html HTTP/1.1\r\n"
469 "User-Agent: test\r\n"
470 "Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5\r\n"
471 "Accept-Language: en-us,en;q=0\r\n"
472 "Accept-Encoding: gzip,\r\n"
473 "\tdeflate\r\n"
474 "Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7\r\n"
475 "Keep-Alive: 300\r\n"
476 "Connection: keep-alive\r\n"
478 Sleep(1000);
479 connection_out.write(
480 "\r\n"
482 boost::shared_ptr< ::Spin::Details::Request > request(request_handler.getNextRequest());
483 CPPUNIT_ASSERT(request->method_ == "GET");
484 CPPUNIT_ASSERT(request->url_ == "/index.html");
485 CPPUNIT_ASSERT(request->protocol_and_version_ == "HTTP/1.1");
486 CPPUNIT_ASSERT(request->body_.empty());
487 CPPUNIT_ASSERT(request->header_fields_.size() == 7);
488 ::Spin::Details::Request::HeaderFields::const_iterator where(request->header_fields_.begin());
489 CPPUNIT_ASSERT(where->name_ == "User-Agent");
490 CPPUNIT_ASSERT(where->value_ == "test");
491 ++where;
492 CPPUNIT_ASSERT(where->name_ == "Accept");
493 CPPUNIT_ASSERT(where->value_ == "text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5");
494 ++where;
495 CPPUNIT_ASSERT(where->name_ == "Accept-Language");
496 CPPUNIT_ASSERT(where->value_ == "en-us,en;q=0");
497 ++where;
498 CPPUNIT_ASSERT(where->name_ == "Accept-Encoding");
499 CPPUNIT_ASSERT(where->value_ == "gzip,\r\n\tdeflate");
500 ++where;
501 CPPUNIT_ASSERT(where->name_ == "Accept-Charset");
502 CPPUNIT_ASSERT(where->value_ == "ISO-8859-1,utf-8;q=0.7,*;q=0.7");
503 ++where;
504 CPPUNIT_ASSERT(where->name_ == "Keep-Alive");
505 CPPUNIT_ASSERT(where->value_ == "300");
506 ++where;
507 CPPUNIT_ASSERT(where->name_ == "Connection");
508 CPPUNIT_ASSERT(where->value_ == "keep-alive");
509 ++where;
512 void Listener::tryAcceptWithHTTPHandler10()
514 ::Spin::Listener listener(0, 4108);
515 ::Spin::Handlers::HTTPRequestHandler request_handler;
516 ::Spin::Handlers::HTTPConnectionHandler connection_handler(request_handler);
517 listener.setNewConnectionHandler(connection_handler);
518 Loki::ScopeGuard attachment_handler = Loki::MakeObjGuard(listener, &::Spin::Listener::clearNewConnectionHandler);
519 ::Spin::Connection connection_out(::Spin::Connector::getInstance().connect("127.0.0.1", 4108));
520 connection_out.write(
521 "GET /index.html HTTP/1.1"
523 Sleep(1000);
524 connection_out.write(
525 "\r\n"
526 "User-Agent: test\r\n"
527 "Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5\r\n"
528 "Accept-Language: en-us,en;q=0\r\n"
529 "Accept-Encoding: gzip,\r\n"
530 "\tdeflate\r\n"
531 "Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7\r\n"
532 "Keep-Alive: 300\r\n"
533 "Connection: keep-alive\r\n"
534 "\r\n"
536 boost::shared_ptr< ::Spin::Details::Request > request(request_handler.getNextRequest());
537 CPPUNIT_ASSERT(request->method_ == "GET");
538 CPPUNIT_ASSERT(request->url_ == "/index.html");
539 CPPUNIT_ASSERT(request->protocol_and_version_ == "HTTP/1.1");
540 CPPUNIT_ASSERT(request->body_.empty());
541 CPPUNIT_ASSERT(request->header_fields_.size() == 7);
542 ::Spin::Details::Request::HeaderFields::const_iterator where(request->header_fields_.begin());
543 CPPUNIT_ASSERT(where->name_ == "User-Agent");
544 CPPUNIT_ASSERT(where->value_ == "test");
545 ++where;
546 CPPUNIT_ASSERT(where->name_ == "Accept");
547 CPPUNIT_ASSERT(where->value_ == "text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5");
548 ++where;
549 CPPUNIT_ASSERT(where->name_ == "Accept-Language");
550 CPPUNIT_ASSERT(where->value_ == "en-us,en;q=0");
551 ++where;
552 CPPUNIT_ASSERT(where->name_ == "Accept-Encoding");
553 CPPUNIT_ASSERT(where->value_ == "gzip,\r\n\tdeflate");
554 ++where;
555 CPPUNIT_ASSERT(where->name_ == "Accept-Charset");
556 CPPUNIT_ASSERT(where->value_ == "ISO-8859-1,utf-8;q=0.7,*;q=0.7");
557 ++where;
558 CPPUNIT_ASSERT(where->name_ == "Keep-Alive");
559 CPPUNIT_ASSERT(where->value_ == "300");
560 ++where;
561 CPPUNIT_ASSERT(where->name_ == "Connection");
562 CPPUNIT_ASSERT(where->value_ == "keep-alive");
563 ++where;
566 void Listener::tryAcceptWithHTTPHandler11()
568 ::Spin::Listener listener(0, 4109);
569 ::Spin::Handlers::HTTPRequestHandler request_handler;
570 ::Spin::Handlers::HTTPConnectionHandler connection_handler(request_handler);
571 listener.setNewConnectionHandler(connection_handler);
572 Loki::ScopeGuard attachment_handler = Loki::MakeObjGuard(listener, &::Spin::Listener::clearNewConnectionHandler);
573 ::Spin::Connection connection_out(::Spin::Connector::getInstance().connect("127.0.0.1", 4109));
574 connection_out.write(
577 Sleep(1000);
578 connection_out.write(
579 "ET /index"
581 Sleep(1000);
582 connection_out.write(
583 ".html HTT"
585 Sleep(1000);
586 connection_out.write(
587 "P/1.1\r\n"
588 "User-Agent: test\r\n"
589 "Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5\r\n"
590 "Accept-Language: en-us,en;q=0\r\n"
591 "Accept-Encoding: gzip,\r\n"
592 "\tdeflate\r\n"
593 "Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7\r\n"
594 "Keep-Alive: 300\r\n"
595 "Connection: keep-alive\r\n"
596 "\r\n"
598 boost::shared_ptr< ::Spin::Details::Request > request(request_handler.getNextRequest());
599 CPPUNIT_ASSERT(request->method_ == "GET");
600 CPPUNIT_ASSERT(request->url_ == "/index.html");
601 CPPUNIT_ASSERT(request->protocol_and_version_ == "HTTP/1.1");
602 CPPUNIT_ASSERT(request->body_.empty());
603 CPPUNIT_ASSERT(request->header_fields_.size() == 7);
604 ::Spin::Details::Request::HeaderFields::const_iterator where(request->header_fields_.begin());
605 CPPUNIT_ASSERT(where->name_ == "User-Agent");
606 CPPUNIT_ASSERT(where->value_ == "test");
607 ++where;
608 CPPUNIT_ASSERT(where->name_ == "Accept");
609 CPPUNIT_ASSERT(where->value_ == "text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5");
610 ++where;
611 CPPUNIT_ASSERT(where->name_ == "Accept-Language");
612 CPPUNIT_ASSERT(where->value_ == "en-us,en;q=0");
613 ++where;
614 CPPUNIT_ASSERT(where->name_ == "Accept-Encoding");
615 CPPUNIT_ASSERT(where->value_ == "gzip,\r\n\tdeflate");
616 ++where;
617 CPPUNIT_ASSERT(where->name_ == "Accept-Charset");
618 CPPUNIT_ASSERT(where->value_ == "ISO-8859-1,utf-8;q=0.7,*;q=0.7");
619 ++where;
620 CPPUNIT_ASSERT(where->name_ == "Keep-Alive");
621 CPPUNIT_ASSERT(where->value_ == "300");
622 ++where;
623 CPPUNIT_ASSERT(where->name_ == "Connection");
624 CPPUNIT_ASSERT(where->value_ == "keep-alive");
625 ++where;