From 45b2481aa412cae11151a8e56603e5cf8ed91d5b Mon Sep 17 00:00:00 2001 From: Belinda Liu Date: Fri, 19 Jun 2020 18:20:28 +0000 Subject: [PATCH] Double encode name parameters in requests to CAPI The v3 API requires that the comma character is double encoded when used in a single query parameter. Previously, the CLI would only encode the query request once it was fully formed. This was sufficient for v2, but with the v3 API this would cause issues when using a resource that had commas in its name. This commit now encodes query parameters with the `names` filter before encoding the entire query. This ensures that resource names that may contain commas are properly double encoded. [Github issue #1938](https://github.com/cloudfoundry/cli/issues/1938) [#172891571](https://www.pivotaltracker.com/story/show/172891571) Authored-by: Belinda Liu --- .../ccv3/isolation_segment_test.go | 2 +- api/cloudcontroller/ccv3/query.go | 8 +++ api/cloudcontroller/ccv3/query_test.go | 52 +++++++++++++++++++ 3 files changed, 61 insertions(+), 1 deletion(-) create mode 100644 api/cloudcontroller/ccv3/query_test.go diff --git a/api/cloudcontroller/ccv3/isolation_segment_test.go b/api/cloudcontroller/ccv3/isolation_segment_test.go index 14479e24273..29607a7b036 100644 --- a/api/cloudcontroller/ccv3/isolation_segment_test.go +++ b/api/cloudcontroller/ccv3/isolation_segment_test.go @@ -122,7 +122,7 @@ var _ = Describe("Isolation Segments", func() { JustBeforeEach(func() { queries = []Query{ {Key: OrganizationGUIDFilter, Values: []string{"some-org-guid"}}, - {Key: NameFilter, Values: []string{"iso1,iso2,iso3"}}, + {Key: NameFilter, Values: []string{"iso1", "iso2", "iso3"}}, } segments, warnings, executeErr = client.GetIsolationSegments(queries...) }) diff --git a/api/cloudcontroller/ccv3/query.go b/api/cloudcontroller/ccv3/query.go index 78e00fa8843..aed50ae0f2d 100644 --- a/api/cloudcontroller/ccv3/query.go +++ b/api/cloudcontroller/ccv3/query.go @@ -116,6 +116,14 @@ type Query struct { func FormatQueryParameters(queries []Query) url.Values { params := url.Values{} for _, query := range queries { + if query.Key == NameFilter { + encodedParamValues := []string{} + for _, valString := range query.Values { + encodedParamValues = append(encodedParamValues, url.QueryEscape(valString)) + } + query.Values = encodedParamValues + } + params.Add(string(query.Key), strings.Join(query.Values, ",")) } diff --git a/api/cloudcontroller/ccv3/query_test.go b/api/cloudcontroller/ccv3/query_test.go new file mode 100644 index 00000000000..01d75328246 --- /dev/null +++ b/api/cloudcontroller/ccv3/query_test.go @@ -0,0 +1,52 @@ +package ccv3_test + +import ( + "net/url" + + . "code.cloudfoundry.org/cli/api/cloudcontroller/ccv3" + . "github.com/onsi/ginkgo" + . "github.com/onsi/gomega" +) + +var _ = Describe("Query Helpers", func() { + Describe("FormatQueryParameters", func() { + var ( + inputQueries []Query + outputParameters url.Values + ) + + BeforeEach(func() { + inputQueries = []Query{ + { + Key: SpaceGUIDFilter, + Values: []string{"space-guid1", "space-guid2"}, + }, + } + outputParameters = FormatQueryParameters(inputQueries) + }) + + It("encodes the param values and reformats the query", func() { + Expect(outputParameters).To(Equal(url.Values{ + "space_guids": []string{"space-guid1,space-guid2"}, + })) + }) + + When("the name filter is used", func() { + BeforeEach(func() { + inputQueries = []Query{ + { + Key: NameFilter, + Values: []string{"name1", "name,2"}, + }, + } + outputParameters = FormatQueryParameters(inputQueries) + }) + + It("encodes the param values before formatting", func() { + Expect(outputParameters).To(Equal(url.Values{ + "names": []string{"name1,name%2C2"}, + })) + }) + }) + }) +})