- //===-- llvm/Debuginfod/HTTPServer.h - HTTP server library ------*- C++ -*-===// 
- // 
- // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 
- // See https://llvm.org/LICENSE.txt for license information. 
- // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 
- // 
- //===----------------------------------------------------------------------===// 
- /// 
- /// \file 
- /// This file contains the declarations of the HTTPServer and HTTPServerRequest 
- /// classes, the HTTPResponse, and StreamingHTTPResponse structs, and the 
- /// streamFile function. 
- /// 
- //===----------------------------------------------------------------------===// 
-   
- #ifndef LLVM_DEBUGINFOD_HTTPSERVER_H 
- #define LLVM_DEBUGINFOD_HTTPSERVER_H 
-   
- #include "llvm/ADT/StringRef.h" 
- #include "llvm/Support/Error.h" 
-   
- #ifdef LLVM_ENABLE_HTTPLIB 
- // forward declarations 
- namespace httplib { 
- class Request; 
- class Response; 
- class Server; 
- } // namespace httplib 
- #endif 
-   
- namespace llvm { 
-   
- struct HTTPResponse; 
- struct StreamingHTTPResponse; 
- class HTTPServer; 
-   
- class HTTPServerRequest { 
-   friend HTTPServer; 
-   
- #ifdef LLVM_ENABLE_HTTPLIB 
- private: 
-   HTTPServerRequest(const httplib::Request &HTTPLibRequest, 
-                     httplib::Response &HTTPLibResponse); 
-   httplib::Response &HTTPLibResponse; 
- #endif 
-   
- public: 
-   std::string UrlPath; 
-   /// The elements correspond to match groups in the url path matching regex. 
-   SmallVector<std::string, 1> UrlPathMatches; 
-   
-   // TODO bring in HTTP headers 
-   
-   void setResponse(StreamingHTTPResponse Response); 
-   void setResponse(HTTPResponse Response); 
- }; 
-   
- struct HTTPResponse { 
-   unsigned Code; 
-   const char *ContentType; 
-   StringRef Body; 
- }; 
-   
- typedef std::function<void(HTTPServerRequest &)> HTTPRequestHandler; 
-   
- /// An HTTPContentProvider is called by the HTTPServer to obtain chunks of the 
- /// streaming response body. The returned chunk should be located at Offset 
- /// bytes and have Length bytes. 
- typedef std::function<StringRef(size_t /*Offset*/, size_t /*Length*/)> 
-     HTTPContentProvider; 
-   
- /// Wraps the content provider with HTTP Status code and headers. 
- struct StreamingHTTPResponse { 
-   unsigned Code; 
-   const char *ContentType; 
-   size_t ContentLength; 
-   HTTPContentProvider Provider; 
-   /// Called after the response transfer is complete with the success value of 
-   /// the transfer. 
-   std::function<void(bool)> CompletionHandler = [](bool Success) {}; 
- }; 
-   
- /// Sets the response to stream the file at FilePath, if available, and 
- /// otherwise an HTTP 404 error response. 
- bool streamFile(HTTPServerRequest &Request, StringRef FilePath); 
-   
- /// An HTTP server which can listen on a single TCP/IP port for HTTP 
- /// requests and delgate them to the appropriate registered handler. 
- class HTTPServer { 
- #ifdef LLVM_ENABLE_HTTPLIB 
-   std::unique_ptr<httplib::Server> Server; 
-   unsigned Port = 0; 
- #endif 
- public: 
-   HTTPServer(); 
-   ~HTTPServer(); 
-   
-   /// Returns true only if LLVM has been compiled with a working HTTPServer. 
-   static bool isAvailable(); 
-   
-   /// Registers a URL pattern routing rule. When the server is listening, each 
-   /// request is dispatched to the first registered handler whose UrlPathPattern 
-   /// matches the UrlPath. 
-   Error get(StringRef UrlPathPattern, HTTPRequestHandler Handler); 
-   
-   /// Attempts to assign the requested port and interface, returning an Error 
-   /// upon failure. 
-   Error bind(unsigned Port, const char *HostInterface = "0.0.0.0"); 
-   
-   /// Attempts to assign any available port and interface, returning either the 
-   /// port number or an Error upon failure. 
-   Expected<unsigned> bind(const char *HostInterface = "0.0.0.0"); 
-   
-   /// Attempts to listen for requests on the bound port. Returns an Error if 
-   /// called before binding a port. 
-   Error listen(); 
-   
-   /// If the server is listening, stop and unbind the socket. 
-   void stop(); 
- }; 
- } // end namespace llvm 
-   
- #endif // LLVM_DEBUGINFOD_HTTPSERVER_H 
-