middleware

package
v0.0.0-...-3eafb10 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Aug 31, 2023 License: MIT Imports: 28 Imported by: 2

README

Middleware

Middleware包实现基础eudore请求中间件。

Index Name Type 描述 备注
01 Admin 调试 相关组件管理后台 example
02 BasicAuth 拦截 basic认证 example nethttp
03 BodyLimit 拦截 限制请求body大小 example
04 Black 拦截 黑白名单 example nethttp api
05 Breaker 拦截 熔断器 example api groups
06 Cache 拦截 请求缓存 example example2 groups
07 Compress 辅助 响应压缩 example
08 ContextWarp 辅助 封装Context example
09 Cors 拦截 跨域处理 example
10 Csrf 拦截 CSRF token检查 example
11 Dump 调试 捕捉请求信息 example api
12 Header 追加 添加响应header信息 example
13 HeaderFilte 追加 过滤外部请求header example
14 Logger 追加 输出access日志 example
15 LoggerLevel 辅助 请求设置独立日志级别 example
16 Look 调试 路径访问对象 example
17 Pprof 调试 处理pprof响应 example
18 Rate 拦截 限速限流 限流 限速 nethttp限流 groups
19 Recover 追加 恢复panic example
20 Referer 拦截 referer校验 example
21 RequestID 追加 增加请求id example
22 Rewrite 辅助 请求路径修改 example nethttp
23 Router 辅助 路由自定义处理 example
24 RouterRewrite 辅助 重写请求路径 example
25 Timeout 其他 处理请求超时 example
26 其他 自定义中间件处理函数 example
27 Policy 其他 Pbac example
28 Promethues 其他 prometheus采集请求信息
29 OpenTelemetry 其他 otel记录请求信息
注入tracer

BasicAuth

实现请求BasicAuth访问认证

参数:

  • map[string]string 允许的用户名和密码的键值对map。

example:

app.AddMiddleware(middleware.NewBasicAuthFunc(map[string]string{"user": "pw"}))

BodyLimit

限制请求body大小

参数:

  • int64 指定限制body的长度

examole:

app.AddMiddleware(middleware.NewBodyLimitFunc(32 << 20))

Black

实现黑白名单管理及管理后台

参数:

  • map[string]bool 指明初始化使用的黑白名单,true为白白名单/false为黑名单
  • eudore.Router 为注入黑名单管理路由的路由器。

example:

app.AddMiddleware(middleware.NewBlackFunc(map[string]bool{
	"192.168.100.0/24": true,
	"192.168.75.0/30":  true,
	"192.168.1.100/30": true,
	"127.0.0.1/32":     true,
	"10.168.0.0/16":    true,
	"0.0.0.0/0":        false,
}, app.Group("/eudore/debug")))

Breaker

实现路由规则熔断

参数:

  • eudore.Router 属性:
  • MaxConsecutiveSuccesses uint32 最大连续成功次数
  • MaxConsecutiveFailures uint32 最大连续失败次数
  • OpenWait time.Duration 打开状态恢复到半开状态下等待时间
  • NewHalfOpen func(string) func() bool 创建一个路由规则半开状态下的限流函数

example:

app.AddMiddleware(middleware.NewBreakerFunc(app.Group("/eudore/debug")))

breaker := middleware.NewBreaker()
breaker.OpenWait = 0
app.AddMiddleware(breaker.NewBreakerFunc(app.Group("/eudore/debug")))

在关闭状态下连续错误一定次数后熔断器进入半开状态;在半开状态下请求将进入限流状态,半开连续错误一定次数后进入打开状态,半开连续成功一定次数后回到关闭状态;在进入关闭状态后等待一定时间后恢复到半开状态。

Cache

创建一个缓存中间件,对Get请求具有缓存和SingleFlight双重效果。

参数:

  • context.Context 控制默认cacheMap清理过期数据的生命周期
  • time.Duration 请求数据缓存时间,默认秒
  • cacheStore 缓存存储对象

example:

app.AddMiddleware(middleware.NewCacheFunc(time.Second*10, app.Context))

Compress

创建响应压缩中间件,默认提供gzip和deflate压缩 参数:

  • string 压缩名称
  • func() any 压缩器创建函数
  • int 压缩级别

example:

import: "github.com/andybalholm/brotli"
app.AddMiddleware(middleware.NewCompressMixinsFunc(nil))
app.AddMiddleware(middleware.NewCompressFunc("br", func() any { return brotli.NewWriter(ioutil.Discard) }))
app.AddMiddleware(middleware.NewCompressGzipFunc())
app.AddMiddleware(middleware.NewCompressDeflateFunc())

ContextWarp

使中间件之后的处理函数使用的eudore.Context对象为新的Context

参数:

  • func(eudore.Context) eudore.Context 指定ContextWarp使用的eudore.Context封装函数

example:

app.AddMiddleware(middleware.NewContextWarpFunc(newContextParams))
func newContextParams(ctx eudore.Context) eudore.Context {
	return contextParams{ctx}
}

Cors

跨域请求

参数:

  • []string 允许使用的origin,默认值为:[]string{"*"}
  • map[string]string CORS验证通过后给请求添加的协议headers,用来设置CORS控制信息

example:

