Mocking HTTPS-Antworten im Go

Ich versuche zum schreiben von tests für ein Paket, das die Anfragen an einen web service. Ich bin in Probleme laufen, wahrscheinlich wegen meiner mangelnden Verständnis von TLS.

Derzeit mein test sieht wie folgt aus:

func TestSimple() {
    server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
        w.Header().Set("Content-Type", "application/json")
        w.WriteHeader(200)
        fmt.Fprintf(w, `{ "fake" : "json data here" }`)
    }))
    transport := &http.Transport{
        Proxy: func(req *http.Request) (*url.URL, error) {
            return url.Parse(server.URL)
        },
    }
    //Client is the type in my package that makes requests
    client := Client{
        c: http.Client{Transport: transport},
    }

    client.DoRequest() //...
}

Mein Paket ist ein Paket-variable (ich möchte, dass es eine Konstante..) für die Basis-Adresse des web service für die Abfrage aus. Es ist eine https-URL. Der test-server, den ich oben erstellt, ist schlicht HTTP, kein TLS.

Standardmäßig, mein test fehlschlägt mit der Fehlermeldung "tls: erste Datensatz nicht Aussehen wie ein TLS-handshake."

Zu bekommen dies funktioniert, meine tests ändern Sie die package-variable, um eine plain-http-URL anstelle von https, bevor Sie die Abfrage.

Gibt es eine Möglichkeit, um dieses? Ich kann die Paket-variable eine Konstante (https), und entweder einen http.Transport dass "downgrades" auf unverschlüsselte HTTP, oder verwenden Sie httptest.NewTLSServer() statt?

(Wenn ich versuche, mit NewTLSServer() bekomme ich "http: TLS-handshake-Fehler, die von 127.0.0.1:45678: tls: oversized-Datensatz empfangen mit Länge 20037")

  • Tun Sie wirklich brauchen, zu verspotten, eine TLS-Anfrage? net/http hat umfangreiche tests, also Tests gegen einen lokalen HTTPS-gehosteten test-Implementierung ist eher überflüssig. Tests auf HTTP-direkt ist semantisch äquivalent.
  • Nein. In der Tat bin ich Spott gegen HTTP jetzt. Ich gerade nicht, wie die Problemumgehung ich verwenden, um zu erzwingen, HTTP. Etwas wird automatisch versuchen, die TLS verwenden, da die Anfrage-URL mit https beginnt. Ich würde lieben, um dieses Verhalten zu deaktivieren, nur für meine tests.
  • Okay, in diesem Fall können Sie erstellen, die eine Implementierung einer http.RoundTripper, die tut, was Sie wollen (wie behandelt https:// als ob es eine http-url) -- Sie können sogar eine benutzerdefinierte RoundTripper zu laufen, nur ein mock http.Handler direkt, ohne Umweg über httptest.Server. Alles, was Sie zu tun haben, dann ist http.DefaultClient.Transport = CustomRoundTripper.
  • Alternativ können Sie golang.org/pkg/net/http/httptest/#NewTLSServer
  • Die benutzerdefinierte http.RoundTripper funktioniert wie ein Charme. Sie sollten konvertieren Sie Ihren Kommentar zu einer Antwort, damit ich das annehmen kann.
  • Waren Sie jemals in der Lage, herauszufinden, warum Sie immer waren übergroße Datensätze zurück, die mit NewTLSServer?

InformationsquelleAutor zmb | 2015-01-10
Schreibe einen Kommentar