96 {
98 "httpclient",
99 [](const std::shared_ptr<MasterRequest>& req) {
100 VLOG(1) << req->getSocketContext()->getSocketConnection()->getConnectionName() <<
": OnRequestStart";
101
102 req->httpMajor = 1;
103 req->httpMinor = 1;
104 req->url = "/";
105 req->set("Connection", "keep-alive");
106 req->setTrailer("MyTrailer",
107 "MyTrailerValue");
108
109 req->end(
110 [](const std::shared_ptr<Request>& req, const std::shared_ptr<Response>& res) {
112 },
113 [](const std::shared_ptr<Request>&, const std::string&) {
114 });
115
116 req->httpMinor = 1;
117 req->method = "GET";
118 req->url = "/sendfile/";
119 req->set("Connection", "keep-alive");
120 req->sendFile(
121 "/home/voc/projects/snodec/snode.c/CMakeLists.tt",
122 [req](int ret) {
123 if (ret == 0) {
124 VLOG(1) << req->getSocketContext()->getSocketConnection()->getConnectionName()
125 << " HTTP: Request accepted: GET / HTTP/" << req->httpMajor << "." << req->httpMinor;
126 VLOG(1) <<
" /home/voc/projects/snodec/snode.c/CMakeLists.tt";
127 } else {
128 LOG(ERROR) << req->getSocketContext()->getSocketConnection()->getConnectionName()
129 << " HTTP: Request failed: GET / HTTP/" << req->httpMajor << "." << req->httpMinor;
130 PLOG(ERROR) <<
" /home/voc/projects/snodec/snode.c/CMakeLists.tt";
131 }
132 },
133 [](const std::shared_ptr<Request>& req, const std::shared_ptr<Response>& res) {
135 },
136 [](const std::shared_ptr<Request>&, const std::string&) {
137 });
138
139 req->init();
140 req->httpMinor = 1;
141 req->url = "/third";
142 req->set("Connection", "keep-alive");
143 req->setTrailer("MyTrailer",
144 "MyTrailerValue");
145
146 req->end(
147 [](const std::shared_ptr<Request>& req, const std::shared_ptr<Response>& res) {
149 },
150 [](const std::shared_ptr<Request>&, const std::string&) {
151 });
152
153#define LONG
154#ifdef LONG
155 req->url = "/";
156 req->set("Connection", "keep-alive");
157 req->end(
158 [](const std::shared_ptr<Request>& req, const std::shared_ptr<Response>& res) {
160 },
161 [](const std::shared_ptr<Request>&, const std::string&) {
162 });
163
164 req->httpMinor = 1;
165 req->url = "/index.html";
166
167 req->end(
168 [](const std::shared_ptr<Request>& req, const std::shared_ptr<Response>& res) {
170 },
171 [](const std::shared_ptr<Request>&, const std::string&) {
172 });
173 req->url = "/";
174 req->set("Connection", "keep-alive");
175 req->end(
176 [](const std::shared_ptr<Request>& req, const std::shared_ptr<Response>& res) {
178 },
179 [req](const std::shared_ptr<Request>&, const std::string&) {
180 });
181 req->url = "/index.html";
182 req->set("Connection", "keep-alive");
183 req->end(
184 [](const std::shared_ptr<Request>& req, const std::shared_ptr<Response>& res) {
186 },
187 [req](const std::shared_ptr<Request>&, const std::string&) {
188 });
189 req->url = "/";
190 req->set("Connection", "keep-alive");
191 req->end(
192 [](const std::shared_ptr<Request>& req, const std::shared_ptr<Response>& res) {
194 },
195 [req](const std::shared_ptr<Request>&, const std::string&) {
196 });
197 req->url = "/index.html";
198 req->set("Connection", "keep-alive");
199 req->end(
200 [](const std::shared_ptr<Request>& req, const std::shared_ptr<Response>& res) {
202 },
203 [req](const std::shared_ptr<Request>&, const std::string&) {
204 });
205 req->url = "/";
206 req->set("Connection", "keep-alive");
207 req->end(
208 [](const std::shared_ptr<Request>& req, const std::shared_ptr<Response>& res) {
210 },
211 [req](const std::shared_ptr<Request>&, const std::string&) {
212 });
213 req->url = "/index.html";
214 req->set("Connection", "keep-alive");
215 req->end(
216 [](const std::shared_ptr<Request>& req, const std::shared_ptr<Response>& res) {
218 },
219 [req](const std::shared_ptr<Request>&, const std::string&) {
220 });
221 req->url = "/";
222 req->set("Connection", "keep-alive");
223 req->end(
224 [](const std::shared_ptr<Request>& req, const std::shared_ptr<Response>& res) {
226 },
227 [req](const std::shared_ptr<Request>&, const std::string&) {
228 });
229 req->url = "/index.html";
230 req->set("Connection", "keep-alive");
231 req->end(
232 [](const std::shared_ptr<Request>& req, const std::shared_ptr<Response>& res) {
234 },
235 [req](const std::shared_ptr<Request>&, const std::string&) {
236 });
237 req->url = "/";
238 req->set("Connection", "keep-alive");
239 req->end(
240 [](const std::shared_ptr<Request>& req, const std::shared_ptr<Response>& res) {
242 },
243 [req](const std::shared_ptr<Request>&, const std::string&) {
244 });
245 req->url = "/index.html";
246 req->set("Connection", "keep-alive");
247 req->end(
248 [](const std::shared_ptr<Request>& req, const std::shared_ptr<Response>& res) {
250 },
251 [req](const std::shared_ptr<Request>&, const std::string&) {
252 });
253 req->url = "/";
254 req->set("Connection", "keep-alive");
255 req->end(
256 [](const std::shared_ptr<Request>& req, const std::shared_ptr<Response>& res) {
258 },
259 [req](const std::shared_ptr<Request>&, const std::string&) {
260 });
261 req->url = "/index.html";
262 req->set("Connection", "keep-alive");
263 req->end(
264 [](const std::shared_ptr<Request>& req, const std::shared_ptr<Response>& res) {
266 },
267 [req](const std::shared_ptr<Request>&, const std::string&) {
268 });
269 req->url = "/";
270 req->set("Connection", "keep-alive");
271 req->end(
272 [](const std::shared_ptr<Request>& req, const std::shared_ptr<Response>& res) {
274 },
275 [req](const std::shared_ptr<Request>&, const std::string&) {
276 });
277 req->url = "/index.html";
278 req->set("Connection", "keep-alive");
279 req->end(
280 [](const std::shared_ptr<Request>& req, const std::shared_ptr<Response>& res) {
282 },
283 [req](const std::shared_ptr<Request>&, const std::string&) {
284 });
285 req->url = "/";
286 req->set("Connection", "close");
287 req->end(
288 [](const std::shared_ptr<Request>& req, const std::shared_ptr<Response>& res) {
290 },
291 [req](const std::shared_ptr<Request>&, const std::string&) {
292 });
293
294 const std::shared_ptr<web::http::client::tools::EventSource> eventStream_1 =
295 web::http::legacy::NET::EventSource("http://" + req->hostFieldValue, "/sse?hihi=3");
296
297 if (eventStream_1) {
298 eventStream_1->onOpen([]() {
299 VLOG(0) <<
"OnOpen 1";
300 });
301
302 eventStream_1->onError([]() {
303 VLOG(0) <<
"OnError 1";
304 });
305
306 eventStream_1->onMessage([](const web::http::client::tools::EventSource::MessageEvent& message) {
307 VLOG(0) <<
"OnMessage 1:1: " << message.
data;
308 });
309 eventStream_1->onMessage([](const web::http::client::tools::EventSource::MessageEvent& message) {
310 VLOG(0) <<
"OnMessage 1:2: " << message.
data;
311 });
312 eventStream_1->addEventListener("myevent", [](const web::http::client::tools::EventSource::MessageEvent& message) {
313 VLOG(0) <<
"EventListener for 'myevent' 1:1: " << message.
lastEventId <<
" : " << message.
data;
314 });
315 eventStream_1->addEventListener("myevent", [](const web::http::client::tools::EventSource::MessageEvent& message) {
316 VLOG(0) <<
"EventListener for 'myevent' 1:2: " << message.
lastEventId <<
" : " << message.
data;
317 });
318
320 [eventStream_1]() {
321 eventStream_1->close();
322 },
323 5);
324 }
325
326 auto eventStream_2 = web::http::legacy::NET::EventSource("http://localhost:8080/sse");
327
328 if (eventStream_2) {
329 eventStream_2->onOpen([]() {
330 VLOG(0) <<
"OnOpen 2";
331 });
332
333 eventStream_2->onError([]() {
334 VLOG(0) <<
"OnError 2";
335 });
336
337 eventStream_2->onMessage([](const web::http::client::tools::EventSource::MessageEvent& message) {
338 VLOG(0) <<
"OnMessage 2:1: " << message.
data;
339 });
340 eventStream_2->onMessage([](const web::http::client::tools::EventSource::MessageEvent& message) {
341 VLOG(0) <<
"OnMessage 2:2: " << message.
data;
342 });
343 eventStream_2->addEventListener("myevent", [](const web::http::client::tools::EventSource::MessageEvent& message) {
344 VLOG(0) <<
"EventListener for 'myevent' 2:1: " << message.
lastEventId <<
" : " << message.
data;
345 });
346 eventStream_2->addEventListener("myevent", [](const web::http::client::tools::EventSource::MessageEvent& message) {
347 VLOG(0) <<
"EventListener for 'myevent' 2:2: " << message.
lastEventId <<
" : " << message.
data;
348 });
349 }
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467#endif
468 },
469 []([[maybe_unused]] const std::shared_ptr<Request>& req) {
470 VLOG(1) << req->getSocketContext()->getSocketConnection()->getConnectionName() <<
": OnRequestEnd";
471 });
472
474 VLOG(1) << socketConnection->getConnectionName() <<
": OnConnect";
475
476 VLOG(1) <<
"\tLocal: " << socketConnection->getLocalAddress().toString();
477 VLOG(1) <<
"\tPeer: " << socketConnection->getRemoteAddress().toString();
478 });
479
481 VLOG(1) << socketConnection->getConnectionName() <<
": OnDisconnect";
482
483 VLOG(1) <<
"\tLocal: " << socketConnection->getLocalAddress().toString();
484 VLOG(1) <<
"\tPeer: " << socketConnection->getRemoteAddress().toString();
485 });
486
487 return client;
488 }
static Timer singleshotTimer(const std::function< void()> &dispatcher, const utils::Timeval &timeout)
static void logResponse(const std::shared_ptr< web::http::client::Request > &req, const std::shared_ptr< web::http::client::Response > &res)
Client::SocketConnection SocketConnection
web::http::legacy::NET::Client Client