package client import ( "bytes" "fmt" "io" "net/http" "net/http/httptest" ) // See "Handler" client option. type handlerTransport struct { handler http.Handler } // RoundTrip completes the http.RoundTripper interface. // It can be used to test calls to a server's handler. func (t *handlerTransport) RoundTrip(req *http.Request) (*http.Response, error) { reqCopy := *req if reqCopy.Proto == "" { reqCopy.Proto = fmt.Sprintf("HTTP/%d.%d", reqCopy.ProtoMajor, reqCopy.ProtoMinor) } if reqCopy.Body != nil { if reqCopy.ContentLength == -1 { reqCopy.TransferEncoding = []string{"chunked"} } } else { reqCopy.Body = io.NopCloser(bytes.NewReader(nil)) } if reqCopy.RequestURI == "" { reqCopy.RequestURI = reqCopy.URL.RequestURI() } recorder := httptest.NewRecorder() t.handler.ServeHTTP(recorder, &reqCopy) resp := http.Response{ Request: &reqCopy, StatusCode: recorder.Code, Status: http.StatusText(recorder.Code), Header: recorder.Result().Header, } if recorder.Flushed { resp.TransferEncoding = []string{"chunked"} } if recorder.Body != nil { resp.Body = io.NopCloser(recorder.Body) } return &resp, nil }