Skip to content

Commit 98affd2

Browse files
committed
support form-urlencoded in base class (#18675)
1 parent 1e51f2c commit 98affd2

File tree

4 files changed

+65
-99
lines changed

4 files changed

+65
-99
lines changed

ydb/core/viewer/json_pipe_req.cpp

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -143,6 +143,11 @@ void TViewerPipeClient::BuildParamsFromJson(TStringBuf data) {
143143
case NJson::EJsonValueType::JSON_BOOLEAN:
144144
Params.InsertUnescaped(key, value.GetStringRobust());
145145
break;
146+
case NJson::EJsonValueType::JSON_ARRAY:
147+
for (const auto& item : value.GetArray()) {
148+
Params.InsertUnescaped(key, item.GetStringRobust());
149+
}
150+
break;
146151
default:
147152
break;
148153
}
@@ -151,6 +156,12 @@ void TViewerPipeClient::BuildParamsFromJson(TStringBuf data) {
151156
}
152157
}
153158

159+
void TViewerPipeClient::BuildParamsFromFormData(TStringBuf data) {
160+
for (const auto& [key, value] : TCgiParameters(data)) {
161+
Params.InsertUnescaped(key, value);
162+
}
163+
}
164+
154165
void TViewerPipeClient::SetupTracing(const TString& handlerName) {
155166
auto request = GetRequest();
156167
NWilson::TTraceId traceId;
@@ -190,6 +201,9 @@ TViewerPipeClient::TViewerPipeClient(IViewer* viewer, NMon::TEvHttpInfo::TPtr& e
190201
if (NHttp::Trim(Event->Get()->Request.GetHeader("Content-Type").Before(';'), ' ') == "application/json") {
191202
BuildParamsFromJson(Event->Get()->Request.GetPostContent());
192203
}
204+
if (NHttp::Trim(Event->Get()->Request.GetHeader("Content-Type").Before(';'), ' ') == "application/x-www-form-urlencoded") {
205+
BuildParamsFromFormData(Event->Get()->Request.GetPostContent());
206+
}
193207
InitConfig(Params);
194208
SetupTracing(handlerName);
195209
}
@@ -203,6 +217,9 @@ TViewerPipeClient::TViewerPipeClient(IViewer* viewer, NHttp::TEvHttpProxy::TEvHt
203217
if (NHttp::Trim(headers.Get("Content-Type").Before(';'), ' ') == "application/json") {
204218
BuildParamsFromJson(HttpEvent->Get()->Request->Body);
205219
}
220+
if (NHttp::Trim(headers.Get("Content-Type").Before(';'), ' ') == "application/x-www-form-urlencoded") {
221+
BuildParamsFromFormData(HttpEvent->Get()->Request->Body);
222+
}
206223
InitConfig(Params);
207224
SetupTracing(handlerName);
208225
}

ydb/core/viewer/json_pipe_req.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -328,6 +328,7 @@ class TViewerPipeClient : public TActorBootstrapped<TViewerPipeClient> {
328328
void InitConfig(const TCgiParameters& params);
329329
void InitConfig(const TRequestSettings& settings);
330330
void BuildParamsFromJson(TStringBuf data);
331+
void BuildParamsFromFormData(TStringBuf data);
331332
void SetupTracing(const TString& handlerName);
332333

333334
template<typename TJson>

ydb/core/viewer/viewer_render.h

Lines changed: 47 additions & 97 deletions
Original file line numberDiff line numberDiff line change
@@ -14,62 +14,38 @@ using namespace NMonitoring;
1414
class TJsonRender : public TViewerPipeClient {
1515
using TThis = TJsonRender;
1616
using TBase = TViewerPipeClient;
17-
TEvViewer::TEvViewerRequest::TPtr ViewerRequest;
18-
ui32 Timeout = 0;
17+
using TBase::ReplyAndPassAway;
1918
std::vector<TString> Metrics;
20-
TCgiParameters Params;
2119

2220
public:
2321
TJsonRender(IViewer* viewer, NMon::TEvHttpInfo::TPtr& ev)
2422
: TViewerPipeClient(viewer, ev)
2523
{
26-
const auto& params(Event->Get()->Request.GetParams());
27-
28-
InitConfig(params);
29-
Timeout = FromStringWithDefault<ui32>(params.Get("timeout"), 30000);
30-
}
31-
32-
TJsonRender(TEvViewer::TEvViewerRequest::TPtr& ev)
33-
: ViewerRequest(ev)
34-
{
35-
auto& request = ViewerRequest->Get()->Record.GetRenderRequest();
36-
37-
TCgiParameters params(request.GetUri());
38-
InitConfig(params);
39-
Direct = true;
40-
Timeout = ViewerRequest->Get()->Record.GetTimeout();
4124
}
4225

4326
void Bootstrap() override {
4427
if (NeedToRedirect()) {
4528
return;
4629
}
47-
auto postData = Event
48-
? Event->Get()->Request.GetPostContent()
49-
: ViewerRequest->Get()->Record.GetRenderRequest().GetContent();
50-
BLOG_D("PostData=" << postData);
5130
NKikimrGraph::TEvGetMetrics getRequest;
52-
if (postData) {
53-
Params = TCgiParameters(postData);
54-
if (Params.Has("target")) {
55-
TString metric;
56-
size_t num = 0;
57-
for (;;) {
58-
metric = Params.Get("target", num);
59-
if (metric.empty()) {
60-
break;
61-
}
62-
Metrics.push_back(metric);
63-
++num;
31+
if (Params.Has("target")) {
32+
TString metric;
33+
size_t num = 0;
34+
for (;;) {
35+
metric = Params.Get("target", num);
36+
if (metric.empty()) {
37+
break;
6438
}
39+
Metrics.push_back(metric);
40+
++num;
6541
}
6642
SendGraphRequest();
6743
} else {
68-
ReplyAndPassAway(Viewer->GetHTTPBADREQUEST(Event->Get(), {}, "Bad Request"));
44+
ReplyAndPassAway(GetHTTPBADREQUEST("text/plain", "Bad Request"));
6945
return;
7046
}
7147

72-
Become(&TThis::StateWork, TDuration::MilliSeconds(Timeout), new TEvents::TEvWakeup());
48+
Become(&TThis::StateWork, Timeout, new TEvents::TEvWakeup());
7349
}
7450

7551
STATEFN(StateWork) {
@@ -90,7 +66,7 @@ class TJsonRender : public TViewerPipeClient {
9066
"\x03\x00\x00\x00\x25\xdb\x56\xca\x00\x00\x00\x03\x50\x4c\x54\x45\x00\x00\x00\xa7\x7a\x3d\xda\x00\x00"
9167
"\x00\x01\x74\x52\x4e\x53\x00\x40\xe6\xd8\x66\x00\x00\x00\x0a\x49\x44\x41\x54\x08\xd7\x63\x60\x00\x00"
9268
"\x00\x02\x00\x01\xe2\x21\xbc\x33\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82";
93-
Send(Event->Sender, new NMon::TEvHttpInfoRes(Viewer->GetHTTPOK(Event->Get(), "image/png", png1x1), 0, NMon::IEvHttpInfoRes::EContentType::Custom));
69+
ReplyAndPassAway(GetHTTPOK("image/png", png1x1));
9470
return PassAway();
9571
}
9672
if (Params.Has("from")) {
@@ -106,82 +82,56 @@ class TJsonRender : public TViewerPipeClient {
10682
}
10783

10884
void HandleRenderResponse(NKikimrGraph::TEvMetricsResult& response) {
109-
if (Event) {
110-
NJson::TJsonValue json;
85+
NJson::TJsonValue json;
11186

112-
if (response.GetError()) {
113-
json["status"] = "error";
114-
json["error"] = response.GetError();
115-
return ReplyAndPassAway(GetHTTPOKJSON(json));
116-
}
117-
if (response.DataSize() != Metrics.size()) {
87+
if (response.GetError()) {
88+
json["status"] = "error";
89+
json["error"] = response.GetError();
90+
return ReplyAndPassAway(GetHTTPOKJSON(json));
91+
}
92+
if (response.DataSize() != Metrics.size()) {
93+
json["status"] = "error";
94+
json["error"] = "Invalid data size received";
95+
return ReplyAndPassAway(GetHTTPOKJSON(json));
96+
}
97+
for (size_t nMetric = 0; nMetric < response.DataSize(); ++nMetric) {
98+
const auto& protoMetric(response.GetData(nMetric));
99+
if (response.TimeSize() != protoMetric.ValuesSize()) {
118100
json["status"] = "error";
119-
json["error"] = "Invalid data size received";
101+
json["error"] = "Invalid value size received";
120102
return ReplyAndPassAway(GetHTTPOKJSON(json));
121103
}
104+
}
105+
{ // graphite
106+
json.SetType(NJson::JSON_ARRAY);
122107
for (size_t nMetric = 0; nMetric < response.DataSize(); ++nMetric) {
123108
const auto& protoMetric(response.GetData(nMetric));
124-
if (response.TimeSize() != protoMetric.ValuesSize()) {
125-
json["status"] = "error";
126-
json["error"] = "Invalid value size received";
127-
return ReplyAndPassAway(GetHTTPOKJSON(json));
128-
}
129-
}
130-
{ // graphite
131-
json.SetType(NJson::JSON_ARRAY);
132-
for (size_t nMetric = 0; nMetric < response.DataSize(); ++nMetric) {
133-
const auto& protoMetric(response.GetData(nMetric));
134-
NJson::TJsonValue& jsonMetric(json.AppendValue({}));
135-
jsonMetric["target"] = Metrics[nMetric];
136-
jsonMetric["title"] = Metrics[nMetric];
137-
jsonMetric["tags"]["name"] = Metrics[nMetric];
138-
NJson::TJsonValue& jsonDataPoints(jsonMetric["datapoints"]);
139-
jsonDataPoints.SetType(NJson::JSON_ARRAY);
140-
for (size_t nTime = 0; nTime < response.TimeSize(); ++nTime) {
141-
NJson::TJsonValue& jsonDataPoint(jsonDataPoints.AppendValue({}));
142-
double value = protoMetric.GetValues(nTime);
143-
if (isnan(value)) {
144-
jsonDataPoint.AppendValue(NJson::TJsonValue(NJson::JSON_NULL));
145-
} else {
146-
jsonDataPoint.AppendValue(value);
147-
}
148-
jsonDataPoint.AppendValue(response.GetTime(nTime));
109+
NJson::TJsonValue& jsonMetric(json.AppendValue({}));
110+
jsonMetric["target"] = Metrics[nMetric];
111+
jsonMetric["title"] = Metrics[nMetric];
112+
jsonMetric["tags"]["name"] = Metrics[nMetric];
113+
NJson::TJsonValue& jsonDataPoints(jsonMetric["datapoints"]);
114+
jsonDataPoints.SetType(NJson::JSON_ARRAY);
115+
for (size_t nTime = 0; nTime < response.TimeSize(); ++nTime) {
116+
NJson::TJsonValue& jsonDataPoint(jsonDataPoints.AppendValue({}));
117+
double value = protoMetric.GetValues(nTime);
118+
if (isnan(value)) {
119+
jsonDataPoint.AppendValue(NJson::TJsonValue(NJson::JSON_NULL));
120+
} else {
121+
jsonDataPoint.AppendValue(value);
149122
}
123+
jsonDataPoint.AppendValue(response.GetTime(nTime));
150124
}
151125
}
152-
153-
ReplyAndPassAway(GetHTTPOKJSON(json));
154-
} else {
155-
TEvViewer::TEvViewerResponse* viewerResponse = new TEvViewer::TEvViewerResponse();
156-
viewerResponse->Record.MutableRenderResponse()->CopyFrom(response);
157-
ReplyAndPassAway(viewerResponse);
158126
}
127+
128+
ReplyAndPassAway(GetHTTPOKJSON(json));
159129
}
160130

161131
void Handle(NGraph::TEvGraph::TEvMetricsResult::TPtr& ev) {
162132
HandleRenderResponse(ev->Get()->Record);
163133
}
164134

165-
void HandleTimeout() {
166-
if (Event) {
167-
ReplyAndPassAway(Viewer->GetHTTPGATEWAYTIMEOUT(Event->Get()));
168-
} else {
169-
auto* response = new TEvViewer::TEvViewerResponse();
170-
response->Record.MutableRenderResponse()->SetError("Request timed out");
171-
ReplyAndPassAway(response);
172-
}
173-
}
174-
175-
void ReplyAndPassAway(TEvViewer::TEvViewerResponse* response) {
176-
Send(ViewerRequest->Sender, response);
177-
PassAway();
178-
}
179-
180-
void ReplyAndPassAway(TString data) {
181-
Send(Event->Sender, new NMon::TEvHttpInfoRes(std::move(data), 0, NMon::IEvHttpInfoRes::EContentType::Custom));
182-
PassAway();
183-
}
184-
185135
void ReplyAndPassAway() override {
186136
}
187137

ydb/core/viewer/viewer_request.cpp

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -124,8 +124,6 @@ IActor* CreateViewerRequestHandler(TEvViewer::TEvViewerRequest::TPtr& request) {
124124
return new TViewerWhiteboardRequest<TEvWhiteboard::TEvNodeStateRequest, TEvWhiteboard::TEvNodeStateResponse>(request);
125125
case NKikimrViewer::TEvViewerRequest::kQueryRequest:
126126
return new TJsonQueryOld(request);
127-
case NKikimrViewer::TEvViewerRequest::kRenderRequest:
128-
return new TJsonRender(request);
129127
case NKikimrViewer::TEvViewerRequest::kAutocompleteRequest:
130128
return new TJsonAutocomplete(request);
131129
default:

0 commit comments

Comments
 (0)