From 8d7f05e5336fa9a05c6ca5a610a0c5140c01bfc3 Mon Sep 17 00:00:00 2001 From: "J. David Lowe" Date: Thu, 23 Jan 2020 18:32:17 -0800 Subject: [PATCH] round-trip paramValues without exploding (#1463) --- bind_test.go | 2 ++ context.go | 5 ++++- context_test.go | 22 ++++++++++++++++++++++ middleware/jwt_test.go | 2 ++ 4 files changed, 30 insertions(+), 1 deletion(-) diff --git a/bind_test.go b/bind_test.go index b9fb9de3..943cfd55 100644 --- a/bind_test.go +++ b/bind_test.go @@ -332,6 +332,7 @@ func TestBindbindData(t *testing.T) { func TestBindParam(t *testing.T) { e := New() + *e.maxParam = 2 req := httptest.NewRequest(GET, "/", nil) rec := httptest.NewRecorder() c := e.NewContext(req, rec) @@ -362,6 +363,7 @@ func TestBindParam(t *testing.T) { // Bind something with param and post data payload body := bytes.NewBufferString(`{ "name": "Jon Snow" }`) e2 := New() + *e2.maxParam = 2 req2 := httptest.NewRequest(POST, "/", body) req2.Header.Set(HeaderContentType, MIMEApplicationJSON) diff --git a/context.go b/context.go index 27da5ffe..0046e5d4 100644 --- a/context.go +++ b/context.go @@ -312,7 +312,10 @@ func (c *context) ParamValues() []string { } func (c *context) SetParamValues(values ...string) { - c.pvalues = values + // NOTE: Don't just set c.pvalues = values, because it has to have length c.echo.maxParam at all times + for i, val := range values { + c.pvalues[i] = val + } } func (c *context) QueryParam(name string) string { diff --git a/context_test.go b/context_test.go index 47be19cc..bb4a9ed4 100644 --- a/context_test.go +++ b/context_test.go @@ -93,6 +93,7 @@ func (responseWriterErr) WriteHeader(statusCode int) { func TestContext(t *testing.T) { e := New() + *e.maxParam = 1 req := httptest.NewRequest(http.MethodPost, "/", strings.NewReader(userJSON)) rec := httptest.NewRecorder() c := e.NewContext(req, rec).(*context) @@ -471,6 +472,7 @@ func TestContextPath(t *testing.T) { func TestContextPathParam(t *testing.T) { e := New() + *e.maxParam = 2 req := httptest.NewRequest(http.MethodGet, "/", nil) c := e.NewContext(req, nil) @@ -487,6 +489,26 @@ func TestContextPathParam(t *testing.T) { testify.Equal(t, "", c.Param("undefined")) } +func TestContextGetAndSetParam(t *testing.T) { + e := New() + *e.maxParam = 2 + req := httptest.NewRequest(http.MethodGet, "/:foo", nil) + c := e.NewContext(req, nil) + c.SetParamNames("foo") + + // round-trip param values with modification + paramVals := c.ParamValues() + testify.EqualValues(t, []string{""}, c.ParamValues()) + paramVals[0] = "bar" + c.SetParamValues(paramVals...) + testify.EqualValues(t, []string{"bar"}, c.ParamValues()) + + // shouldn't explode during Reset() afterwards! + testify.NotPanics(t, func() { + c.Reset(nil, nil) + }) +} + func TestContextFormValue(t *testing.T) { f := make(url.Values) f.Set("name", "Jon Snow") diff --git a/middleware/jwt_test.go b/middleware/jwt_test.go index 7f15bd46..f7f089fb 100644 --- a/middleware/jwt_test.go +++ b/middleware/jwt_test.go @@ -60,6 +60,8 @@ func TestJWTRace(t *testing.T) { func TestJWT(t *testing.T) { e := echo.New() + r := e.Router() + r.Add("GET", "/:jwt", func(echo.Context) error { return nil }) handler := func(c echo.Context) error { return c.String(http.StatusOK, "test") }