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
90 explicit HttpClient(ObjectBase *parent = nullptr);
91
93 ~HttpClient() override;
94
105 Future<HttpResponse> send(const HttpRequest &request);
106
108 Future<HttpResponse> get(const String &url);
109
111 Future<HttpResponse> post(const String &url, const Buffer &body,
112 const String &contentType = String("application/octet-stream"));
113
115 Future<HttpResponse> put(const String &url, const Buffer &body,
116 const String &contentType = String("application/octet-stream"));
117
123 Future<HttpResponse> del(const String &url);
124
125 // ----------------------------------------------------
126 // Defaults applied to every request
127 // ----------------------------------------------------
128
135 void setDefaultHeader(const String &name, const String &value);
136
140 void removeDefaultHeader(const String &name);
141
145 const HttpHeaders &defaultHeaders() const { return _defaultHeaders; }
146
154 void setBaseUrl(const Url &url) { _baseUrl = url; }
155
157 const Url &baseUrl() const { return _baseUrl; }
158
165 void setTimeoutMs(unsigned int ms) { _timeoutMs = ms; }
166
168 void setMaxBodyBytes(int64_t bytes) { _maxBodyBytes = bytes; }
169
191 void setSslContext(SslContext ctx) { _sslContext = std::move(ctx); }
192
194 SslContext sslContext() const { return _sslContext; }
195
203 static bool hasTlsSupport() { return SslContext::hasTlsSupport(); }
204
206 PROMEKI_SIGNAL(requestFinished, HttpRequest, HttpResponse);
207
209 PROMEKI_SIGNAL(errorOccurred, Error);
210
211 private:
212 struct Pending;
213 using PendingPtr = SharedPtr<Pending, false>;
214
215 EventLoop *_loop = nullptr;
216 HttpHeaders _defaultHeaders;
217 Url _baseUrl;
218 unsigned int _timeoutMs = DefaultTimeoutMs;
219 int64_t _maxBodyBytes = DefaultMaxBodyBytes;
220 List<PendingPtr> _active;
221 SslContext _sslContext;
222
223 Future<HttpResponse> dispatch(HttpRequest request);
224 void resolveTargetUrl(HttpRequest &request) const;
225 void applyDefaultHeaders(HttpRequest &request) const;
226 void retire(const PendingPtr &p);
227
228 // The per-request state machine lives in the cpp;
229 // it needs to reach back into _active and emit signals.
230 friend struct Pending;
231};
232
233PROMEKI_NAMESPACE_END
234
235#endif // PROMEKI_ENABLE_HTTP