|
@@ -125,48 +125,51 @@ func (cli *DockerCli) clientRequest(method, path string, in io.Reader, headers m
|
|
|
return serverResp, nil
|
|
|
}
|
|
|
|
|
|
-func (cli *DockerCli) clientRequestAttemptLogin(method, path string, in io.Reader, out io.Writer, index *registry.IndexInfo, cmdName string) (io.ReadCloser, int, error) {
|
|
|
- cmdAttempt := func(authConfig cliconfig.AuthConfig) (io.ReadCloser, int, error) {
|
|
|
- buf, err := json.Marshal(authConfig)
|
|
|
- if err != nil {
|
|
|
- return nil, -1, err
|
|
|
- }
|
|
|
- registryAuthHeader := []string{
|
|
|
- base64.URLEncoding.EncodeToString(buf),
|
|
|
- }
|
|
|
+// cmdAttempt builds the corresponding registry Auth Header from the given
|
|
|
+// authConfig. It returns the servers body, status, error response
|
|
|
+func (cli *DockerCli) cmdAttempt(authConfig cliconfig.AuthConfig, method, path string, in io.Reader, out io.Writer) (io.ReadCloser, int, error) {
|
|
|
+ buf, err := json.Marshal(authConfig)
|
|
|
+ if err != nil {
|
|
|
+ return nil, -1, err
|
|
|
+ }
|
|
|
+ registryAuthHeader := []string{
|
|
|
+ base64.URLEncoding.EncodeToString(buf),
|
|
|
+ }
|
|
|
|
|
|
- // begin the request
|
|
|
- serverResp, err := cli.clientRequest(method, path, in, map[string][]string{
|
|
|
- "X-Registry-Auth": registryAuthHeader,
|
|
|
- })
|
|
|
- if err == nil && out != nil {
|
|
|
- // If we are streaming output, complete the stream since
|
|
|
- // errors may not appear until later.
|
|
|
- err = cli.streamBody(serverResp.body, serverResp.header.Get("Content-Type"), true, out, nil)
|
|
|
- }
|
|
|
- if err != nil {
|
|
|
- // Since errors in a stream appear after status 200 has been written,
|
|
|
- // we may need to change the status code.
|
|
|
- if strings.Contains(err.Error(), "Authentication is required") ||
|
|
|
- strings.Contains(err.Error(), "Status 401") ||
|
|
|
- strings.Contains(err.Error(), "401 Unauthorized") ||
|
|
|
- strings.Contains(err.Error(), "status code 401") {
|
|
|
- serverResp.statusCode = http.StatusUnauthorized
|
|
|
- }
|
|
|
+ // begin the request
|
|
|
+ serverResp, err := cli.clientRequest(method, path, in, map[string][]string{
|
|
|
+ "X-Registry-Auth": registryAuthHeader,
|
|
|
+ })
|
|
|
+ if err == nil && out != nil {
|
|
|
+ // If we are streaming output, complete the stream since
|
|
|
+ // errors may not appear until later.
|
|
|
+ err = cli.streamBody(serverResp.body, serverResp.header.Get("Content-Type"), true, out, nil)
|
|
|
+ }
|
|
|
+ if err != nil {
|
|
|
+ // Since errors in a stream appear after status 200 has been written,
|
|
|
+ // we may need to change the status code.
|
|
|
+ if strings.Contains(err.Error(), "Authentication is required") ||
|
|
|
+ strings.Contains(err.Error(), "Status 401") ||
|
|
|
+ strings.Contains(err.Error(), "401 Unauthorized") ||
|
|
|
+ strings.Contains(err.Error(), "status code 401") {
|
|
|
+ serverResp.statusCode = http.StatusUnauthorized
|
|
|
}
|
|
|
- return serverResp.body, serverResp.statusCode, err
|
|
|
}
|
|
|
+ return serverResp.body, serverResp.statusCode, err
|
|
|
+}
|
|
|
+
|
|
|
+func (cli *DockerCli) clientRequestAttemptLogin(method, path string, in io.Reader, out io.Writer, index *registry.IndexInfo, cmdName string) (io.ReadCloser, int, error) {
|
|
|
|
|
|
// Resolve the Auth config relevant for this server
|
|
|
authConfig := registry.ResolveAuthConfig(cli.configFile, index)
|
|
|
- body, statusCode, err := cmdAttempt(authConfig)
|
|
|
+ body, statusCode, err := cli.cmdAttempt(authConfig, method, path, in, out)
|
|
|
if statusCode == http.StatusUnauthorized {
|
|
|
fmt.Fprintf(cli.out, "\nPlease login prior to %s:\n", cmdName)
|
|
|
if err = cli.CmdLogin(index.GetAuthConfigKey()); err != nil {
|
|
|
return nil, -1, err
|
|
|
}
|
|
|
authConfig = registry.ResolveAuthConfig(cli.configFile, index)
|
|
|
- return cmdAttempt(authConfig)
|
|
|
+ return cli.cmdAttempt(authConfig, method, path, in, out)
|
|
|
}
|
|
|
return body, statusCode, err
|
|
|
}
|