github.com/pf-qiu/concourse/v6@v6.7.3-0.20201207032516-1f455d73275f/fly/commands/curl.go (about)

     1  package commands
     2  
     3  import (
     4  	"fmt"
     5  	"net/url"
     6  	"os"
     7  	"os/exec"
     8  	"strings"
     9  
    10  	"github.com/pf-qiu/concourse/v6/fly/rc"
    11  )
    12  
    13  type CurlCommand struct {
    14  	Args struct {
    15  		Path string   `positional-arg-name:"PATH" required:"true" description:"Pass query params as normal curl path like path?key=value"`
    16  		Rest []string `positional-arg-name:"curl flags" description:"To pass flags to curl, pass a -- argument, so that fly can distinguish them from its own flags"`
    17  	} `positional-args:"yes"`
    18  	PrintAndExit bool `long:"print-and-exit" description:"Print curl command and exit"`
    19  }
    20  
    21  func (command *CurlCommand) Execute([]string) error {
    22  	target, err := rc.LoadTarget(Fly.Target, Fly.Verbose)
    23  	if err != nil {
    24  		return err
    25  	}
    26  
    27  	err = target.Validate()
    28  	if err != nil {
    29  		return err
    30  	}
    31  
    32  	fullUrl, err := command.makeFullUrl(target.URL(), command.Args.Path)
    33  	if err != nil {
    34  		return err
    35  	}
    36  
    37  	argsList := command.makeArgsList(target.Token(), fullUrl, command.Args.Rest)
    38  
    39  	cmd := exec.Command("curl", argsList...)
    40  	cmd.Stdout = os.Stdout
    41  	cmd.Stderr = os.Stderr
    42  	cmd.Stdin = os.Stdin
    43  
    44  	if command.PrintAndExit {
    45  		fmt.Println(printableCommand(cmd.Args))
    46  		return nil
    47  	}
    48  
    49  	if err := cmd.Run(); err != nil {
    50  		return err
    51  	}
    52  
    53  	return nil
    54  }
    55  
    56  func (command *CurlCommand) makeFullUrl(host, path string) (string, error) {
    57  	u, err := url.Parse(host)
    58  	if err != nil {
    59  		return "", err
    60  	}
    61  	p, err := url.Parse(path)
    62  	if err != nil {
    63  		return "", err
    64  	}
    65  	u.Path = p.Path
    66  	u.RawQuery = p.RawQuery
    67  	return u.String(), nil
    68  }
    69  
    70  func (command *CurlCommand) makeArgsList(token *rc.TargetToken, url string, options []string) (args []string) {
    71  	authTokenHeader := []string{"-H", fmt.Sprintf("Authorization: %s %s", token.Type, token.Value)}
    72  	args = append(args, authTokenHeader...)
    73  	args = append(args, options...)
    74  	args = append(args, url)
    75  	return
    76  }
    77  
    78  func printableCommand(args []string) string {
    79  	for i, arg := range args {
    80  		if strings.Contains(arg, " ") {
    81  			args[i] = fmt.Sprintf(`"%s"`, arg)
    82  		}
    83  	}
    84  
    85  	return strings.Join(args, " ")
    86  }