Subversion Repositories QNX 8.QNX8 LLVM/Clang compiler suite

Rev

Blame | Last modification | View Log | Download | RSS feed

  1. //===-- llvm/Debuginfod/HTTPServer.h - HTTP server library ------*- C++ -*-===//
  2. //
  3. // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
  4. // See https://llvm.org/LICENSE.txt for license information.
  5. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
  6. //
  7. //===----------------------------------------------------------------------===//
  8. ///
  9. /// \file
  10. /// This file contains the declarations of the HTTPServer and HTTPServerRequest
  11. /// classes, the HTTPResponse, and StreamingHTTPResponse structs, and the
  12. /// streamFile function.
  13. ///
  14. //===----------------------------------------------------------------------===//
  15.  
  16. #ifndef LLVM_DEBUGINFOD_HTTPSERVER_H
  17. #define LLVM_DEBUGINFOD_HTTPSERVER_H
  18.  
  19. #include "llvm/ADT/StringRef.h"
  20. #include "llvm/Support/Error.h"
  21.  
  22. #ifdef LLVM_ENABLE_HTTPLIB
  23. // forward declarations
  24. namespace httplib {
  25. class Request;
  26. class Response;
  27. class Server;
  28. } // namespace httplib
  29. #endif
  30.  
  31. namespace llvm {
  32.  
  33. struct HTTPResponse;
  34. struct StreamingHTTPResponse;
  35. class HTTPServer;
  36.  
  37. class HTTPServerRequest {
  38.   friend HTTPServer;
  39.  
  40. #ifdef LLVM_ENABLE_HTTPLIB
  41. private:
  42.   HTTPServerRequest(const httplib::Request &HTTPLibRequest,
  43.                     httplib::Response &HTTPLibResponse);
  44.   httplib::Response &HTTPLibResponse;
  45. #endif
  46.  
  47. public:
  48.   std::string UrlPath;
  49.   /// The elements correspond to match groups in the url path matching regex.
  50.   SmallVector<std::string, 1> UrlPathMatches;
  51.  
  52.   // TODO bring in HTTP headers
  53.  
  54.   void setResponse(StreamingHTTPResponse Response);
  55.   void setResponse(HTTPResponse Response);
  56. };
  57.  
  58. struct HTTPResponse {
  59.   unsigned Code;
  60.   const char *ContentType;
  61.   StringRef Body;
  62. };
  63.  
  64. typedef std::function<void(HTTPServerRequest &)> HTTPRequestHandler;
  65.  
  66. /// An HTTPContentProvider is called by the HTTPServer to obtain chunks of the
  67. /// streaming response body. The returned chunk should be located at Offset
  68. /// bytes and have Length bytes.
  69. typedef std::function<StringRef(size_t /*Offset*/, size_t /*Length*/)>
  70.     HTTPContentProvider;
  71.  
  72. /// Wraps the content provider with HTTP Status code and headers.
  73. struct StreamingHTTPResponse {
  74.   unsigned Code;
  75.   const char *ContentType;
  76.   size_t ContentLength;
  77.   HTTPContentProvider Provider;
  78.   /// Called after the response transfer is complete with the success value of
  79.   /// the transfer.
  80.   std::function<void(bool)> CompletionHandler = [](bool Success) {};
  81. };
  82.  
  83. /// Sets the response to stream the file at FilePath, if available, and
  84. /// otherwise an HTTP 404 error response.
  85. bool streamFile(HTTPServerRequest &Request, StringRef FilePath);
  86.  
  87. /// An HTTP server which can listen on a single TCP/IP port for HTTP
  88. /// requests and delgate them to the appropriate registered handler.
  89. class HTTPServer {
  90. #ifdef LLVM_ENABLE_HTTPLIB
  91.   std::unique_ptr<httplib::Server> Server;
  92.   unsigned Port = 0;
  93. #endif
  94. public:
  95.   HTTPServer();
  96.   ~HTTPServer();
  97.  
  98.   /// Returns true only if LLVM has been compiled with a working HTTPServer.
  99.   static bool isAvailable();
  100.  
  101.   /// Registers a URL pattern routing rule. When the server is listening, each
  102.   /// request is dispatched to the first registered handler whose UrlPathPattern
  103.   /// matches the UrlPath.
  104.   Error get(StringRef UrlPathPattern, HTTPRequestHandler Handler);
  105.  
  106.   /// Attempts to assign the requested port and interface, returning an Error
  107.   /// upon failure.
  108.   Error bind(unsigned Port, const char *HostInterface = "0.0.0.0");
  109.  
  110.   /// Attempts to assign any available port and interface, returning either the
  111.   /// port number or an Error upon failure.
  112.   Expected<unsigned> bind(const char *HostInterface = "0.0.0.0");
  113.  
  114.   /// Attempts to listen for requests on the bound port. Returns an Error if
  115.   /// called before binding a port.
  116.   Error listen();
  117.  
  118.   /// If the server is listening, stop and unbind the socket.
  119.   void stop();
  120. };
  121. } // end namespace llvm
  122.  
  123. #endif // LLVM_DEBUGINFOD_HTTPSERVER_H
  124.