diff options
author | Devtools Arcadia <arcadia-devtools@yandex-team.ru> | 2022-02-07 18:08:42 +0300 |
---|---|---|
committer | Devtools Arcadia <arcadia-devtools@mous.vla.yp-c.yandex.net> | 2022-02-07 18:08:42 +0300 |
commit | 1110808a9d39d4b808aef724c861a2e1a38d2a69 (patch) | |
tree | e26c9fed0de5d9873cce7e00bc214573dc2195b7 /library/cpp/http/server/response.cpp | |
download | ydb-1110808a9d39d4b808aef724c861a2e1a38d2a69.tar.gz |
intermediate changes
ref:cde9a383711a11544ce7e107a78147fb96cc4029
Diffstat (limited to 'library/cpp/http/server/response.cpp')
-rw-r--r-- | library/cpp/http/server/response.cpp | 65 |
1 files changed, 65 insertions, 0 deletions
diff --git a/library/cpp/http/server/response.cpp b/library/cpp/http/server/response.cpp new file mode 100644 index 0000000000..52d64c91ce --- /dev/null +++ b/library/cpp/http/server/response.cpp @@ -0,0 +1,65 @@ +#include "response.h" + +#include <util/stream/output.h> +#include <util/stream/mem.h> +#include <util/string/cast.h> + +THttpResponse& THttpResponse::AddMultipleHeaders(const THttpHeaders& headers) { + for (THttpHeaders::TConstIterator i = headers.Begin(); i != headers.End(); ++i) { + this->Headers.AddHeader(*i); + } + return *this; +} + +THttpResponse& THttpResponse::SetContentType(const TStringBuf& contentType) { + Headers.AddOrReplaceHeader(THttpInputHeader("Content-Type", ToString(contentType))); + + return *this; +} + +void THttpResponse::OutTo(IOutputStream& os) const { + TVector<IOutputStream::TPart> parts; + const size_t FIRST_LINE_PARTS = 3; + const size_t HEADERS_PARTS = Headers.Count() * 4; + const size_t CONTENT_PARTS = 5; + parts.reserve(FIRST_LINE_PARTS + HEADERS_PARTS + CONTENT_PARTS); + + // first line + parts.push_back(IOutputStream::TPart(TStringBuf("HTTP/1.1 "))); + parts.push_back(IOutputStream::TPart(HttpCodeStrEx(Code))); + parts.push_back(IOutputStream::TPart::CrLf()); + + // headers + for (THttpHeaders::TConstIterator i = Headers.Begin(); i != Headers.End(); ++i) { + parts.push_back(IOutputStream::TPart(i->Name())); + parts.push_back(IOutputStream::TPart(TStringBuf(": "))); + parts.push_back(IOutputStream::TPart(i->Value())); + parts.push_back(IOutputStream::TPart::CrLf()); + } + + char buf[50]; + + if (!Content.empty()) { + TMemoryOutput mo(buf, sizeof(buf)); + + mo << Content.size(); + + parts.push_back(IOutputStream::TPart(TStringBuf("Content-Length: "))); + parts.push_back(IOutputStream::TPart(buf, mo.Buf() - buf)); + parts.push_back(IOutputStream::TPart::CrLf()); + } + + // content + parts.push_back(IOutputStream::TPart::CrLf()); + + if (!Content.empty()) { + parts.push_back(IOutputStream::TPart(Content)); + } + + os.Write(parts.data(), parts.size()); +} + +template <> +void Out<THttpResponse>(IOutputStream& os, const THttpResponse& resp) { + resp.OutTo(os); +} |