Indy icon indicating copy to clipboard operation
Indy copied to clipboard

idHttp - IPv6 - IPVersion-ProtocolSwitch on Redirect (HandleRedirects=true)

Open tobfel opened this issue 1 year ago • 2 comments

First reqest is done via IPv6, but when the server response with 301, the RedirectUrl ist not called with the same IP-Protocol-Version. Can be fixed via:

if Request.IPVersion=Id_IPv6 then
    begin
    with TIdURI.Create(LLocation) do
         begin
         URI := LLocation;
         IPVersion := Id_IPv6;
         LLocation := URI;
         Free;
         end;
    end;

in

function TIdHTTPProtocol.ProcessResponse(AIgnoreReplies: array of Int16): TIdHTTPWhatsNext;
...
after:
LLocation := Response.Location;
LMethod := Request.Method;

tobfel avatar Mar 14 '24 18:03 tobfel

TIdURI is already being used to process the Request.URL inside of TIdCustomHTTP.PrepareRequest(), which is called just after LLocation is assigned to Request.URL. So, rather than modifying LLocation itself, it would probably work/make more sense to instead have PrepareRequest() preserve the existing IPVersion when processing ARequest.URL, eg:

procedure TIdCustomHTTP.PrepareRequest(ARequest: TIdHTTPRequest);
var
  LURI: TIdURI;
  ...
begin
  LURI := TIdURI.Create(ARequest.URL);

  try
    // Add this...?
    LURI.IPVersion := ARequest.IPVersion;
    // or maybe this?
    if ARequest.IPVersion = Id_IPv6 then begin
      LURI.IPVersion := Id_IPv6;
    end;

    ...
  finally
    FreeAndNil(LURI);  // Free URI Object
  end;
end;

rlebeau avatar Mar 17 '24 17:03 rlebeau

Was my earlier suggestion helpful to you?

rlebeau avatar Jul 16 '24 19:07 rlebeau