package api import ( "net/http" "net/http/cookiejar" "net/url" ) // Config is used to configure the creation of the client. type Config struct { // Address is the address of the Vault server. This should be a complete // URL such as "http://vault.example.com". If you need a custom SSL // cert or want to enable insecure mode, you need to specify a custom // HttpClient. Address string // HttpClient is the HTTP client to use. http.DefaultClient will be // used if not specified. The HTTP client must have the cookie jar set // to be able to store cookies, otherwise authentication (login) will // not work properly. If the jar is nil, a default empty cookie jar // will be set. HttpClient *http.Client } // DefaultConfig returns a default configuration for the client. It is // safe to modify the return value of this function. func DefaultConfig() *Config { config := &Config{ Address: "https://127.0.0.1:8200", HttpClient: http.DefaultClient, } return config } // Client is the client to the Vault API. Create a client with // NewClient. type Client struct { addr *url.URL config Config } // NewClient returns a new client for the given configuration. func NewClient(c Config) (*Client, error) { u, err := url.Parse(c.Address) if err != nil { return nil, err } // Make a copy of the HTTP client so we can configure it without // affecting the original // // If no cookie jar is set on the client, we set a default empty // cookie jar. client := *c.HttpClient if client.Jar == nil { jar, err := cookiejar.New(&cookiejar.Options{}) if err != nil { return nil, err } client.Jar = jar } return &Client{ addr: u, config: c, }, nil } // NewRequest creates a new raw request object to query the Vault server // configured for this client. This is an advanced method and generally // doesn't need to be called externally. func (c *Client) NewRequest(method, path string) *Request { return &Request{ Method: method, URL: &url.URL{ Scheme: c.addr.Scheme, Host: c.addr.Host, Path: path, }, Params: make(map[string][]string), } } // RawRequest performs the raw request given. This request may be against // a Vault server not configured with this client. This is an advanced operation // that generally won't need to be called externally. func (c *Client) RawRequest(r *Request) (*Response, error) { req, err := r.ToHTTP() if err != nil { return nil, err } resp, err := c.config.HttpClient.Do(req) if err != nil { return nil, err } result := &Response{Response: resp} if err := result.Error(); err != nil { return nil, err } return result, nil }