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