From 01d27c5e5ad51e5936e4ad1035e8c014230e1f15 Mon Sep 17 00:00:00 2001 From: Shwetha Gururaj Date: Tue, 25 Jun 2024 10:27:08 -0400 Subject: [PATCH] Remove Content-Type header while downloading droplets [v8] (#2975) Remove Content-Type header for download droplet --- api/cloudcontroller/ccv3/request.go | 10 +++++++- api/cloudcontroller/ccv3/requester_test.go | 28 ++++++++++++++++++++++ 2 files changed, 37 insertions(+), 1 deletion(-) diff --git a/api/cloudcontroller/ccv3/request.go b/api/cloudcontroller/ccv3/request.go index dc799fc59e..65b988ac78 100644 --- a/api/cloudcontroller/ccv3/request.go +++ b/api/cloudcontroller/ccv3/request.go @@ -3,6 +3,7 @@ package ccv3 import ( "io" "net/http" + "strings" "code.cloudfoundry.org/cli/api/cloudcontroller" "code.cloudfoundry.org/cli/api/cloudcontroller/ccv3/internal" @@ -57,6 +58,7 @@ func (requester *RealRequester) newHTTPRequest(passedRequest requestOptions) (*c } request.Header = http.Header{} + if passedRequest.Header != nil { request.Header = passedRequest.Header } @@ -69,9 +71,15 @@ func (requester *RealRequester) newHTTPRequest(passedRequest requestOptions) (*c request.Header.Set("Accept", "application/json") } - if request.Header.Get("Content-Type") == "" { + if !isDownloadDroplet(passedRequest.URL, passedRequest.RequestName) && request.Header.Get("Content-Type") == "" { request.Header.Set("Content-Type", "application/json") + } else if isDownloadDroplet(passedRequest.URL, passedRequest.RequestName) && request.Header.Get("Content-Type") != "" { + request.Header.Del("Content-Type") } return cloudcontroller.NewRequest(request, passedRequest.Body), nil } + +func isDownloadDroplet(URL string, requestName string) bool { + return (strings.Contains(URL, "droplet") && strings.Contains(URL, "download")) || (requestName == internal.GetDropletBitsRequest) +} diff --git a/api/cloudcontroller/ccv3/requester_test.go b/api/cloudcontroller/ccv3/requester_test.go index 9eb78324da..6b078ece01 100644 --- a/api/cloudcontroller/ccv3/requester_test.go +++ b/api/cloudcontroller/ccv3/requester_test.go @@ -1069,6 +1069,9 @@ var _ = Describe("shared request helpers", func() { CombineHandlers( VerifyRequest(http.MethodGet, "/v3/apps/some-app-guid/manifest"), VerifyHeaderKV("Accept", "application/x-yaml"), + func(w http.ResponseWriter, req *http.Request) { + Expect(req.Header).To(HaveKey("Content-Type"), "Header Content-Type is not present") + }, RespondWith( http.StatusOK, expectedResponseBody, @@ -1134,6 +1137,31 @@ var _ = Describe("shared request helpers", func() { }) }) }) + + Context("Download a droplet", func() { + BeforeEach(func() { + requestName = internal.GetDropletBitsRequest + uriParams = internal.Params{"droplet_guid": "some-droplet-guid"} + }) + + When("The server returns an unauthorized error", func() { + BeforeEach(func() { + server.AppendHandlers( + CombineHandlers( + VerifyRequest(http.MethodGet, "/v3/droplets/some-droplet-guid/download"), + func(w http.ResponseWriter, req *http.Request) { + Expect(req.Header).NotTo(HaveKey("Content-Type"), "Header Content-Type is present") + }, + RespondWith(http.StatusUnauthorized, "", http.Header{}), + ), + ) + }) + + It("fails", func() { + Expect(executeErr).To(HaveOccurred()) + }) + }) + }) }) Describe("MakeRequestSendRaw", func() {