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