2014-07-04 10 views
7

Vorrei registrare 301s vs 302s ma non riesco a vedere un modo per leggere il codice di stato della risposta in Client.Do, Get, doFollowingRedirects, CheckRedirect. Dovrò implementare il reindirizzamento per raggiungere questo obiettivo?Come ottenere i codici di stato di reindirizzamento http in Golang

+0

Hai provato Response.StatusCode? – rvignacio

+1

@rvignacio Golang http.Client reindirizza automaticamente così tutto ciò che mi darebbe è il codice di stato finale 200. –

risposta

8

Il tipo http.Client consente di specificare un trasporto personalizzato, che dovrebbe consentire di eseguire ciò che si sta cercando. Qualcosa come il seguente dovrebbe fare:

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 
} 

(si potrebbe semplificare questo un po 'se supporti solo concatenamento al trasporto di default).

È possibile quindi creare un client che utilizza questo tipo di trasporto, e le eventuali reindirizzamenti devono essere registrati:

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

Ecco un esempio completo si può sperimentare con: http://play.golang.org/p/8uf8Cn31HC

+0

Per ulteriori messaggi di registro informativo, potresti anche voler usare ['http.StatusText()'] (https://golang.org/pkg/net/http/#StatusText) per includere il nome descrittivo umano del codice di stato. –

Problemi correlati