PPysolate SpineREAD THE CODE · UNDERSTAND THE SYSTEM
课程与章节
源码索引 / 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
		}
	}
}