Heim >Backend-Entwicklung >Golang >Wie kann ich die Integrität des HTTP-Anforderungskörpers beim Reverse-Proxying bewahren?

Wie kann ich die Integrität des HTTP-Anforderungskörpers beim Reverse-Proxying bewahren?

Linda Hamilton
Linda HamiltonOriginal
2024-12-16 04:28:21443Durchsuche

How Can I Preserve HTTP Request Body Integrity When Reverse Proxying?

Bewahrung der HTTP-Anforderungskörperintegrität für Reverse-Proxying

Problem:

In einem benutzerdefinierten HTTP-Handler, der die ServeHTTP-Methode implementiert, Die Überprüfung des Hauptteils eingehender POST-Anfragen mit req.ParseForm() führt zu einem Fehler, wenn die Anfrage an einen Reverse-Proxy weitergeleitet wird. Dies liegt daran, dass das Lesen des Körpers den req.Body.Reader-Stream leert und nichts für nachfolgende Verbraucher übrig bleibt.

Lösung:

Um den ursprünglichen Anforderungsstatus beizubehalten, während die untersucht wird Beachten Sie die folgende Technik:

  1. Lesen Sie den Anforderungstext mit in einen Puffer io.ReadAll(r.Body).
  2. Erstellen Sie zwei neue Reader, rdr1 und rdr2, unterstützt durch den Puffer, mit io.NopCloser(bytes.NewBuffer(buf)).
  3. Verwenden Sie rdr1, um Untersuchen Sie den Körper und führen Sie die gewünschten Aktionen aus.
  4. Setzen Sie r.Body auf rdr2 zurück Behalten Sie den ursprünglichen Anforderungsstatus für den Reverse-Proxy bei.

Codebeispiel:

buf, _ := io.ReadAll(r.Body)
rdr1 := io.NopCloser(bytes.NewBuffer(buf))
rdr2 := io.NopCloser(bytes.NewBuffer(buf))

doStuff(rdr1)
r.Body = rdr2 // Resets the request body without consuming any data

Hinweis:

bytes.Buffer implementiert die io.ReadCloser-Schnittstelle aufgrund des Fehlens einer Close()-Methode nicht; daher ist jeder Leser in io.NopCloser.

eingeschlossen

Das obige ist der detaillierte Inhalt vonWie kann ich die Integrität des HTTP-Anforderungskörpers beim Reverse-Proxying bewahren?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn