Where communities thrive

  • Join over 1.5M+ people
  • Join over 100K+ communities
  • Free without limits
  • Create your own community
Repo info
  • 07:49
    daqingshu starred labstack/echo
  • 07:20
    imagelee starred labstack/echo
  • 07:18
    aldas commented #2079
  • 07:15
    aldas commented #2079
  • 07:10
    AngangGuo commented #2079
  • 06:27
    P2YH starred labstack/echo
  • 06:25
    aldas commented #2079
  • 06:18
    AngangGuo opened #2079
  • 06:15
    cyberkryption closed #2075
  • 06:15
    cyberkryption commented #2075
  • 05:32
    ftamhar starred labstack/echo
  • 05:31
    chenjunlinabc starred labstack/echo
  • 02:31
    yqlbu starred labstack/echo
  • Jan 23 23:06
    lammel commented #2044
  • Jan 23 22:14
    lammel commented #2049
  • Jan 23 21:20
    codecov[bot] commented #2049
  • Jan 23 21:18
    lammel commented #2072
  • Jan 23 20:47
    aldas commented #2075
  • Jan 23 20:38
    codecov[bot] commented #2072
  • Jan 23 20:37

    aldas on master

    Add pagoda to the README. (compare)

ali naseri
Why does this error occur in Echo? "Please provide valid credentials"
hi! is it possible to use the proxy middleware to proxy a unix socket? I am getting {"message":"remote unix:///tmp/ttyd.sock unreachable, could not forward: unsupported protocol scheme \"unix\""}
if it's not possible I'd like to open a feature request on github
Martti T.

