xref: /haiku/headers/private/netservices2/HttpRequest.h (revision ed24eb5ff12640d052171c6a7feba37fab8a75d1)
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