1package api
2
3import (
4	"fmt"
5	"strings"
6
7	retryablehttp "github.com/hashicorp/go-retryablehttp"
8)
9
10const (
11	ErrOutputStringRequest = "output a string, please"
12)
13
14var (
15	LastOutputStringError *OutputStringError
16)
17
18type OutputStringError struct {
19	*retryablehttp.Request
20	parsingError     error
21	parsedCurlString string
22}
23
24func (d *OutputStringError) Error() string {
25	if d.parsedCurlString == "" {
26		d.parseRequest()
27		if d.parsingError != nil {
28			return d.parsingError.Error()
29		}
30	}
31
32	return ErrOutputStringRequest
33}
34
35func (d *OutputStringError) parseRequest() {
36	body, err := d.Request.BodyBytes()
37	if err != nil {
38		d.parsingError = err
39		return
40	}
41
42	// Build cURL string
43	d.parsedCurlString = "curl "
44	if d.Request.Method != "GET" {
45		d.parsedCurlString = fmt.Sprintf("%s-X %s ", d.parsedCurlString, d.Request.Method)
46	}
47	for k, v := range d.Request.Header {
48		for _, h := range v {
49			if strings.ToLower(k) == "x-vault-token" {
50				h = `$(vault print token)`
51			}
52			d.parsedCurlString = fmt.Sprintf("%s-H \"%s: %s\" ", d.parsedCurlString, k, h)
53		}
54	}
55
56	if len(body) > 0 {
57		// We need to escape single quotes since that's what we're using to
58		// quote the body
59		escapedBody := strings.Replace(string(body), "'", "'\"'\"'", -1)
60		d.parsedCurlString = fmt.Sprintf("%s-d '%s' ", d.parsedCurlString, escapedBody)
61	}
62
63	d.parsedCurlString = fmt.Sprintf("%s%s", d.parsedCurlString, d.Request.URL.String())
64}
65
66func (d *OutputStringError) CurlString() string {
67	if d.parsedCurlString == "" {
68		d.parseRequest()
69	}
70	return d.parsedCurlString
71}
72