app.AddMiddleware("global", middleware.NewCorsFunc([]string{"www.*.com", "example.com", "127.0.0.1:*"}, map[string]string{
	"Access-Control-Allow-Credentials": "true",
	"Access-Control-Allow-Headers":     "Authorization,DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,X-Parent-Id",
	"Access-Control-Expose-Headers":    "X-Request-Id",
	"access-control-allow-methods":     "GET, POST, PUT, DELETE, HEAD",
	"access-control-max-age":           "1000",
}))

Cors中间件注册不是全局中间件时,需要最后注册一次Options /*或404方法,否则Options请求匹配了默认404没有经过Cors中间件处理。

Csrf

校验设置CSRF token

参数:

  • any 指明获取csrf token的方法,下列是允许使用的值
    • "csrf"
    • "query: csrf"
    • "header: X-CSRF-Token"
    • "form: csrf"
    • func(ctx eudore.Context) string {return ctx.Query("csrf")}
    • nil
  • any 指明设置Cookie的基础信息,下列是允许使用的值
    • "csrf"
    • http.Cookie{Name: "csrf"}
    • nil

example:

app.AddMiddleware(middleware.NewCsrfFunc("csrf", nil))

Dump

截取请求信息的中间件,将匹配请求使用webscoket输出给客户端。

参数:

  • router参数是eudore.Router类型,然后注入拦截路由处理。

example:

app.AddMiddleware(middleware.NewDumpFunc(app.Group("/eudore/debug")))

Gzip

对请求响应body使用gzip压缩

参数:

  • int gzip压缩等级,非法值设置为5

example:

app.AddMiddleware(middleware.NewGzipFunc(5))

Header

添加响应Header

参数:

  • http.Header 需要添加的Header内存

examaple:

app.AddMiddleware(middleware.NewHeaderFunc(http.Header{
	"Cache-Control": []string{"no-cache"},
}))
app.AddMiddleware(middleware.NewHeaderWithSecureFunc(nil))

HeaderFilte

对来源于外部请求,过滤指定请求header

参数:

  • []string 指定内部ip,默认[]string{"10.0.0.0/8", "172.16.0.0/12", "192.0.0.0/24", "127.0.0.1"}
  • []string 指定需要过滤的请求header,默认[]string{HeaderXRealIP, HeaderXForwardedFor, HeaderXForwardedHost, HeaderXForwardedProto, HeaderXRequestID, HeaderXTraceID}

examaple:

	app.AddMiddleware(middleware.NewHeaderFilteFunc(nil, nil))
	app.AddMiddleware(middleware.NewHeaderFilteFunc([]string{"127.0.0.1"}, nil))

Logger

输出请求access logger并记录相关fields

参数:

  • eudore.App 指定App对象,需要使用App.Logger输出日志。
  • ...string 指定额外添加的Params值,如果值非空则会加入到access logger fields中

example:

app.AddMiddleware(middleware.NewLoggerFunc(app, "route"))

Rate

实现请求令牌桶限流/限速

参数:

  • int 每周期(默认秒)增加speed个令牌
  • int 最多拥有的令牌数量
  • ...any 额外使用的Options,根据类型来断言设置选项 context.Context => 控制cleanupVisitors退出的生命周期 time.Duration => 基础时间周期单位,默认秒 func(eudore.Context) string => 限流获取key的函数,默认Context.ReadIP

example:

// 限流 每秒一个请求,最多保存3个请求
app.AddMiddleware(middleware.NewRateRequestFunc(1, 3, app.Context))
// 限速 每秒32Kb流量,最多保存128Kb流量
app.AddMiddleware(middleware.NewRateSpeedFunc(32*1024, 128*1024, app.Context))

Recover

恢复panic抛出的错误,并输出日志、返回异常响应

example:

app.AddMiddleware(middleware.NewRecoverFunc())

Referer

检查请求Referer Header值是否有效

参数:

example:

app.AddMiddleware(middleware.NewRefererFunc(map[string]bool{
	"":                         true,
	"origin":                   false,
	"www.eudore.cn/*":          true,
	"www.eudore.cn/api/*":      false,
	"www.example.com/*":        true,
}))

RequestID

给请求、响应、日志设置一个请求ID

参数:

  • func() string 用于创建一个请求ID,默认使用时间戳随机数

example:

app.AddMiddleware(middleware.NewRequestIDFunc(nil))

Rewrite

重写请求路径,需要注册全局中间件

参数:

  • map[string]string 请求匹配模式对应的目标模式

example:

app.AddMiddleware("global", middleware.NewRewriteFunc(map[string]string{
	"/js/*":          "/public/js/$0",
	"/d/*":           "/d/$0-$0",
	"/api/v1/*":      "/api/v3/$0",
	"/api/v2/*":      "/api/v3/$0",
	"/help/history*": "/api/v3/history",
	"/help/history":  "/api/v3/history",
	"/help/*":        "$0",
}))

Router

用于执行额外的路由匹配行为

参数:

  • map[string]any 请求路径对应的执行函数,路径前缀不指定方法则为Any方法 example:
app.AddMiddleware(middleware.NewRouterFunc(map[string]any{
	"/api/:v/*": func(ctx eudore.Context) {
		ctx.Request().URL.Path = "/api/v3/" + ctx.GetParam("*")
	},
	"GET /api/:v/*": func(ctx eudore.Context) {
		ctx.WriteHeader(403)
		ctx.End()
	},
}))

RouterRewrite

基于Router中间件实现路由重写,参考Rewrite

example:

app.AddMiddleware("global", middleware.NewRouterRewriteFunc(map[string]string{
	"/js/*":          "/public/js/$0",
	"/d/*":           "/d/$0-$0",
	"/api/v1/*":      "/api/v3/$0",
	"/api/v2/*":      "/api/v3/$0",
	"/help/history*": "/api/v3/history",
	"/help/history":  "/api/v3/history",
	"/help/*":        "$0",
}))

Timeout

设置请求处理超时时间,如果超时返回503状态码并取消context,

实现难点:写入中超时状态码异常、panic栈无法捕捉信息异常、http.Header并发读写、sync.Pool回收了Context、Context数据竟态检测

Policy

goto github.com/eudore/eudore/policy

Prometheus

goto github.com/eudore/endpoint/prometheus

Opentracing

goto github.com/eudore/endpoint/opentracing

不将实现中间件及原因:

  • Casbin 接入太简单不具有技术含量,自行添加判断逻辑;不支持pbac实现。
  • Jwt 无明显效果,不如Context扩展实现相关功能。
  • Session 无明显效果,不如Context扩展实现相关功能。
  • Timing 核心入侵大,不如Trace。

Documentation

Overview

Package middleware 实现eudore基础请求中间件和处理函数。

BasicAuth

实现请求BasicAuth访问认证

参数:

map[string]string    允许的用户名和密码的键值对map。

example:

app.AddMiddleware(middleware.NewBasicAuthFunc(map[string]string{"user": "pw"}))

BodyLimit

限制请求body大小

参数:

int64		指定限制body的长度

examole:

app.AddMiddleware(middleware.NewBodyLimitFunc(32 << 20))

Black

实现黑白名单管理及管理后台

参数:

map[string]bool    指明初始化使用的黑白名单,true为白白名单/false为黑名单
eudore.Router      为注入黑名单管理路由的路由器。

example:

app.AddMiddleware(middleware.NewBlackFunc(map[string]bool{
	"192.168.100.0/24": true,
	"192.168.75.0/30":  true,
	"192.168.1.100/30": true,
	"127.0.0.1/32":     true,
	"10.168.0.0/16":    true,
	"0.0.0.0/0":        false,
}, app.Group("/eudore/debug")))

Breaker

实现路由规则熔断

参数:

eudore.Router

属性:

MaxConsecutiveSuccesses uint32                   最大连续成功次数
MaxConsecutiveFailures  uint32                   最大连续失败次数
OpenWait                time.Duration            打开状态恢复到半开状态下等待时间
NewHalfOpen             func(string) func() bool 创建一个路由规则半开状态下的限流函数

example:

app.AddMiddleware(middleware.NewBreakerFunc(app.Group("/eudore/debug")))

breaker := middleware.NewBreaker()
breaker.OpenWait = 0
app.AddMiddleware(breaker.NewBreakerFunc(app.Group("/eudore/debug")))

在关闭状态下连续错误一定次数后熔断器进入半开状态;在半开状态下请求将进入限流状态,半开连续错误一定次数后进入打开状态,半开连续成功一定次数后回到关闭状态;在进入关闭状态后等待一定时间后恢复到半开状态。

Cache

创建一个缓存中间件,对Get请求具有缓存和SingleFlight双重效果。

参数:

context.Context	控制默认cacheMap清理过期数据的生命周期
time.Duration	请求数据缓存时间,默认秒
cacheStore	缓存存储对象

example:

app.AddMiddleware(middleware.NewCacheFunc(time.Second*10, app.Context))

Compress

创建响应压缩中间件,默认提供gzip和deflate压缩 参数:

string	压缩名称
func() any 压缩器创建函数
int	压缩级别

example:

import: "github.com/andybalholm/brotli"
app.AddMiddleware(middleware.NewCompressMixinsFunc(nil))
app.AddMiddleware(middleware.NewCompressFunc("br", func() any { return brotli.NewWriter(io.Discard) }))
app.AddMiddleware(middleware.NewCompressGzipFunc())
app.AddMiddleware(middleware.NewCompressDeflateFunc())

ContextWarp

使中间件之后的处理函数使用的eudore.Context对象为新的Context

参数:

func(eudore.Context) eudore.Context    指定ContextWarp使用的eudore.Context封装函数

example:

app.AddMiddleware(middleware.NewContextWarpFunc(newContextParams))
func newContextParams(ctx eudore.Context) eudore.Context {
	return contextParams{ctx}
}

Cors

跨域请求

参数:

[]string             允许使用的origin,默认值为:[]string{"*"}
map[string]string    CORS验证通过后给请求添加的协议headers,用来设置CORS控制信息

example:

app.AddMiddleware("global", middleware.NewCorsFunc([]string{"www.*.com", "example.com", "127.0.0.1:*"}, map[string]string{
	"Access-Control-Allow-Credentials": "true",
	"Access-Control-Allow-Headers":     "Authorization,DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,X-Parent-Id",
	"Access-Control-Expose-Headers":    "X-Request-Id",
	"access-control-allow-methods":     "GET, POST, PUT, DELETE, HEAD",
	"access-control-max-age":           "1000",
}))

Cors中间件注册不是全局中间件时,需要最后注册一次Options /*或404方法,否则Options请求匹配了默认404没有经过Cors中间件处理。

Csrf

校验设置CSRF token

参数:

any    指明获取csrf token的方法,下列是允许使用的值
	- "csrf"
	- "query: csrf"
	- "header: X-CSRF-Token"
	- "form: csrf"
	- func(ctx eudore.Context) string {return ctx.Query("csrf")}
	- nil
any    指明设置Cookie的基础信息,下列是允许使用的值
	- "csrf"
	- http.Cookie{Name: "csrf"}
	- nil

example:

app.AddMiddleware(middleware.NewCsrfFunc("csrf", nil))

Dump

截取请求信息的中间件,将匹配请求使用webscoket输出给客户端。

参数:

router参数是eudore.Router类型,然后注入拦截路由处理。

example:

app.AddMiddleware(middleware.NewDumpFunc(app.Group("/eudore/debug")))

Header

添加响应Header

参数:

http.Header 	需要添加的Header内存

examaple:

app.AddMiddleware(middleware.NewHeaderFunc(http.Header{
	"Cache-Control": []string{"no-cache"},
}))
app.AddMiddleware(middleware.NewHeaderWithSecureFunc(nil))

HeaderFilte

对来源于外部ip请求,过滤指定请求header

参数:

[]string	指定内部ip,默认[]string{"10.0.0.0/8", "172.16.0.0/12", "192.0.0.0/24", "127.0.0.1"}
[]string	指定需要过滤的请求header,默认[]string{HeaderXRealIP, HeaderXForwardedFor, HeaderXForwardedHost, HeaderXForwardedProto, HeaderXRequestID, HeaderXTraceID}

examaple:

app.AddMiddleware(middleware.NewHeaderFilteFunc(nil, nil))
app.AddMiddleware(middleware.NewHeaderFilteFunc([]string{"127.0.0.1"}, nil))

Logger

输出请求access logger并记录相关fields

参数:

eudore.App    指定App对象,需要使用App.Logger输出日志。
...string     指定额外添加的Params值,如果值非空则会加入到access logger fields中

example:

app.AddMiddleware(middleware.NewLoggerFunc(app, "route"))

Rate

实现请求令牌桶限流

参数:

int       每周期(默认秒)增加speed个令牌
int       最多拥有的令牌数量
...any    额外使用的Options,根据类型来断言设置选项
	context.Context               =>    控制cleanupVisitors退出的生命周期
	time.Duration                 =>    基础时间周期单位,默认秒
	func(eudore.Context) string   =>    限流获取key的函数,默认Context.ReadIP

example:

// 限流 每秒一个请求,最多保存3个请求
app.AddMiddleware(middleware.NewRateRequestFunc(1, 3, app.Context))
// 限速 每秒32Kb流量,最多保存128Kb流量
app.AddMiddleware(middleware.NewRateSpeedFunc(32*1024, 128*1024, app.Context))

Recover

恢复panic抛出的错误,并输出日志、返回异常响应

example:

app.AddMiddleware(middleware.NewRecoverFunc())

Referer

检查请求Referer Header值是否有效

参数:

map[string]bool    设置referer值是否有效
	""                         =>    其他值未匹配时使用的默认值。
	"origin"                   =>    请求Referer和Host同源情况下,检查host为referer前缀,origin检查在其他值检查之前。
	"*"                        =>    任意域名端口
	"www.eudore.cn/*"          =>    www.eudore.cn域名全部请求,不指明http或https时为同时包含http和https
	"www.eudore.cn/api/*"      =>    www.eudore.cn域名全部/api/前缀的请求
	"https://www.eudore.cn/*"  =>    www.eudore.cn仅匹配https。

example:

app.AddMiddleware(middleware.NewRefererFunc(map[string]bool{
	"":                         true,
	"origin":                   false,
	"www.eudore.cn/*":          true,
	"www.eudore.cn/api/*":      false,
	"www.example.com/*":        true,
}))

RequestID

给请求、响应、日志设置一个请求ID

参数:

func() string     用于创建一个请求ID,默认使用时间戳随机数

example:

app.AddMiddleware(middleware.NewRequestIDFunc(nil))

Rewrite

重写请求路径,需要注册全局中间件

参数:

map[string]string    请求匹配模式对应的目标模式

example:

app.AddMiddleware("global", middleware.NewRewriteFunc(map[string]string{
	"/js/*":          "/public/js/$0",
	"/d/*":           "/d/$0-$0",
	"/api/v1/*":      "/api/v3/$0",
	"/api/v2/*":      "/api/v3/$0",
	"/help/history*": "/api/v3/history",
	"/help/history":  "/api/v3/history",
	"/help/*":        "$0",
}))

Router

用于执行额外的路由匹配行为

参数:

map[string]any    请求路径对应的执行函数,路径前缀不指定方法则为Any方法

example:

app.AddMiddleware(middleware.NewRouterFunc(map[string]any{
	"/api/:v/*": func(ctx eudore.Context) {
		ctx.Request().URL.Path = "/api/v3/" + ctx.GetParam("*")
	},
	"GET /api/:v/*": func(ctx eudore.Context) {
		ctx.WriteHeader(403)
		ctx.End()
	},
}))

RouterRewrite

基于Router中间件实现路由重写,参考Rewrite

example:

app.AddMiddleware("global", middleware.NewRouterRewriteFunc(map[string]string{
	"/js/*":          "/public/js/$0",
	"/d/*":           "/d/$0-$0",
	"/api/v1/*":      "/api/v3/$0",
	"/api/v2/*":      "/api/v3/$0",
	"/help/history*": "/api/v3/history",
	"/help/history":  "/api/v3/history",
	"/help/*":        "$0",
}))

Timeout

设置请求处理超时时间,如果超时返回503状态码并取消context,

实现难点:写入中超时状态码异常、panic栈无法捕捉信息异常、http.Header并发读写、sync.Pool回收了Context、Context数据竟态检测

Index

Constants

View Source
const (
	CompressBufferLength = 1024
	CompressStateUnknown = iota
	CompressStateBuffer
	CompressStateEnable
	CompressStateDisable
	CompressNameGzip     = "gzip"
	CompressNameBrotli   = "br"
	CompressNameDeflate  = "deflate"
	CompressNameIdentity = "identity"
	MimeValueJSON        = "value/json"
	MimeValueHTML        = "value/html"
	MimeValueText        = "value/text"
	QueryFormatJSON      = "json"
	QueryFormatHTML      = "html"
	QueryFormatText      = "text"
)

Variables

View Source
var (
	// DefaultBlackInvalidAddress 定义解析无效地址时使用的默认地址,127.0.0.2。
	DefaultBlackInvalidAddress uint64 = 2130706434
	DefaultCacheSaveTime              = time.Second * 10
	// DefaultComoressBrotliFunc 指定brotli压缩构造函数。
	//
	// import "github.com/andybalholm/brotli"
	//
	// middleware.DefaultComoressBrotliFunc = func() any {return brotli.NewWriter(io.Discard)} .
	DefaultComoressBrotliFunc  func() any
	DefaultComoressDisableMime = map[string]bool{
		"application/gzip":             true,
		"application/zip":              true,
		"application/x-compressed-tar": true,
		"application/x-7z-compressed":  true,
		"application/x-rar-compressed": true,
		"image/gif":                    true,
		"image/jpeg":                   true,
		"image/png":                    true,
		"image/svg+xml":                true,
		"image/webp":                   true,
		"font/woff2":                   true,
	}

	DefaultPprofHandlers = map[string]http.Handler{
		"cmdline":      http.HandlerFunc(pprof.Cmdline),
		"profile":      http.HandlerFunc(pprof.Profile),
		"symbol":       http.HandlerFunc(pprof.Symbol),
		"trace":        http.HandlerFunc(pprof.Trace),
		"allocs":       pprof.Handler("allocs"),
		"block":        pprof.Handler("block"),
		"heap":         pprof.Handler("heap"),
		"mutex":        pprof.Handler("mutex"),
		"threadcreate": pprof.Handler("threadcreate"),
	}

	ErrRateReadWaitLong  = errors.New("if the github.com/eudore/eudore/middleware speed limit waiting time is too long, it will time out")
	ErrRateWriteWaitLong = errors.New("if the github.com/eudore/eudore/middleware speed limit waits for write time is too long, it will wait for timeout")
)
View Source
var AdminStatic = adminStatic

AdminStatic 定义admin.html内容

View Source
var BreakerStatues = []string{"closed", "half-open", "open"}

BreakerStatues 定义熔断状态字符串。

Functions

func HandlerAdmin

func HandlerAdmin(ctx eudore.Context)

HandlerAdmin 函数返回Admin UI界面。

func HandlerExpvar

func HandlerExpvar(ctx eudore.Context)

HandlerExpvar 方法实现expvar处理。

func HandlerPporfIndex

func HandlerPporfIndex(ctx eudore.Context)

HandlerPporfIndex 函数处理pprof index页面,返回index消息,响应format=text/json/html三种格式。

func HandlerPprof

func HandlerPprof(ctx eudore.Context)

HandlerPprof 处理pprof请求,路由注册路径必须以/*结尾,使用*获取处理函数。

func HandlerPprofGoroutine

func HandlerPprofGoroutine(ctx eudore.Context)

HandlerPprofGoroutine 函数处理pprof Goroutine数据,响应format=text/json/html三种格式。

func NewBasicAuthFunc

func NewBasicAuthFunc(names map[string]string) eudore.HandlerFunc

NewBasicAuthFunc 创建一个Basic auth认证中间件。

names为保存用户密码的map。

注意: BasicAuth需要放置在CORS之后。

func NewBindLook

func NewBindLook(renders map[string]eudore.HandlerDataFunc) eudore.HandlerDataFunc

NewBindLook 函数创建支持look value的eudore.NewRenders。

func NewBlackFunc

func NewBlackFunc(data map[string]bool, router eudore.Router) eudore.HandlerFunc

NewBlackFunc 函数创建一个黑名单处理函数,传入map[string]bool类型参数记录初始化使用的黑/白名单,白名单值为true/黑名单值为false。

func NewBodyLimitFunc

func NewBodyLimitFunc(size int64) eudore.HandlerFunc

NewBodyLimitFunc 函数创建显示请求body长度的处理中间件。

func NewBreakerFunc

func NewBreakerFunc(router eudore.Router) eudore.HandlerFunc

NewBreakerFunc 函数创建一个路由熔断器处理函数。

func NewCacheFunc

func NewCacheFunc(args ...any) eudore.HandlerFunc

NewCacheFunc 函数创建一个缓存中间件,对Get请求具有缓存和SingleFlight双重效果, 无法获得中间件之前的响应header数据。

options:

context.Context               =>    控制默认cacheMap清理过期数据的生命周期。
time.Duration                 =>    请求数据缓存时间,默认秒。
func(eudore.Context) string   =>    自定义缓存key,为空则跳过缓存。
CacheStore			          =>    缓存存储对象。

func NewCompressDeflateFunc

func NewCompressDeflateFunc() eudore.HandlerFunc

NewCompressDeflateFunc 函数创建一个deflate压缩处理函数。

func NewCompressFunc

func NewCompressFunc(name string, fn func() any) eudore.HandlerFunc

NewCompressFunc 函数创建一个压缩处理函数,需要指定压缩算法和压缩对象构造函数。

func NewCompressGzipFunc

func NewCompressGzipFunc() eudore.HandlerFunc

NewCompressGzipFunc 函数创建一个gzip压缩处理函数。

func NewCompressMixinsFunc

func NewCompressMixinsFunc(compresss map[string]func() any) eudore.HandlerFunc

NewCompressMixinsFunc 函数创建一个混合压缩处理函数,默认具有gzip、defalte。

如果压缩ResponseWriter.Size()值为压缩后size。

如果设置middleware.DefaultComoressBrotliFunc指定brotli压缩函数,追加br压缩。

HeaderAcceptEncoding值忽略非零权重值,顺序优先。

func NewContextWarpFunc

func NewContextWarpFunc(fn func(eudore.Context) eudore.Context) eudore.HandlerFunc

NewContextWarpFunc 函数中间件使之后的处理函数使用的eudore.Context对象为新的Context。

装饰器下可以直接对Context进行包装, 而责任链下无法修改Context主体故设计该中间件作为中间件执行机制补充。

func NewCorsFunc

func NewCorsFunc(pattens []string, headers map[string]string) eudore.HandlerFunc

NewCorsFunc 函数创建一个Cors处理函数。

pattens是允许的origin,headers是跨域验证成功的添加的headers,例如:"Access-Control-Allow-Credentials"、"Access-Control-Allow-Headers"等。

如果pattens为空,允许任意origin。 如果Access-Control-Allow-Methods header为空,设置为*。

Cors中间件注册不是全局中间件时,需要最后注册一次Options /*或404方法,否则Options请求匹配了默认404没有经过Cors中间件处理。

func NewCsrfFunc

func NewCsrfFunc(key, cookie any) eudore.HandlerFunc

NewCsrfFunc 函数创建一个Csrf处理函数,key指定请求带有crsf参数的关键字,cookie是csrf设置cookie的基本详细。

key value:

"csrf"
"query: csrf"
"header: X-CSRF-Token"
"form: csrf"
func(ctx eudore.Context) string {return ctx.Query("csrf")}
nil

cookie value:

"csrf"
http.Cookie{Name: "csrf"}
nil

func NewDumpFunc

func NewDumpFunc(router eudore.Router) eudore.HandlerFunc

NewDumpFunc 函数创建一个截取请求信息的中间件,将匹配请求使用webscoket输出给客户端。

router参数是eudore.Router类型,然后注入拦截路由处理。

注意:dump在集群模式下只能连接到一个server。

func NewHalfOpenTicker

func NewHalfOpenTicker(t time.Duration) func(string) func() bool

NewHalfOpenTicker 函数创建一个方法再半开状态下,周期允许通过一个请求。

func NewHeaderFilteFunc

func NewHeaderFilteFunc(iplist, names []string) eudore.HandlerFunc

NewHeaderFilteFunc 函数创建请求header过滤中间件,对来源于外部ip请求,过滤指定header。

func NewHeaderFunc

func NewHeaderFunc(h http.Header) eudore.HandlerFunc

NewHeaderFunc 函数创建响应header写入中间件。

func NewHeaderWithSecureFunc

func NewHeaderWithSecureFunc(h http.Header) eudore.HandlerFunc

NewHeaderWithSecureFunc 函数创建响应header写入中间件,并额外附加基本安全header。

func NewLoggerFunc

func NewLoggerFunc(log eudore.Logger, params ...string) eudore.HandlerFunc

NewLoggerFunc 函数创建一个请求日志记录中间件。

log参数设置用于输出eudore.Logger, params获取Context.Params如果不为空则添加到输出日志条目中

状态码如果为50x输出日志级别为Error。

func NewLoggerLevelFunc

func NewLoggerLevelFunc(fn func(ctx eudore.Context) int) eudore.HandlerFunc

NewLoggerLevelFunc 函数创建一个设置一次请求日志级别的中间件。

通过一个函数处理请求,返回一个0-4,代表日志级别Debug-Fatal,默认处理函数使用debug参数转换成日志级别数字。

func NewLookFunc

func NewLookFunc(data any) eudore.HandlerFunc

NewLookFunc 函数创建一个访问对象数据处理函数。

如果参数类型为func(eudore.Context) any,可以动态返回需要渲染的数据。

获取请求路由参数"*"为object访问路径,返回object指定属性的数据,允许使用下列参数:

d=10 depth递归显时最大层数;
all=false 是否显时非导出属性;
format=html/json/text 设置数据显示格式;
godoc=https://golang.org 设置html格式链接的godoc服务地址;
width=60 设置html格式缩进宽度。

func NewNetHTTPBasicAuthFunc

func NewNetHTTPBasicAuthFunc(next http.Handler, names map[string]string) http.HandlerFunc

NewNetHTTPBasicAuthFunc 函数创建一个net/http BasicAuth中间件处理函数,文档见NewBasicAuthFunc函数。

func NewNetHTTPBlackFunc

func NewNetHTTPBlackFunc(next http.Handler, data map[string]bool) http.HandlerFunc

NewNetHTTPBlackFunc 函数创建一个net/http黑名单中间件处理函数,文档见NewBlackFunc函数。

func NewNetHTTPBodyLimitFunc

func NewNetHTTPBodyLimitFunc(next http.Handler, size int64) http.HandlerFunc

NewNetHTTPBodyLimitFunc 函数创建一个net/http BodyLimt中间件处理函数,优化NoBody和Size。

func NewNetHTTPRateRequestFunc

func NewNetHTTPRateRequestFunc(next http.Handler, speed, max int64, options ...any) http.HandlerFunc

NewNetHTTPRateRequestFunc 函数创建一个net/http限流中间件处理函数,文档见NewRateFunc函数。

func NewNetHTTPRewriteFunc

func NewNetHTTPRewriteFunc(next http.Handler, data map[string]string) http.HandlerFunc

NewNetHTTPRewriteFunc 函数创建一个net/http路径重写中间件处理函数,文档见NewRewriteFunc函数。

func NewRateRequestFunc

func NewRateRequestFunc(speed, max int64, options ...any) eudore.HandlerFunc

NewRateRequestFunc 返回一个限流处理函数。

每周期(默认秒)增加speed个令牌,最多拥有max个。

options:

context.Context => 控制cleanupVisitors退出的生命周期

time.Duration => 基础时间周期单位,默认秒

func(eudore.Context) string => 限流获取key的函数,默认Context.ReadIP。

func NewRateSpeedFunc

func NewRateSpeedFunc(speed, max int64, options ...any) eudore.HandlerFunc

NewRateSpeedFunc 函数创建一个限速处理函数,不区分上下行流量。

speed为速度(byte),max为默认初始化流量值,参数参考NewRateRequestFunc。

speed速度不要小于通常Reader的缓冲区大小(最好大于4kB 4096),否则无法请求到住够的令牌导致阻塞。

Read时先请求缓冲区大小数量的令牌,然后返还未使用的令牌数量;Write时请求写入数据长度数量的令牌。

func NewRecoverFunc

func NewRecoverFunc() eudore.HandlerFunc

NewRecoverFunc 函数创建一个错误捕捉中间件,并返回500。

func NewRefererFunc

func NewRefererFunc(data map[string]bool) eudore.HandlerFunc

NewRefererFunc 函数创建Referer header检查中间件,如果不指定协议匹配http和https,默认拒绝。

阅览器发送Referer值受html meta name referrer和Response Header Referrer-Policy影响。

"origin" => 请求Referer和Host同源情况下,检查host为referer前缀,origin检查在其他值检查之前。

"*" => 任意域名端口,包含无Referer值。

"www.eudore.cn/*" => www.eudore.cn域名全部请求,不指明http或https时为同时包含http和https。

"www.eudore.cn:*/*" => www.eudore.cn任意端口的全部请求,不包含没有指明端口的情况。

