Ein einfaches Reverse-Proxy-Beispiel in Go

English Deutsch

Dieses Beispiel zeigt dir einen Go-HTTP-Server, der Anfragen an einen Upstream-Server über einen HTTP-Client weiterleitet. Beachte, dass dieses Beispiel die Antworten des Upstream-Servers nicht streamt, sondern in den RAM lädt und dann an den Client ausliefert (daher musst du dieses Beispiel möglicherweise verbessern, wenn du große Dateien ausliefern möchtest).

Beachte auch, dass dieses Beispiel keine ordnungsgemäße Fehlerbehandlung für die Upstream-Anfrage implementiert, da es nur als Ausgangspunkt für dich gedacht ist, um deine eigene Reverse-Proxy-Implementierung zu entwickeln.

reverse_proxy.go
package main

import (
    "fmt"
    "io/ioutil"
    "log"
    "net/http"
)

func main() {
    client := &http.Client{}
    http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
        // Anfrage ausführen
        url := "https://techoverflow.net" + r.URL.Path
        req, _ := http.NewRequest(r.Method, url, r.Body)
        req.Header = r.Header
        resp, _ := client.Do(req)
        // Cleanup, wenn diese Funktion endet
        defer resp.Body.Close()
        // Header von Anfrage zu Antwort kopieren
        header := w.Header()
        for name, headers := range resp.Header {
            // Alle Header mit einem Namen iterieren (z.B. Content-Type)
            for _, hdr := range headers {
                header.Add(name, hdr)
            }
        }
        // Alle Antwortdaten in ein []byte einlesen
        body, _ := ioutil.ReadAll(resp.Body)
        // Header & Body schreiben
        w.WriteHeader(resp.StatusCode)
        w.Write(body)
    })
    // log.Fatal zeigt dir, ob es einen Fehler gibt, z.B. wenn
    //  der Port bereits verwendet wird
    fmt.Println("Listening on port 8080")
    log.Fatal(http.ListenAndServe(":8080", nil))
}

Weiterführende Literatur:


Check out similar posts by category: Go