AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Nach einem redirect 301 wird POST wird durch GET überschrieben
Thema durchsuchen
Ansicht
Themen-Optionen

Nach einem redirect 301 wird POST wird durch GET überschrieben

Ein Thema von alex517 · begonnen am 16. Feb 2022 · letzter Beitrag vom 17. Feb 2022
Antwort Antwort
alex517
Online

Registriert seit: 23. Nov 2004
Ort: Bernau b. Berlin
273 Beiträge
 
Delphi XE5 Enterprise
 
#1

Nach einem redirect 301 wird POST wird durch GET überschrieben

  Alt 16. Feb 2022, 15:26
Hallo alle zusammen!

Ich habe einen REST-Server und einen REST-Client mit dem DMVC von Daniele Teti geschrieben.

Die Filter-Parameter für die Abfrage GetHistorie() werden als JSON im Body übergeben.
Mit POST wird die Abfrage ausgeführt.

Delphi-Quellcode:
    [MVCPath('/historie')]
    [MVCConsumes(TMVCMediaType.APPLICATION_JSON)]
    [MVCProduces(TMVCMediaType.APPLICATION_JSON)]
    [MVCHTTPMethod([httpPOST])]
    procedure GetHistorie([MVCFromBody] Filter: TFltHistorie);
Die Produktiv-Umgebung läuft über einen Reverse-Proxy mit NGINX und Let's encrypt.

Wenn die Abfrage über HTTPS geht ist alles ok, die POST-Methode wird ausgeführt.

Wenn die Abfrage über HTTP gestartet wird,
erfolgt durch NGINX eine Umleitung auf HTTPS.
Code:
  ...
  return 301 https://$server_name$request_uri;
  ...
Diese Umleitung mit dem Code 301 bewirkt im REST-Server in der Funktion
System.Net.HttpClient.IsAutoRedirectWithGET(..)
ein Überschreiben der POST-Methode durch eine GET-Methode.

Das hat zur Folge, dass der Client als Antwort ein 404 erhält,
da Funktion GetHistorie() als HTTP-POST und nicht als HTTP-GET definiert ist.

Ok, Lösung:
gleich das HTTPS Protkoll verwenden.

Jetzt die Fragen:

Warum wird, wie es aussieht standardmäßig, nach einem redirect 301 ein POST durch ein GET ersetzt?

Kann man dieses Verhalten abstellen?

Alex
Alexander

Geändert von alex517 (16. Feb 2022 um 15:30 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Union
Union

Registriert seit: 18. Mär 2004
Ort: Luxembourg
3.492 Beiträge
 
Delphi 7 Enterprise
 
#2

AW: Nach einem redirect 301 wird POST wird durch GET überschrieben

  Alt 16. Feb 2022, 15:34
Ist wohl abhängig von der verwendeten Client-Library Implementierung:
Zitat von RFC2616:
If the 301 status code is received in response to a request other
than GET or HEAD, the user agent MUST NOT automatically redirect the
request unless it can be confirmed by the user, since this might
change the conditions under which the request was issued.

Note: When automatically redirecting a POST request after
receiving a 301 status code, some existing HTTP/1.0 user agents
will erroneously change it into a GET request.
Ibi fas ubi proxima merces
sudo /Developer/Library/uninstall-devtools --mode=all
  Mit Zitat antworten Zitat
alex517
Online

Registriert seit: 23. Nov 2004
Ort: Bernau b. Berlin
273 Beiträge
 
Delphi XE5 Enterprise
 
#3

AW: Nach einem redirect 301 wird POST wird durch GET überschrieben

  Alt 16. Feb 2022, 15:56
Hhmm,
das heißt, dass diese Funktion einfach nur ein Fehler ist?

unit System.Net.HttpClient:
Delphi-Quellcode:
function THTTPClient.IsAutoRedirectWithGET(const ARequest: THTTPRequest; const AResponse: THTTPResponse): Boolean;
var
  LRedirWithGet: THTTPRedirectsWithGET;
  LMethod: string;
begin
  // POST:
  // * 303 must be redirected to GET according spec
  // * 301, 302, 307 erroneously may be redirected to GET too
  // PUT, DELETE:
  // * 303 must be redirected to GET according spec

  Result := False;
  if not IsAutoRedirect(AResponse) then
    Exit;

  LRedirWithGet := RedirectsWithGET;
  LMethod := ARequest.GetMethodString;
  if SameText(LMethod, sHTTPMethodPost) then
    case AResponse.GetStatusCode of
    301: Result := THTTPRedirectWithGET.Post301 in LRedirWithGet;
    302: Result := THTTPRedirectWithGET.Post302 in LRedirWithGet;
    303: Result := THTTPRedirectWithGET.Post303 in LRedirWithGet;
    307: Result := THTTPRedirectWithGET.Post307 in LRedirWithGet;
    308: Result := THTTPRedirectWithGET.Post308 in LRedirWithGet;
    end
  else if SameText(LMethod, sHTTPMethodPut) then
    case AResponse.GetStatusCode of
    301: Result := THTTPRedirectWithGET.Put301 in LRedirWithGet;
    302: Result := THTTPRedirectWithGET.Put302 in LRedirWithGet;
    303: Result := THTTPRedirectWithGET.Put303 in LRedirWithGet;
    307: Result := THTTPRedirectWithGET.Put307 in LRedirWithGet;
    308: Result := THTTPRedirectWithGET.Put308 in LRedirWithGet;
    end
  else if SameText(LMethod, sHTTPMethodDelete) then
    case AResponse.GetStatusCode of
    301: Result := THTTPRedirectWithGET.Delete301 in LRedirWithGet;
    302: Result := THTTPRedirectWithGET.Delete302 in LRedirWithGet;
    303: Result := THTTPRedirectWithGET.Delete303 in LRedirWithGet;
    307: Result := THTTPRedirectWithGET.Delete307 in LRedirWithGet;
    308: Result := THTTPRedirectWithGET.Delete308 in LRedirWithGet;
    end;
end;
Alexander
  Mit Zitat antworten Zitat
Rolf Frei

Registriert seit: 19. Jun 2006
647 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: Nach einem redirect 301 wird POST wird durch GET überschrieben

  Alt 16. Feb 2022, 17:53
Nein das ist so schon richtig. Das Problem ist, dass du garnicht erst ein Post auf eine URL ausführen solltest, die ein 301 liefert. Die Daten werden im Content an den Server geschickt und bei einem 301 würdest du diese Daten verlieren, da du nur die neue URL retour bekommst, aber nicht die im Content geschickten Daten. Eventuell irre ich mich da auch, aber ich glaube eine 301 sendet kein Content.
  Mit Zitat antworten Zitat
alex517
Online

Registriert seit: 23. Nov 2004
Ort: Bernau b. Berlin
273 Beiträge
 
Delphi XE5 Enterprise
 
#5

AW: Nach einem redirect 301 wird POST wird durch GET überschrieben

  Alt 17. Feb 2022, 08:33
Ok, das mit dem fehlenden Content wäre eine Erklärung.
Wobei sich die Frage stellt, was das Sinnvolles rauskommen soll,
wenn ein POST/PUT/DELETE in ein GET umgewandelt wird.

Und es bliebe noch der Hinweis aus der RFC, dass das Umwandeln nur
fälschlicherweise durch einige Clients ausgeführt wird.

Aber gut, ich werde den Zugriff per HTTP abstellen und immer gleich HTTPS verwenden.

Alex
Alexander
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.052 Beiträge
 
Delphi 12 Athens
 
#6

AW: Nach einem redirect 301 wird POST wird durch GET überschrieben

  Alt 17. Feb 2022, 09:18
Auf das Redirekt reagieren, die Zugangsdaten in der Komponente anpassen und es nochmal senden?
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
alex517
Online

Registriert seit: 23. Nov 2004
Ort: Bernau b. Berlin
273 Beiträge
 
Delphi XE5 Enterprise
 
#7

AW: Nach einem redirect 301 wird POST wird durch GET überschrieben

  Alt 17. Feb 2022, 09:27
Naja, ich bekomme als Fehler nur die 404 "Not found" zurück
und das kann ja verschiedene Gründe haben.
Außerdem gehe ich in der Produktiv-Umgebung sowieso über HTTPS
und komme damit nicht in den "Genuss" des Redirects.

Meine Frage war eher aus Interesse, warum man überhaupt sowas,
für meine Begriffe, unsinniges macht.

alex
Alexander
  Mit Zitat antworten Zitat
Bbommel

Registriert seit: 27. Jun 2007
Ort: Köln
655 Beiträge
 
Delphi 12 Athens
 
#8

AW: Nach einem redirect 301 wird POST wird durch GET überschrieben

  Alt 17. Feb 2022, 09:50
Wenn du statt 301 ein 308 als Antwort lieferst, dann sollte die Umleitung so funktionieren, dass das POST erhalten bleibt, siehe bei MDN. Ich hatte das Problem bei einem Programm von mir selber auch und konnte das so, da ich auch Zugriff auf den Server hatte, am einfachsten lösen. Klar, irgendwas mit 404 oder 301 und dann selber auswerten ging auch, aber so war es am einfachsten.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.052 Beiträge
 
Delphi 12 Athens
 
#9

AW: Nach einem redirect 301 wird POST wird durch GET überschrieben

  Alt 17. Feb 2022, 09:51
Das 301 sagt Dir, dass es nun wo anders zufinden ist ... du (bzw. die verwendete Komponente) kann nun einen Fehler werfen, weil Umleitungen z.B. aus Sicherheitsgründen verboten sind (Hacker hat Kontrolle bekommen und leitet alles an seine Server weiter) oder man wendet sich eben an die neue Adresse (hier vielleicht die Redirects mitzählen und begrenzen, damit man nicht in einer Endlosschleife landen kann.

Der Server könnte natürlich auch intern die Anfrage direkt weiterleiten, anstatt einem 301/308, wenn er wöllte, und du bekommst davon dann nichts mit und es läuft so weiter, wie bisher.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.

Geändert von himitsu (17. Feb 2022 um 09:53 Uhr)
  Mit Zitat antworten Zitat
alex517
Online

Registriert seit: 23. Nov 2004
Ort: Bernau b. Berlin
273 Beiträge
 
Delphi XE5 Enterprise
 
#10

AW: Nach einem redirect 301 wird POST wird durch GET überschrieben

  Alt 17. Feb 2022, 10:58
Erstmal danke für den interessanten Link.

Ein POST/PUT/DELETE wird auch bei einem redirect 308 in der
unit System.Net.HttpClient auf ein GET umgeleitet und ich hatte
nicht vor an den Delphi-Quelltexten Änderungen zu machen.

Den redirect 301 verwende ich im nginx dazu den Client
zum Wechsel von HTTP zu HTTPS zu zwingen.
Da aber auch die Client-Software von mir ist,
kann ich auch gleich das richtige Protokoll verwenden.
Bei HTTP gibt es ein 403 zurück.
Ist auch der Sicherheit zuträglicher.
Alexander

Geändert von alex517 (17. Feb 2022 um 11:07 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:47 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz