]> Cypherpunks repositories - gostls13.git/commitdiff
net/http: set Content-Length:0 for empty PATCH requests as with POST, PATCH
authorSegflow <asselmeher@gmail.com>
Mon, 24 Aug 2020 13:42:45 +0000 (13:42 +0000)
committerEmmanuel Odeke <emm.odeke@gmail.com>
Mon, 24 Aug 2020 16:53:02 +0000 (16:53 +0000)
Sets Content-Length:0 for nil bodies in PATCH requests, as we already do for  POST and PUT requests.

RFC 2616 mentions that unless a method’s Content-Length is forbidden it can send one.
In the wild, we’ve found that Microsoft Azure’s DataLake Gen2 storage API https://docs.microsoft.com/en-us/rest/api/storageservices/datalakestoragegen2/path/update deliberately rejects PATCH requests without a Content-Length, yet there is no workaround for setting that header when trying to flush the content of a file which was uploaded in a previous request.

Fixes #40978

Change-Id: Ib0a623b907d827a1c5ee431dca3c41024fa291c5
GitHub-Last-Rev: 12a3903f2bc22bcc4f5f8e2abcc3922b612b8871
GitHub-Pull-Request: golang/go#40991
Reviewed-on: https://go-review.googlesource.com/c/go/+/250039
Run-TryBot: Emmanuel Odeke <emm.odeke@gmail.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Emmanuel Odeke <emm.odeke@gmail.com>
src/net/http/requestwrite_test.go
src/net/http/transfer.go

index fc6257cb3380b3dc43327ac80f6880a70b8e10e0..9ac6701cfdd5236810b35f096985e80fd6a9540a 100644 (file)
@@ -588,6 +588,26 @@ var reqWriteTests = []reqWriteTest{
                },
                WantError: errors.New("net/http: can't write control character in Request.URL"),
        },
+
+       26: { // Request with nil body and PATCH method. Issue #40978
+               Req: Request{
+                       Method:        "PATCH",
+                       URL:           mustParseURL("/"),
+                       Host:          "example.com",
+                       ProtoMajor:    1,
+                       ProtoMinor:    1,
+                       ContentLength: 0, // as if unset by user
+               },
+               Body: nil,
+               WantWrite: "PATCH / HTTP/1.1\r\n" +
+                       "Host: example.com\r\n" +
+                       "User-Agent: Go-http-client/1.1\r\n" +
+                       "Content-Length: 0\r\n\r\n",
+               WantProxy: "PATCH / HTTP/1.1\r\n" +
+                       "Host: example.com\r\n" +
+                       "User-Agent: Go-http-client/1.1\r\n" +
+                       "Content-Length: 0\r\n\r\n",
+       },
 }
 
 func TestRequestWrite(t *testing.T) {
index 50d434b1fb096079a1594db94a05d9710b43270a..ab009177bc7bb3f0f735af365887f5b0eb1cfd62 100644 (file)
@@ -258,7 +258,7 @@ func (t *transferWriter) shouldSendContentLength() bool {
                return false
        }
        // Many servers expect a Content-Length for these methods
-       if t.Method == "POST" || t.Method == "PUT" {
+       if t.Method == "POST" || t.Method == "PUT" || t.Method == "PATCH" {
                return true
        }
        if t.ContentLength == 0 && isIdentity(t.TransferEncoding) {