aboutsummaryrefslogtreecommitdiffstats
path: root/library/cpp/http/server/response.cpp
diff options
context:
space:
mode:
authorDevtools Arcadia <arcadia-devtools@yandex-team.ru>2022-02-07 18:08:42 +0300
committerDevtools Arcadia <arcadia-devtools@mous.vla.yp-c.yandex.net>2022-02-07 18:08:42 +0300
commit1110808a9d39d4b808aef724c861a2e1a38d2a69 (patch)
treee26c9fed0de5d9873cce7e00bc214573dc2195b7 /library/cpp/http/server/response.cpp
downloadydb-1110808a9d39d4b808aef724c861a2e1a38d2a69.tar.gz
intermediate changes
ref:cde9a383711a11544ce7e107a78147fb96cc4029
Diffstat (limited to 'library/cpp/http/server/response.cpp')
-rw-r--r--library/cpp/http/server/response.cpp65
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);
+}