| package client // import "github.com/docker/docker/client" | |
| import ( | |
| "bytes" | |
| "encoding/json" | |
| "io" | |
| "net/http" | |
| "github.com/docker/docker/api/types" | |
| ) | |
| // transportFunc allows us to inject a mock transport for testing. We define it | |
| // here so we can detect the tlsconfig and return nil for only this type. | |
| type transportFunc func(*http.Request) (*http.Response, error) | |
| func (tf transportFunc) RoundTrip(req *http.Request) (*http.Response, error) { | |
| return tf(req) | |
| } | |
| func transportEnsureBody(f transportFunc) transportFunc { | |
| return func(req *http.Request) (*http.Response, error) { | |
| resp, err := f(req) | |
| if resp != nil && resp.Body == nil { | |
| resp.Body = http.NoBody | |
| } | |
| return resp, err | |
| } | |
| } | |
| func newMockClient(doer func(*http.Request) (*http.Response, error)) *http.Client { | |
| return &http.Client{ | |
| // Some tests return a response with a nil body, this is incorrect semantically and causes a panic with wrapper transports (such as otelhttp's) | |
| // Wrap the doer to ensure a body is always present even if it is empty. | |
| Transport: transportEnsureBody(transportFunc(doer)), | |
| } | |
| } | |
| func errorMock(statusCode int, message string) func(req *http.Request) (*http.Response, error) { | |
| return func(req *http.Request) (*http.Response, error) { | |
| header := http.Header{} | |
| header.Set("Content-Type", "application/json") | |
| body, err := json.Marshal(&types.ErrorResponse{ | |
| Message: message, | |
| }) | |
| if err != nil { | |
| return nil, err | |
| } | |
| return &http.Response{ | |
| StatusCode: statusCode, | |
| Body: io.NopCloser(bytes.NewReader(body)), | |
| Header: header, | |
| }, nil | |
| } | |
| } | |
| func plainTextErrorMock(statusCode int, message string) func(req *http.Request) (*http.Response, error) { | |
| return func(req *http.Request) (*http.Response, error) { | |
| return &http.Response{ | |
| StatusCode: statusCode, | |
| Body: io.NopCloser(bytes.NewReader([]byte(message))), | |
| }, nil | |
| } | |
| } |