You could try

    proxyConf := middleware.ProxyConfig{
        // your other settings
        Transport: &http.Transport{
            DialContext: func(ctx context.Context, network, addr string) (net.Conn, error) {
                return net.Dial("unix", addr)

maybe it works.

3 replies
panic: echo: proxy middleware requires balancer

goroutine 1 [running]:
github.com/labstack/echo/v4/middleware.ProxyWithConfig({0x1319698, {0x0, 0x0}, 0x0, 0x0, {0x0, 0x0}, {0x13641a0, 0xc00013d040}, 0x0})
    /Users/matthias/go/pkg/mod/github.com/labstack/echo/v4@v4.6.1/middleware/proxy.go:214 +0x1aa
    /Users/matthias/apigw/server.go:62 +0x194
exit status 2
should I just pass an empty balancer?
with an empty balancer:
echo: http: panic serving [::1]:61352: runtime error: invalid memory address or nil pointer dereference
goroutine 6 [running]:
    /usr/local/Cellar/go/1.17.2/libexec/src/net/http/server.go:1801 +0xb9
panic({0x12b0840, 0x154adf0})
    /usr/local/Cellar/go/1.17.2/libexec/src/runtime/panic.go:1047 +0x266
    /usr/local/Cellar/go/1.17.2/libexec/src/net/http/httputil/reverseproxy.go:144 +0x1d
github.com/labstack/echo/v4/middleware.proxyHTTP(0xc0000668a0, {0x13736f0, 0xc00018c460}, {0x1319778, {0x136a6a0, 0xc0000134e0}, 0x0, 0x0, {0x0, 0x0}, ...})
    /Users/matthias/go/pkg/mod/github.com/labstack/echo/v4@v4.6.1/middleware/proxy.go:279 +0x45
github.com/labstack/echo/v4/middleware.ProxyWithConfig.func1.1({0x13736f0, 0xc00018c460})
    /Users/matthias/go/pkg/mod/github.com/labstack/echo/v4@v4.6.1/middleware/proxy.go:260 +0x5d0
github.com/labstack/echo/v4.(*Echo).add.func1({0x13736f0, 0xc00018c460})
    /Users/matthias/go/pkg/mod/github.com/labstack/echo/v4@v4.6.1/echo.go:552 +0x51
github.com/labstack/echo/v4.(*Echo).ServeHTTP(0xc000014fc0, {0x136a8e0, 0xc00017e2a0}, 0xc00019e000)
    /Users/matthias/go/pkg/mod/github.com/labstack/echo/v4@v4.6.1/echo.go:662 +0x3bc
net/http.serverHandler.ServeHTTP({0xc0001917d0}, {0x136a8e0, 0xc00017e2a0}, 0xc00019e000)
    /usr/local/Cellar/go/1.17.2/libexec/src/net/http/server.go:2878 +0x43b
net/http.(*conn).serve(0xc00018c3c0, {0x136bb00, 0xc0001916e0})
    /usr/local/Cellar/go/1.17.2/libexec/src/net/http/server.go:1929 +0xb08
created by net/http.(*Server).Serve
    /usr/local/Cellar/go/1.17.2/libexec/src/net/http/server.go:3033 +0x4e8
Martti T.
you need balancer. What that Transport.DialContext does is that it will use unix socket instead of tcp for initiating the connection.
4 replies
will try later
Yeah I am very new to go. Literally just started today
Thanks for the pointers
Martti T.

when proxying multiple things like:

serverA -> /
serverB -> /api

can I make serverA not overwrite serverB on /api? Because I can't figure it out haha

ah nevermind I am blind
skipper seems to work for this purpose
Berke Soysal
is it possible to take multiple http parameters with the same identifier?
1 reply
Request query returns an array always
6 replies

question. I am trying to add a custom middleware which changes both method and path (I know there are existing middlewares for both and I checked their source)

        req := c.Request()
        req.Method = "PUT"
        path := req.URL.Path
        url, _ := req.URL.Parse(path + "/9")
        req.URL = url

This succeeds in changing the method, but it fails changing the path, any idea what's up with that?

just to be clear, I am using my middleware with e.Preas recommended
Nevermind. Worked around it another way
Martti T.
@matthias:bsr.mn could you explain your (business) use-case (why/when) for changing method/path?
1 reply
i mean the proxy middleware works just fine for websockets, but not while proxying unix sockets haha
Yagyesh Srivastava

I am facing the "No token found " when I try to use echo framework for expositioning my metrics and using prometheus to scrape them.
While instrumenting my labstack echo web server with prometheus, I followed the example here: https://echo.labstack.com/middleware/prometheus/
and didnt instrument any custom metrics yet, still not able to get it to work with prometheus scraper with just the basic echo framework metrics. Following is the scrape config that I used:

- job_name: 'nebula-staging'
  - targets: ['10.X.Y.Z:8000']
      instance: 'nebula'

Also, I am able to curl to this address and get the metrics, when I use promtool to check the metrics for any inconsistency I dont find any. Not too sure what to do, does anyone have any clue? Would be of great help, thanks!

Hello! I was wondering if Echo supports adding/removing routes while it's running or do I have to restart it?
1 reply
alright. thanks!
Tornike Razmadze

Hi, I have been stuck trying to configure my echo app to serve with https, but have no success. I've read and tried this: https://echo.labstack.com/cookbook/auto-tls ..

So at this point i am getting following error:
echo: http: TLS handshake error from {some-ip}:27002: acme/autocert: unable to satisfy "https://acme-v02.api.letsencrypt.org/acme/authz-v3/53188301650" for domain "mydomain.com": no viable challenge type found

2 replies
Thomas Elsgaard
Hi everybody! I am serving index.html which loads css, js etc.by using e.Static("/dashboard", "/web"), BUT i would like to retrieve the query params. How can i achieve this? How do i call a normal handler like e.GET and get the query params, and then return either the path to /web or the specific index.html file ?
Hi everybody, I saw a CRUD example here (https://echo.labstack.com/cookbook/crud/). My question is Variable Users and Seq both are not Go routine safe (thread-safe). Two Goroutines can access both Variables at the same time.
Martti T.
these variables are not thread safe. maybe for shorter example sync.mutex is left out. anyway - in real world you would use some proper storage engine and their locking mechanisms
Thank you so much.
Parsing JSON request data appears not to be supported´╝č
I have to parse it manually
Martti T.
ok thank
Hey all
I'd like to create a test that I can hand a path to and echo will route for me and send it to the appropriate handler
Has anyone here done that before? So far I can only find documentation for manually giving it a specific handler function
This message was deleted
Something like this doesn't seem to return anything
func GETTER(path string, params []string, paramValues []string) string {
    e := echo.New()
    req := httptest.NewRequest(http.MethodGet, path, nil)
    rec := httptest.NewRecorder()

    c := e.NewContext(req, rec)


    //res := rec.Result()
    defer rec.Result().Body.Close()

    return rec.Body.String()
1 reply
is there a good Guide to get started with Echo??
1 reply
Emil Nikolov
Is there a way to enumerate all routes of an echo router? Something similar to chi.Walk() - https://github.com/go-chi/chi/blob/d32a83448b5f43e42bc96487c6b0b3667a92a2e4/tree.go#L827
Martti T.
e.Routes() gives you all registered routes (with default router). does not include vhost ones
Hi, how to pass the echo logging middleware that can be used by other packages, when we write the application ?
Martti T.
how i can testing my routes?
func login(c echo.Context) error {
    validate := validator.New()
    u := new(Auth)
    if err := c.Bind(u); err != nil {
        return echo.NewHTTPError(http.StatusBadRequest)
    err := validate.Struct(u)

    if err != nil {
        return echo.NewHTTPError(http.StatusBadRequest)
    user , err := domain.GetAuthByUsername(u.Username,u.Password)

    if user.Id == 0  {
          return echo.ErrUnauthorized
    claims := &jwtCustomClaims{ user.Username,*user.Active,*user.Admin,user.Roles,
            ExpiresAt: time.Now().Add(time.Hour * 72).Unix(),
    token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)

    t, err := token.SignedString([]byte(os.Getenv("ACCESS_SECRET")))
    if err != nil {
        return err

    return c.JSON(http.StatusOK, echo.Map{
        "token": t,"roles":user.Roles,"username": user.Username,
func startAuthRouters(app *echo.Echo){
    auth := app.Group("/auth/login")
    auth.POST("", login)
package controllers

import (

func TestAuth(t *testing.T) {
    // t.Parallel()
    // Start()
    t.Run("Controllers ECHO", func(t *testing.T) {

        req := httptest.NewRequest(echo.POST, "/auth/login",nil)
        rec := httptest.NewRecorder()

        // // req.Header.Set("Content-Type", "application/json")
        // // req.Header.Set(echo.HeaderContentType, echo.MIMEApplicationJSON)
        // c.SetPath("/auth/login")
        // h := login(c)
        // fmt.Println(h)
        // fmt.Println(rec)
        // assert.Equal(t, http.StatusBadRequest, rec.Code)
        assert.Equal(t, http.StatusBadRequest, rec.Code)