From 102a1bfedc37b0fd73dde6458ac7bb6c2dff6a76 Mon Sep 17 00:00:00 2001 From: Tea Date: Sun, 15 Oct 2023 06:27:03 +0800 Subject: [PATCH] Fix digest auth http: ContentLength=xxx with Body length 0 (#730) --- digest.go | 11 +++++++++++ request_test.go | 19 +++++++++++++++++++ 2 files changed, 30 insertions(+) diff --git a/digest.go b/digest.go index ba099ad2..a1088007 100644 --- a/digest.go +++ b/digest.go @@ -55,6 +55,17 @@ func (dt *digestTransport) RoundTrip(req *http.Request) (*http.Response, error) req2.Header[k] = s } + // Fix http: ContentLength=xxx with Body length 0 + if req2.Body == nil { + req2.ContentLength = 0 + } else if req2.GetBody != nil { + var err error + req2.Body, err = req2.GetBody() + if err != nil { + return nil, err + } + } + // Make a request to get the 401 that contains the challenge. resp, err := dt.transport.RoundTrip(req) if err != nil || resp.StatusCode != http.StatusUnauthorized { diff --git a/request_test.go b/request_test.go index fd1222c5..7312128f 100644 --- a/request_test.go +++ b/request_test.go @@ -722,6 +722,25 @@ func TestRequestDigestAuthFail(t *testing.T) { logResponse(t, resp) } +func TestRequestDigestAuthWithBody(t *testing.T) { + conf := defaultDigestServerConf() + ts := createDigestServer(t, nil) + defer ts.Close() + + resp, err := dclr(). + SetDigestAuth(conf.username, conf.password). + SetResult(&AuthSuccess{}). + SetHeader(hdrContentTypeKey, "application/json"). + SetBody(map[string]interface{}{"zip_code": "00000", "city": "Los Angeles"}). + Post(ts.URL + conf.uri) + + assertError(t, err) + assertEqual(t, http.StatusOK, resp.StatusCode()) + + t.Logf("Result Success: %q", resp.Result().(*AuthSuccess)) + logResponse(t, resp) +} + func TestFormData(t *testing.T) { ts := createFormPostServer(t) defer ts.Close()