1 /* 2 * Copyright 2022 Haiku Inc. All rights reserved. 3 * Distributed under the terms of the MIT License. 4 */ 5 6 #ifndef _B_HTTP_REQUEST_H_ 7 #define _B_HTTP_REQUEST_H_ 8 9 #include <memory> 10 #include <optional> 11 #include <string_view> 12 #include <variant> 13 14 #include <ErrorsExt.h> 15 #include <String.h> 16 17 class BDataIO; 18 class BMallocIO; 19 class BUrl; 20 21 22 namespace BPrivate { 23 24 namespace Network { 25 26 27 class BHttpFields; 28 class HttpBuffer; 29 class HttpSerializer; 30 31 32 class BHttpMethod 33 { 34 public: 35 // Constants for default methods in RFC 7230 section 4.2 36 enum Verb { Get, Head, Post, Put, Delete, Connect, Options, Trace }; 37 38 // Error type when constructing with a custom method 39 class InvalidMethod; 40 41 // Constructors & Destructor 42 BHttpMethod(Verb verb) noexcept; 43 BHttpMethod(const std::string_view& method); 44 BHttpMethod(const BHttpMethod& other); 45 BHttpMethod(BHttpMethod&& other) noexcept; 46 ~BHttpMethod(); 47 48 // Assignment operators 49 BHttpMethod& operator=(const BHttpMethod& other); 50 BHttpMethod& operator=(BHttpMethod&& other) noexcept; 51 52 // Comparison 53 bool operator==(const Verb& other) const noexcept; 54 bool operator!=(const Verb& other) const noexcept; 55 56 // Get the method as a string 57 const std::string_view Method() const noexcept; 58 59 private: 60 std::variant<Verb, BString> fMethod; 61 }; 62 63 64 class BHttpMethod::InvalidMethod : public BError 65 { 66 public: 67 InvalidMethod(const char* origin, BString input); 68 69 virtual const char* Message() const noexcept override; 70 virtual BString DebugMessage() const override; 71 72 BString input; 73 }; 74 75 76 struct BHttpAuthentication { 77 BString username; 78 BString password; 79 }; 80 81 82 class BHttpRequest 83 { 84 public: 85 // Aggregate parameter types 86 struct Body; 87 88 // Constructors and Destructor 89 BHttpRequest(); 90 BHttpRequest(const BUrl& url); 91 BHttpRequest(const BHttpRequest& other) = delete; 92 BHttpRequest(BHttpRequest&& other) noexcept; 93 ~BHttpRequest(); 94 95 // Assignment operators 96 BHttpRequest& operator=(const BHttpRequest& other) = delete; 97 BHttpRequest& operator=(BHttpRequest&&) noexcept; 98 99 // Access 100 bool IsEmpty() const noexcept; 101 const BHttpAuthentication* Authentication() const noexcept; 102 const BHttpFields& Fields() const noexcept; 103 uint8 MaxRedirections() const noexcept; 104 const BHttpMethod& Method() const noexcept; 105 const Body* RequestBody() const noexcept; 106 bool StopOnError() const noexcept; 107 bigtime_t Timeout() const noexcept; 108 const BUrl& Url() const noexcept; 109 110 // Named Setters 111 void SetAuthentication(const BHttpAuthentication& authentication); 112 void SetFields(const BHttpFields& fields); 113 void SetMaxRedirections(uint8 maxRedirections); 114 void SetMethod(const BHttpMethod& method); 115 void SetRequestBody(std::unique_ptr<BDataIO> input, BString mimeType, 116 std::optional<off_t> size); 117 void SetStopOnError(bool stopOnError); 118 void SetTimeout(bigtime_t timeout); 119 void SetUrl(const BUrl& url); 120 121 // Clearing Options 122 void ClearAuthentication() noexcept; 123 std::unique_ptr<BDataIO> ClearRequestBody() noexcept; 124 125 // Serialization 126 BString HeaderToString() const; 127 128 private: 129 friend class BHttpSession; 130 friend class HttpSerializer; 131 struct Data; 132 133 bool RewindBody() noexcept; 134 void SerializeHeaderTo(HttpBuffer& buffer) const; 135 136 std::unique_ptr<Data> fData; 137 }; 138 139 140 struct BHttpRequest::Body { 141 std::unique_ptr<BDataIO> input; 142 BString mimeType; 143 std::optional<off_t> size; 144 std::optional<off_t> startPosition; 145 }; 146 147 148 } // namespace Network 149 150 } // namespace BPrivate 151 152 #endif // _B_HTTP_REQUEST_H_ 153