源码索引 / CURRENT IMPLEMENTATION
learning/go-patterns/patterns/middleware/middleware.go
59 行 · 点击行号可定位;函数链接随声明位置更新,不手填行号。
跳到函数 / 声明
// Package middleware demonstrates function-based handler composition.
package middleware
import "maps"
// Request is the input passed through a handler chain.
type Request struct {
Path string
}
// Response is the value returned by a handler chain.
type Response struct {
Status int
Body string
Headers map[string]string
}
// Handler handles a request.
type Handler func(Request) Response
// Middleware wraps a Handler with cross-cutting behavior.
type Middleware func(Handler) Handler
// Chain applies middleware so the first item is the outermost wrapper.
func Chain(endpoint Handler, middleware ...Middleware) Handler {
for i := len(middleware) - 1; i >= 0; i-- {
if middleware[i] != nil {
endpoint = middleware[i](endpoint)
}
}
return endpoint
}
// PrefixBody adds a deterministic prefix to a successful or failed response.
func PrefixBody(prefix string) Middleware {
return func(next Handler) Handler {
return func(request Request) Response {
response := next(request)
response.Body = prefix + ":" + response.Body
return response
}
}
}
// AddHeader adds or replaces one response header while preserving headers set
// by the endpoint and inner middleware.
func AddHeader(name, value string) Middleware {
return func(next Handler) Handler {
return func(request Request) Response {
response := next(request)
response.Headers = maps.Clone(response.Headers)
if response.Headers == nil {
response.Headers = make(map[string]string)
}
response.Headers[name] = value
return response
}
}
}