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;
90 explicit HttpClient(ObjectBase *parent =
nullptr);
93 ~HttpClient()
override;
105 Future<HttpResponse> send(
const HttpRequest &request);
108 Future<HttpResponse> get(
const String &url);
111 Future<HttpResponse> post(
const String &url,
const Buffer &body,
112 const String &contentType = String(
"application/octet-stream"));
115 Future<HttpResponse> put(
const String &url,
const Buffer &body,
116 const String &contentType = String(
"application/octet-stream"));
123 Future<HttpResponse> del(
const String &url);
135 void setDefaultHeader(
const String &name,
const String &value);
140 void removeDefaultHeader(
const String &name);
145 const HttpHeaders &defaultHeaders()
const {
return _defaultHeaders; }
154 void setBaseUrl(
const Url &url) { _baseUrl = url; }
157 const Url &baseUrl()
const {
return _baseUrl; }
165 void setTimeoutMs(
unsigned int ms) { _timeoutMs = ms; }
168 void setMaxBodyBytes(int64_t bytes) { _maxBodyBytes = bytes; }
191 void setSslContext(SslContext ctx) { _sslContext = std::move(ctx); }
194 SslContext sslContext()
const {
return _sslContext; }
203 static bool hasTlsSupport() {
return SslContext::hasTlsSupport(); }
206 PROMEKI_SIGNAL(requestFinished, HttpRequest, HttpResponse);
209 PROMEKI_SIGNAL(errorOccurred, Error);
213 using PendingPtr = SharedPtr<Pending, false>;
215 EventLoop *_loop =
nullptr;
216 HttpHeaders _defaultHeaders;
218 unsigned int _timeoutMs = DefaultTimeoutMs;
219 int64_t _maxBodyBytes = DefaultMaxBodyBytes;
220 List<PendingPtr> _active;
221 SslContext _sslContext;
223 Future<HttpResponse> dispatch(HttpRequest request);
224 void resolveTargetUrl(HttpRequest &request)
const;
225 void applyDefaultHeaders(HttpRequest &request)
const;
226 void retire(
const PendingPtr &p);
230 friend struct Pending;