2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
42#ifndef APPS_HTTP_MODEL_CLIENTS_H
43#define APPS_HTTP_MODEL_CLIENTS_H
46#define STR_INCLUDE(a) #a
52#include CLIENT_INCLUDE
54#ifndef DOXYGEN_SHOULD_SKIP_THIS
56#include "log/Logger.h"
57#include "web/http/http_utils.h"
59#if (STREAM_TYPE == TLS)
61#include <openssl/ssl.h>
62#include <openssl/x509v3.h>
67static void logResponse(
const std::shared_ptr<web::http::client::Request>& req,
const std::shared_ptr<web::http::client::Response>& res) {
68 VLOG(1) << req->getSocketContext()->getSocketConnection()->getConnectionName() <<
" HTTP response: " << req->method <<
" " << req->url
69 <<
" HTTP/" << req->httpMajor <<
"." << req->httpMinor <<
"\n"
70 << httputils::toString(req->method,
72 "HTTP/" + std::to_string(req->httpMajor) +
"." + std::to_string(req->httpMinor),
78 << httputils::toString(res->httpVersion, res->statusCode, res->reason, res->headers, res->cookies, res->body);
81#if (STREAM_TYPE == LEGACY)
93 [](
const std::shared_ptr<Request>& req) {
94 VLOG(1) << req->getSocketContext()->getSocketConnection()->getConnectionName() <<
": OnRequestStart";
98 req->set(
"Connection",
"keep-alive");
99 req->setTrailer(
"MyTrailer",
102 req->end([](
const std::shared_ptr<Request>& req,
const std::shared_ptr<Response>& res) {
103 logResponse(req, res);
107 req->url =
"/hihihih";
108 req->set(
"Connection",
"keep-alive");
109 req->end([](
const std::shared_ptr<Request>& req,
const std::shared_ptr<Response>& res) {
110 logResponse(req, res);
114 req->url =
"/index.html";
116 req->end([](
const std::shared_ptr<Request>& req,
const std::shared_ptr<Response>& res) {
117 logResponse(req, res);
120 req->set(
"Connection",
"keep-alive");
121 req->end([](
const std::shared_ptr<Request>& req,
const std::shared_ptr<Response>& res) {
122 logResponse(req, res);
124 req->url =
"/index.html";
125 req->set(
"Connection",
"keep-alive");
126 req->end([](
const std::shared_ptr<Request>& req,
const std::shared_ptr<Response>& res) {
127 logResponse(req, res);
130 req->set(
"Connection",
"keep-alive");
131 req->end([](
const std::shared_ptr<Request>& req,
const std::shared_ptr<Response>& res) {
132 logResponse(req, res);
134 req->url =
"/index.html";
135 req->set(
"Connection",
"keep-alive");
136 req->end([](
const std::shared_ptr<Request>& req,
const std::shared_ptr<Response>& res) {
137 logResponse(req, res);
140 req->set(
"Connection",
"keep-alive");
141 req->end([](
const std::shared_ptr<Request>& req,
const std::shared_ptr<Response>& res) {
142 logResponse(req, res);
144 req->url =
"/index.html";
145 req->set(
"Connection",
"keep-alive");
146 req->end([](
const std::shared_ptr<Request>& req,
const std::shared_ptr<Response>& res) {
147 logResponse(req, res);
150 req->set(
"Connection",
"keep-alive");
151 req->end([](
const std::shared_ptr<Request>& req,
const std::shared_ptr<Response>& res) {
152 logResponse(req, res);
154 req->url =
"/index.html";
155 req->set(
"Connection",
"keep-alive");
156 req->end([](
const std::shared_ptr<Request>& req,
const std::shared_ptr<Response>& res) {
157 logResponse(req, res);
160 req->set(
"Connection",
"keep-alive");
161 req->end([](
const std::shared_ptr<Request>& req,
const std::shared_ptr<Response>& res) {
162 logResponse(req, res);
164 req->url =
"/index.html";
165 req->set(
"Connection",
"keep-alive");
166 req->end([](
const std::shared_ptr<Request>& req,
const std::shared_ptr<Response>& res) {
167 logResponse(req, res);
170 req->set(
"Connection",
"keep-alive");
171 req->end([](
const std::shared_ptr<Request>& req,
const std::shared_ptr<Response>& res) {
172 logResponse(req, res);
174 req->url =
"/index.html";
175 req->set(
"Connection",
"keep-alive");
176 req->end([](
const std::shared_ptr<Request>& req,
const std::shared_ptr<Response>& res) {
177 logResponse(req, res);
180 req->set(
"Connection",
"keep-alive");
181 req->end([](
const std::shared_ptr<Request>& req,
const std::shared_ptr<Response>& res) {
182 logResponse(req, res);
184 req->url =
"/index.html";
185 req->set(
"Connection",
"keep-alive");
186 req->end([](
const std::shared_ptr<Request>& req,
const std::shared_ptr<Response>& res) {
187 logResponse(req, res);
190 req->set(
"Connection",
"keep-alive");
191 req->end([](
const std::shared_ptr<Request>& req,
const std::shared_ptr<Response>& res) {
192 logResponse(req, res);
196 req->method =
"POST";
198 req->set(
"Test",
"aaa");
199 req->setTrailer(
"MyTrailer1",
202 req->setTrailer(
"MyTrailer2",
"MyTrailerValue2");
203 req->setTrailer(
"MyTrailer3",
"MyTrailerValue3");
204 req->setTrailer(
"MyTrailer4",
"MyTrailerValue4");
205 req->setTrailer(
"MyTrailer5",
"MyTrailerValue5");
206 req->setTrailer(
"MyTrailer6",
"MyTrailerValue6");
207 req->query(
"Query1",
"QueryValue1");
208 req->query(
"Query2",
"QueryValue2");
210 "/home/voc/projects/snodec/snode.c/CMakeLists.txt",
213 VLOG(1) << req->getSocketContext()->getSocketConnection()->getConnectionName()
214 <<
" HTTP: Request accepted: POST / HTTP/" << req->httpMajor <<
"." << req->httpMinor;
215 VLOG(1) <<
" /home/voc/projects/snodec/snode.c/CMakeLists.txt";
217 LOG(ERROR) << req->getSocketContext()->getSocketConnection()->getConnectionName()
218 <<
" HTTP: Request failed: POST / HTTP/" << req->httpMajor <<
"." << req->httpMinor;
219 PLOG(ERROR) <<
" /home/voc/projects/snodec/snode.c/CMakeLists.txt";
221 req->set(
"Connection",
"close");
222 req->end([]([[maybe_unused]]
const std::shared_ptr<Request>& req,
223 [[maybe_unused]]
const std::shared_ptr<Response>& res) {
227 [](
const std::shared_ptr<Request>& req,
const std::shared_ptr<Response>& res) {
228 logResponse(req, res);
231 req->method =
"POST";
233 req->set(
"Connection",
"keep-alive");
234 req->set(
"Test",
"bbb");
236 "/home/voc/projects/snodec/snode.c/CMakeLists.tt",
239 VLOG(1) << req->getSocketContext()->getSocketConnection()->getConnectionName()
240 <<
" HTTP: Request accepted: POST / HTTP/" << req->httpMajor <<
"." << req->httpMinor;
241 VLOG(1) <<
" /home/voc/projects/snodec/snode.c/CMakeLists.tt";
243 LOG(ERROR) << req->getSocketContext()->getSocketConnection()->getConnectionName()
244 <<
" HTTP: Request failed: POST / HTTP/" << req->httpMajor <<
"." << req->httpMinor;
245 PLOG(ERROR) <<
" /home/voc/projects/snodec/snode.c/CMakeLists.tt";
250 req->set(
"Connection",
"close");
251 req->set(
"Test",
"ccc");
252 req->end([](
const std::shared_ptr<Request>& req,
const std::shared_ptr<Response>& res) {
253 logResponse(req, res);
257 [](
const std::shared_ptr<Request>& req,
const std::shared_ptr<Response>& res) {
258 logResponse(req, res);
264 req->set(
"Connection",
"close");
265 req->set(
"Test",
"xxx");
266 req->end([](
const std::shared_ptr<Request>& req,
const std::shared_ptr<Response>& res) {
267 logResponse(req, res);
269 core::EventReceiver::atNextTick([req]() {
270 req->method =
"POST";
272 req->set(
"Connection",
"keep-alive");
273 req->set(
"Test",
"ddd");
275 "/home/voc/projects/snodec/snode.c/CMakeLists.txt",
278 VLOG(1) << req->getSocketContext()->getSocketConnection()->getConnectionName()
279 <<
" HTTP: Request accepted: POST / HTTP/" << req->httpMajor <<
"." << req->httpMinor;
280 VLOG(1) <<
" /home/voc/projects/snodec/snode.c/CMakeLists.txt";
282 LOG(ERROR) << req->getSocketContext()->getSocketConnection()->getConnectionName()
283 <<
" HTTP: Request failed: POST / HTTP/" << req->httpMajor <<
"." << req->httpMinor;
284 PLOG(ERROR) <<
" /home/voc/projects/snodec/snode.c/CMakeLists.txt";
286 req->set(
"Connection",
"close");
287 req->end([]([[maybe_unused]]
const std::shared_ptr<Request>& req,
288 [[maybe_unused]]
const std::shared_ptr<Response>& res) {
292 [](
const std::shared_ptr<Request>& req,
const std::shared_ptr<Response>& res) {
293 logResponse(req, res);
296 req->method =
"POST";
298 req->set(
"Connection",
"keep-alive");
299 req->set(
"Test",
"eee");
300 req->setTrailer(
"MyTrailer1",
"MyTrailerValue1");
301 req->setTrailer(
"MyTrailer2",
"MyTrailerValue2");
303 "/home/voc/projects/snodec/snode.c/CMakeLists.txt",
306 VLOG(1) << req->getSocketContext()->getSocketConnection()->getConnectionName()
307 <<
" HTTP: Request accepted: POST / HTTP/" << req->httpMajor <<
"." << req->httpMinor;
308 VLOG(1) <<
" /home/voc/projects/snodec/snode.c/CMakeLists.txt";
310 LOG(ERROR) << req->getSocketContext()->getSocketConnection()->getConnectionName()
311 <<
" HTTP: Request failed: POST / HTTP/" << req->httpMajor <<
"." << req->httpMinor;
312 PLOG(ERROR) <<
" /home/voc/projects/snodec/snode.c/CMakeLists.txt";
314 req->set(
"Connection",
"close");
315 req->end([]([[maybe_unused]]
const std::shared_ptr<Request>& req,
316 [[maybe_unused]]
const std::shared_ptr<Response>& res) {
320 [](
const std::shared_ptr<Request>& req,
const std::shared_ptr<Response>& res) {
321 logResponse(req, res);
326 []([[maybe_unused]]
const std::shared_ptr<Request>& req) {
327 VLOG(1) << req->getSocketContext()->getSocketConnection()->getConnectionName() <<
": OnRequestEnd";
330 client.setOnConnect([](SocketConnection* socketConnection) {
331 VLOG(1) << socketConnection->getConnectionName() <<
": OnConnect";
333 VLOG(1) <<
"\tLocal: " << socketConnection->getLocalAddress().toString();
334 VLOG(1) <<
"\tPeer: " << socketConnection->getRemoteAddress().toString();
337 client.setOnDisconnect([](SocketConnection* socketConnection) {
338 VLOG(1) << socketConnection->getConnectionName() <<
": OnDisconnect";
340 VLOG(1) <<
"\tLocal: " << socketConnection->getLocalAddress().toString();
341 VLOG(1) <<
"\tPeer: " << socketConnection->getRemoteAddress().toString();
351#if (STREAM_TYPE == TLS)
353namespace apps::http::
tls {
363 [](
const std::shared_ptr<Request>& req) {
364 VLOG(1) << req->getSocketContext()->getSocketConnection()->getConnectionName() <<
": OnRequestStart";
367 req->set(
"Connection",
"keep-alive");
368 req->end([](
const std::shared_ptr<Request>& req,
const std::shared_ptr<Response>& res) {
369 logResponse(req, res);
372 req->set(
"Connection",
"keep-alive");
373 req->end([](
const std::shared_ptr<Request>& req,
const std::shared_ptr<Response>& res) {
374 logResponse(req, res);
376 req->url =
"/index.html";
377 req->set(
"Connection",
"keep-alive");
378 req->end([](
const std::shared_ptr<Request>& req,
const std::shared_ptr<Response>& res) {
379 logResponse(req, res);
382 req->set(
"Connection",
"keep-alive");
383 req->end([](
const std::shared_ptr<Request>& req,
const std::shared_ptr<Response>& res) {
384 logResponse(req, res);
386 req->url =
"/index.html";
387 req->set(
"Connection",
"keep-alive");
388 req->end([](
const std::shared_ptr<Request>& req,
const std::shared_ptr<Response>& res) {
389 logResponse(req, res);
392 req->set(
"Connection",
"keep-alive");
393 req->end([](
const std::shared_ptr<Request>& req,
const std::shared_ptr<Response>& res) {
394 logResponse(req, res);
396 req->url =
"/index.html";
397 req->set(
"Connection",
"keep-alive");
398 req->end([](
const std::shared_ptr<Request>& req,
const std::shared_ptr<Response>& res) {
399 logResponse(req, res);
402 req->set(
"Connection",
"keep-alive");
403 req->end([](
const std::shared_ptr<Request>& req,
const std::shared_ptr<Response>& res) {
404 logResponse(req, res);
406 req->url =
"/index.html";
407 req->set(
"Connection",
"keep-alive");
408 req->end([](
const std::shared_ptr<Request>& req,
const std::shared_ptr<Response>& res) {
409 logResponse(req, res);
412 req->set(
"Connection",
"keep-alive");
413 req->end([](
const std::shared_ptr<Request>& req,
const std::shared_ptr<Response>& res) {
414 logResponse(req, res);
416 req->url =
"/index.html";
417 req->set(
"Connection",
"keep-alive");
418 req->end([](
const std::shared_ptr<Request>& req,
const std::shared_ptr<Response>& res) {
419 logResponse(req, res);
422 req->set(
"Connection",
"keep-alive");
423 req->end([](
const std::shared_ptr<Request>& req,
const std::shared_ptr<Response>& res) {
424 logResponse(req, res);
426 req->url =
"/index.html";
427 req->set(
"Connection",
"keep-alive");
428 req->end([](
const std::shared_ptr<Request>& req,
const std::shared_ptr<Response>& res) {
429 logResponse(req, res);
432 req->set(
"Connection",
"keep-alive");
433 req->end([](
const std::shared_ptr<Request>& req,
const std::shared_ptr<Response>& res) {
434 logResponse(req, res);
436 req->url =
"/index.html";
437 req->set(
"Connection",
"keep-alive");
438 req->end([](
const std::shared_ptr<Request>& req,
const std::shared_ptr<Response>& res) {
439 logResponse(req, res);
442 req->set(
"Connection",
"keep-alive");
443 req->end([](
const std::shared_ptr<Request>& req,
const std::shared_ptr<Response>& res) {
444 logResponse(req, res);
446 req->url =
"/index.html";
447 req->set(
"Connection",
"keep-alive");
448 req->end([](
const std::shared_ptr<Request>& req,
const std::shared_ptr<Response>& res) {
449 logResponse(req, res);
452 req->set(
"Connection",
"close");
453 req->end([](
const std::shared_ptr<Request>& req,
const std::shared_ptr<Response>& res) {
454 logResponse(req, res);
457 []([[maybe_unused]]
const std::shared_ptr<Request>& req) {
458 VLOG(1) << req->getSocketContext()->getSocketConnection()->getConnectionName() <<
": OnRequestEnd";
461 client.setOnConnect([](SocketConnection* socketConnection) {
462 VLOG(1) <<
"OnConnect " << socketConnection->getConnectionName();
464 VLOG(1) <<
"\tLocal: " << socketConnection->getLocalAddress().toString();
465 VLOG(1) <<
"\tPeer: " << socketConnection->getRemoteAddress().toString();
477 client.setOnConnected([](SocketConnection* socketConnection) {
478 VLOG(1) << socketConnection->getConnectionName() <<
": OnConnected";
479 X509* server_cert = SSL_get_peer_certificate(socketConnection->getSSL());
480 if (server_cert !=
nullptr) {
481 long verifyErr = SSL_get_verify_result(socketConnection->getSSL());
483 VLOG(1) <<
"\tPeer certificate verifyErr = " + std::to_string(verifyErr) +
": " +
484 std::string(X509_verify_cert_error_string(verifyErr));
486 char* str = X509_NAME_oneline(X509_get_subject_name(server_cert),
nullptr, 0);
487 VLOG(1) <<
"\t Subject: " + std::string(str);
490 str = X509_NAME_oneline(X509_get_issuer_name(server_cert),
nullptr, 0);
491 VLOG(1) <<
"\t Issuer: " + std::string(str);
496 GENERAL_NAMES* subjectAltNames =
497 static_cast<GENERAL_NAMES*>(X509_get_ext_d2i(server_cert, NID_subject_alt_name,
nullptr,
nullptr));
499#pragma GCC diagnostic push
501#if __has_warning
("-Wused-but-marked-unused")
502#pragma GCC diagnostic ignored "-Wused-but-marked-unused"
506 int32_t altNameCount = sk_GENERAL_NAME_num(subjectAltNames);
508#pragma GCC diagnostic pop
510 VLOG(1) <<
"\t Subject alternative name count: " << altNameCount;
511 for (int32_t i = 0; i < altNameCount; ++i) {
513#pragma GCC diagnostic push
515#if __has_warning
("-Wused-but-marked-unused")
516#pragma GCC diagnostic ignored "-Wused-but-marked-unused"
520 GENERAL_NAME* generalName = sk_GENERAL_NAME_value(subjectAltNames, i);
522#pragma GCC diagnostic pop
524 if (generalName->type == GEN_URI) {
525 std::string subjectAltName =
526 std::string(
reinterpret_cast<
const char*>(ASN1_STRING_get0_data(generalName->d.uniformResourceIdentifier)),
527 static_cast<std::size_t>(ASN1_STRING_length(generalName->d.uniformResourceIdentifier)));
528 VLOG(1) <<
"\t SAN (URI): '" + subjectAltName;
529 }
else if (generalName->type == GEN_DNS) {
530 std::string subjectAltName =
531 std::string(
reinterpret_cast<
const char*>(ASN1_STRING_get0_data(generalName->d.dNSName)),
532 static_cast<std::size_t>(ASN1_STRING_length(generalName->d.dNSName)));
533 VLOG(1) <<
"\t SAN (DNS): '" + subjectAltName;
535 VLOG(1) <<
"\t SAN (Type): '" + std::to_string(generalName->type);
539#pragma GCC diagnostic push
541#if __has_warning
("-Wused-but-marked-unused")
542#pragma GCC diagnostic ignored "-Wused-but-marked-unused"
546 sk_GENERAL_NAME_pop_free(subjectAltNames, GENERAL_NAME_free);
548#pragma GCC diagnostic pop
550 X509_free(server_cert);
552 VLOG(1) <<
"\tPeer certificate: no certificate";
556 client.setOnDisconnect([](SocketConnection* socketConnection) {
557 VLOG(1) << socketConnection->getConnectionName() <<
": OnDisconnect";
559 VLOG(1) <<
"\tLocal: " << socketConnection->getLocalAddress().toString();
560 VLOG(1) <<
"\tPeer: " << socketConnection->getRemoteAddress().toString();
static void logResponse(const std::shared_ptr< web::http::client::Request > &req, const std::shared_ptr< web::http::client::Response > &res)
static Client getClient()
static Client getClient()
int main(int argc, char *argv[])