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