// apiPost wraps a POST request with a status code check, such that if the POST // does not return 2xx, the error will be read and returned. The response body // is not closed. func apiPost(call, vals string) (*http.Response, error) { if host, port, _ := net.SplitHostPort(addr); host == "" { addr = net.JoinHostPort("localhost", port) } resp, err := api.HttpPOST("http://"+addr+call, vals) if err != nil { return nil, errors.New("no response from daemon") } // check error code if resp.StatusCode == http.StatusUnauthorized { resp.Body.Close() // Prompt for password and retry request with authentication. password, err := speakeasy.Ask("API password: "******"http://"+addr+call, vals, password) if err != nil { return nil, errors.New("no response from daemon - authentication failed") } } if resp.StatusCode == http.StatusNotFound { resp.Body.Close() return nil, errors.New("API call not recognized: " + call) } if non2xx(resp.StatusCode) { err := decodeError(resp) resp.Body.Close() return nil, err } return resp, nil }
// apiPost wraps a POST request with a status code check, such that if the POST // does not return 200, the error will be read and returned. The response body // is not closed. func apiPost(call, vals string) (*http.Response, error) { if host, port, _ := net.SplitHostPort(addr); host == "" { addr = net.JoinHostPort("localhost", port) } resp, err := api.HttpPOST("http://"+addr+call, vals) if err != nil { return nil, errors.New("no response from daemon") } // check error code if resp.StatusCode == http.StatusNotFound { resp.Body.Close() err = errors.New("API call not recognized: " + call) } else if resp.StatusCode != http.StatusOK { errResp, _ := ioutil.ReadAll(resp.Body) resp.Body.Close() err = errors.New(strings.TrimSpace(string(errResp))) } return resp, err }