|
@@ -134,17 +134,18 @@ func (cli *Client) sendRequest(ctx context.Context, method, path string, query u
|
|
|
return resp, errdefs.FromStatusCode(err, resp.statusCode)
|
|
|
}
|
|
|
|
|
|
+// FIXME(thaJeztah): Should this actually return a serverResp when a connection error occurred?
|
|
|
func (cli *Client) doRequest(req *http.Request) (serverResponse, error) {
|
|
|
serverResp := serverResponse{statusCode: -1, reqURL: req.URL}
|
|
|
|
|
|
resp, err := cli.client.Do(req)
|
|
|
if err != nil {
|
|
|
if cli.scheme != "https" && strings.Contains(err.Error(), "malformed HTTP response") {
|
|
|
- return serverResp, fmt.Errorf("%v.\n* Are you trying to connect to a TLS-enabled daemon without TLS?", err)
|
|
|
+ return serverResp, errConnectionFailed{fmt.Errorf("%v.\n* Are you trying to connect to a TLS-enabled daemon without TLS?", err)}
|
|
|
}
|
|
|
|
|
|
if cli.scheme == "https" && strings.Contains(err.Error(), "bad certificate") {
|
|
|
- return serverResp, errors.Wrap(err, "the server probably has client authentication (--tlsverify) enabled; check your TLS client certification settings")
|
|
|
+ return serverResp, errConnectionFailed{errors.Wrap(err, "the server probably has client authentication (--tlsverify) enabled; check your TLS client certification settings")}
|
|
|
}
|
|
|
|
|
|
// Don't decorate context sentinel errors; users may be comparing to
|
|
@@ -156,12 +157,13 @@ func (cli *Client) doRequest(req *http.Request) (serverResponse, error) {
|
|
|
if uErr, ok := err.(*url.Error); ok {
|
|
|
if nErr, ok := uErr.Err.(*net.OpError); ok {
|
|
|
if os.IsPermission(nErr.Err) {
|
|
|
- return serverResp, errors.Wrapf(err, "permission denied while trying to connect to the Docker daemon socket at %v", cli.host)
|
|
|
+ return serverResp, errConnectionFailed{errors.Wrapf(err, "permission denied while trying to connect to the Docker daemon socket at %v", cli.host)}
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
if nErr, ok := err.(net.Error); ok {
|
|
|
+ // FIXME(thaJeztah): any net.Error should be considered a connection error (but we should include the original error)?
|
|
|
if nErr.Timeout() {
|
|
|
return serverResp, ErrorConnectionFailed(cli.host)
|
|
|
}
|
|
@@ -190,7 +192,7 @@ func (cli *Client) doRequest(req *http.Request) (serverResponse, error) {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- return serverResp, errors.Wrap(err, "error during connect")
|
|
|
+ return serverResp, errConnectionFailed{errors.Wrap(err, "error during connect")}
|
|
|
}
|
|
|
|
|
|
if resp != nil {
|