// Check the response from a HTTP request for problems func handleResponse(res *http.Response, creds auth.Creds) error { auth.SaveCredentials(creds, res) if res.StatusCode < 400 { return nil } defer func() { io.Copy(ioutil.Discard, res.Body) res.Body.Close() }() cliErr := &ClientError{} err := DecodeResponse(res, cliErr) if err == nil { if len(cliErr.Message) == 0 { err = defaultError(res) } else { err = errutil.Error(cliErr) } } if res.StatusCode == 401 { return errutil.NewAuthError(err) } if res.StatusCode > 499 && res.StatusCode != 501 && res.StatusCode != 509 { return errutil.NewFatalError(err) } return err }
func doNTLMRequest(request *http.Request, retry bool) (*http.Response, error) { handReq, err := cloneRequest(request) if err != nil { return nil, err } res, err := NewHttpClient(config.Config, handReq.Host).Do(handReq) if err != nil && res == nil { return nil, err } //If the status is 401 then we need to re-authenticate, otherwise it was successful if res.StatusCode == 401 { creds, err := auth.GetCreds(request) if err != nil { return nil, err } negotiateReq, err := cloneRequest(request) if err != nil { return nil, err } challengeMessage, err := negotiate(negotiateReq, ntlmNegotiateMessage) if err != nil { return nil, err } challengeReq, err := cloneRequest(request) if err != nil { return nil, err } res, err := challenge(challengeReq, challengeMessage, creds) if err != nil { return nil, err } //If the status is 401 then we need to re-authenticate if res.StatusCode == 401 && retry == true { return doNTLMRequest(challengeReq, false) } auth.SaveCredentials(creds, res) return res, nil } return res, nil }
// Check the response from a HTTP request for problems func handleResponse(cfg *config.Configuration, res *http.Response, creds auth.Creds) error { auth.SaveCredentials(cfg, creds, res) if res.StatusCode < 400 { return nil } defer func() { io.Copy(ioutil.Discard, res.Body) res.Body.Close() }() cliErr := &ClientError{} err := DecodeResponse(res, cliErr) if err == nil { if len(cliErr.Message) == 0 { err = defaultError(res) } else { err = errors.Wrap(cliErr, "http") } } if res.StatusCode == 401 { if err == nil { err = errors.New("api: received status 401") } return errors.NewAuthError(err) } if res.StatusCode > 499 && res.StatusCode != 501 && res.StatusCode != 507 && res.StatusCode != 509 { if err == nil { err = errors.Errorf("api: received status %d", res.StatusCode) } return errors.NewFatalError(err) } return err }