2014-07-04 17 views
7

Ich möchte 301s vs 302s protokollieren, aber eine Möglichkeit zum Lesen der Antwort Statuscode in Client.Do, Get, DoFollowingRedirects, CheckRedirect nicht sehen. Muss ich die Umleitung selbst implementieren, um dies zu erreichen?Wie bekomme ich die HTTP-Redirect-Status-Codes in Golang

+0

Haben Sie Response.StatusCode versucht? – rvignacio

+1

@ rvignacio Golang http.Client führt die Weiterleitungen automatisch, so dass alles, was mir geben würde, ist der endgültige Statuscode 200. –

Antwort

8

Der Typ http.Client ermöglicht es Ihnen, einen benutzerdefinierten Transport anzugeben, mit dem Sie das tun können, wonach Sie suchen. So etwas wie die folgenden tun sollten:

type LogRedirects struct { 
    Transport http.RoundTripper 
} 

func (l LogRedirects) RoundTrip(req *http.Request) (resp *http.Response, err error) { 
    t := l.Transport 
    if t == nil { 
     t = http.DefaultTransport 
    } 
    resp, err = t.RoundTrip(req) 
    if err != nil { 
     return 
    } 
    switch resp.StatusCode { 
    case http.StatusMovedPermanently, http.StatusFound, http.StatusSeeOther, http.StatusTemporaryRedirect: 
     log.Println("Request for", req.URL, "redirected with status", resp.StatusCode) 
    } 
    return 
} 

(Sie diese ein wenig vereinfachen könnte, wenn man nur auf die Standardtransport unterstützen Chaining).

Anschließend können Sie einen Client mit diesem Transport erstellen und alle Umleitungen protokolliert werden sollen:

client := &http.Client{Transport: LogRedirects{}} 

Hier ist ein vollständiges Beispiel ist, dass Sie mit experimentieren können: http://play.golang.org/p/8uf8Cn31HC

+0

Für mehr informative Log-Nachrichten, möchten Sie vielleicht auch ['http.StatusText()'] (https://golang.org/pkg/net/http/#StatusText), um den benutzerfreundlichen Namen des Statuscodes einzufügen. –

Verwandte Themen