Browse Source

Merge pull request #14811 from devx/refactor-clientRequestAttemptLogin

Cleanup: Factor cmdAttempt out of cli.clientRequestAttemptLogin
David Calavera 10 years ago
parent
commit
70cae97ee2
1 changed files with 33 additions and 30 deletions
  1. 33 30
      api/client/utils.go

+ 33 - 30
api/client/utils.go

@@ -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
 }