Placing them into separate files slims down the main connect file and makes it more obvious where things need to be handled for future integrations.
96 lines
2.8 KiB
Go
96 lines
2.8 KiB
Go
package connect
|
|
|
|
import (
|
|
"fmt"
|
|
"strings"
|
|
|
|
"github.com/hashicorp/boundary/internal/cmd/base"
|
|
"github.com/posener/complete"
|
|
)
|
|
|
|
const (
|
|
httpSynopsis = "Authorize a session against a target and invoke an HTTP client to connect"
|
|
)
|
|
|
|
func httpOptions(c *Command, set *base.FlagSets) {
|
|
f := set.NewFlagSet("HTTP Options")
|
|
|
|
f.StringVar(&base.StringVar{
|
|
Name: "style",
|
|
Target: &c.flagHttpStyle,
|
|
EnvVar: "BOUNDARY_CONNECT_HTTP_STYLE",
|
|
Completion: complete.PredictSet("curl"),
|
|
Default: "curl",
|
|
Usage: `Specifies how the CLI will attempt to invoke an HTTP client. This will also set a suitable default for -exec if a value was not specified. Currently-understood values are "curl".`,
|
|
})
|
|
|
|
f.StringVar(&base.StringVar{
|
|
Name: "host",
|
|
Target: &c.flagHttpHost,
|
|
EnvVar: "BOUNDARY_CONNECT_HTTP_HOST",
|
|
Completion: complete.PredictNothing,
|
|
Usage: `Specifies the host value to use. The specified hostname will be passed through to the client (if supported) for use in the Host header and TLS SNI value.`,
|
|
})
|
|
|
|
f.StringVar(&base.StringVar{
|
|
Name: "path",
|
|
Target: &c.flagHttpPath,
|
|
EnvVar: "BOUNDARY_CONNECT_HTTP_PATH",
|
|
Completion: complete.PredictNothing,
|
|
Usage: `Specifies a path that will be appended to the generated URL.`,
|
|
})
|
|
|
|
f.StringVar(&base.StringVar{
|
|
Name: "method",
|
|
Target: &c.flagHttpMethod,
|
|
EnvVar: "BOUNDARY_CONNECT_HTTP_METHOD",
|
|
Completion: complete.PredictNothing,
|
|
Usage: `Specifies the method to use. If not set, will use the client's default.`,
|
|
})
|
|
|
|
f.StringVar(&base.StringVar{
|
|
Name: "scheme",
|
|
Target: &c.flagHttpScheme,
|
|
Default: "https",
|
|
EnvVar: "BOUNDARY_CONNECT_HTTP_SCHEME",
|
|
Completion: complete.PredictNothing,
|
|
Usage: `Specifies the scheme to use.`,
|
|
})
|
|
}
|
|
|
|
type httpFlags struct {
|
|
flagHttpStyle string
|
|
flagHttpHost string
|
|
flagHttpPath string
|
|
flagHttpMethod string
|
|
flagHttpScheme string
|
|
}
|
|
|
|
func (h *httpFlags) defaultExec() string {
|
|
return strings.ToLower(h.flagHttpStyle)
|
|
}
|
|
|
|
func (h *httpFlags) buildArgs(c *Command, port, ip, addr string) []string {
|
|
var args []string
|
|
switch h.flagHttpStyle {
|
|
case "curl":
|
|
if h.flagHttpMethod != "" {
|
|
args = append(args, "-X", h.flagHttpMethod)
|
|
}
|
|
var uri string
|
|
if h.flagHttpHost != "" {
|
|
h.flagHttpHost = strings.TrimSuffix(h.flagHttpHost, "/")
|
|
args = append(args, "-H", fmt.Sprintf("Host: %s", h.flagHttpHost))
|
|
args = append(args, "--resolve", fmt.Sprintf("%s:%s:%s", h.flagHttpHost, port, ip))
|
|
uri = fmt.Sprintf("%s://%s:%s", h.flagHttpScheme, h.flagHttpHost, port)
|
|
} else {
|
|
uri = fmt.Sprintf("%s://%s", h.flagHttpScheme, addr)
|
|
}
|
|
if h.flagHttpPath != "" {
|
|
uri = fmt.Sprintf("%s/%s", uri, strings.TrimPrefix(h.flagHttpPath, "/"))
|
|
}
|
|
args = append(args, uri)
|
|
}
|
|
return args
|
|
}
|