LLVM: lib/Debuginfod/HTTPClient.cpp Source File (original) (raw)

1

2

3

4

5

6

7

8

9

10

11

12

13

14

21#ifdef LLVM_ENABLE_CURL

22#include <curl/curl.h>

23#endif

24

25using namespace llvm;

26

28

30 return A.Url == B.Url && A.Method == B.Method &&

31 A.FollowRedirects == B.FollowRedirects;

32}

33

35

37

43

44#ifdef LLVM_ENABLE_CURL

45

47

50 curl_global_init(CURL_GLOBAL_ALL);

52 }

53}

54

57 curl_global_cleanup();

59 }

60}

61

63 if (Timeout < std::chrono::milliseconds(0))

64 Timeout = std::chrono::milliseconds(0);

65 curl_easy_setopt(Curl, CURLOPT_TIMEOUT_MS, Timeout.count());

66}

67

68

69

70

71struct CurlHTTPRequest {

72 CurlHTTPRequest(HTTPResponseHandler &Handler) : Handler(Handler) {}

73 void storeError(Error Err) {

74 ErrorState = joinErrors(std::move(Err), std::move(ErrorState));

75 }

76 HTTPResponseHandler &Handler;

78};

79

80static size_t curlWriteFunction(char *Contents, size_t Size, size_t NMemb,

81 CurlHTTPRequest *CurlRequest) {

82 Size *= NMemb;

84 CurlRequest->Handler.handleBodyChunk(StringRef(Contents, Size))) {

85 CurlRequest->storeError(std::move(Err));

86 return 0;

87 }

89}

90

93 "Must call HTTPClient::initialize() at the beginning of main().");

94 if (Curl)

95 return;

96 Curl = curl_easy_init();

97 assert(Curl && "Curl could not be initialized");

98

99 curl_easy_setopt(Curl, CURLOPT_WRITEFUNCTION, curlWriteFunction);

100

101 curl_easy_setopt(Curl, CURLOPT_ACCEPT_ENCODING, "");

102}

103

105

110 "Unsupported CURL request method.");

111

112 SmallString<128> Url = Request.Url;

113 curl_easy_setopt(Curl, CURLOPT_URL, Url.c_str());

114 curl_easy_setopt(Curl, CURLOPT_FOLLOWLOCATION, Request.FollowRedirects);

115

116 curl_slist *Headers = nullptr;

117 for (const std::string &Header : Request.Headers)

118 Headers = curl_slist_append(Headers, Header.c_str());

119 curl_easy_setopt(Curl, CURLOPT_HTTPHEADER, Headers);

120

121 CurlHTTPRequest CurlRequest(Handler);

122 curl_easy_setopt(Curl, CURLOPT_WRITEDATA, &CurlRequest);

123 CURLcode CurlRes = curl_easy_perform(Curl);

124 curl_slist_free_all(Headers);

125 if (CurlRes != CURLE_OK)

126 return joinErrors(std::move(CurlRequest.ErrorState),

128 "curl_easy_perform() failed: %s\n",

129 curl_easy_strerror(CurlRes)));

130 return std::move(CurlRequest.ErrorState);

131}

132

134 long Code = 0;

135 curl_easy_getinfo(Curl, CURLINFO_RESPONSE_CODE, &Code);

137}

138

139#else

140

142

144

146

148

150

152

157

161

162#endif

assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")

This file implements a class to represent arbitrary precision integral constant values and operations...

static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")

static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")

static const HTTPClientCleanup Cleanup

Definition HTTPClient.cpp:42

This file contains the declarations of the HTTPClient library for issuing HTTP requests and handling ...

Definition HTTPClient.cpp:38

~HTTPClientCleanup()

Definition HTTPClient.cpp:40

Lightweight error class with error context and mandatory checking.

static ErrorSuccess success()

Create a success value.

static bool isAvailable()

Returns true only if LLVM has been compiled with a working HTTPClient.

Definition HTTPClient.cpp:145

static bool IsInitialized

unsigned responseCode()

Returns the last received response code or zero if none.

Definition HTTPClient.cpp:158

static void initialize()

Must be called at the beginning of a program, while it is a single thread.

Definition HTTPClient.cpp:147

Error perform(const HTTPRequest &Request, HTTPResponseHandler &Handler)

Performs the Request, passing response data to the Handler.

Definition HTTPClient.cpp:153

void setTimeout(std::chrono::milliseconds Timeout)

Sets the timeout for the entire request, in milliseconds.

Definition HTTPClient.cpp:151

static void cleanup()

Must be called at the end of a program, while it is a single thread.

Definition HTTPClient.cpp:149

A handler for state updates occurring while an HTTPRequest is performed.

StringRef - Represent a constant reference to a string, i.e.

#define llvm_unreachable(msg)

Marks that the current location is not supposed to be reachable.

NodeAddr< CodeNode * > Code

This is an optimization pass for GlobalISel generic memory operations.

Error createStringError(std::error_code EC, char const *Fmt, const Ts &... Vals)

Create formatted StringError object.

bool operator==(const AddressRangeValuePair &LHS, const AddressRangeValuePair &RHS)

Error joinErrors(Error E1, Error E2)

Concatenate errors.

@ Timeout

Reached timeout while waiting for the owner to release the lock.

A stateless description of an outbound HTTP request.

SmallVector< std::string, 0 > Headers

HTTPRequest(StringRef Url)

Definition HTTPClient.cpp:27