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 (Regex(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.