Skip to content

Conversation

@renovate
Copy link
Contributor

@renovate renovate bot commented Oct 11, 2023

This PR contains the following updates:

Package Change Age Confidence
github.com/labstack/echo/v4 v4.11.1v4.15.0 age confidence

Release Notes

labstack/echo (github.com/labstack/echo/v4)

v4.15.0

Compare Source

Security

NB: If your application relies on cross-origin or same-site (same subdomain) requests do not blindly push this version to production

The CSRF middleware now supports the Sec-Fetch-Site header as a modern, defense-in-depth approach to CSRF
protection
, implementing the OWASP-recommended Fetch Metadata API alongside the traditional token-based mechanism.

How it works:

Modern browsers automatically send the Sec-Fetch-Site header with all requests, indicating the relationship
between the request origin and the target. The middleware uses this to make security decisions:

  • same-origin or none: Requests are allowed (exact origin match or direct user navigation)
  • same-site: Falls back to token validation (e.g., subdomain to main domain)
  • cross-site: Blocked by default with 403 error for unsafe methods (POST, PUT, DELETE, PATCH)

For browsers that don't send this header (older browsers), the middleware seamlessly falls back to
traditional token-based CSRF protection.

New Configuration Options:

  • TrustedOrigins []string: Allowlist specific origins for cross-site requests (useful for OAuth callbacks, webhooks)
  • AllowSecFetchSiteFunc func(echo.Context) (bool, error): Custom logic for same-site/cross-site request validation

Example:

e.Use(middleware.CSRFWithConfig(middleware.CSRFConfig{
    // Allow OAuth callbacks from trusted provider
    TrustedOrigins: []string{"https://oauth-provider.com"},

    // Custom validation for same-site requests
    AllowSecFetchSiteFunc: func(c echo.Context) (bool, error) {
        // Your custom authorization logic here
        return validateCustomAuth(c), nil
        // return true, err  // blocks request with error
        // return true, nil  // allows CSRF request through
        // return false, nil // falls back to legacy token logic
    },
}))

PR: #​2858

Type-Safe Generic Parameter Binding

  • Added generic functions for type-safe parameter extraction and context access by @​aldas in #​2856

    Echo now provides generic functions for extracting path, query, and form parameters with automatic type conversion,
    eliminating manual string parsing and type assertions.

    New Functions:

    • Path parameters: PathParam[T], PathParamOr[T]
    • Query parameters: QueryParam[T], QueryParamOr[T], QueryParams[T], QueryParamsOr[T]
    • Form values: FormParam[T], FormParamOr[T], FormParams[T], FormParamsOr[T]
    • Context store: ContextGet[T], ContextGetOr[T]

    Supported Types:
    Primitives (bool, string, int/uint variants, float32/float64), time.Duration, time.Time
    (with custom layouts and Unix timestamp support), and custom types implementing BindUnmarshaler,
    TextUnmarshaler, or JSONUnmarshaler.

    Example:

    // Before: Manual parsing
    idStr := c.Param("id")
    id, err := strconv.Atoi(idStr)
    
    // After: Type-safe with automatic parsing
    id, err := echo.PathParam[int](c, "id")
    
    // With default values
    page, err := echo.QueryParamOr[int](c, "page", 1)
    limit, err := echo.QueryParamOr[int](c, "limit", 20)
    
    // Type-safe context access (no more panics from type assertions)
    user, err := echo.ContextGet[*User](c, "user")

PR: #​2856

DEPRECATION NOTICE Timeout Middleware Deprecated - Use ContextTimeout Instead

The middleware.Timeout middleware has been deprecated due to fundamental architectural issues that cause
data races. Use middleware.ContextTimeout or middleware.ContextTimeoutWithConfig instead.

Why is this being deprecated?

The Timeout middleware manipulates response writers across goroutine boundaries, which causes data races that
cannot be reliably fixed without a complete architectural redesign. The middleware:

  • Swaps the response writer using http.TimeoutHandler
  • Must be the first middleware in the chain (fragile constraint)
  • Can cause races with other middleware (Logger, metrics, custom middleware)
  • Has been the source of multiple race condition fixes over the years

What should you use instead?

The ContextTimeout middleware (available since v4.12.0) provides timeout functionality using Go's standard
context mechanism. It is:

  • Race-free by design
  • Can be placed anywhere in the middleware chain
  • Simpler and more maintainable
  • Compatible with all other middleware

Migration Guide:

// Before (deprecated):
e.Use(middleware.Timeout())

// After (recommended):
e.Use(middleware.ContextTimeout(30 * time.Second))

Important Behavioral Differences:

  1. Handler cooperation required: With ContextTimeout, your handlers must check context.Done() for cooperative
    cancellation. The old Timeout middleware would send a 503 response regardless of handler cooperation, but had
    data race issues.

  2. Error handling: ContextTimeout returns errors through the standard error handling flow. Handlers that receive
    context.DeadlineExceeded should handle it appropriately:

