iris/x/client/handler_transport.go
2022-06-17 22:03:18 +03:00

58 lines
1.1 KiB
Go

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
}