"www.eudore.cn/api/*" => www.eudore.cn域名全部/api/前缀的请求。

"https://www.eudore.cn/*" => www.eudore.cn仅匹配https。

func NewRequestIDFunc

func NewRequestIDFunc(fn func(eudore.Context) string) eudore.HandlerFunc

NewRequestIDFunc 函数创建一个请求ID注入处理函数,不给定请求ID创建函数, 默认使用时间戳和随机数,会将request-id写入协议和附加到日志field。

func NewRewriteFunc

func NewRewriteFunc(data map[string]string) eudore.HandlerFunc

NewRewriteFunc 函数创建一个请求路径重写处理函数,当前默认使用树匹配实现。

匹配路径中使用'*'代表当前位置到下一个'/'匹配内容,如果'*'在结尾表示任意字符串

目标路径中$0到$9表示匹配路径中'*'出现位置匹配到的字符串,最多匹配10个'*',否在解析错误。

"/js/*" => "/public/js*"

"/api/v1/*" => "/api/v3/$0"

"/api/v1/users/*/orders/*" => "/api/v3/user/$0/order/$1"

"/d/*" => "/d/$0-$0"

若运行出现`panic: runtime error: index out of range`,请检测'$?'的值是否超出了'*'数量。

func NewRouterFunc

func NewRouterFunc(data map[string]any) eudore.HandlerFunc

