diff options
author | Alexander Rutkovsky <alexvru@mail.ru> | 2022-02-15 21:32:46 +0300 |
---|---|---|
committer | Alexander Rutkovsky <alexvru@mail.ru> | 2022-02-15 21:32:46 +0300 |
commit | ab675143aaea0ec78f3968a38ad6f2817bf9b97f (patch) | |
tree | fc4219d80af504c463f7b27ca12c3d2ec15f2e6c | |
parent | 83c7a63dd6100653e59d2a5d7cf218ede8ea8ee5 (diff) | |
download | ydb-ab675143aaea0ec78f3968a38ad6f2817bf9b97f.tar.gz |
Use new TEvRemoteHttpInfo interface KIKIMR-14300
ref:e195dec5ef0f1fe978465455cfd94ddf126c672b
-rw-r--r-- | library/cpp/actors/protos/actors.proto | 8 | ||||
-rw-r--r-- | ydb/core/tablet/tablet_monitoring_proxy.cpp | 60 |
2 files changed, 52 insertions, 16 deletions
diff --git a/library/cpp/actors/protos/actors.proto b/library/cpp/actors/protos/actors.proto index 072040600d6..ad347dc2907 100644 --- a/library/cpp/actors/protos/actors.proto +++ b/library/cpp/actors/protos/actors.proto @@ -27,7 +27,11 @@ message TRemoteHttpInfo { optional string Path = 2; repeated TQueryParam QueryParams = 3; repeated TQueryParam PostParams = 4; - repeated bytes PostContent = 5; - optional THeader Headers = 6; + optional bytes PostContent = 8; + repeated THeader Headers = 9; optional string RemoteAddr = 7; + + // for compatibility reasons (incorrect field types merged in 21-4) + reserved 5; + reserved 6; } diff --git a/ydb/core/tablet/tablet_monitoring_proxy.cpp b/ydb/core/tablet/tablet_monitoring_proxy.cpp index a61a43b7e5c..ab421f1228a 100644 --- a/ydb/core/tablet/tablet_monitoring_proxy.cpp +++ b/ydb/core/tablet/tablet_monitoring_proxy.cpp @@ -18,24 +18,59 @@ namespace NKikimr { namespace NTabletMonitoringProxy { namespace { +bool IsFormUrlencoded(const NMonitoring::IMonHttpRequest& request) { + auto *header = request.GetHeaders().FindHeader("Content-Type"); + if (!header) { + return false; + } + TStringBuf value = header->Value(); + const TStringBuf contentType = value.NextTok(';'); + return contentType == "application/x-www-form-urlencoded"; +} + class TForwardingActor : public TActorBootstrapped<TForwardingActor> { public: static constexpr NKikimrServices::TActivity::EType ActorActivityType() { return NKikimrServices::TActivity::TABLET_FORWARDING_ACTOR; } - TForwardingActor(const TTabletMonitoringProxyConfig& config, ui64 targetTablet, bool forceFollower, const TActorId& sender, const TString& query, HTTP_METHOD method) + TForwardingActor(const TTabletMonitoringProxyConfig& config, ui64 targetTablet, bool forceFollower, const TActorId& sender, const NMonitoring::IMonHttpRequest& request) : Config(config) , TargetTablet(targetTablet) , ForceFollower(forceFollower) , Sender(sender) - , Query(query) - , Method(method) + , Request(ConvertRequestToProtobuf(request)) {} - TForwardingActor(const TTabletMonitoringProxyConfig& config, ui64 targetTablet, bool forceFollower, const TActorId& sender, const TString& query) - : TForwardingActor(config, targetTablet, forceFollower, sender, query, HTTP_METHOD::HTTP_METHOD_GET) - {} + static NActorsProto::TRemoteHttpInfo ConvertRequestToProtobuf(const NMonitoring::IMonHttpRequest& request) { + NActorsProto::TRemoteHttpInfo pb; + pb.SetMethod(request.GetMethod()); + pb.SetPath(TString(request.GetPathInfo())); + for (const auto& [key, value] : request.GetParams()) { + auto *p = pb.AddQueryParams(); + p->SetKey(key); + p->SetValue(value); + } + if (request.GetMethod() == HTTP_METHOD_POST && IsFormUrlencoded(request)) { + for (const auto& [key, value] : request.GetPostParams()) { + auto *p = pb.AddPostParams(); + p->SetKey(key); + p->SetValue(value); + } + } + if (const auto& content = request.GetPostContent()) { + pb.SetPostContent(content.data(), content.size()); + } + for (const auto& header : request.GetHeaders()) { + auto *p = pb.AddHeaders(); + p->SetName(header.Name()); + p->SetValue(header.Value()); + } + if (const auto& addr = request.GetRemoteAddr()) { + pb.SetRemoteAddr(addr.data(), addr.size()); + } + return pb; + } void Bootstrap(const TActorContext& ctx) { NTabletPipe::TClientConfig config; @@ -45,7 +80,7 @@ public: config.RetryPolicy = Config.RetryPolicy; PipeClient = ctx.ExecutorThread.RegisterActor(NTabletPipe::CreateClient(ctx.SelfID, TargetTablet, config)); - NTabletPipe::SendData(ctx, PipeClient, new NMon::TEvRemoteHttpInfo(Query, Method)); + NTabletPipe::SendData(ctx, PipeClient, new NMon::TEvRemoteHttpInfo(std::move(Request))); ctx.Schedule(TDuration::Seconds(60), new TEvents::TEvWakeup()); Become(&TThis::StateWork); @@ -114,9 +149,8 @@ private: const ui64 TargetTablet; const bool ForceFollower; const TActorId Sender; - const TString Query; + NActorsProto::TRemoteHttpInfo Request; TActorId PipeClient; - const HTTP_METHOD Method; }; } @@ -186,7 +220,7 @@ TTabletMonitoringProxyActor::Handle(NMon::TEvHttpInfo::TPtr &ev, const TActorCon NMon::TEvHttpInfo* msg = ev->Get(); const TCgiParameters* cgi; - if (msg->Request.GetMethod() == HTTP_METHOD_POST) { + if (msg->Request.GetMethod() == HTTP_METHOD_POST && IsFormUrlencoded(msg->Request)) { cgi = &msg->Request.GetPostParams(); } else { cgi = &msg->Request.GetParams(); @@ -206,8 +240,7 @@ TTabletMonitoringProxyActor::Handle(NMon::TEvHttpInfo::TPtr &ev, const TActorCon const TString &tabletIdParam = cgi->Get("FollowerID"); const ui64 tabletId = TryParseTabletId(tabletIdParam); if (tabletId) { - TString url = TStringBuilder() << msg->Request.GetPathInfo() << "?" << cgi->Print(); - ctx.ExecutorThread.RegisterActor(new TForwardingActor(Config, tabletId, true, ev->Sender, std::move(url))); + ctx.ExecutorThread.RegisterActor(new TForwardingActor(Config, tabletId, true, ev->Sender, msg->Request)); return; } } @@ -217,8 +250,7 @@ TTabletMonitoringProxyActor::Handle(NMon::TEvHttpInfo::TPtr &ev, const TActorCon const TString &tabletIdParam = cgi->Get("TabletID"); const ui64 tabletId = TryParseTabletId(tabletIdParam); if (tabletId) { - TString url = TStringBuilder() << msg->Request.GetPathInfo() << "?" << cgi->Print(); - ctx.ExecutorThread.RegisterActor(new TForwardingActor(Config, tabletId, false, ev->Sender, std::move(url), msg->Request.GetMethod())); + ctx.ExecutorThread.RegisterActor(new TForwardingActor(Config, tabletId, false, ev->Sender, msg->Request)); return; } } |