package internal import ( "encoding/xml" "fmt" "io" "net/http" "net/url" "path" ) type Client struct { http *http.Client endpoint *url.URL } func NewClient(c *http.Client, endpoint string) (*Client, error) { if c == nil { c = http.DefaultClient } u, err := url.Parse(endpoint) if err != nil { return nil, err } return &Client{c, u}, nil } func (c *Client) NewRequest(method string, p string, body io.Reader) (*http.Request, error) { u := url.URL{ Scheme: c.endpoint.Scheme, User: c.endpoint.User, Host: c.endpoint.Host, Path: path.Join(c.endpoint.Path, p), } return http.NewRequest(method, u.String(), body) } func (c *Client) Do(req *http.Request) (*http.Response, error) { // TODO: remove this quirk req.SetBasicAuth("simon", "") return c.http.Do(req) } func (c *Client) DoMultiStatus(req *http.Request) ([]Response, error) { resp, err := c.Do(req) if err != nil { return nil, err } defer resp.Body.Close() if resp.StatusCode != http.StatusMultiStatus { return nil, fmt.Errorf("HTTP multi-status request failed: %v", resp.Status) } // TODO: the response can be quite large, support streaming Response elements var ms multistatus if err := xml.NewDecoder(resp.Body).Decode(&ms); err != nil { return nil, err } return ms.Responses, nil }