NewRouterFunc 函数创建一个路由器中间件,将根据路由路径匹配执行对应的多个处理函数。

如果key为"router",val类型为eudore.Router,则使用改路由器处理请求。

func NewRouterRewriteFunc

func NewRouterRewriteFunc(data map[string]string) eudore.HandlerFunc

NewRouterRewriteFunc 函数创建一个根据Router中间件实现的请求路径重写中间件。

RouterRewrite中间件使用参数和Rewrite中间件完全相同。

func RenderValueHTML

func RenderValueHTML(ctx eudore.Context, data any) error

RenderValueHTML 实现渲染Value为HTML格式。

func RenderValueJSON

func RenderValueJSON(ctx eudore.Context, data any) error

RenderValueJSON 实现渲染Value为JSON格式。

func RenderValueText

func RenderValueText(ctx eudore.Context, data any) error

RenderValueText 实现渲染Value为Text格式。

Types

type BlackInfo

type BlackInfo struct {
	Addr  string `alias:"addr" json:"addr"`
	Mask  uint64 `alias:"mask" json:"mask"`
	Count uint64 `alias:"count" json:"count"`
}

BlackInfo 定义黑名单规则信息。

type BlackNode

type BlackNode struct {
	Childrens [2]*BlackNode
	Data      bool
	Count     uint64
}

