Skip to content

Conversation

@aldas
Copy link
Contributor

@aldas aldas commented Dec 3, 2023

Relates to #2552 and #988

Difference from previous implementations is that in case we are binding to unsupported Map we ended in with panic. Now we skip binding (params/query/header) and try other sources (ala body)

package main import ( "github.com/labstack/echo/v4" "github.com/labstack/echo/v4/middleware" "net/http" ) func main() { e := echo.New() e.Use(middleware.Logger()) e.Use(middleware.Recover()) // test: `curl -XPOST --header "Content-Type: application/json" -d '{"module1": "2", "module2": "3"}' http://127.0.0.1:8080/test/string/1` // output old: {"id":"1","module1":"2","module2":"3"} // output new: {"id":"1","module1":"2","module2":"3"} e.POST("/test/string/:id", func(c echo.Context) error { p := map[string]string{} if err := c.Bind(&p); err != nil { return err	} return c.JSON(http.StatusOK, p)	}) // test: `curl -XPOST --header "Content-Type: application/json" -d '{"module1": 2, "module2": 3}' http://127.0.0.1:8080/test/int/1` // output old: {"message":"Internal Server Error"} // output new: {"module1":"2","module2":"3"} e.POST("/test/int/:id", func(c echo.Context) error { p := map[string]int{} if err := c.Bind(&p); err != nil { return err	} return c.JSON(http.StatusOK, p)	}) e.Start("127.0.0.1:8080") }
@codecov
Copy link

codecov bot commented Dec 3, 2023

Codecov Report

All modified and coverable lines are covered by tests ✅

Comparison is base (584cb85) 92.89% compared to head (aea150e) 93.02%.

Additional details and impacted files
@@ Coverage Diff @@ ## master #2554 +/- ## ========================================== + Coverage 92.89% 93.02% +0.12%  ========================================== Files 39 39 Lines 4658 4673 +15 ========================================== + Hits 4327 4347 +20  + Misses 240 236 -4  + Partials 91 90 -1 

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

Copy link

@astromechza astromechza left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks @aldas, this looks much more robust than before 👍

@aldas aldas merged commit 60fc2fb into labstack:master Dec 20, 2023
@aldas aldas deleted the bind_to_map branch December 20, 2023 13:32
@georgmu
Copy link
Contributor

georgmu commented Jan 12, 2024

There is still an issue when having code like this:

var params map[string]any c.Bind(&params) 

This works for JSON body, but fails for path params (since params is nil).

A small addition helps to solve this (this is the same that the JSON decoder does):

--- a/bind.go +++ b/bind.go @@ -138,6 +138,9 @@ func (b *DefaultBinder) bindData(destination interface{}, data map[string][]stri // You are better off binding to struct but there are user who want this map feature. Source of data for these cases are: // params,query,header,form as these sources produce string values, most of the time slice of strings, actually. if typ.Kind() == reflect.Map && typ.Key().Kind() == reflect.String { + if val.IsNil() { + val.Set(reflect.MakeMap(typ)) + } k := typ.Elem().Kind() isElemInterface := k == reflect.Interface isElemString := k == reflect.String 

I can prepare a merge request (including a test case) for this.

@dakhtarovpx
Copy link

Hello there!

Thank you for your PR.

I'd like to ask: when do you plan to release this PR? v4.11.4 is the latest version, and it still doesn't work at the moment.

@aldas
Copy link
Contributor Author

aldas commented Feb 1, 2024

I do not know at the moment. Meanwhile use:

p := map[string]string{} if err := c.Bind(&p); err != nil {
nono referenced this pull request in cozy/cozy-stack Apr 22, 2024
[![Mend Renovate](https://app.renovatebot.com/images/banner.svg)](https://renovatebot.com) This PR contains the following updates: | Package | Change | Age | Adoption | Passing | Confidence | |---|---|---|---|---|---| | [github.com/labstack/echo/v4](https://togithub.com/labstack/echo) | `v4.11.4` -> `v4.12.0` | [![age](https://developer.mend.io/api/mc/badges/age/go/github.com%2flabstack%2fecho%2fv4/v4.12.0?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![adoption](https://developer.mend.io/api/mc/badges/adoption/go/github.com%2flabstack%2fecho%2fv4/v4.12.0?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![passing](https://developer.mend.io/api/mc/badges/compatibility/go/github.com%2flabstack%2fecho%2fv4/v4.11.4/v4.12.0?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![confidence](https://developer.mend.io/api/mc/badges/confidence/go/github.com%2flabstack%2fecho%2fv4/v4.11.4/v4.12.0?slim=true)](https://docs.renovatebot.com/merge-confidence/) | --- ### Release Notes <details> <summary>labstack/echo (github.com/labstack/echo/v4)</summary> ### [`v4.12.0`](https://togithub.com/labstack/echo/blob/HEAD/CHANGELOG.md#v4120---2024-04-15) [Compare Source](https://togithub.com/labstack/echo/compare/v4.11.4...v4.12.0) **Security** - Update golang.org/x/net dep because of [GO-2024-2687](https://pkg.go.dev/vuln/GO-2024-2687) by [@&#8203;aldas](https://togithub.com/aldas) in [https://github.com/labstack/echo/pull/2625](https://togithub.com/labstack/echo/pull/2625) **Enhancements** - binder: make binding to Map work better with string destinations by [@&#8203;aldas](https://togithub.com/aldas) in [https://github.com/labstack/echo/pull/2554](https://togithub.com/labstack/echo/pull/2554) - README.md: add Encore as sponsor by [@&#8203;marcuskohlberg](https://togithub.com/marcuskohlberg) in [https://github.com/labstack/echo/pull/2579](https://togithub.com/labstack/echo/pull/2579) - Reorder paragraphs in README.md by [@&#8203;aldas](https://togithub.com/aldas) in [https://github.com/labstack/echo/pull/2581](https://togithub.com/labstack/echo/pull/2581) - CI: upgrade actions/checkout to v4 by [@&#8203;aldas](https://togithub.com/aldas) in [https://github.com/labstack/echo/pull/2584](https://togithub.com/labstack/echo/pull/2584) - Remove default charset from 'application/json' Content-Type header by [@&#8203;doortts](https://togithub.com/doortts) in [https://github.com/labstack/echo/pull/2568](https://togithub.com/labstack/echo/pull/2568) - CI: Use Go 1.22 by [@&#8203;aldas](https://togithub.com/aldas) in [https://github.com/labstack/echo/pull/2588](https://togithub.com/labstack/echo/pull/2588) - binder: allow binding to a nil map by [@&#8203;georgmu](https://togithub.com/georgmu) in [https://github.com/labstack/echo/pull/2574](https://togithub.com/labstack/echo/pull/2574) - Add Skipper Unit Test In BasicBasicAuthConfig and Add More Detail Explanation regarding BasicAuthValidator by [@&#8203;RyoKusnadi](https://togithub.com/RyoKusnadi) in [https://github.com/labstack/echo/pull/2461](https://togithub.com/labstack/echo/pull/2461) - fix some typos by [@&#8203;teslaedison](https://togithub.com/teslaedison) in [https://github.com/labstack/echo/pull/2603](https://togithub.com/labstack/echo/pull/2603) - fix: some typos by [@&#8203;pomadev](https://togithub.com/pomadev) in [https://github.com/labstack/echo/pull/2596](https://togithub.com/labstack/echo/pull/2596) - Allow ResponseWriters to unwrap writers when flushing/hijacking by [@&#8203;aldas](https://togithub.com/aldas) in [https://github.com/labstack/echo/pull/2595](https://togithub.com/labstack/echo/pull/2595) - Add SPDX licence comments to files. by [@&#8203;aldas](https://togithub.com/aldas) in [https://github.com/labstack/echo/pull/2604](https://togithub.com/labstack/echo/pull/2604) - Upgrade deps by [@&#8203;aldas](https://togithub.com/aldas) in [https://github.com/labstack/echo/pull/2605](https://togithub.com/labstack/echo/pull/2605) - Change type definition blocks to single declarations. This helps copy… by [@&#8203;aldas](https://togithub.com/aldas) in [https://github.com/labstack/echo/pull/2606](https://togithub.com/labstack/echo/pull/2606) - Fix Real IP logic by [@&#8203;cl-bvl](https://togithub.com/cl-bvl) in [https://github.com/labstack/echo/pull/2550](https://togithub.com/labstack/echo/pull/2550) - Default binder can use `UnmarshalParams(params []string) error` inter… by [@&#8203;aldas](https://togithub.com/aldas) in [https://github.com/labstack/echo/pull/2607](https://togithub.com/labstack/echo/pull/2607) - Default binder can bind pointer to slice as struct field. For example `*[]string` by [@&#8203;aldas](https://togithub.com/aldas) in [https://github.com/labstack/echo/pull/2608](https://togithub.com/labstack/echo/pull/2608) - Remove maxparam dependence from Context by [@&#8203;aldas](https://togithub.com/aldas) in [https://github.com/labstack/echo/pull/2611](https://togithub.com/labstack/echo/pull/2611) - When route is registered with empty path it is normalized to `/`. by [@&#8203;aldas](https://togithub.com/aldas) in [https://github.com/labstack/echo/pull/2616](https://togithub.com/labstack/echo/pull/2616) - proxy middleware should use httputil.ReverseProxy for SSE requests by [@&#8203;aldas](https://togithub.com/aldas) in [https://github.com/labstack/echo/pull/2624](https://togithub.com/labstack/echo/pull/2624) </details> --- ### Configuration 📅 **Schedule**: Branch creation - "before 6am on Monday" in timezone Europe/Paris, Automerge - At any time (no schedule defined). 🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied. ♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box --- This PR has been generated by [Mend Renovate](https://www.mend.io/free-developer-tools/renovate/). View repository job log [here](https://developer.mend.io/github/cozy/cozy-stack). <!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiIzNy4zMTMuMSIsInVwZGF0ZWRJblZlciI6IjM3LjMxMy4xIiwidGFyZ2V0QnJhbmNoIjoibWFzdGVyIiwibGFiZWxzIjpbXX0=-->
github-merge-queue bot referenced this pull request in infratographer/x Aug 8, 2024
[![Mend Renovate](https://app.renovatebot.com/images/banner.svg)](https://renovatebot.com) This PR contains the following updates: | Package | Change | Age | Adoption | Passing | Confidence | |---|---|---|---|---|---| | [github.com/labstack/echo/v4](https://togithub.com/labstack/echo) | `v4.11.4` -> `v4.12.0` | [![age](https://developer.mend.io/api/mc/badges/age/go/github.com%2flabstack%2fecho%2fv4/v4.12.0?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![adoption](https://developer.mend.io/api/mc/badges/adoption/go/github.com%2flabstack%2fecho%2fv4/v4.12.0?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![passing](https://developer.mend.io/api/mc/badges/compatibility/go/github.com%2flabstack%2fecho%2fv4/v4.11.4/v4.12.0?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![confidence](https://developer.mend.io/api/mc/badges/confidence/go/github.com%2flabstack%2fecho%2fv4/v4.11.4/v4.12.0?slim=true)](https://docs.renovatebot.com/merge-confidence/) | --- ### Release Notes <details> <summary>labstack/echo (github.com/labstack/echo/v4)</summary> ### [`v4.12.0`](https://togithub.com/labstack/echo/blob/HEAD/CHANGELOG.md#v4120---2024-04-15) [Compare Source](https://togithub.com/labstack/echo/compare/v4.11.4...v4.12.0) **Security** - Update golang.org/x/net dep because of [GO-2024-2687](https://pkg.go.dev/vuln/GO-2024-2687) by [@&#8203;aldas](https://togithub.com/aldas) in [https://github.com/labstack/echo/pull/2625](https://togithub.com/labstack/echo/pull/2625) **Enhancements** - binder: make binding to Map work better with string destinations by [@&#8203;aldas](https://togithub.com/aldas) in [https://github.com/labstack/echo/pull/2554](https://togithub.com/labstack/echo/pull/2554) - README.md: add Encore as sponsor by [@&#8203;marcuskohlberg](https://togithub.com/marcuskohlberg) in [https://github.com/labstack/echo/pull/2579](https://togithub.com/labstack/echo/pull/2579) - Reorder paragraphs in README.md by [@&#8203;aldas](https://togithub.com/aldas) in [https://github.com/labstack/echo/pull/2581](https://togithub.com/labstack/echo/pull/2581) - CI: upgrade actions/checkout to v4 by [@&#8203;aldas](https://togithub.com/aldas) in [https://github.com/labstack/echo/pull/2584](https://togithub.com/labstack/echo/pull/2584) - Remove default charset from 'application/json' Content-Type header by [@&#8203;doortts](https://togithub.com/doortts) in [https://github.com/labstack/echo/pull/2568](https://togithub.com/labstack/echo/pull/2568) - CI: Use Go 1.22 by [@&#8203;aldas](https://togithub.com/aldas) in [https://github.com/labstack/echo/pull/2588](https://togithub.com/labstack/echo/pull/2588) - binder: allow binding to a nil map by [@&#8203;georgmu](https://togithub.com/georgmu) in [https://github.com/labstack/echo/pull/2574](https://togithub.com/labstack/echo/pull/2574) - Add Skipper Unit Test In BasicBasicAuthConfig and Add More Detail Explanation regarding BasicAuthValidator by [@&#8203;RyoKusnadi](https://togithub.com/RyoKusnadi) in [https://github.com/labstack/echo/pull/2461](https://togithub.com/labstack/echo/pull/2461) - fix some typos by [@&#8203;teslaedison](https://togithub.com/teslaedison) in [https://github.com/labstack/echo/pull/2603](https://togithub.com/labstack/echo/pull/2603) - fix: some typos by [@&#8203;pomadev](https://togithub.com/pomadev) in [https://github.com/labstack/echo/pull/2596](https://togithub.com/labstack/echo/pull/2596) - Allow ResponseWriters to unwrap writers when flushing/hijacking by [@&#8203;aldas](https://togithub.com/aldas) in [https://github.com/labstack/echo/pull/2595](https://togithub.com/labstack/echo/pull/2595) - Add SPDX licence comments to files. by [@&#8203;aldas](https://togithub.com/aldas) in [https://github.com/labstack/echo/pull/2604](https://togithub.com/labstack/echo/pull/2604) - Upgrade deps by [@&#8203;aldas](https://togithub.com/aldas) in [https://github.com/labstack/echo/pull/2605](https://togithub.com/labstack/echo/pull/2605) - Change type definition blocks to single declarations. This helps copy… by [@&#8203;aldas](https://togithub.com/aldas) in [https://github.com/labstack/echo/pull/2606](https://togithub.com/labstack/echo/pull/2606) - Fix Real IP logic by [@&#8203;cl-bvl](https://togithub.com/cl-bvl) in [https://github.com/labstack/echo/pull/2550](https://togithub.com/labstack/echo/pull/2550) - Default binder can use `UnmarshalParams(params []string) error` inter… by [@&#8203;aldas](https://togithub.com/aldas) in [https://github.com/labstack/echo/pull/2607](https://togithub.com/labstack/echo/pull/2607) - Default binder can bind pointer to slice as struct field. For example `*[]string` by [@&#8203;aldas](https://togithub.com/aldas) in [https://github.com/labstack/echo/pull/2608](https://togithub.com/labstack/echo/pull/2608) - Remove maxparam dependence from Context by [@&#8203;aldas](https://togithub.com/aldas) in [https://github.com/labstack/echo/pull/2611](https://togithub.com/labstack/echo/pull/2611) - When route is registered with empty path it is normalized to `/`. by [@&#8203;aldas](https://togithub.com/aldas) in [https://github.com/labstack/echo/pull/2616](https://togithub.com/labstack/echo/pull/2616) - proxy middleware should use httputil.ReverseProxy for SSE requests by [@&#8203;aldas](https://togithub.com/aldas) in [https://github.com/labstack/echo/pull/2624](https://togithub.com/labstack/echo/pull/2624) </details> --- ### Configuration 📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined). 🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied. ♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box --- This PR was generated by [Mend Renovate](https://www.mend.io/free-developer-tools/renovate/). View the [repository job log](https://developer.mend.io/github/infratographer/x). <!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiIzNy4yOTMuMCIsInVwZGF0ZWRJblZlciI6IjM3LjQzOC4wIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6W119--> --------- Signed-off-by: Mike Mason <mimason@equinix.com> Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Co-authored-by: Mike Mason <mimason@equinix.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

4 participants