1 //===-- llvm/Support/HTTPClient.h - HTTP client library ---------*- C++ -*-===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 /// 9 /// \file 10 /// This file contains the declarations of the HTTPClient library for issuing 11 /// HTTP requests and handling the responses. 12 /// 13 //===----------------------------------------------------------------------===// 14 15 #ifndef LLVM_DEBUGINFOD_HTTPCLIENT_H 16 #define LLVM_DEBUGINFOD_HTTPCLIENT_H 17 18 #include "llvm/Support/Error.h" 19 #include "llvm/Support/MemoryBuffer.h" 20 21 #include <chrono> 22 23 namespace llvm { 24 25 enum class HTTPMethod { GET }; 26 27 /// A stateless description of an outbound HTTP request. 28 struct HTTPRequest { 29 SmallString<128> Url; 30 SmallVector<std::string, 0> Headers; 31 HTTPMethod Method = HTTPMethod::GET; 32 bool FollowRedirects = true; 33 HTTPRequest(StringRef Url); 34 }; 35 36 bool operator==(const HTTPRequest &A, const HTTPRequest &B); 37 38 /// A handler for state updates occurring while an HTTPRequest is performed. 39 /// Can trigger the client to abort the request by returning an Error from any 40 /// of its methods. 41 class HTTPResponseHandler { 42 public: 43 /// Processes an additional chunk of bytes of the HTTP response body. 44 virtual Error handleBodyChunk(StringRef BodyChunk) = 0; 45 46 protected: 47 ~HTTPResponseHandler(); 48 }; 49 50 /// A reusable client that can perform HTTPRequests through a network socket. 51 class HTTPClient { 52 #ifdef LLVM_ENABLE_CURL 53 void *Curl = nullptr; 54 #endif 55 56 public: 57 HTTPClient(); 58 ~HTTPClient(); 59 60 static bool IsInitialized; 61 62 /// Returns true only if LLVM has been compiled with a working HTTPClient. 63 static bool isAvailable(); 64 65 /// Must be called at the beginning of a program, while it is a single thread. 66 static void initialize(); 67 68 /// Must be called at the end of a program, while it is a single thread. 69 static void cleanup(); 70 71 /// Sets the timeout for the entire request, in milliseconds. A zero or 72 /// negative value means the request never times out. 73 void setTimeout(std::chrono::milliseconds Timeout); 74 75 /// Performs the Request, passing response data to the Handler. Returns all 76 /// errors which occur during the request. Aborts if an error is returned by a 77 /// Handler method. 78 Error perform(const HTTPRequest &Request, HTTPResponseHandler &Handler); 79 80 /// Returns the last received response code or zero if none. 81 unsigned responseCode(); 82 }; 83 84 } // end namespace llvm 85 86 #endif // LLVM_DEBUGINFOD_HTTPCLIENT_H 87