BlackNode 定义黑名单存储树节点。

func (*BlackNode) DeleteAll

func (node *BlackNode) DeleteAll(ipstr string)

DeleteAll 方法给黑名单节点删除一个ip或ip段包全部子网段。

func (*BlackNode) Insert

func (node *BlackNode) Insert(ipstr string)

Insert 方法给黑名单节点新增一个ip或ip段。

func (*BlackNode) List

func (node *BlackNode) List(data []BlackInfo, prefix, bit uint64) []BlackInfo

List 方法递归获取全部黑名单规则信息。

func (*BlackNode) Look

func (node *BlackNode) Look(ip uint64) bool

Look 方法匹配ip是否在黑名单节点,命中则节点计数加一。

type Breaker

type Breaker struct {
	sync.RWMutex            `json:"-"`
	Index                   int                      `json:"index"`
	Mapping                 map[int]string           `json:"mapping"`
	Routes                  map[string]*breakRoute   `json:"routes"`
	MaxConsecutiveSuccesses uint32                   `json:"maxconsecutivesuccesses"`
	MaxConsecutiveFailures  uint32                   `json:"maxconsecutivefailures"`
	OpenWait                time.Duration            `json:"openwait"`
	NewHalfOpen             func(string) func() bool `json:"-"`
}

Breaker 定义熔断器。

