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 HTTPMethod Method = HTTPMethod::GET; 31 bool FollowRedirects = true; 32 HTTPRequest(StringRef Url); 33 }; 34 35 bool operator==(const HTTPRequest &A, const HTTPRequest &B); 36 37 /// A handler for state updates occurring while an HTTPRequest is performed. 38 /// Can trigger the client to abort the request by returning an Error from any 39 /// of its methods. 40 class HTTPResponseHandler { 41 public: 42 /// Processes an additional chunk of bytes of the HTTP response body. 43 virtual Error handleBodyChunk(StringRef BodyChunk) = 0; 44 45 protected: 46 ~HTTPResponseHandler(); 47 }; 48 49 /// A reusable client that can perform HTTPRequests through a network socket. 50 class HTTPClient { 51 #ifdef LLVM_ENABLE_CURL 52 void *Curl = nullptr; 53 #endif 54 55 public: 56 HTTPClient(); 57 ~HTTPClient(); 58 59 static bool IsInitialized; 60 61 /// Returns true only if LLVM has been compiled with a working HTTPClient. 62 static bool isAvailable(); 63 64 /// Must be called at the beginning of a program, while it is a single thread. 65 static void initialize(); 66 67 /// Must be called at the end of a program, while it is a single thread. 68 static void cleanup(); 69 70 /// Sets the timeout for the entire request, in milliseconds. A zero or 71 /// negative value means the request never times out. 72 void setTimeout(std::chrono::milliseconds Timeout); 73 74 /// Performs the Request, passing response data to the Handler. Returns all 75 /// errors which occur during the request. Aborts if an error is returned by a 76 /// Handler method. 77 Error perform(const HTTPRequest &Request, HTTPResponseHandler &Handler); 78 79 /// Returns the last received response code or zero if none. 80 unsigned responseCode(); 81 }; 82 83 } // end namespace llvm 84 85 #endif // LLVM_DEBUGINFOD_HTTPCLIENT_H 86