タイムアウト
ContextTimeout ミドルウェアは、リクエストの context.Context
に deadline を設定します。deadline を過ぎるとコンテキストがキャンセルされ、
c.Request().Context().Done() を監視しているハンドラは、最後まで実行されるのを待たずにすぐ戻れます。
下の例では、ミドルウェアが 5 秒のタイムアウトを適用します。一方、ハンドラは通常なら 10 秒かかるため、
リクエストは 408 Request Timeout を返します。
package main
import ( "context" "net/http" "time"
"github.com/labstack/echo/v5" "github.com/labstack/echo/v5/middleware")
func main() { // Echo instance e := echo.New()
// Middleware e.Use(middleware.ContextTimeout(5 * time.Second))
// Route => handler e.GET("/", func(c *echo.Context) error { select { case <-c.Request().Context().Done(): return echo.NewHTTPError(http.StatusRequestTimeout, "Request timed out") case <-time.After(10 * time.Second): return c.String(http.StatusOK, "Hello, World!\n") } })
// Start server sc := echo.StartConfig{Address: ":1323"} if err := sc.Start(context.Background(), e); err != nil { e.Logger.Error("failed to start server", "error", err) }}