e.GET("/long-task", func(c echo.Context) error {
    ctx := c.Request().Context()

    // Example: database query with context
    result, err := db.QueryContext(ctx, "SELECT * FROM large_table")
    if err != nil {
        if errors.Is(err, context.DeadlineExceeded) {
            // Handle timeout
            return echo.NewHTTPError(http.StatusServiceUnavailable, "Request timeout")
        }
        return err
    }

    return c.JSON(http.StatusOK, result)
})
  1. Background tasks: For long-running background tasks, use goroutines with context:
e.GET("/async-task", func(c echo.Context) error {
    ctx := c.Request().Context()

    resultCh := make(chan Result, 1)
    errCh := make(chan error, 1)

    go func() {
        result, err := performLongTask(ctx)
        if err != nil {
            errCh <- err
            return
        }
        resultCh <- result
    }()

    select {
    case result := <-resultCh:
        return c.JSON(http.StatusOK, result)
    case err := <-errCh:
        return err
    case <-ctx.Done():
        return echo.NewHTTPError(http.StatusServiceUnavailable, "Request timeout")
    }
})

Enhancements

v4.14.0

Compare Source

middleware.Logger has been deprecated. For request logging, use middleware.RequestLogger or
middleware.RequestLoggerWithConfig.

middleware.RequestLogger replaces middleware.Logger, offering comparable configuration while relying on the
Go standard library’s new slog logger.

The previous default output format was JSON. The new default follows the standard slog logger settings.
To continue emitting request logs in JSON, configure slog accordingly:

slog.SetDefault(slog.New(slog.NewJSONHandler(os.Stdout, nil)))
e.Use(middleware.RequestLogger())

Security

Enhancements

v4.13.4

Compare Source

Enhancements

Security

v4.13.3

Compare Source

Security

v4.13.2

Compare Source

Security

v4.13.1

Compare Source

Fixes

v4.13.0

Compare Source

BREAKING CHANGE JWT Middleware Removed from Core use labstack/echo-jwt instead

The JWT middleware has been removed from Echo core due to another security vulnerability, CVE-2024-51744. For more details, refer to issue #​2699. A drop-in replacement is available in the labstack/echo-jwt repository.

Important: Direct assignments like token := c.Get("user").(*jwt.Token) will now cause a panic due to an invalid cast. Update your code accordingly. Replace the current imports from "github.com/golang-jwt/jwt" in your handlers to the new middleware version using "github.com/golang-jwt/jwt/v5".

Background:

The version of golang-jwt/jwt (v3.2.2) previously used in Echo core has been in an unmaintained state for some time. This is not the first vulnerability affecting this library; earlier issues were addressed in PR #​1946.
JWT middleware was marked as deprecated in Echo core as of v4.10.0 on 2022-12-27. If you did not notice that, consider leveraging tools like Staticcheck to catch such deprecations earlier in you dev/CI flow. For bonus points - check out gosec.

We sincerely apologize for any inconvenience caused by this change. While we strive to maintain backward compatibility within Echo core, recurring security issues with third-party dependencies have forced this decision.

Enhancements

v4.12.0

Compare Source

Security

Enhancements

v4.11.4

Compare Source

Security

  • Upgrade golang.org/x/crypto to v0.17.0 to fix vulnerability issue #​2562

Enhancements

v4.11.3

Compare Source

Security

  • 'c.Attachment' and 'c.Inline' should escape filename in 'Content-Disposition' header to avoid 'Reflect File Download' vulnerability. #​2541

Enhancements

  • Tests: refactor context tests to be separate functions #​2540
  • Proxy middleware: reuse echo request context #​2537
  • Mark unmarshallable yaml struct tags as ignored #​2536

v4.11.2

Compare Source

Security

Enhancements


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.


  • If you want to rebase/retry this PR, check this box

This PR was generated by Mend Renovate. View the repository job log.

@renovate renovate bot requested a review from Clivern as a code owner October 11, 2023 06:13
@renovate renovate bot changed the title Update module github.com/labstack/echo/v4 to v4.11.2 Update module github.com/labstack/echo/v4 to v4.11.3 Nov 7, 2023
@renovate renovate bot force-pushed the renovate/github.com-labstack-echo-v4-4.x branch from 0f8494b to d2fd87b Compare November 7, 2023 12:49
@renovate renovate bot changed the title Update module github.com/labstack/echo/v4 to v4.11.3 Update module github.com/labstack/echo/v4 to v4.11.4 Dec 20, 2023
@renovate renovate bot force-pushed the renovate/github.com-labstack-echo-v4-4.x branch from d2fd87b to 9135f93 Compare December 20, 2023 16:38
@renovate renovate bot changed the title Update module github.com/labstack/echo/v4 to v4.11.4 Update module github.com/labstack/echo/v4 to v4.12.0 Apr 15, 2024
@renovate renovate bot force-pushed the renovate/github.com-labstack-echo-v4-4.x branch from 9135f93 to 410c8ad Compare April 15, 2024 19:46
@renovate renovate bot changed the title Update module github.com/labstack/echo/v4 to v4.12.0 Update module github.com/labstack/echo/v4 to v4.13.0 Dec 4, 2024
@renovate renovate bot force-pushed the renovate/github.com-labstack-echo-v4-4.x branch from 410c8ad to cb92244 Compare December 4, 2024 23:33
@renovate
Copy link
Contributor Author

