Skip to content

Commit 3721e81

Browse files
authored
Merge ce87dd1 into 54d3846
2 parents 54d3846 + ce87dd1 commit 3721e81

File tree

3 files changed

+321
-92
lines changed

3 files changed

+321
-92
lines changed

ydb/library/actors/http/http.cpp

Lines changed: 78 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -412,8 +412,33 @@ THttpOutgoingDataChunkPtr THttpOutgoingResponse::CreateIncompleteDataChunk() {
412412
return new THttpOutgoingDataChunk(this);
413413
}
414414

415-
THttpIncomingRequestPtr THttpIncomingRequest::Duplicate() {
416-
THttpIncomingRequestPtr request = new THttpIncomingRequest(*this);
415+
THttpIncomingRequestPtr THttpIncomingRequest::Duplicate(const THeaders& extraHeaders) const {
416+
THttpIncomingRequestPtr request = new THttpIncomingRequest(Endpoint, Address);
417+
request->Append(Method.Data(), Method.Size());
418+
request->Append(' ');
419+
request->Append(URL.Data(), URL.Size());
420+
request->Append(' ');
421+
request->Append(Protocol.Data(), Protocol.Size());
422+
request->Append('/');
423+
request->Append(Version.Data(), Version.Size());
424+
request->Append('\r');
425+
request->Append('\n');
426+
THeadersBuilder headers(Headers);
427+
headers.Erase("Transfer-Encoding"); // we do not want to copy chunked encoding
428+
for (const auto& [key, value] : extraHeaders.Headers) {
429+
if (value) {
430+
headers.Set(key, value);
431+
} else {
432+
headers.Erase(key);
433+
}
434+
}
435+
auto renderedHeaders = headers.Render();
436+
request->Append(renderedHeaders.data(), renderedHeaders.size());
437+
request->Append('\r');
438+
request->Append('\n');
439+
if (Body) {
440+
request->Append(Body.Data(), Body.Size());
441+
}
417442
request->Reparse();
418443
request->Timer.Reset();
419444
return request;
@@ -442,20 +467,51 @@ THttpOutgoingRequestPtr THttpIncomingRequest::Forward(TStringBuf baseUrl) const
442467
return request;
443468
}
444469

445-
THttpIncomingResponsePtr THttpIncomingResponse::Duplicate(THttpOutgoingRequestPtr request) {
446-
THttpIncomingResponsePtr response = new THttpIncomingResponse(*this);
470+
THttpIncomingResponsePtr THttpIncomingResponse::Duplicate(THttpOutgoingRequestPtr request, const THeaders& extraHeaders) {
471+
THttpIncomingResponsePtr response = new THttpIncomingResponse(request);
472+
response->Append(Protocol.Data(), Protocol.Size());
473+
response->Append('/');
474+
response->Append(Version.Data(), Version.Size());
475+
response->Append(' ');
476+
response->Append(Status.Data(), Status.Size());
477+
response->Append(' ');
478+
response->Append(Message.Data(), Message.Size());
479+
response->Append('\r');
480+
response->Append('\n');
481+
THeadersBuilder headers(Headers);
482+
headers.Erase("Transfer-Encoding"); // we do not want to copy chunked encoding
483+
for (const auto& [key, value] : extraHeaders.Headers) {
484+
if (value) {
485+
headers.Set(key, value);
486+
} else {
487+
headers.Erase(key);
488+
}
489+
}
490+
auto renderedHeaders = headers.Render();
491+
response->Append(renderedHeaders.data(), renderedHeaders.size());
492+
response->Append('\r');
493+
response->Append('\n');
494+
if (Body) {
495+
response->Append(Body.Data(), Body.Size());
496+
}
447497
response->Reparse();
448-
response->Request = request;
449498
return response;
450499
}
451500

452-
THttpOutgoingResponsePtr THttpOutgoingResponse::Duplicate(THttpIncomingRequestPtr request) {
501+
THttpOutgoingResponsePtr THttpOutgoingResponse::Duplicate(THttpIncomingRequestPtr request, const THeaders& extraHeaders) {
453502
THeadersBuilder headers(Headers);
454503
if (!headers.Has("X-Worker-Name")) {
455504
if (!request->Endpoint->WorkerName.empty()) {
456505
headers.Set("X-Worker-Name", request->Endpoint->WorkerName);
457506
}
458507
}
508+
for (const auto& [key, value] : extraHeaders.Headers) {
509+
if (value) {
510+
headers.Set(key, value);
511+
} else {
512+
headers.Erase(key);
513+
}
514+
}
459515
THttpOutgoingResponsePtr response = new THttpOutgoingResponse(request);
460516
response->InitResponse(Protocol, Version, Status, Message);
461517
if (Body) {
@@ -598,9 +654,22 @@ THttpOutgoingRequestPtr THttpOutgoingRequest::CreateHttpRequest(TStringBuf metho
598654
return request;
599655
}
600656

601-
THttpOutgoingRequestPtr THttpOutgoingRequest::Duplicate() {
602-
THttpOutgoingRequestPtr request = new THttpOutgoingRequest(*this);
603-
request->Reparse();
657+
THttpOutgoingRequestPtr THttpOutgoingRequest::Duplicate(const THeaders& extraHeaders) {
658+
THttpOutgoingRequestPtr request = new THttpOutgoingRequest();
659+
request->Secure = Secure;
660+
request->InitRequest(Method, URL, Protocol, Version);
661+
THeadersBuilder headers(Headers);
662+
for (const auto& [key, value] : extraHeaders.Headers) {
663+
if (value) {
664+
headers.Set(key, value);
665+
} else {
666+
headers.Erase(key);
667+
}
668+
}
669+
request->Set(headers);
670+
if (Body) {
671+
request->SetBody(Body);
672+
}
604673
return request;
605674
}
606675

ydb/library/actors/http/http.h

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1021,7 +1021,7 @@ class THttpIncomingRequest :
10211021
THttpOutgoingResponsePtr CreateIncompleteResponse(TStringBuf status, TStringBuf message, const THeaders& headers = {});
10221022
THttpOutgoingResponsePtr CreateIncompleteResponse(TStringBuf status, TStringBuf message, const THeaders& headers, TStringBuf body);
10231023

1024-
THttpIncomingRequestPtr Duplicate();
1024+
THttpIncomingRequestPtr Duplicate(const NHttp::THeaders& extraHeaders = {}) const;
10251025
THttpOutgoingRequestPtr Forward(TStringBuf baseUrl) const;
10261026

10271027
private:
@@ -1047,7 +1047,7 @@ class THttpOutgoingRequest :
10471047
static THttpOutgoingRequestPtr CreateRequestPost(TStringBuf host, TStringBuf uri, TStringBuf contentType, TStringBuf body); // http only
10481048
static THttpOutgoingRequestPtr CreateRequest(TStringBuf method, TStringBuf url, TStringBuf contentType = TStringBuf(), TStringBuf body = TStringBuf());
10491049
static THttpOutgoingRequestPtr CreateHttpRequest(TStringBuf method, TStringBuf host, TStringBuf uri, TStringBuf contentType = TStringBuf(), TStringBuf body = TStringBuf());
1050-
THttpOutgoingRequestPtr Duplicate();
1050+
THttpOutgoingRequestPtr Duplicate(const THeaders& extraHeaders = {});
10511051
THttpIncomingRequestPtr Reverse();
10521052

10531053
bool IsConnectionClose() const {
@@ -1069,7 +1069,7 @@ class THttpIncomingResponse :
10691069
return Request;
10701070
}
10711071

1072-
THttpIncomingResponsePtr Duplicate(THttpOutgoingRequestPtr request);
1072+
THttpIncomingResponsePtr Duplicate(THttpOutgoingRequestPtr request, const THeaders& extraHeaders = {});
10731073
THttpOutgoingResponsePtr Reverse(THttpIncomingRequestPtr request);
10741074

10751075
bool IsConnectionClose() const {
@@ -1141,7 +1141,7 @@ class THttpOutgoingResponse :
11411141
return Request;
11421142
}
11431143

1144-
THttpOutgoingResponsePtr Duplicate(THttpIncomingRequestPtr request);
1144+
THttpOutgoingResponsePtr Duplicate(THttpIncomingRequestPtr request, const THeaders& extraHeaders = {});
11451145
THttpIncomingResponsePtr Reverse(THttpOutgoingRequestPtr request);
11461146
THttpOutgoingDataChunkPtr CreateDataChunk(TStringBuf data = {}); // empty chunk means end of data
11471147
THttpOutgoingDataChunkPtr CreateIncompleteDataChunk(); // to construct it later

0 commit comments

Comments
 (0)