NVIDIA DeepStream SDK API Reference

9.2 Release
includes/opentelemetry/ext/http/server/http_server.h
Go to the documentation of this file.
1 // Copyright The OpenTelemetry Authors
2 // SPDX-License-Identifier: Apache-2.0
3 
4 #pragma once
5 
6 #include <functional>
7 #include <list>
8 #include <map>
9 
10 #include "socket_tools.h"
11 
12 #ifdef HAVE_HTTP_DEBUG
13 # ifdef LOG_TRACE
14 # undef LOG_TRACE
15 # define LOG_TRACE(x, ...) printf(x "\n", __VA_ARGS__)
16 # endif
17 #endif
18 
19 #ifndef HTTP_SERVER_NS
20 # define HTTP_SERVER_NS testing
21 #endif
22 
23 namespace HTTP_SERVER_NS
24 {
25 
26 constexpr const char *CONTENT_TYPE = "Content-Type";
27 constexpr const char *CONTENT_TYPE_TEXT = "text/plain";
28 constexpr const char *CONTENT_TYPE_BIN = "application/octet-stream";
29 
31 {
32  std::string client;
33  std::string method;
34  std::string uri;
35  std::string protocol;
36  std::map<std::string, std::string> headers;
37  std::string content;
38 };
39 
41 {
42  int code;
43  std::string message;
44  std::map<std::string, std::string> headers;
45  std::string body;
46 };
47 
48 using CallbackFunction = std::function<int(HttpRequest const &request, HttpResponse &response)>;
49 
51 {
52 protected:
54 
55 public:
57  virtual ~HttpRequestCallback() = default;
58 
60  {
61  callback = other.callback;
62  return *this;
63  }
64 
66 
68  {
69  callback = func;
70  return (*this);
71  }
72 
73  virtual int onHttpRequest(HttpRequest const &request, HttpResponse &response)
74  {
75  if (callback != nullptr)
76  {
77  return callback(request, response);
78  }
79  return 0;
80  }
81 };
82 
83 // Simple HTTP server
84 // Goals:
85 // - Support enough of HTTP to be used as a mock
86 // - Be flexible to allow creating various test scenarios
87 // Out of scope:
88 // - Performance
89 // - Full support of RFC 7230-7237
91 {
92 protected:
93  struct Connection
94  {
96  std::string receiveBuffer;
97  std::string sendBuffer;
98  enum
99  {
108  } state;
110  bool keepalive;
113  };
114 
115  std::string m_serverHost;
116  bool allowKeepalive{true};
118  std::list<SocketTools::Socket> m_listeningSockets;
119 
120  class HttpRequestHandler : public std::pair<std::string, HttpRequestCallback *>
121  {
122  public:
123  HttpRequestHandler(const std::string &key, HttpRequestCallback *value)
124  {
125  first = key;
126  second = value;
127  }
128 
130  {
131  first = "";
132  second = nullptr;
133  }
134 
135  HttpRequestHandler &operator=(std::pair<std::string, HttpRequestCallback *> other)
136  {
137  first = other.first;
138  second = other.second;
139  return (*this);
140  }
141 
143  {
144  second = &cb;
145  return (*this);
146  }
147 
149  {
150  second = cb;
151  return (*this);
152  }
153  };
154 
155  std::list<HttpRequestHandler> m_handlers;
156 
157  std::map<SocketTools::Socket, Connection> m_connections;
159 
160 public:
161  void setKeepalive(bool keepAlive) { allowKeepalive = keepAlive; }
162 
164  : m_serverHost("unnamed"),
165  allowKeepalive(true),
166  m_reactor(*this),
168  m_maxRequestContentSize(2 * 1024 * 1024)
169  {}
170 
171  HttpServer(const std::string &serverHost, int port = 30000) : HttpServer()
172  {
173  std::ostringstream os;
174  os << serverHost << ":" << port;
175  setServerName(os.str());
176  addListeningPort(port);
177  }
178 
179  ~HttpServer() override
180  {
181  for (auto &sock : m_listeningSockets)
182  {
183  sock.close();
184  }
185  }
186 
187  void setRequestLimits(size_t maxRequestHeadersSize, size_t maxRequestContentSize)
188  {
189  m_maxRequestHeadersSize = maxRequestHeadersSize;
190  m_maxRequestContentSize = maxRequestContentSize;
191  }
192 
193  void setServerName(std::string const &name) { m_serverHost = name; }
194 
195  int addListeningPort(int port)
196  {
197  SocketTools::Socket socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
198  socket.setNonBlocking();
199  socket.setReuseAddr();
200 
201  SocketTools::SocketAddr addr(0, port);
202  socket.bind(addr);
203  socket.getsockname(addr);
204 
205  socket.listen(10);
206  m_listeningSockets.push_back(socket);
208  LOG_INFO("HttpServer: Listening on %s", addr.toString().c_str());
209 
210  return addr.port();
211  }
212 
213  HttpRequestHandler &addHandler(const std::string &root, HttpRequestCallback &handler)
214  {
215  // No thread-safety here!
216  m_handlers.push_back({root, &handler});
217  LOG_INFO("HttpServer: Added handler for %s", root.c_str());
218  return m_handlers.back();
219  }
220 
221  HttpRequestHandler &operator[](const std::string &root)
222  {
223  // No thread-safety here!
224  m_handlers.push_back({root, nullptr});
225  LOG_INFO("HttpServer: Added handler for %s", root.c_str());
226  return m_handlers.back();
227  }
228 
229  HttpServer &operator+=(std::pair<const std::string &, HttpRequestCallback &> other)
230  {
231  LOG_INFO("HttpServer: Added handler for %s", other.first.c_str());
232  m_handlers.push_back(HttpRequestHandler(other.first, &other.second));
233  return (*this);
234  }
235 
236  void start() { m_reactor.start(); }
237 
238  void stop() { m_reactor.stop(); }
239 
240 protected:
241  virtual void onSocketAcceptable(SocketTools::Socket socket) override
242  {
243  LOG_TRACE("HttpServer: accepting socket fd=0x%llx", socket.m_sock);
244  assert(std::find(m_listeningSockets.begin(), m_listeningSockets.end(), socket) !=
245  m_listeningSockets.end());
246 
247  SocketTools::Socket csocket;
249  if (socket.accept(csocket, caddr))
250  {
251  csocket.setNonBlocking();
252  Connection &conn = m_connections[csocket];
253  conn.socket = csocket;
254  conn.state = Connection::Idle;
255  conn.request.client = caddr.toString();
257  LOG_TRACE("HttpServer: [%s] accepted", conn.request.client.c_str());
258  }
259  }
260 
261  virtual void onSocketReadable(SocketTools::Socket socket) override
262  {
263  LOG_TRACE("HttpServer: reading socket fd=0x%llx", socket.m_sock);
264  // No thread-safety here!
265  assert(std::find(m_listeningSockets.begin(), m_listeningSockets.end(), socket) ==
266  m_listeningSockets.end());
267 
268  // No thread-safety here!
269  auto connIt = m_connections.find(socket);
270  if (connIt == m_connections.end())
271  {
272  return;
273  }
274  Connection &conn = connIt->second;
275 
276  char buffer[2048] = {0};
277  int received = socket.recv(buffer, sizeof(buffer));
278  LOG_TRACE("HttpServer: [%s] received %d", conn.request.client.c_str(), received);
279  if (received <= 0)
280  {
282  return;
283  }
284  conn.receiveBuffer.append(buffer, buffer + received);
285 
286  handleConnection(conn);
287  }
288 
289  virtual void onSocketWritable(SocketTools::Socket socket) override
290  {
291  LOG_TRACE("HttpServer: writing socket fd=0x%llx", socket.m_sock);
292 
293  // No thread-safety here!
294  assert(std::find(m_listeningSockets.begin(), m_listeningSockets.end(), socket) ==
295  m_listeningSockets.end());
296 
297  // No thread-safety here!
298  auto connIt = m_connections.find(socket);
299  if (connIt == m_connections.end())
300  {
301  return;
302  }
303  Connection &conn = connIt->second;
304 
305  if (!sendMore(conn))
306  {
307  handleConnection(conn);
308  }
309  }
310 
311  virtual void onSocketClosed(SocketTools::Socket socket) override
312  {
313  LOG_TRACE("HttpServer: closing socket fd=0x%llx", socket.m_sock);
314  assert(std::find(m_listeningSockets.begin(), m_listeningSockets.end(), socket) ==
315  m_listeningSockets.end());
316 
317  auto connIt = m_connections.find(socket);
318  if (connIt == m_connections.end())
319  {
320  return;
321  }
322  Connection &conn = connIt->second;
323 
325  }
326 
327  bool sendMore(Connection &conn)
328  {
329  if (conn.sendBuffer.empty())
330  {
331  return false;
332  }
333 
334  int sent = conn.socket.send(conn.sendBuffer.data(), static_cast<int>(conn.sendBuffer.size()));
335  LOG_TRACE("HttpServer: [%s] sent %d", conn.request.client.c_str(), sent);
336  if (sent < 0 && conn.socket.error() != SocketTools::Socket::ErrorWouldBlock)
337  {
338  return true;
339  }
340  conn.sendBuffer.erase(0, sent);
341 
342  if (!conn.sendBuffer.empty())
343  {
346  return true;
347  }
348 
349  return false;
350  }
351 
352 protected:
354  {
355  LOG_TRACE("HttpServer: [%s] closed", conn.request.client.c_str());
356  if (conn.state != Connection::Idle && conn.state != Connection::Closing)
357  {
358  LOG_WARN("HttpServer: [%s] connection closed unexpectedly", conn.request.client.c_str());
359  }
361  auto connIt = m_connections.find(conn.socket);
362  conn.socket.close();
363  m_connections.erase(connIt);
364  }
365 
367  {
368  for (;;)
369  {
370  if (conn.state == Connection::Idle)
371  {
372  conn.response.code = 0;
374  LOG_TRACE("HttpServer: [%s] receiving headers", conn.request.client.c_str());
375  }
376 
378  {
379  bool lfOnly = false;
380  size_t ofs = conn.receiveBuffer.find("\r\n\r\n");
381  if (ofs == std::string::npos)
382  {
383  lfOnly = true;
384  ofs = conn.receiveBuffer.find("\n\n");
385  }
386  size_t headersLen = (ofs != std::string::npos) ? ofs : conn.receiveBuffer.length();
387  if (headersLen > m_maxRequestHeadersSize)
388  {
389  LOG_WARN("HttpServer: [%s] headers too long - %u", conn.request.client.c_str(),
390  static_cast<unsigned>(headersLen));
391  conn.response.code = 431; // Request Header Fields Too Large
392  conn.keepalive = false;
394  continue;
395  }
396  if (ofs == std::string::npos)
397  {
398  return;
399  }
400 
401  if (!parseHeaders(conn))
402  {
403  LOG_WARN("HttpServer: [%s] invalid headers", conn.request.client.c_str());
404  conn.response.code = 400; // Bad Request
405  conn.keepalive = false;
407  continue;
408  }
409  LOG_INFO("HttpServer: [%s] %s %s %s", conn.request.client.c_str(),
410  conn.request.method.c_str(), conn.request.uri.c_str(),
411  conn.request.protocol.c_str());
412  conn.receiveBuffer.erase(0, ofs + (lfOnly ? 2 : 4));
413 
414  conn.keepalive = (conn.request.protocol == "HTTP/1.1");
415  auto const connection = conn.request.headers.find("Connection");
416  if (connection != conn.request.headers.end())
417  {
418  if (equalsLowercased(connection->second, "keep-alive"))
419  {
420  conn.keepalive = true;
421  }
422  else if (equalsLowercased(connection->second, "close"))
423  {
424  conn.keepalive = false;
425  }
426  }
427 
428  auto const contentLength = conn.request.headers.find("Content-Length");
429  if (contentLength != conn.request.headers.end())
430  {
431  conn.contentLength = atoi(contentLength->second.c_str());
432  }
433  else
434  {
435  conn.contentLength = 0;
436  }
438  {
439  LOG_WARN("HttpServer: [%s] content too long - %u", conn.request.client.c_str(),
440  static_cast<unsigned>(conn.contentLength));
441  conn.response.code = 413; // Payload Too Large
442  conn.keepalive = false;
444  continue;
445  }
446 
447  auto const expect = conn.request.headers.find("Expect");
448  if (expect != conn.request.headers.end() && conn.request.protocol == "HTTP/1.1")
449  {
450  if (!equalsLowercased(expect->second, "100-continue"))
451  {
452  LOG_WARN("HttpServer: [%s] unknown expectation - %s", conn.request.client.c_str(),
453  expect->second.c_str());
454  conn.response.code = 417; // Expectation Failed
455  conn.keepalive = false;
457  continue;
458  }
459  conn.sendBuffer = "HTTP/1.1 100 Continue\r\n\r\n";
461  LOG_TRACE("HttpServer: [%s] sending \"100 Continue\"", conn.request.client.c_str());
462  continue;
463  }
464 
466  LOG_TRACE("HttpServer: [%s] receiving body", conn.request.client.c_str());
467  }
468 
470  {
471  if (sendMore(conn))
472  {
473  return;
474  }
475 
477  LOG_TRACE("HttpServer: [%s] receiving body", conn.request.client.c_str());
478  }
479 
480  if (conn.state == Connection::ReceivingBody)
481  {
482  if (conn.receiveBuffer.length() < conn.contentLength)
483  {
484  return;
485  }
486 
487  if (conn.receiveBuffer.length() == conn.contentLength)
488  {
489  conn.request.content = std::move(conn.receiveBuffer);
490  conn.receiveBuffer.clear();
491  }
492  else
493  {
494  conn.request.content.assign(conn.receiveBuffer, 0, conn.contentLength);
495  conn.receiveBuffer.erase(0, conn.contentLength);
496  }
497 
499  LOG_TRACE("HttpServer: [%s] processing request", conn.request.client.c_str());
500  }
501 
502  if (conn.state == Connection::Processing)
503  {
504  processRequest(conn);
505 
506  std::ostringstream os;
507  os << conn.request.protocol << ' ' << conn.response.code << ' ' << conn.response.message
508  << "\r\n";
509  for (auto const &header : conn.response.headers)
510  {
511  os << header.first << ": " << header.second << "\r\n";
512  }
513  os << "\r\n";
514 
515  conn.sendBuffer = os.str();
517  LOG_TRACE("HttpServer: [%s] sending headers", conn.request.client.c_str());
518  }
519 
520  if (conn.state == Connection::SendingHeaders)
521  {
522  if (sendMore(conn))
523  {
524  return;
525  }
526 
527  conn.sendBuffer = std::move(conn.response.body);
529  LOG_TRACE("HttpServer: [%s] sending body", conn.request.client.c_str());
530  }
531 
532  if (conn.state == Connection::SendingBody)
533  {
534  if (sendMore(conn))
535  {
536  return;
537  }
538 
539  conn.keepalive &= allowKeepalive;
540 
541  if (conn.keepalive)
542  {
545  conn.state = Connection::Idle;
546  LOG_TRACE("HttpServer: [%s] idle (keep-alive)", conn.request.client.c_str());
547  if (conn.receiveBuffer.empty())
548  {
549  return;
550  }
551  }
552  else
553  {
556  conn.state = Connection::Closing;
557  LOG_TRACE("HttpServer: [%s] closing", conn.request.client.c_str());
558  }
559  }
560 
561  if (conn.state == Connection::Closing)
562  {
563  return;
564  }
565  }
566  }
567 
569  {
570  // Method
571  char const *begin = conn.receiveBuffer.c_str();
572  char const *ptr = begin;
573  while (*ptr && *ptr != ' ' && *ptr != '\r' && *ptr != '\n')
574  {
575  ptr++;
576  }
577  if (*ptr != ' ')
578  {
579  return false;
580  }
581  conn.request.method.assign(begin, ptr);
582  while (*ptr == ' ')
583  {
584  ptr++;
585  }
586 
587  // URI
588  begin = ptr;
589  while (*ptr && *ptr != ' ' && *ptr != '\r' && *ptr != '\n')
590  {
591  ptr++;
592  }
593  if (*ptr != ' ')
594  {
595  return false;
596  }
597  conn.request.uri.assign(begin, ptr);
598  while (*ptr == ' ')
599  {
600  ptr++;
601  }
602 
603  // Protocol
604  begin = ptr;
605  while (*ptr && *ptr != ' ' && *ptr != '\r' && *ptr != '\n')
606  {
607  ptr++;
608  }
609  if (*ptr != '\r' && *ptr != '\n')
610  {
611  return false;
612  }
613  conn.request.protocol.assign(begin, ptr);
614  if (*ptr == '\r')
615  {
616  ptr++;
617  }
618  if (*ptr != '\n')
619  {
620  return false;
621  }
622  ptr++;
623 
624  // Headers
625  conn.request.headers.clear();
626  while (*ptr != '\r' && *ptr != '\n')
627  {
628  // Name
629  begin = ptr;
630  while (*ptr && *ptr != ':' && *ptr != ' ' && *ptr != '\r' && *ptr != '\n')
631  {
632  ptr++;
633  }
634  if (*ptr != ':')
635  {
636  return false;
637  }
638  std::string name = normalizeHeaderName(begin, ptr);
639  ptr++;
640  while (*ptr == ' ')
641  {
642  ptr++;
643  }
644 
645  // Value
646  begin = ptr;
647  while (*ptr && *ptr != '\r' && *ptr != '\n')
648  {
649  ptr++;
650  }
651  if (!conn.request.headers[name].empty())
652  {
653  conn.request.headers[name] =
654  conn.request.headers[name].append(",").append(std::string(begin, ptr));
655  }
656  else
657  {
658  conn.request.headers[name] = std::string(begin, ptr);
659  }
660  if (*ptr == '\r')
661  {
662  ptr++;
663  }
664  if (*ptr != '\n')
665  {
666  return false;
667  }
668  ptr++;
669  }
670 
671  if (*ptr == '\r')
672  {
673  ptr++;
674  }
675  if (*ptr != '\n')
676  {
677  return false;
678  }
679  ptr++;
680 
681  return true;
682  }
683 
684  static bool equalsLowercased(std::string const &str, char const *mask)
685  {
686  char const *ptr = str.c_str();
687  while (*ptr && *mask && ::tolower(*ptr) == *mask)
688  {
689  ptr++;
690  mask++;
691  }
692  return !*ptr && !*mask;
693  }
694 
695  static std::string normalizeHeaderName(char const *begin, char const *end)
696  {
697  std::string result(begin, end);
698  bool first = true;
699  for (char &ch : result)
700  {
701  if (first)
702  {
703  ch = static_cast<char>(::toupper(ch));
704  first = false;
705  }
706  else if (ch == '-')
707  {
708  first = true;
709  }
710  else
711  {
712  ch = static_cast<char>(::tolower(ch));
713  }
714  }
715  return result;
716  }
717 
719  {
720  conn.response.message.clear();
721  conn.response.headers.clear();
722  conn.response.body.clear();
723 
724  if (conn.response.code == 0)
725  {
726  conn.response.code = 404; // Not Found
727  for (auto &handler : m_handlers)
728  {
729  if (conn.request.uri.length() >= handler.first.length() &&
730  strncmp(conn.request.uri.c_str(), handler.first.c_str(), handler.first.length()) == 0)
731  {
732  LOG_TRACE("HttpServer: [%s] using handler for %s", conn.request.client.c_str(),
733  handler.first.c_str());
734  // auto callback = handler.second; // Bazel gets mad at this unused
735  // var, uncomment when using
736  int result = handler.second->onHttpRequest(conn.request, conn.response);
737  if (result != 0)
738  {
739  conn.response.code = result;
740  break;
741  }
742  }
743  }
744 
745  if (conn.response.code == -1)
746  {
747  LOG_TRACE("HttpServer: [%s] closing by request", conn.request.client.c_str());
749  }
750  }
751 
752  if (conn.response.message.empty())
753  {
755  }
756 
757  conn.response.headers["Host"] = m_serverHost;
758  conn.response.headers["Connection"] = (conn.keepalive ? "keep-alive" : "close");
759  conn.response.headers["Date"] = formatTimestamp(time(nullptr));
760  conn.response.headers["Content-Length"] = std::to_string(conn.response.body.size());
761  }
762 
763  static std::string formatTimestamp(time_t time)
764  {
765  tm tm;
766 #ifdef _WIN32
767  gmtime_s(&tm, &time);
768 #else
769  gmtime_r(&time, &tm);
770 #endif
771  char buf[32];
772  strftime(buf, sizeof(buf), "%a, %d %b %Y %H:%M:%S GMT", &tm);
773  return buf;
774  }
775 
776 public:
777  static char const *getDefaultResponseMessage(int code)
778  {
779  switch (code)
780  {
781  // *INDENT-OFF*
782  case 100:
783  return "Continue";
784  case 101:
785  return "Switching Protocols";
786  case 200:
787  return "OK";
788  case 201:
789  return "Created";
790  case 202:
791  return "Accepted";
792  case 203:
793  return "Non-Authoritative Information";
794  case 204:
795  return "No Content";
796  case 205:
797  return "Reset Content";
798  case 206:
799  return "Partial Content";
800  case 300:
801  return "Multiple Choices";
802  case 301:
803  return "Moved Permanently";
804  case 302:
805  return "Found";
806  case 303:
807  return "See Other";
808  case 304:
809  return "Not Modified";
810  case 305:
811  return "Use Proxy";
812  case 306:
813  return "Switch Proxy";
814  case 307:
815  return "Temporary Redirect";
816  case 308:
817  return "Permanent Redirect";
818  case 400:
819  return "Bad Request";
820  case 401:
821  return "Unauthorized";
822  case 402:
823  return "Payment Required";
824  case 403:
825  return "Forbidden";
826  case 404:
827  return "Not Found";
828  case 405:
829  return "Method Not Allowed";
830  case 406:
831  return "Not Acceptable";
832  case 407:
833  return "Proxy Authentication Required";
834  case 408:
835  return "Request Timeout";
836  case 409:
837  return "Conflict";
838  case 410:
839  return "Gone";
840  case 411:
841  return "Length Required";
842  case 412:
843  return "Precondition Failed";
844  case 413:
845  return "Payload Too Large";
846  case 414:
847  return "URI Too Long";
848  case 415:
849  return "Unsupported Media Type";
850  case 416:
851  return "Range Not Satisfiable";
852  case 417:
853  return "Expectation Failed";
854  case 421:
855  return "Misdirected Request";
856  case 426:
857  return "Upgrade Required";
858  case 428:
859  return "Precondition Required";
860  case 429:
861  return "Too Many Requests";
862  case 431:
863  return "Request Header Fields Too Large";
864  case 500:
865  return "Internal Server Error";
866  case 501:
867  return "Not Implemented";
868  case 502:
869  return "Bad Gateway";
870  case 503:
871  return "Service Unavailable";
872  case 504:
873  return "Gateway Timeout";
874  case 505:
875  return "HTTP Version Not Supported";
876  case 506:
877  return "Variant Also Negotiates";
878  case 510:
879  return "Not Extended";
880  case 511:
881  return "Network Authentication Required";
882  default:
883  return "???";
884  // *INDENT-ON*
885  }
886  }
887 };
888 
889 } // namespace HTTP_SERVER_NS
SocketTools::Socket::listen
bool listen(int backlog)
Definition: includes/opentelemetry/ext/http/server/socket_tools.h:370
HTTP_SERVER_NS::HttpServer::operator[]
HttpRequestHandler & operator[](const std::string &root)
Definition: includes/opentelemetry/ext/http/server/http_server.h:221
HTTP_SERVER_NS::HttpRequest::uri
std::string uri
Definition: includes/opentelemetry/ext/http/server/http_server.h:34
LOG_WARN
#define LOG_WARN(fmt_,...)
Definition: includes/opentelemetry/ext/http/server/socket_tools.h:75
HTTP_SERVER_NS::HttpServer::handleConnection
void handleConnection(Connection &conn)
Definition: includes/opentelemetry/ext/http/server/http_server.h:366
pydeepstreamdoc::node::NodeDoc::find
constexpr const char * find
Definition: service-maker/sources/python/src/bindings/docstrings/nodedoc.h:38
HTTP_SERVER_NS::HttpServer::setServerName
void setServerName(std::string const &name)
Definition: includes/opentelemetry/ext/http/server/http_server.h:193
HTTP_SERVER_NS::HttpServer::m_reactor
SocketTools::Reactor m_reactor
Definition: includes/opentelemetry/ext/http/server/http_server.h:117
SocketTools::Reactor::Closed
@ Closed
Definition: includes/opentelemetry/ext/http/server/socket_tools.h:466
HTTP_SERVER_NS::HttpServer::Connection::ReceivingBody
@ ReceivingBody
Definition: includes/opentelemetry/ext/http/server/http_server.h:103
HTTP_SERVER_NS::HttpServer::setRequestLimits
void setRequestLimits(size_t maxRequestHeadersSize, size_t maxRequestContentSize)
Definition: includes/opentelemetry/ext/http/server/http_server.h:187
HTTP_SERVER_NS::HttpServer::Connection::request
HttpRequest request
Definition: includes/opentelemetry/ext/http/server/http_server.h:111
HTTP_SERVER_NS::HttpServer::HttpRequestHandler::operator=
HttpRequestHandler & operator=(HttpRequestCallback &cb)
Definition: includes/opentelemetry/ext/http/server/http_server.h:142
HTTP_SERVER_NS::HttpServer::Connection::keepalive
bool keepalive
Definition: includes/opentelemetry/ext/http/server/http_server.h:110
HTTP_SERVER_NS::HttpServer::addHandler
HttpRequestHandler & addHandler(const std::string &root, HttpRequestCallback &handler)
Definition: includes/opentelemetry/ext/http/server/http_server.h:213
SocketTools::Socket::setNonBlocking
void setNonBlocking()
Definition: includes/opentelemetry/ext/http/server/socket_tools.h:287
HTTP_SERVER_NS::HttpRequest
Definition: includes/opentelemetry/ext/http/server/http_server.h:30
HTTP_SERVER_NS::HttpRequestCallback::callback
CallbackFunction callback
Definition: includes/opentelemetry/ext/http/server/http_server.h:53
HTTP_SERVER_NS::HttpServer::HttpRequestHandler::HttpRequestHandler
HttpRequestHandler()
Definition: includes/opentelemetry/ext/http/server/http_server.h:129
SocketTools::Socket::ErrorWouldBlock
@ ErrorWouldBlock
Definition: includes/opentelemetry/ext/http/server/socket_tools.h:408
HTTP_SERVER_NS::HttpServer::Connection::Idle
@ Idle
Definition: includes/opentelemetry/ext/http/server/http_server.h:100
SocketTools::Socket::close
void close()
Definition: includes/opentelemetry/ext/http/server/socket_tools.h:329
SocketTools::SocketAddr::port
int port() const
Definition: includes/opentelemetry/ext/http/server/socket_tools.h:220
socket_tools.h
SocketTools::Reactor
Socket Reactor
Definition: includes/opentelemetry/ext/http/server/socket_tools.h:442
HTTP_SERVER_NS::CONTENT_TYPE
constexpr const char * CONTENT_TYPE
Definition: includes/opentelemetry/ext/http/server/http_server.h:26
HTTP_SERVER_NS::HttpServer::operator+=
HttpServer & operator+=(std::pair< const std::string &, HttpRequestCallback & > other)
Definition: includes/opentelemetry/ext/http/server/http_server.h:229
HTTP_SERVER_NS::HttpServer::onSocketWritable
virtual void onSocketWritable(SocketTools::Socket socket) override
Definition: includes/opentelemetry/ext/http/server/http_server.h:289
LOG_TRACE
#define LOG_TRACE(fmt_,...)
Definition: includes/opentelemetry/ext/http/server/socket_tools.h:73
SocketTools::SocketAddr
Encapsulation of sockaddr(_in)
Definition: includes/opentelemetry/ext/http/server/socket_tools.h:161
HTTP_SERVER_NS::HttpServer::HttpServer
HttpServer(const std::string &serverHost, int port=30000)
Definition: includes/opentelemetry/ext/http/server/http_server.h:171
HTTP_SERVER_NS::HttpRequestCallback
Definition: includes/opentelemetry/ext/http/server/http_server.h:50
HTTP_SERVER_NS::HttpServer::onSocketAcceptable
virtual void onSocketAcceptable(SocketTools::Socket socket) override
Definition: includes/opentelemetry/ext/http/server/http_server.h:241
HTTP_SERVER_NS::HttpServer::Connection
Definition: includes/opentelemetry/ext/http/server/http_server.h:93
HTTP_SERVER_NS::HttpServer::Connection::receiveBuffer
std::string receiveBuffer
Definition: includes/opentelemetry/ext/http/server/http_server.h:96
HTTP_SERVER_NS::HttpServer::normalizeHeaderName
static std::string normalizeHeaderName(char const *begin, char const *end)
Definition: includes/opentelemetry/ext/http/server/http_server.h:695
SocketTools::Socket::m_sock
Type m_sock
Definition: includes/opentelemetry/ext/http/server/socket_tools.h:269
HTTP_SERVER_NS::HttpServer::Connection::contentLength
size_t contentLength
Definition: includes/opentelemetry/ext/http/server/http_server.h:109
HTTP_SERVER_NS::HttpServer::stop
void stop()
Definition: includes/opentelemetry/ext/http/server/http_server.h:238
HTTP_SERVER_NS::HttpServer::m_maxRequestHeadersSize
size_t m_maxRequestHeadersSize
Definition: includes/opentelemetry/ext/http/server/http_server.h:158
HTTP_SERVER_NS::HttpRequest::content
std::string content
Definition: includes/opentelemetry/ext/http/server/http_server.h:37
HTTP_SERVER_NS::HttpResponse
Definition: includes/opentelemetry/ext/http/server/http_server.h:40
HTTP_SERVER_NS::HttpRequestCallback::operator=
HttpRequestCallback & operator=(CallbackFunction func)
Definition: includes/opentelemetry/ext/http/server/http_server.h:67
HTTP_SERVER_NS::HttpServer::Connection::Processing
@ Processing
Definition: includes/opentelemetry/ext/http/server/http_server.h:104
HTTP_SERVER_NS::HttpServer::Connection::Closing
@ Closing
Definition: includes/opentelemetry/ext/http/server/http_server.h:107
HTTP_SERVER_NS::HttpServer::sendMore
bool sendMore(Connection &conn)
Definition: includes/opentelemetry/ext/http/server/http_server.h:327
HTTP_SERVER_NS::HttpResponse::code
int code
Definition: includes/opentelemetry/ext/http/server/http_server.h:42
HTTP_SERVER_NS::HttpServer::Connection::SendingHeaders
@ SendingHeaders
Definition: includes/opentelemetry/ext/http/server/http_server.h:105
SocketTools::Socket::recv
int recv(_Out_cap_(size) void *buffer, unsigned size)
Definition: includes/opentelemetry/ext/http/server/socket_tools.h:340
HTTP_SERVER_NS::HttpServer::onSocketReadable
virtual void onSocketReadable(SocketTools::Socket socket) override
Definition: includes/opentelemetry/ext/http/server/http_server.h:261
HTTP_SERVER_NS::HttpRequest::headers
std::map< std::string, std::string > headers
Definition: includes/opentelemetry/ext/http/server/http_server.h:36
HTTP_SERVER_NS::HttpServer::Connection::socket
SocketTools::Socket socket
Definition: includes/opentelemetry/ext/http/server/http_server.h:95
HTTP_SERVER_NS::HttpServer::Connection::response
HttpResponse response
Definition: includes/opentelemetry/ext/http/server/http_server.h:112
HTTP_SERVER_NS::HttpServer::m_maxRequestContentSize
size_t m_maxRequestContentSize
Definition: includes/opentelemetry/ext/http/server/http_server.h:158
SocketTools::Socket
Encapsulation of a socket (non-exclusive ownership)
Definition: includes/opentelemetry/ext/http/server/socket_tools.h:259
HTTP_SERVER_NS::HttpServer
Definition: includes/opentelemetry/ext/http/server/http_server.h:90
absl::move
constexpr absl::OTABSL_OPTION_NAMESPACE_NAME::remove_reference_t< T > && move(T &&t) noexcept
Definition: includes/opentelemetry/nostd/internal/absl/utility/utility.h:199
HTTP_SERVER_NS::HttpServer::HttpRequestHandler
Definition: includes/opentelemetry/ext/http/server/http_server.h:120
SocketTools::SocketAddr::toString
std::string toString() const
Definition: includes/opentelemetry/ext/http/server/socket_tools.h:234
HTTP_SERVER_NS::HttpServer::Connection::SendingBody
@ SendingBody
Definition: includes/opentelemetry/ext/http/server/http_server.h:106
HTTP_SERVER_NS::HttpRequestCallback::HttpRequestCallback
HttpRequestCallback()
Definition: includes/opentelemetry/ext/http/server/http_server.h:56
SocketTools::Reactor::removeSocket
void removeSocket(const Socket &socket)
Remove Socket
Definition: includes/opentelemetry/ext/http/server/socket_tools.h:617
HTTP_SERVER_NS::HttpServer::Connection::sendBuffer
std::string sendBuffer
Definition: includes/opentelemetry/ext/http/server/http_server.h:97
HTTP_SERVER_NS::HttpServer::setKeepalive
void setKeepalive(bool keepAlive)
Definition: includes/opentelemetry/ext/http/server/http_server.h:161
HTTP_SERVER_NS
Definition: includes/opentelemetry/ext/http/server/file_http_server.h:14
HTTP_SERVER_NS::HttpServer::start
void start()
Definition: includes/opentelemetry/ext/http/server/http_server.h:236
SocketTools::Reactor::Acceptable
@ Acceptable
Definition: includes/opentelemetry/ext/http/server/socket_tools.h:465
HTTP_SERVER_NS::HttpServer::m_connections
std::map< SocketTools::Socket, Connection > m_connections
Definition: includes/opentelemetry/ext/http/server/http_server.h:157
HTTP_SERVER_NS::HttpServer::Connection::Sending100Continue
@ Sending100Continue
Definition: includes/opentelemetry/ext/http/server/http_server.h:102
HTTP_SERVER_NS::HttpResponse::body
std::string body
Definition: includes/opentelemetry/ext/http/server/http_server.h:45
HTTP_SERVER_NS::HttpServer::equalsLowercased
static bool equalsLowercased(std::string const &str, char const *mask)
Definition: includes/opentelemetry/ext/http/server/http_server.h:684
HTTP_SERVER_NS::HttpRequestCallback::~HttpRequestCallback
virtual ~HttpRequestCallback()=default
HTTP_SERVER_NS::HttpResponse::headers
std::map< std::string, std::string > headers
Definition: includes/opentelemetry/ext/http/server/http_server.h:44
HTTP_SERVER_NS::HttpServer::Connection::state
enum HTTP_SERVER_NS::HttpServer::Connection::@30 state
HTTP_SERVER_NS::HttpServer::m_listeningSockets
std::list< SocketTools::Socket > m_listeningSockets
Definition: includes/opentelemetry/ext/http/server/http_server.h:118
HTTP_SERVER_NS::HttpServer::m_handlers
std::list< HttpRequestHandler > m_handlers
Definition: includes/opentelemetry/ext/http/server/http_server.h:155
HTTP_SERVER_NS::HttpServer::~HttpServer
~HttpServer() override
Definition: includes/opentelemetry/ext/http/server/http_server.h:179
HTTP_SERVER_NS::HttpServer::addListeningPort
int addListeningPort(int port)
Definition: includes/opentelemetry/ext/http/server/http_server.h:195
HTTP_SERVER_NS::HttpServer::onSocketClosed
virtual void onSocketClosed(SocketTools::Socket socket) override
Definition: includes/opentelemetry/ext/http/server/http_server.h:311
HTTP_SERVER_NS::HttpServer::HttpRequestHandler::HttpRequestHandler
HttpRequestHandler(const std::string &key, HttpRequestCallback *value)
Definition: includes/opentelemetry/ext/http/server/http_server.h:123
HTTP_SERVER_NS::HttpServer::m_serverHost
std::string m_serverHost
Definition: includes/opentelemetry/ext/http/server/http_server.h:115
std
Extensions to the C++ standard library.
Definition: includes/opentelemetry/nostd/string_view.h:212
HTTP_SERVER_NS::HttpServer::allowKeepalive
bool allowKeepalive
Definition: includes/opentelemetry/ext/http/server/http_server.h:116
HTTP_SERVER_NS::HttpResponse::message
std::string message
Definition: includes/opentelemetry/ext/http/server/http_server.h:43
HTTP_SERVER_NS::HttpServer::HttpRequestHandler::operator=
HttpRequestHandler & operator=(std::pair< std::string, HttpRequestCallback * > other)
Definition: includes/opentelemetry/ext/http/server/http_server.h:135
SocketTools::Reactor::Writable
@ Writable
Definition: includes/opentelemetry/ext/http/server/socket_tools.h:464
SocketTools::Reactor::Readable
@ Readable
Definition: includes/opentelemetry/ext/http/server/socket_tools.h:463
HTTP_SERVER_NS::CONTENT_TYPE_BIN
constexpr const char * CONTENT_TYPE_BIN
Definition: includes/opentelemetry/ext/http/server/http_server.h:28
HTTP_SERVER_NS::CallbackFunction
std::function< int(HttpRequest const &request, HttpResponse &response)> CallbackFunction
Definition: includes/opentelemetry/ext/http/server/http_server.h:48
HTTP_SERVER_NS::HttpRequest::client
std::string client
Definition: includes/opentelemetry/ext/http/server/http_server.h:32
HTTP_SERVER_NS::HttpServer::HttpServer
HttpServer()
Definition: includes/opentelemetry/ext/http/server/http_server.h:163
SocketTools::Socket::shutdown
bool shutdown(int how)
Definition: includes/opentelemetry/ext/http/server/socket_tools.h:388
HTTP_SERVER_NS::HttpRequest::method
std::string method
Definition: includes/opentelemetry/ext/http/server/http_server.h:33
HTTP_SERVER_NS::HttpServer::Connection::ReceivingHeaders
@ ReceivingHeaders
Definition: includes/opentelemetry/ext/http/server/http_server.h:101
SocketTools::Socket::send
int send(void const *buffer, unsigned size)
Definition: includes/opentelemetry/ext/http/server/socket_tools.h:347
SocketTools::Reactor::stop
void stop()
Stop server
Definition: includes/opentelemetry/ext/http/server/socket_tools.h:665
SocketTools::Socket::bind
bool bind(SocketAddr const &addr)
Definition: includes/opentelemetry/ext/http/server/socket_tools.h:353
SocketTools::Socket::ShutdownSend
@ ShutdownSend
Definition: includes/opentelemetry/ext/http/server/socket_tools.h:420
HTTP_SERVER_NS::HttpRequestCallback::HttpRequestCallback
HttpRequestCallback(CallbackFunction func)
Definition: includes/opentelemetry/ext/http/server/http_server.h:65
SocketTools::Socket::error
int error() const
Definition: includes/opentelemetry/ext/http/server/socket_tools.h:394
HTTP_SERVER_NS::HttpRequestCallback::operator=
HttpRequestCallback & operator=(HttpRequestCallback other)
Definition: includes/opentelemetry/ext/http/server/http_server.h:59
SocketTools::Socket::accept
bool accept(Socket &csock, SocketAddr &caddr)
Definition: includes/opentelemetry/ext/http/server/socket_tools.h:376
HTTP_SERVER_NS::HttpServer::getDefaultResponseMessage
static const char * getDefaultResponseMessage(int code)
Definition: includes/opentelemetry/ext/http/server/http_server.h:777
SocketTools::Reactor::SocketCallback
Socket State callback
Definition: includes/opentelemetry/ext/http/server/socket_tools.h:447
SocketTools::Socket::getsockname
bool getsockname(SocketAddr &addr) const
Definition: includes/opentelemetry/ext/http/server/socket_tools.h:359
HTTP_SERVER_NS::CONTENT_TYPE_TEXT
constexpr const char * CONTENT_TYPE_TEXT
Definition: includes/opentelemetry/ext/http/server/http_server.h:27
HTTP_SERVER_NS::HttpRequest::protocol
std::string protocol
Definition: includes/opentelemetry/ext/http/server/http_server.h:35
HTTP_SERVER_NS::HttpServer::handleConnectionClosed
void handleConnectionClosed(Connection &conn)
Definition: includes/opentelemetry/ext/http/server/http_server.h:353
SocketTools::Socket::setReuseAddr
bool setReuseAddr()
Definition: includes/opentelemetry/ext/http/server/socket_tools.h:299
HTTP_SERVER_NS::HttpServer::parseHeaders
bool parseHeaders(Connection &conn)
Definition: includes/opentelemetry/ext/http/server/http_server.h:568
HTTP_SERVER_NS::HttpServer::processRequest
void processRequest(Connection &conn)
Definition: includes/opentelemetry/ext/http/server/http_server.h:718
HTTP_SERVER_NS::HttpServer::HttpRequestHandler::operator=
HttpRequestHandler & operator=(HttpRequestCallback *cb)
Definition: includes/opentelemetry/ext/http/server/http_server.h:148
HTTP_SERVER_NS::HttpServer::formatTimestamp
static std::string formatTimestamp(time_t time)
Definition: includes/opentelemetry/ext/http/server/http_server.h:763
HTTP_SERVER_NS::HttpRequestCallback::onHttpRequest
virtual int onHttpRequest(HttpRequest const &request, HttpResponse &response)
Definition: includes/opentelemetry/ext/http/server/http_server.h:73
SocketTools::Reactor::addSocket
void addSocket(const Socket &socket, int flags)
Add Socket
Definition: includes/opentelemetry/ext/http/server/socket_tools.h:522
LOG_INFO
#define LOG_INFO(fmt,...)
Definition: includes/ds3d/common/defines.h:66
SocketTools::Reactor::start
void start()
Start server
Definition: includes/opentelemetry/ext/http/server/socket_tools.h:656
pydeepstreamdoc::osd::ArrowHeadDoc::end
constexpr const char * end
Definition: service-maker/sources/python/src/bindings/docstrings/osddoc.h:34