renovate bot commented Dec 4, 2024

ℹ Artifact update notice

File name: go.mod

In order to perform the update(s) described in the table above, Renovate ran the go get command, which resulted in the following additional change(s):

  • 8 additional dependencies were updated
  • The go directive was updated for compatibility reasons

Details:

Package Change
go 1.20 -> 1.23.0
github.com/labstack/gommon v0.4.0 -> v0.4.2
github.com/mattn/go-colorable v0.1.13 -> v0.1.14
github.com/mattn/go-isatty v0.0.19 -> v0.0.20
golang.org/x/crypto v0.11.0 -> v0.38.0
golang.org/x/net v0.12.0 -> v0.40.0
golang.org/x/sys v0.10.0 -> v0.33.0
golang.org/x/text v0.11.0 -> v0.25.0
golang.org/x/time v0.3.0 -> v0.11.0

@renovate renovate bot force-pushed the renovate/github.com-labstack-echo-v4-4.x branch from cb92244 to 40c48d4 Compare December 11, 2024 13:39
@renovate renovate bot changed the title Update module github.com/labstack/echo/v4 to v4.13.0 Update module github.com/labstack/echo/v4 to v4.13.1 Dec 11, 2024
@renovate renovate bot changed the title Update module github.com/labstack/echo/v4 to v4.13.1 Update module github.com/labstack/echo/v4 to v4.13.2 Dec 12, 2024
@renovate renovate bot force-pushed the renovate/github.com-labstack-echo-v4-4.x branch from 40c48d4 to 03c6e93 Compare December 12, 2024 09:57
@renovate renovate bot changed the title Update module github.com/labstack/echo/v4 to v4.13.2 Update module github.com/labstack/echo/v4 to v4.13.3 Dec 19, 2024
@renovate renovate bot force-pushed the renovate/github.com-labstack-echo-v4-4.x branch from 03c6e93 to 929a219 Compare December 19, 2024 07:48
@renovate renovate bot force-pushed the renovate/github.com-labstack-echo-v4-4.x branch from 929a219 to 5848ba7 Compare May 25, 2025 00:10
@renovate renovate bot changed the title Update module github.com/labstack/echo/v4 to v4.13.3 Update module github.com/labstack/echo/v4 to v4.13.4 May 25, 2025
@renovate renovate bot force-pushed the renovate/github.com-labstack-echo-v4-4.x branch from 5848ba7 to 7da584e Compare August 10, 2025 12:42
@renovate renovate bot force-pushed the renovate/github.com-labstack-echo-v4-4.x branch from 7da584e to eafdc18 Compare October 9, 2025 14:30
@renovate renovate bot changed the title Update module github.com/labstack/echo/v4 to v4.13.4 Update module github.com/labstack/echo/v4 to v4.14.0 Dec 11, 2025
@renovate renovate bot force-pushed the renovate/github.com-labstack-echo-v4-4.x branch from eafdc18 to 5c389b1 Compare December 11, 2025 22:38
@renovate
Copy link
Contributor Author

renovate bot commented Dec 11, 2025

ℹ️ Artifact update notice

File name: go.mod

In order to perform the update(s) described in the table above, Renovate ran the go get command, which resulted in the following additional change(s):

  • 8 additional dependencies were updated
  • The go directive was updated for compatibility reasons

Details:

Package Change
go 1.20 -> 1.24.0
github.com/labstack/gommon v0.4.0 -> v0.4.2
github.com/mattn/go-colorable v0.1.13 -> v0.1.14
github.com/mattn/go-isatty v0.0.19 -> v0.0.20
golang.org/x/crypto v0.11.0 -> v0.46.0
golang.org/x/net v0.12.0 -> v0.48.0
golang.org/x/sys v0.10.0 -> v0.39.0
golang.org/x/text v0.11.0 -> v0.32.0
golang.org/x/time v0.3.0 -> v0.14.0

@renovate renovate bot force-pushed the renovate/github.com-labstack-echo-v4-4.x branch from 5c389b1 to 42d8480 Compare January 1, 2026 14:14
@renovate renovate bot changed the title Update module github.com/labstack/echo/v4 to v4.14.0 Update module github.com/labstack/echo/v4 to v4.15.0 Jan 1, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant