11#include <promeki/config.h>
12#if PROMEKI_ENABLE_HTTP
27PROMEKI_NAMESPACE_BEGIN
74class HttpClient :
public ObjectBase {
75 PROMEKI_OBJECT(HttpClient, ObjectBase)
78 static constexpr unsigned int DefaultTimeoutMs = 30'000;
81 static constexpr int64_t DefaultMaxBodyBytes = 64 * 1024 * 1024;
99 static constexpr int DefaultMaxRedirects = 10;
108 explicit HttpClient(ObjectBase *parent =
nullptr);
111 ~HttpClient()
override;
123 Future<HttpResponse> send(
const HttpRequest &request);
126 Future<HttpResponse> get(
const String &url);
129 Future<HttpResponse> post(
const String &url,
const Buffer &body,
130 const String &contentType = String(
"application/octet-stream"));
133 Future<HttpResponse> put(
const String &url,
const Buffer &body,
134 const String &contentType = String(
"application/octet-stream"));
141 Future<HttpResponse> del(
const String &url);
153 void setDefaultHeader(
const String &name,
const String &value);
158 void removeDefaultHeader(
const String &name);
163 const HttpHeaders &defaultHeaders()
const {
return _defaultHeaders; }
172 void setBaseUrl(
const Url &url) { _baseUrl = url; }
175 const Url &baseUrl()
const {
return _baseUrl; }
183 void setTimeoutMs(
unsigned int ms) { _timeoutMs = ms; }
186 void setMaxBodyBytes(int64_t bytes) { _maxBodyBytes = bytes; }
221 void setMaxRedirects(
int max) { _maxRedirects = max; }
224 int maxRedirects()
const {
return _maxRedirects; }
247 void setSslContext(SslContext ctx) { _sslContext = std::move(ctx); }
250 SslContext sslContext()
const {
return _sslContext; }
259 static bool hasTlsSupport() {
return SslContext::hasTlsSupport(); }
262 PROMEKI_SIGNAL(requestFinished, HttpRequest, HttpResponse);
265 PROMEKI_SIGNAL(errorOccurred, Error);
269 using PendingPtr = SharedPtr<Pending, false>;
271 EventLoop *_loop =
nullptr;
272 HttpHeaders _defaultHeaders;
274 unsigned int _timeoutMs = DefaultTimeoutMs;
275 int64_t _maxBodyBytes = DefaultMaxBodyBytes;
276 int _maxRedirects = DefaultMaxRedirects;
277 List<PendingPtr> _active;
278 SslContext _sslContext;
280 Future<HttpResponse> dispatch(HttpRequest request);
281 void resolveTargetUrl(HttpRequest &request)
const;
282 void applyDefaultHeaders(HttpRequest &request)
const;
283 void retire(
const PendingPtr &p);
287 friend struct Pending;