func NewBreaker

func NewBreaker() *Breaker

NewBreaker 函数创建一个熔断器

注意:breaker在集群模式下只能操作一个server。

func (*Breaker) NewBreakerFunc

func (b *Breaker) NewBreakerFunc(router eudore.Router) eudore.HandlerFunc

NewBreakerFunc 方法定义熔断器处理eudore请求上下文函数。

type BreakerState

type BreakerState int8

BreakerState 是熔断器状态。

const (
	BreakerStatueClosed BreakerState = iota
	BreakerStatueHalfOpen
	BreakerStatueOpen
)

定义熔断器状态。

func (BreakerState) MarshalText

func (state BreakerState) MarshalText() (text []byte, err error)

MarshalText 方法实现encoding.TextMarshaler接口。

func (BreakerState) String

func (state BreakerState) String() string

String 方法实现string接口。

type CacheData

type CacheData struct {
	Expired      time.Time
	ModifiedTime string
	Status       int
	Header       http.Header
	Body         []byte
}

CacheData 定义缓存的数据类型。

type CacheStore

type CacheStore interface {
	Load(string) *CacheData
	Store(string, *CacheData)
}

type LookConfig

type LookConfig struct {
	Depth   int                  `json:"-"`
	ShowAll bool                 `json:"-"`
	Godoc   string               `json:"-"`
	Refs    map[uintptr]struct{} `json:"-"`
}

LookConfig 定义属性遍历的配置。

type LookValue

type LookValue struct {
	*LookConfig `json:"-"`
	Kind        string      `json:"kind"`
	Package     string      `json:"package,omitempty"`
	Name        string      `json:"name,omitempty"`
	Value       any         `json:"value,omitempty"`
	String      string      `json:"string,omitempty"`
	Pointer     uintptr     `json:"pointer,omitempty"`
	Elem        *LookValue  `json:"elem,omitempty"`
	Keys        []string    `json:"keys,omitempty"`
	Vals        []LookValue `json:"vals,omitempty"`
}

LookValue 定义数据的每一项属性。

func NewLookValue

func NewLookValue(ctx eudore.Context) *LookValue

NewLookValue 方法从请求上下文成就一个默认配置的LookValue。

func (*LookValue) Scan

func (look *LookValue) Scan(iValue reflect.Value)

Scan 方法扫描属性并保存。

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL