aboutsummaryrefslogtreecommitdiffstats
path: root/library/cpp/monlib/service/service.cpp
diff options
context:
space:
mode:
authorelviandante <elviandante@yandex-team.ru>2022-02-10 16:49:47 +0300
committerDaniil Cherednik <dcherednik@yandex-team.ru>2022-02-10 16:49:47 +0300
commit621a17b75565a8d70df465a0ac5c93a7c6d2e61f (patch)
tree5d5cb817648f650d76cf1076100726fd9b8448e8 /library/cpp/monlib/service/service.cpp
parent643ddee8bd6125a18c4b1506c35bee857f64f4d2 (diff)
downloadydb-621a17b75565a8d70df465a0ac5c93a7c6d2e61f.tar.gz
Restoring authorship annotation for <elviandante@yandex-team.ru>. Commit 2 of 2.
Diffstat (limited to 'library/cpp/monlib/service/service.cpp')
-rw-r--r--library/cpp/monlib/service/service.cpp268
1 files changed, 134 insertions, 134 deletions
diff --git a/library/cpp/monlib/service/service.cpp b/library/cpp/monlib/service/service.cpp
index 559aba661e..929efbf816 100644
--- a/library/cpp/monlib/service/service.cpp
+++ b/library/cpp/monlib/service/service.cpp
@@ -5,64 +5,64 @@
#include <library/cpp/http/fetch/httpheader.h>
#include <library/cpp/http/fetch/httpfsm.h>
#include <library/cpp/uri/http_url.h>
-
+
#include <util/generic/buffer.h>
#include <util/stream/str.h>
#include <util/stream/buffer.h>
#include <util/stream/zerocopy.h>
#include <util/string/vector.h>
-namespace NMonitoring {
+namespace NMonitoring {
class THttpClient: public IHttpRequest {
- public:
+ public:
void ServeRequest(THttpInput& in, IOutputStream& out, const NAddr::IRemoteAddr* remoteAddr, const THandler& Handler) {
- try {
- try {
+ try {
+ try {
RemoteAddr = remoteAddr;
- THttpHeaderParser parser;
- parser.Init(&Header);
+ THttpHeaderParser parser;
+ parser.Init(&Header);
if (parser.Execute(in.FirstLine().data(), in.FirstLine().size()) < 0) {
- out << "HTTP/1.1 400 Bad request\r\nConnection: Close\r\n\r\n";
- return;
- }
+ out << "HTTP/1.1 400 Bad request\r\nConnection: Close\r\n\r\n";
+ return;
+ }
if (Url.Parse(Header.GetUrl().data()) != THttpURL::ParsedOK) {
- out << "HTTP/1.1 400 Invalid url\r\nConnection: Close\r\n\r\n";
- return;
- }
+ out << "HTTP/1.1 400 Invalid url\r\nConnection: Close\r\n\r\n";
+ return;
+ }
TString path = GetPath();
if (!path.StartsWith('/')) {
out << "HTTP/1.1 400 Bad request\r\nConnection: Close\r\n\r\n";
return;
}
Headers = &in.Headers();
- CgiParams.Scan(Url.Get(THttpURL::FieldQuery));
+ CgiParams.Scan(Url.Get(THttpURL::FieldQuery));
} catch (...) {
- out << "HTTP/1.1 500 Internal server error\r\nConnection: Close\r\n\r\n";
+ out << "HTTP/1.1 500 Internal server error\r\nConnection: Close\r\n\r\n";
YSYSLOG(TLOG_ERR, "THttpClient: internal error while serving monitoring request: %s", CurrentExceptionMessage().data());
- }
-
+ }
+
if (Header.http_method == HTTP_METHOD_POST)
TransferData(&in, &PostContent);
- Handler(out, *this);
- out.Finish();
+ Handler(out, *this);
+ out.Finish();
} catch (...) {
auto msg = CurrentExceptionMessage();
out << "HTTP/1.1 500 Internal server error\r\nConnection: Close\r\n\r\n" << msg;
out.Finish();
YSYSLOG(TLOG_ERR, "THttpClient: error while serving monitoring request: %s", msg.data());
- }
- }
-
+ }
+ }
+
const char* GetURI() const override {
return Header.request_uri.c_str();
- }
+ }
const char* GetPath() const override {
- return Url.Get(THttpURL::FieldPath);
- }
+ return Url.Get(THttpURL::FieldPath);
+ }
const TCgiParameters& GetParams() const override {
- return CgiParams;
- }
+ return CgiParams;
+ }
const TCgiParameters& GetPostParams() const override {
if (PostParams.empty() && !PostContent.Buffer().Empty())
const_cast<THttpClient*>(this)->ScanPostParams();
@@ -90,125 +90,125 @@ namespace NMonitoring {
return RemoteAddr ? NAddr::PrintHostAndPort(*RemoteAddr) : TString();
}
- private:
- THttpRequestHeader Header;
+ private:
+ THttpRequestHeader Header;
const THttpHeaders* Headers = nullptr;
- THttpURL Url;
+ THttpURL Url;
TCgiParameters CgiParams;
TCgiParameters PostParams;
TBufferOutput PostContent;
const NAddr::IRemoteAddr* RemoteAddr = nullptr;
- };
-
- /* TCoHttpServer */
-
+ };
+
+ /* TCoHttpServer */
+
class TCoHttpServer::TConnection: public THttpClient {
- public:
+ public:
TConnection(const TCoHttpServer::TAcceptFull& acc, const TCoHttpServer& parent)
: Socket(acc.S->Release())
, RemoteAddr(acc.Remote)
- , Parent(parent)
- {
- }
-
+ , Parent(parent)
+ {
+ }
+
void operator()(TCont* c) {
- try {
- THolder<TConnection> me(this);
- TContIO io(Socket, c);
- THttpInput in(&io);
- THttpOutput out(&io, &in);
- // buffer reply so there will be ne context switching
- TStringStream s;
+ try {
+ THolder<TConnection> me(this);
+ TContIO io(Socket, c);
+ THttpInput in(&io);
+ THttpOutput out(&io, &in);
+ // buffer reply so there will be ne context switching
+ TStringStream s;
ServeRequest(in, s, RemoteAddr, Parent.Handler);
- out << s.Str();
- out.Finish();
+ out << s.Str();
+ out.Finish();
} catch (...) {
YSYSLOG(TLOG_WARNING, "TCoHttpServer::TConnection: error: %s\n", CurrentExceptionMessage().data());
- }
- }
+ }
+ }
- private:
- TSocketHolder Socket;
+ private:
+ TSocketHolder Socket;
const NAddr::IRemoteAddr* RemoteAddr;
- const TCoHttpServer& Parent;
- };
-
+ const TCoHttpServer& Parent;
+ };
+
TCoHttpServer::TCoHttpServer(TContExecutor& executor, const TString& bindAddr, TIpPort port, THandler handler)
- : Executor(executor)
- , Listener(this, &executor)
+ : Executor(executor)
+ , Listener(this, &executor)
, Handler(std::move(handler))
- , BindAddr(bindAddr)
- , Port(port)
- {
+ , BindAddr(bindAddr)
+ , Port(port)
+ {
try {
Listener.Bind(TIpAddress(bindAddr, port));
} catch (yexception e) {
Y_FAIL("TCoHttpServer::TCoHttpServer: couldn't bind to %s:%d\n", bindAddr.data(), port);
}
- }
-
- void TCoHttpServer::Start() {
- Listener.Listen();
- }
-
- void TCoHttpServer::Stop() {
- Listener.Stop();
- }
-
+ }
+
+ void TCoHttpServer::Start() {
+ Listener.Listen();
+ }
+
+ void TCoHttpServer::Stop() {
+ Listener.Stop();
+ }
+
void TCoHttpServer::OnAcceptFull(const TAcceptFull& acc) {
THolder<TConnection> conn(new TConnection(acc, *this));
- Executor.Create(*conn, "client");
+ Executor.Create(*conn, "client");
Y_UNUSED(conn.Release());
- }
-
- void TCoHttpServer::OnError() {
- throw; // just rethrow
- }
-
+ }
+
+ void TCoHttpServer::OnError() {
+ throw; // just rethrow
+ }
+
void TCoHttpServer::ProcessRequest(IOutputStream& out, const IHttpRequest& request) {
- try {
- TNetworkAddress addr(BindAddr, Port);
- TSocket sock(addr);
- TSocketOutput sock_out(sock);
- TSocketInput sock_in(sock);
+ try {
+ TNetworkAddress addr(BindAddr, Port);
+ TSocket sock(addr);
+ TSocketOutput sock_out(sock);
+ TSocketInput sock_in(sock);
sock_out << "GET " << request.GetURI() << " HTTP/1.0\r\n\r\n";
- THttpInput http_in(&sock_in);
- try {
- out << "HTTP/1.1 200 Ok\nConnection: Close\n\n";
- TransferData(&http_in, &out);
+ THttpInput http_in(&sock_in);
+ try {
+ out << "HTTP/1.1 200 Ok\nConnection: Close\n\n";
+ TransferData(&http_in, &out);
} catch (...) {
YSYSLOG(TLOG_DEBUG, "TCoHttpServer: while getting data from backend: %s", CurrentExceptionMessage().data());
- }
+ }
} catch (const yexception& /*e*/) {
- out << "HTTP/1.1 500 Internal server error\nConnection: Close\n\n";
+ out << "HTTP/1.1 500 Internal server error\nConnection: Close\n\n";
YSYSLOG(TLOG_DEBUG, "TCoHttpServer: while getting data from backend: %s", CurrentExceptionMessage().data());
- }
- }
-
- /* TMtHttpServer */
-
+ }
+ }
+
+ /* TMtHttpServer */
+
class TMtHttpServer::TConnection: public TClientRequest, public THttpClient {
- public:
- TConnection(const TMtHttpServer& parent)
- : Parent(parent)
- {
- }
-
+ public:
+ TConnection(const TMtHttpServer& parent)
+ : Parent(parent)
+ {
+ }
+
bool Reply(void*) override {
ServeRequest(Input(), Output(), NAddr::GetPeerAddr(Socket()).Get(), Parent.Handler);
- return true;
- }
+ return true;
+ }
+
+ private:
+ const TMtHttpServer& Parent;
+ };
- private:
- const TMtHttpServer& Parent;
- };
-
TMtHttpServer::TMtHttpServer(const TOptions& options, THandler handler, IThreadFactory* pool)
- : THttpServer(this, options, pool)
+ : THttpServer(this, options, pool)
, Handler(std::move(handler))
- {
- }
-
+ {
+ }
+
TMtHttpServer::TMtHttpServer(const TOptions& options, THandler handler, TSimpleSharedPtr<IThreadPool> pool)
: THttpServer(this, /* mainWorkers = */pool, /* failWorkers = */pool, options)
, Handler(std::move(handler))
@@ -233,36 +233,36 @@ namespace NMonitoring {
THttpServer::Stop();
}
- TClientRequest* TMtHttpServer::CreateClient() {
- return new TConnection(*this);
- }
-
- /* TService */
-
+ TClientRequest* TMtHttpServer::CreateClient() {
+ return new TConnection(*this);
+ }
+
+ /* TService */
+
TMonService::TMonService(TContExecutor& executor, TIpPort internalPort, TIpPort externalPort,
THandler coHandler, THandler mtHandler)
: CoServer(executor, "127.0.0.1", internalPort, std::move(coHandler))
, MtServer(THttpServerOptions(externalPort), std::bind(&TMonService::DispatchRequest, this, std::placeholders::_1, std::placeholders::_2))
, MtHandler(std::move(mtHandler))
- {
- }
-
- void TMonService::Start() {
- MtServer.Start();
- CoServer.Start();
- }
-
- void TMonService::Stop() {
- MtServer.Stop();
- CoServer.Stop();
- }
-
+ {
+ }
+
+ void TMonService::Start() {
+ MtServer.Start();
+ CoServer.Start();
+ }
+
+ void TMonService::Stop() {
+ MtServer.Stop();
+ CoServer.Stop();
+ }
+
void TMonService::DispatchRequest(IOutputStream& out, const IHttpRequest& request) {
- if (strcmp(request.GetPath(), "/") == 0) {
- out << "HTTP/1.1 200 Ok\nConnection: Close\n\n";
- MtHandler(out, request);
+ if (strcmp(request.GetPath(), "/") == 0) {
+ out << "HTTP/1.1 200 Ok\nConnection: Close\n\n";
+ MtHandler(out, request);
} else
- CoServer.ProcessRequest(out, request);
- }
-
+ CoServer.ProcessRequest(out, request);
+ }
+
}