LLVM: lib/Debuginfod/HTTPServer.cpp Source File (original) (raw)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
24
25#ifdef LLVM_ENABLE_HTTPLIB
26#include "httplib.h"
27#endif
28
29using namespace llvm;
30
32
34
36
41 Request.setResponse({404u, "text/plain", "Could not open file to read.\n"});
42 return false;
43 }
46 -1,
47 false);
51 Request.setResponse({404u, "text/plain", "Could not memory-map file.\n"});
52 return false;
53 }
54
55
60 },
61 [=](bool Success) { delete MB; }});
62 return true;
63}
64
65#ifdef LLVM_ENABLE_HTTPLIB
66
68
70
72
73static void expandUrlPathMatches(const std::smatch &Matches,
75 bool UrlPathSet = false;
76 for (const auto &it : Matches) {
77 if (UrlPathSet)
79 else {
81 UrlPathSet = true;
82 }
83 }
84}
85
86HTTPServerRequest::HTTPServerRequest(const httplib::Request &HTTPLibRequest,
87 httplib::Response &HTTPLibResponse)
88 : HTTPLibResponse(HTTPLibResponse) {
89 expandUrlPathMatches(HTTPLibRequest.matches, *this);
90}
91
93 HTTPLibResponse.set_content(Response.Body.begin(), Response.Body.size(),
95 HTTPLibResponse.status = Response.Code;
96}
97
99 HTTPLibResponse.set_content_provider(
101 [=](size_t Offset, size_t Length, httplib::DataSink &Sink) {
102 if (Offset < Response.ContentLength) {
103 StringRef Chunk = Response.Provider(Offset, Length);
104 Sink.write(Chunk.begin(), Chunk.size());
105 }
106 return true;
107 },
109
110 HTTPLibResponse.status = Response.Code;
111}
112
114 std::string ErrorMessage;
115 if ((UrlPathPattern).isValid(ErrorMessage))
117 Server->Get(std::string(UrlPathPattern),
118 [Handler](const httplib::Request &HTTPLibRequest,
119 httplib::Response &HTTPLibResponse) {
120 HTTPServerRequest Request(HTTPLibRequest, HTTPLibResponse);
121 Handler(Request);
122 });
124}
125
127 if (!Server->bind_to_port(HostInterface, ListenPort))
129 "Could not assign requested address.");
130 Port = ListenPort;
132}
133
135 int ListenPort = Server->bind_to_any_port(HostInterface);
136 if (ListenPort < 0)
138 "Could not assign any port on requested address.");
139 return Port = ListenPort;
140}
141
143 if (!Port)
145 "Cannot listen without first binding to a port.");
146 if (!Server->listen_after_bind())
149 "An unknown error occurred when cpp-httplib attempted to listen.");
151}
152
154 Server->stop();
155 Port = 0;
156}
157
158#else
159
160
162
164
166
170
174
181
185
189
193
197
198#endif
This file contains the declarations of the HTTPServer and HTTPServerRequest classes,...
static bool isValid(const char C)
Returns true if C is a valid mangled character: <0-9a-zA-Z_>.
Represents either an error or a value T.
std::error_code getError() const
Lightweight error class with error context and mandatory checking.
static ErrorSuccess success()
Create a success value.
Tagged union holding either a T or a Error.
Error takeError()
Take ownership of the stored error.
HTTPServerError(const Twine &Msg)
Definition HTTPServer.cpp:33
void log(raw_ostream &OS) const override
Print an error message to an output stream.
Definition HTTPServer.cpp:35
void setResponse(StreamingHTTPResponse Response)
Definition HTTPServer.cpp:171
SmallVector< std::string, 1 > UrlPathMatches
The elements correspond to match groups in the url path matching regex.
Error get(StringRef UrlPathPattern, HTTPRequestHandler Handler)
Registers a URL pattern routing rule.
Definition HTTPServer.cpp:175
Error bind(unsigned Port, const char *HostInterface="0.0.0.0")
Attempts to assign the requested port and interface, returning an Error upon failure.
Definition HTTPServer.cpp:182
Error listen()
Attempts to listen for requests on the bound port.
Definition HTTPServer.cpp:190
static bool isAvailable()
Returns true only if LLVM has been compiled with a working HTTPServer.
Definition HTTPServer.cpp:161
void stop()
If the server is listening, stop and unbind the socket.
Definition HTTPServer.cpp:194
This interface provides simple read-only access to a block of memory, and provides simple methods for...
static ErrorOr< std::unique_ptr< MemoryBuffer > > getOpenFile(sys::fs::file_t FD, const Twine &Filename, uint64_t FileSize, bool RequiresNullTerminator=true, bool IsVolatile=false, std::optional< Align > Alignment=std::nullopt)
Given an already-open file descriptor, read the file and return a MemoryBuffer.
size_t getBufferSize() const
StringRef getBuffer() const
void push_back(const T &Elt)
StringRef - Represent a constant reference to a string, i.e.
constexpr StringRef substr(size_t Start, size_t N=npos) const
Return a reference to the substring from [Start, Start + N).
constexpr size_t size() const
size - Get the string size.
Twine - A lightweight data structure for efficiently representing the concatenation of temporary valu...
This class implements an extremely fast bulk output stream that can only output to a stream.
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
LLVM_ABI std::error_code closeFile(file_t &F)
Close the file object.
LLVM_ABI Expected< file_t > openNativeFileForRead(const Twine &Name, OpenFlags Flags=OF_None, SmallVectorImpl< char > *RealPath=nullptr)
Opens the file with the given name in a read-only mode, returning its open file descriptor.
This is an optimization pass for GlobalISel generic memory operations.
std::function< void(HTTPServerRequest &)> HTTPRequestHandler
Error createStringError(std::error_code EC, char const *Fmt, const Ts &... Vals)
Create formatted StringError object.
@ Success
The lock was released successfully.
Error make_error(ArgTs &&... Args)
Make a Error instance representing failure using the given error info type.
LLVM_ABI Error errorCodeToError(std::error_code EC)
Helper for converting an std::error_code to a Error.
bool streamFile(HTTPServerRequest &Request, StringRef FilePath)
Sets the response to stream the file at FilePath, if available, and otherwise an HTTP 404 error respo...
Definition HTTPServer.cpp:37
void consumeError(Error Err)
Consume a Error without doing anything.
Wraps the content provider with HTTP Status code and headers.
std::function< void(bool)> CompletionHandler
Called after the response transfer is complete with the success value of the transfer.