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 }