21#ifdef LLVM_ENABLE_CURL
30 return A.Url ==
B.Url &&
A.Method ==
B.Method &&
31 A.FollowRedirects ==
B.FollowRedirects;
44#ifdef LLVM_ENABLE_CURL
50 curl_global_init(CURL_GLOBAL_ALL);
57 curl_global_cleanup();
63 if (Timeout < std::chrono::milliseconds(0))
64 Timeout = std::chrono::milliseconds(0);
65 curl_easy_setopt(Curl, CURLOPT_TIMEOUT_MS, Timeout.count());
71struct CurlHTTPRequest {
73 void storeError(
Error Err) {
74 ErrorState =
joinErrors(std::move(Err), std::move(ErrorState));
80static size_t curlWriteFunction(
char *Contents,
size_t Size,
size_t NMemb,
81 CurlHTTPRequest *CurlRequest) {
84 CurlRequest->Handler.handleBodyChunk(
StringRef(Contents,
Size))) {
85 CurlRequest->storeError(std::move(Err));
93 "Must call HTTPClient::initialize() at the beginning of main().");
96 Curl = curl_easy_init();
97 assert(Curl &&
"Curl could not be initialized");
99 curl_easy_setopt(Curl, CURLOPT_WRITEFUNCTION, curlWriteFunction);
101 curl_easy_setopt(Curl, CURLOPT_ACCEPT_ENCODING,
"");
110 "Unsupported CURL request method.");
113 curl_easy_setopt(Curl, CURLOPT_URL, Url.
c_str());
114 curl_easy_setopt(Curl, CURLOPT_FOLLOWLOCATION, Request.
FollowRedirects);
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);
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);
135 curl_easy_getinfo(Curl, CURLINFO_RESPONSE_CODE, &Code);
This file implements a class to represent arbitrary precision integral constant values and operations...
static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")
static const HTTPClientCleanup Cleanup
This file contains the declarations of the HTTPClient library for issuing HTTP requests and handling ...
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
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.
static bool IsInitialized
unsigned responseCode()
Returns the last received response code or zero if none.
static void initialize()
Must be called at the beginning of a program, while it is a single thread.
Error perform(const HTTPRequest &Request, HTTPResponseHandler &Handler)
Performs the Request, passing response data to the Handler.
void setTimeout(std::chrono::milliseconds Timeout)
Sets the timeout for the entire request, in milliseconds.
static void cleanup()
Must be called at the end of a program, while it is a single thread.
A handler for state updates occurring while an HTTPRequest is performed.
SmallString - A SmallString is just a SmallVector with methods and accessors that make it work better...
StringRef str() const
Explicit conversion to StringRef.
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.
A stateless description of an outbound HTTP request.
SmallVector< std::string, 0 > Headers
HTTPRequest(StringRef Url)