ETag
ETag.The ETag (or entity tag) HTTP response header is an identifier for a specific version of a resource. It lets caches be more efficient and save bandwidth, as a web server does not need to resend a full response if the content was not changed. Additionally, etags help to prevent simultaneous updates of a resource from overwriting each other (“mid-air collisions”).
Hertz also provides Etag middleware that can operate on ETag, inspired by fiber’s implementation.
Install
Download and install
go get github.com/hertz-contrib/etag
Import into your code
import "github.com/hertz-contrib/etag"
Example
package main
import (
"context"
"net/http"
"github.com/cloudwego/hertz/pkg/app"
"github.com/cloudwego/hertz/pkg/app/server"
"github.com/hertz-contrib/etag"
)
func main() {
h := server.Default()
h.Use(etag.New())
h.GET("/ping", func(ctx context.Context, c *app.RequestContext) {
c.String(http.StatusOK, "pong")
})
h.Spin()
}
Configuration
| Configuration | Default | Description |
|---|---|---|
| WithWeak | false | Enable weak validator |
| WithNext | nil | Defines a function to skip etag middleware when return is true |
| WithGenerator | nil | Custom etag generation logic |
WithWeak
WithWeak will enable weak validator for ETag.
Function Signature:
func WithWeak() Option
Sample Code:
package main
import (
"context"
"net/http"
"github.com/cloudwego/hertz/pkg/app"
"github.com/cloudwego/hertz/pkg/app/server"
"github.com/hertz-contrib/etag"
)
func main() {
h := server.Default()
h.Use(etag.New(etag.WithWeak()))
h.GET("/ping", func(ctx context.Context, c *app.RequestContext) {
c.String(http.StatusOK, "pong")
})
h.Spin()
}
WithNext
WithNext will skip etag middleware when the defined function returns true.
Function Signature:
func WithNext(next NextFunc) Option
Sample Code:
package main
import (
"context"
"net/http"
"github.com/cloudwego/hertz/pkg/app"
"github.com/cloudwego/hertz/pkg/app/server"
"github.com/hertz-contrib/etag"
)
func main() {
h := server.Default()
h.Use(etag.New(etag.WithNext(
func(ctx context.Context, c *app.RequestContext) bool {
if string(c.Method()) == http.MethodPost {
return true
} else {
return false
}
},
)))
h.GET("/ping", func(ctx context.Context, c *app.RequestContext) {
c.String(http.StatusOK, "pong")
})
h.Spin()
}
WithGenerator
WithGenerator will replace default ETag generation with yours.
Note: you should not add W/ prefix to your custom ETag when used with WithWeak.
Function Signature:
func WithGenerator(gen Generator) Option
Sample Code:
package main
import (
"context"
"net/http"
"github.com/cloudwego/hertz/pkg/app"
"github.com/cloudwego/hertz/pkg/app/server"
"github.com/hertz-contrib/etag"
)
func main() {
h := server.Default()
h.Use(etag.New(etag.WithGenerator(
func(ctx context.Context, c *app.RequestContext) []byte {
return []byte("my-custom-etag")
},
)))
h.GET("/ping", func(ctx context.Context, c *app.RequestContext) {
c.String(http.StatusOK, "pong")
})
h.Spin()
}
Full Example
Refer to the etag/example for full usage examples.