Loading documentation...
Loading documentation...
Loading documentation...
Generates ETag headers for responses and handles If-None-Match requests. Returns 304 Not Modified when appropriate.
// Strong ETags
s.Use(middleware.ETag())
// Weak ETags
s.Use(middleware.ETagWeak())s.Use(middleware.ETagWithConfig(middleware.ETagConfig{
Weak: false, // Strong ETags
SkipFunc: func(r *http.Request) bool {
// Skip ETag for dynamic content
return r.URL.Path == "/api/dynamic"
},
}))If-None-Match headerIf-None-Match header from requestStrong ETags (default):
"abc123..."Weak ETags:
W/"abc123..."// Strong ETags (default)
s.Use(middleware.ETag())
// Weak ETags
s.Use(middleware.ETagWeak())Skip ETag generation for dynamic content:
s.Use(middleware.ETagWithConfig(middleware.ETagConfig{
SkipFunc: func(r *http.Request) bool {
// Skip for dynamic or personalized content
return r.URL.Path == "/api/user/profile" ||
r.URL.Path == "/api/dynamic"
},
}))Generate ETags manually:
// Generate ETag from content
etag := middleware.ETagFromContent([]byte("content"), false)
// Generate ETag from string
etag := middleware.ETagFromString("content", false)
// Generate ETag from version number
etag := middleware.ETagFromVersion(123, false)Clients can use ETags for caching:
GET /api/users HTTP/1.1
If-None-Match: "abc123def456"If content hasn't changed, server responds:
HTTP/1.1 304 Not Modified
ETag: "abc123def456"s := helix.New(nil)
// Enable ETag for all GET requests
s.Use(middleware.ETag())
// Handler that benefits from ETag
s.GET("/api/users", helix.HandleCtx(func(c *helix.Ctx) error {
users, err := userService.List(c.Context())
if err != nil {
return err
}
// ETag is automatically generated and checked
return c.OK(users)
}))Generates ETag headers for responses and handles If-None-Match requests. Returns 304 Not Modified when appropriate.
// Strong ETags
s.Use(middleware.ETag())
// Weak ETags
s.Use(middleware.ETagWeak())s.Use(middleware.ETagWithConfig(middleware.ETagConfig{
Weak: false, // Strong ETags
SkipFunc: func(r *http.Request) bool {
// Skip ETag for dynamic content
return r.URL.Path == "/api/dynamic"
},
}))If-None-Match headerIf-None-Match header from requestStrong ETags (default):
"abc123..."Weak ETags:
W/"abc123..."// Strong ETags (default)
s.Use(middleware.ETag())
// Weak ETags
s.Use(middleware.ETagWeak())Skip ETag generation for dynamic content:
s.Use(middleware.ETagWithConfig(middleware.ETagConfig{
SkipFunc: func(r *http.Request) bool {
// Skip for dynamic or personalized content
return r.URL.Path == "/api/user/profile" ||
r.URL.Path == "/api/dynamic"
},
}))Generate ETags manually:
// Generate ETag from content
etag := middleware.ETagFromContent([]byte("content"), false)
// Generate ETag from string
etag := middleware.ETagFromString("content", false)
// Generate ETag from version number
etag := middleware.ETagFromVersion(123, false)Clients can use ETags for caching:
GET /api/users HTTP/1.1
If-None-Match: "abc123def456"If content hasn't changed, server responds:
HTTP/1.1 304 Not Modified
ETag: "abc123def456"s := helix.New(nil)
// Enable ETag for all GET requests
s.Use(middleware.ETag())
// Handler that benefits from ETag
s.GET("/api/users", helix.HandleCtx(func(c *helix.Ctx) error {
users, err := userService.List(c.Context())
if err != nil {
return err
}
// ETag is automatically generated and checked
return c.OK(users)
}))// Strong ETags
s.Use(middleware.ETag())
// Weak ETags
s.Use(middleware.ETagWeak())s.Use(middleware.ETagWithConfig(middleware.ETagConfig{
Weak: false, // Strong ETags
SkipFunc: func(r *http.Request) bool {
// Skip ETag for dynamic content
return r.URL.Path == "/api/dynamic"
},
}))// Strong ETags (default)
s.Use(middleware.ETag())
// Weak ETags
s.Use(middleware.ETagWeak())s.Use(middleware.ETagWithConfig(middleware.ETagConfig{
SkipFunc: func(r *http.Request) bool {
// Skip for dynamic or personalized content
return r.URL.Path == "/api/user/profile" ||
r.URL.Path == "/api/dynamic"
},
}))// Generate ETag from content
etag := middleware.ETagFromContent([]byte("content"), false)
// Generate ETag from string
etag := middleware.ETagFromString("content", false)
// Generate ETag from version number
etag := middleware.ETagFromVersion(123, false)GET /api/users HTTP/1.1
If-None-Match: "abc123def456"HTTP/1.1 304 Not Modified
ETag: "abc123def456"s := helix.New(nil)
// Enable ETag for all GET requests
s.Use(middleware.ETag())
// Handler that benefits from ETag
s.GET("/api/users", helix.HandleCtx(func(c *helix.Ctx) error {
users, err := userService.List(c.Context())
if err != nil {
return err
}
// ETag is automatically generated and checked
return c.OK(users)
}))// Strong ETags
s.Use(middleware.ETag())
// Weak ETags
s.Use(middleware.ETagWeak())s.Use(middleware.ETagWithConfig(middleware.ETagConfig{
Weak: false, // Strong ETags
SkipFunc: func(r *http.Request) bool {
// Skip ETag for dynamic content
return r.URL.Path == "/api/dynamic"
},
}))// Strong ETags (default)
s.Use(middleware.ETag())
// Weak ETags
s.Use(middleware.ETagWeak())s.Use(middleware.ETagWithConfig(middleware.ETagConfig{
SkipFunc: func(r *http.Request) bool {
// Skip for dynamic or personalized content
return r.URL.Path == "/api/user/profile" ||
r.URL.Path == "/api/dynamic"
},
}))// Generate ETag from content
etag := middleware.ETagFromContent([]byte("content"), false)
// Generate ETag from string
etag := middleware.ETagFromString("content", false)
// Generate ETag from version number
etag := middleware.ETagFromVersion(123, false)GET /api/users HTTP/1.1
If-None-Match: "abc123def456"HTTP/1.1 304 Not Modified
ETag: "abc123def456"s := helix.New(nil)
// Enable ETag for all GET requests
s.Use(middleware.ETag())
// Handler that benefits from ETag
s.GET("/api/users", helix.HandleCtx(func(c *helix.Ctx) error {
users, err := userService.List(c.Context())
if err != nil {
return err
}
// ETag is automatically generated and checked
return c.OK(users)
}))