@@ -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
0 commit comments