From cf0986159551d8e08c93be5cefc345b80b917ba6 Mon Sep 17 00:00:00 2001 From: Ka Hin Ng Date: Wed, 13 Nov 2019 14:29:45 -0500 Subject: [PATCH] Revert "Revert "Extend releases signature to permit query parameters"" This reverts commit c70a64237d4e7ece3502397066d85563fea27d06. --- pivnet.go | 45 +++++++++++++++++++++++++++++++++++++++++++++ releases.go | 4 ++-- releases_test.go | 17 +++++++++++++++++ 3 files changed, 64 insertions(+), 2 deletions(-) diff --git a/pivnet.go b/pivnet.go index db157da..7495dc7 100644 --- a/pivnet.go +++ b/pivnet.go @@ -59,6 +59,11 @@ type AccessTokenOrLegacyToken struct { userAgent string } +type QueryParameter struct { + Key string + Value string +} + func (o AccessTokenOrLegacyToken) AccessToken() (string, error) { const legacyAPITokenLength = 20 if len(o.refreshToken) > legacyAPITokenLength { @@ -245,6 +250,46 @@ func (c Client) MakeRequest( return resp, nil } +func (c Client) MakeRequestWithParams( + requestType string, + endpoint string, + expectedStatusCode int, + params []QueryParameter, + body io.Reader, +) (*http.Response, error) { + req, err := c.CreateRequest(requestType, endpoint, body) + if err != nil { + return nil, err + } + + q := req.URL.Query() + for _, param := range params { + q.Add(param.Key, param.Value) + } + req.URL.RawQuery = q.Encode() + + reqBytes, err := httputil.DumpRequestOut(req, true) + if err != nil { + return nil, err + } + + c.logger.Debug("Making request", logger.Data{"request": string(reqBytes)}) + + resp, err := c.HTTP.Do(req) + if err != nil { + return nil, err + } + + c.logger.Debug("Response status code", logger.Data{"status code": resp.StatusCode}) + c.logger.Debug("Response headers", logger.Data{"headers": resp.Header}) + + if expectedStatusCode > 0 && resp.StatusCode != expectedStatusCode { + return nil, c.handleUnexpectedResponse(resp) + } + + return resp, nil +} + func (c Client) stripHostPrefix(downloadLink string) string { if strings.HasPrefix(downloadLink, apiVersion) { return downloadLink diff --git a/releases.go b/releases.go index 13d1c04..8139186 100644 --- a/releases.go +++ b/releases.go @@ -66,11 +66,11 @@ type CreateReleaseConfig struct { CopyMetadata bool } -func (r ReleasesService) List(productSlug string) ([]Release, error) { +func (r ReleasesService) List(productSlug string, params ...QueryParameter) ([]Release, error) { url := fmt.Sprintf("/products/%s/releases", productSlug) var response ReleasesResponse - resp, err := r.client.MakeRequest("GET", url, http.StatusOK, nil) + resp, err := r.client.MakeRequestWithParams("GET", url, http.StatusOK, params, nil) if err != nil { return nil, err } diff --git a/releases_test.go b/releases_test.go index 3d87512..210ffd3 100644 --- a/releases_test.go +++ b/releases_test.go @@ -63,6 +63,23 @@ var _ = Describe("PivnetClient - product files", func() { Expect(releases[1].ID).To(Equal(3)) }) + Context("when specifying a limit", func() { + It("passes the limit to the API endpoint in the form of query params", func() { + response := `{"releases": [{"id": 3, "version": "3.2.1", "_links": {"product_files": {"href":"https://banana.org/cookies/download"}}}]}` + server.AppendHandlers( + ghttp.CombineHandlers( + ghttp.VerifyRequest("GET", apiPrefix+"/products/banana/releases", "limit=1"), + ghttp.RespondWith(http.StatusOK, response), + ), + ) + + releases, err := client.Releases.List("banana", pivnet.QueryParameter{"limit", "1"}) + Expect(err).NotTo(HaveOccurred()) + Expect(releases).To(HaveLen(1)) + Expect(releases[0].ID).To(Equal(3)) + }) + }) + Context("when the server responds with a non-2XX status code", func() { var ( body []byte