open-vault/api/request.go

98 lines
2.1 KiB
Go
Raw Normal View History

2015-03-09 18:38:50 +00:00
package api
import (
"bytes"
"encoding/json"
"io"
"net/http"
2015-03-09 18:38:50 +00:00
"net/url"
)
// Request is a raw request configuration structure used to initiate
// API requests to the Vault server.
type Request struct {
2017-10-23 20:52:56 +00:00
Method string
URL *url.URL
Params url.Values
Headers http.Header
ClientToken string
MFAHeaderVals []string
WrapTTL string
Obj interface{}
Body io.Reader
BodySize int64
// Whether to request overriding soft-mandatory Sentinel policies (RGPs and
// EGPs). If set, the override flag will take effect for all policies
// evaluated during the request.
PolicyOverride bool
2015-03-09 18:38:50 +00:00
}
// SetJSONBody is used to set a request body that is a JSON-encoded value.
func (r *Request) SetJSONBody(val interface{}) error {
buf := bytes.NewBuffer(nil)
enc := json.NewEncoder(buf)
if err := enc.Encode(val); err != nil {
return err
}
2015-04-20 17:44:51 +00:00
r.Obj = val
2015-03-09 18:38:50 +00:00
r.Body = buf
r.BodySize = int64(buf.Len())
return nil
}
2015-04-20 17:44:51 +00:00
// ResetJSONBody is used to reset the body for a redirect
func (r *Request) ResetJSONBody() error {
if r.Body == nil {
return nil
}
return r.SetJSONBody(r.Obj)
}
// ToHTTP turns this request into a valid *http.Request for use with the
// net/http package.
func (r *Request) ToHTTP() (*http.Request, error) {
2015-03-09 18:38:50 +00:00
// Encode the query parameters
r.URL.RawQuery = r.Params.Encode()
// Create the HTTP request
req, err := http.NewRequest(r.Method, r.URL.RequestURI(), r.Body)
2015-03-09 18:38:50 +00:00
if err != nil {
return nil, err
}
req.URL.User = r.URL.User
2015-03-09 18:38:50 +00:00
req.URL.Scheme = r.URL.Scheme
req.URL.Host = r.URL.Host
req.Host = r.URL.Host
if r.Headers != nil {
for header, vals := range r.Headers {
for _, val := range vals {
req.Header.Add(header, val)
}
}
}
2015-08-22 00:36:19 +00:00
if len(r.ClientToken) != 0 {
req.Header.Set("X-Vault-Token", r.ClientToken)
}
2016-05-02 05:58:58 +00:00
if len(r.WrapTTL) != 0 {
req.Header.Set("X-Vault-Wrap-TTL", r.WrapTTL)
}
2017-10-23 20:52:56 +00:00
if len(r.MFAHeaderVals) != 0 {
for _, mfaHeaderVal := range r.MFAHeaderVals {
req.Header.Add("X-Vault-MFA", mfaHeaderVal)
}
}
if r.PolicyOverride {
req.Header.Set("X-Vault-Policy-Override", "true")
}
2015-03-09 18:38:50 +00:00
return req, nil
}