libpromeki 1.0.0-alpha
PROfessional MEdia toolKIt
 
Loading...
Searching...
No Matches
httpclient.h
Go to the documentation of this file.
1
8#pragma once
9
10
11#include <promeki/config.h>
12#if PROMEKI_ENABLE_HTTP
13#include <promeki/namespace.h>
14#include <promeki/objectbase.h>
15#include <promeki/error.h>
16#include <promeki/string.h>
17#include <promeki/buffer.h>
18#include <promeki/url.h>
19#include <promeki/list.h>
20#include <promeki/sharedptr.h>
21#include <promeki/future.h>
22#include <promeki/httprequest.h>
24#include <promeki/httpheaders.h>
25#include <promeki/sslcontext.h>
26
27PROMEKI_NAMESPACE_BEGIN
28
29class EventLoop;
30
74class HttpClient : public ObjectBase {
75 PROMEKI_OBJECT(HttpClient, ObjectBase)
76 public:
78 static constexpr unsigned int DefaultTimeoutMs = 30'000;
79
81 static constexpr int64_t DefaultMaxBodyBytes = 64 * 1024 * 1024;
82
99 static constexpr int DefaultMaxRedirects = 10;
100
108 explicit HttpClient(ObjectBase *parent = nullptr);
109
111 ~HttpClient() override;
112
123 Future<HttpResponse> send(const HttpRequest &request);
124
126 Future<HttpResponse> get(const String &url);
127
129 Future<HttpResponse> post(const String &url, const Buffer &body,
130 const String &contentType = String("application/octet-stream"));
131
133 Future<HttpResponse> put(const String &url, const Buffer &body,
134 const String &contentType = String("application/octet-stream"));
135
141 Future<HttpResponse> del(const String &url);
142
143 // ----------------------------------------------------
144 // Defaults applied to every request
145 // ----------------------------------------------------
146
153 void setDefaultHeader(const String &name, const String &value);
154
158 void removeDefaultHeader(const String &name);
159
163 const HttpHeaders &defaultHeaders() const { return _defaultHeaders; }
164
172 void setBaseUrl(const Url &url) { _baseUrl = url; }
173
175 const Url &baseUrl() const { return _baseUrl; }
176
183 void setTimeoutMs(unsigned int ms) { _timeoutMs = ms; }
184
186 void setMaxBodyBytes(int64_t bytes) { _maxBodyBytes = bytes; }
187
221 void setMaxRedirects(int max) { _maxRedirects = max; }
222
224 int maxRedirects() const { return _maxRedirects; }
225
247 void setSslContext(SslContext ctx) { _sslContext = std::move(ctx); }
248
250 SslContext sslContext() const { return _sslContext; }
251
259 static bool hasTlsSupport() { return SslContext::hasTlsSupport(); }
260
262 PROMEKI_SIGNAL(requestFinished, HttpRequest, HttpResponse);
263
265 PROMEKI_SIGNAL(errorOccurred, Error);
266
267 private:
268 struct Pending;
269 using PendingPtr = SharedPtr<Pending, false>;
270
271 EventLoop *_loop = nullptr;
272 HttpHeaders _defaultHeaders;
273 Url _baseUrl;
274 unsigned int _timeoutMs = DefaultTimeoutMs;
275 int64_t _maxBodyBytes = DefaultMaxBodyBytes;
276 int _maxRedirects = DefaultMaxRedirects;
277 List<PendingPtr> _active;
278 SslContext _sslContext;
279
280 Future<HttpResponse> dispatch(HttpRequest request);
281 void resolveTargetUrl(HttpRequest &request) const;
282 void applyDefaultHeaders(HttpRequest &request) const;
283 void retire(const PendingPtr &p);
284
285 // The per-request state machine lives in the cpp;
286 // it needs to reach back into _active and emit signals.
287 friend struct Pending;
288};
289
290PROMEKI_NAMESPACE_END
291
292#endif // PROMEKI_ENABLE_HTTP