aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlexander Rutkovsky <alexvru@mail.ru>2022-02-15 21:32:46 +0300
committerAlexander Rutkovsky <alexvru@mail.ru>2022-02-15 21:32:46 +0300
commitab675143aaea0ec78f3968a38ad6f2817bf9b97f (patch)
treefc4219d80af504c463f7b27ca12c3d2ec15f2e6c
parent83c7a63dd6100653e59d2a5d7cf218ede8ea8ee5 (diff)
downloadydb-ab675143aaea0ec78f3968a38ad6f2817bf9b97f.tar.gz
Use new TEvRemoteHttpInfo interface KIKIMR-14300
ref:e195dec5ef0f1fe978465455cfd94ddf126c672b
-rw-r--r--library/cpp/actors/protos/actors.proto8
-rw-r--r--ydb/core/tablet/tablet_monitoring_proxy.cpp60
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;
}
}