11#include <promeki/config.h>
12#if PROMEKI_ENABLE_HTTP
25PROMEKI_NAMESPACE_BEGIN
72 PROMEKI_SHARED_FINAL(HttpResponse)
75 using Ptr = SharedPtr<HttpResponse>;
78 using List = ::promeki::List<HttpResponse>;
81 using PtrList = ::promeki::List<Ptr>;
84 static const String DefaultHttpVersion;
87 HttpResponse() =
default;
90 const HttpStatus &status()
const {
return _status; }
93 void setStatus(
const HttpStatus &s) {
95 _customReason.clear();
105 void setStatus(
int code) {
106 _status = HttpStatus{code};
107 _customReason.clear();
117 String reasonPhrase()
const;
120 void setReasonPhrase(
const String &s) { _customReason = s; }
123 const HttpHeaders &headers()
const {
return _headers; }
126 HttpHeaders &headers() {
return _headers; }
129 void setHeaders(
const HttpHeaders &h) { _headers = h; }
132 void setHeader(
const String &name,
const String &value) { _headers.set(name, value); }
135 void addHeader(
const String &name,
const String &value) { _headers.add(name, value); }
138 const Buffer &body()
const {
return _body; }
146 bool hasBodyStream()
const {
return _bodyStream.isValid(); }
155 IODevice *bodyStream()
const {
156 return _bodyStream.isValid() ?
const_cast<IODevice *
>(_bodyStream.ptr()) : nullptr;
166 const IODevice::Shared &bodyStreamShared()
const {
return _bodyStream; }
176 int64_t bodyStreamLength()
const {
return _bodyStreamLength; }
188 IODevice::Shared takeBodyStream();
191 void setBody(
const Buffer &body);
194 void setBody(
const String &text);
203 void setText(
const String &text);
208 void setHtml(
const String &html);
213 void setBinary(
const Buffer &body,
const String &mimeType);
221 void setJson(
const JsonObject &obj);
224 void setJson(
const JsonArray &arr);
227 void setJsonPretty(
const JsonObject &obj,
unsigned int indent = 2);
230 void setJsonPretty(
const JsonArray &arr,
unsigned int indent = 2);
245 void setBodyStream(IODevice::Shared device, int64_t length = -1,
const String &mimeType = String());
248 bool isSuccess()
const {
return _status.isSuccess(); }
250 bool isRedirect()
const {
return _status.isRedirect(); }
252 bool isError()
const {
return _status.isError(); }
255 const String &httpVersion()
const {
return _httpVersion; }
258 void setHttpVersion(
const String &v) { _httpVersion = v; }
265 static HttpResponse ok(
const JsonObject &obj);
268 static HttpResponse ok(
const String &text);
277 static HttpResponse notFound(
const String &message = String());
280 static HttpResponse badRequest(
const String &message = String());
283 static HttpResponse methodNotAllowed(
const String &allow);
286 static HttpResponse internalError(
const String &message = String());
289 static HttpResponse noContent();
310 using UpgradeHook = Function<void(TcpSocket *socket)>;
313 void setUpgradeHook(UpgradeHook hook) { _upgradeHook = std::move(hook); }
316 const UpgradeHook &upgradeHook()
const {
return _upgradeHook; }
319 HttpStatus _status = HttpStatus::Ok;
320 String _customReason;
321 HttpHeaders _headers;
323 IODevice::Shared _bodyStream;
324 int64_t _bodyStreamLength = -1;
325 String _httpVersion = DefaultHttpVersion;
326 UpgradeHook _upgradeHook;