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