99 lines
2.5 KiB
Go
99 lines
2.5 KiB
Go
// Copyright (c) HashiCorp, Inc.
|
|
// SPDX-License-Identifier: MPL-2.0
|
|
|
|
package api
|
|
|
|
import (
|
|
"fmt"
|
|
"net/http"
|
|
"strings"
|
|
|
|
retryablehttp "github.com/hashicorp/go-retryablehttp"
|
|
)
|
|
|
|
const (
|
|
ErrOutputStringRequest = "output a string, please"
|
|
)
|
|
|
|
var LastOutputStringError *OutputStringError
|
|
|
|
type OutputStringError struct {
|
|
*retryablehttp.Request
|
|
TLSSkipVerify bool
|
|
ClientCACert, ClientCAPath string
|
|
ClientCert, ClientKey string
|
|
finalCurlString string
|
|
}
|
|
|
|
func (d *OutputStringError) Error() string {
|
|
if d.finalCurlString == "" {
|
|
cs, err := d.buildCurlString()
|
|
if err != nil {
|
|
return err.Error()
|
|
}
|
|
d.finalCurlString = cs
|
|
}
|
|
|
|
return ErrOutputStringRequest
|
|
}
|
|
|
|
func (d *OutputStringError) CurlString() (string, error) {
|
|
if d.finalCurlString == "" {
|
|
cs, err := d.buildCurlString()
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
d.finalCurlString = cs
|
|
}
|
|
return d.finalCurlString, nil
|
|
}
|
|
|
|
func (d *OutputStringError) buildCurlString() (string, error) {
|
|
body, err := d.Request.BodyBytes()
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
|
|
// Build cURL string
|
|
finalCurlString := "curl "
|
|
if d.TLSSkipVerify {
|
|
finalCurlString += "--insecure "
|
|
}
|
|
if d.Request.Method != http.MethodGet {
|
|
finalCurlString = fmt.Sprintf("%s-X %s ", finalCurlString, d.Request.Method)
|
|
}
|
|
if d.ClientCACert != "" {
|
|
clientCACert := strings.ReplaceAll(d.ClientCACert, "'", "'\"'\"'")
|
|
finalCurlString = fmt.Sprintf("%s--cacert '%s' ", finalCurlString, clientCACert)
|
|
}
|
|
if d.ClientCAPath != "" {
|
|
clientCAPath := strings.ReplaceAll(d.ClientCAPath, "'", "'\"'\"'")
|
|
finalCurlString = fmt.Sprintf("%s--capath '%s' ", finalCurlString, clientCAPath)
|
|
}
|
|
if d.ClientCert != "" {
|
|
clientCert := strings.ReplaceAll(d.ClientCert, "'", "'\"'\"'")
|
|
finalCurlString = fmt.Sprintf("%s--cert '%s' ", finalCurlString, clientCert)
|
|
}
|
|
if d.ClientKey != "" {
|
|
clientKey := strings.ReplaceAll(d.ClientKey, "'", "'\"'\"'")
|
|
finalCurlString = fmt.Sprintf("%s--key '%s' ", finalCurlString, clientKey)
|
|
}
|
|
for k, v := range d.Request.Header {
|
|
for _, h := range v {
|
|
if strings.ToLower(k) == "x-vault-token" {
|
|
h = `$(vault print token)`
|
|
}
|
|
finalCurlString = fmt.Sprintf("%s-H \"%s: %s\" ", finalCurlString, k, h)
|
|
}
|
|
}
|
|
|
|
if len(body) > 0 {
|
|
// We need to escape single quotes since that's what we're using to
|
|
// quote the body
|
|
escapedBody := strings.ReplaceAll(string(body), "'", "'\"'\"'")
|
|
finalCurlString = fmt.Sprintf("%s-d '%s' ", finalCurlString, escapedBody)
|
|
}
|
|
|
|
return fmt.Sprintf("%s%s", finalCurlString, d.Request.URL.String()), nil
|
|
}
|