fix both modify
This commit is contained in:
commit
8da2c61aa8
@ -14,6 +14,8 @@ var (
|
|||||||
TraceIDField = "trace_id"
|
TraceIDField = "trace_id"
|
||||||
// StartRequestTimeField 开始请求时间字段
|
// StartRequestTimeField 开始请求时间字段
|
||||||
StartRequestTimeField = "start_request_time"
|
StartRequestTimeField = "start_request_time"
|
||||||
|
// FinishRequestTimeField 完成请求时间
|
||||||
|
FinishRequestTimeField = "finish_request_time"
|
||||||
// ResponseCodeField 响应状态码字段
|
// ResponseCodeField 响应状态码字段
|
||||||
ResponseCodeField = "code"
|
ResponseCodeField = "code"
|
||||||
// ResponseMessageField 响应信息字段
|
// ResponseMessageField 响应信息字段
|
||||||
@ -26,6 +28,10 @@ var (
|
|||||||
ResponseTraceIDField = "trace_id"
|
ResponseTraceIDField = "trace_id"
|
||||||
// ResponseRequestIDField 响应的请求ID字段
|
// ResponseRequestIDField 响应的请求ID字段
|
||||||
ResponseRequestIDField = "request_id"
|
ResponseRequestIDField = "request_id"
|
||||||
|
// RecordResponseDataField 记录响应数据到上下文
|
||||||
|
RecordResponseDataField = "pkg_gin_record_response_data"
|
||||||
|
// RecordRequestDataField 记录请求数据到上下文
|
||||||
|
RecordRequestDataField = "pkg_gin_record_request_data"
|
||||||
)
|
)
|
||||||
|
|
||||||
// HttpHandleConfig 请求处理配置
|
// HttpHandleConfig 请求处理配置
|
||||||
|
23
go.mod
23
go.mod
@ -2,29 +2,42 @@ module git.zhangdeman.cn/zhangdeman/gin
|
|||||||
|
|
||||||
go 1.17
|
go 1.17
|
||||||
|
|
||||||
require git.zhangdeman.cn/zhangdeman/exception v0.0.0-20220703050824-0679ce509241
|
require (
|
||||||
|
git.zhangdeman.cn/zhangdeman/exception v0.0.0-20220703050824-0679ce509241
|
||||||
|
git.zhangdeman.cn/zhangdeman/util v0.0.0-20220714054940-3cfcad0c6547
|
||||||
|
github.com/gin-gonic/gin v1.8.1
|
||||||
|
)
|
||||||
|
|
||||||
require (
|
require (
|
||||||
git.zhangdeman.cn/zhangdeman/util v0.0.0-20220625151616-cfe1f4c04db4 // indirect
|
github.com/Jeffail/gabs v1.4.0 // indirect
|
||||||
github.com/gin-gonic/gin v1.8.1 // indirect
|
github.com/axgle/mahonia v0.0.0-20180208002826-3358181d7394 // indirect
|
||||||
|
github.com/gin-contrib/sse v0.1.0 // indirect
|
||||||
|
github.com/go-ini/ini v1.66.6 // indirect
|
||||||
github.com/go-playground/locales v0.14.0 // indirect
|
github.com/go-playground/locales v0.14.0 // indirect
|
||||||
github.com/go-playground/universal-translator v0.18.0 // indirect
|
github.com/go-playground/universal-translator v0.18.0 // indirect
|
||||||
github.com/go-playground/validator/v10 v10.10.0 // indirect
|
github.com/go-playground/validator/v10 v10.10.0 // indirect
|
||||||
github.com/goccy/go-json v0.9.7 // indirect
|
github.com/goccy/go-json v0.9.7 // indirect
|
||||||
github.com/json-iterator/go v1.1.12 // indirect
|
github.com/json-iterator/go v1.1.12 // indirect
|
||||||
github.com/leodido/go-urn v1.2.1 // indirect
|
github.com/leodido/go-urn v1.2.1 // indirect
|
||||||
github.com/manucorporat/sse v0.0.0-20160126180136-ee05b128a739 // indirect
|
github.com/mattn/go-isatty v0.0.14 // indirect
|
||||||
github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421 // indirect
|
github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421 // indirect
|
||||||
github.com/modern-go/reflect2 v1.0.2 // indirect
|
github.com/modern-go/reflect2 v1.0.2 // indirect
|
||||||
github.com/pelletier/go-toml/v2 v2.0.1 // indirect
|
github.com/pelletier/go-toml/v2 v2.0.1 // indirect
|
||||||
github.com/pkg/errors v0.9.1 // indirect
|
github.com/pkg/errors v0.9.1 // indirect
|
||||||
github.com/spaolacci/murmur3 v1.1.0 // indirect
|
github.com/spaolacci/murmur3 v1.1.0 // indirect
|
||||||
github.com/stretchr/testify v1.7.5 // indirect
|
github.com/stretchr/testify v1.8.0 // indirect
|
||||||
|
github.com/tidwall/gjson v1.14.1 // indirect
|
||||||
|
github.com/tidwall/match v1.1.1 // indirect
|
||||||
|
github.com/tidwall/pretty v1.2.0 // indirect
|
||||||
github.com/ugorji/go/codec v1.2.7 // indirect
|
github.com/ugorji/go/codec v1.2.7 // indirect
|
||||||
|
go.uber.org/atomic v1.9.0 // indirect
|
||||||
|
go.uber.org/multierr v1.8.0 // indirect
|
||||||
|
go.uber.org/zap v1.21.0 // indirect
|
||||||
golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97 // indirect
|
golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97 // indirect
|
||||||
golang.org/x/net v0.0.0-20220624214902-1bab6f366d9e // indirect
|
golang.org/x/net v0.0.0-20220624214902-1bab6f366d9e // indirect
|
||||||
golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a // indirect
|
golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a // indirect
|
||||||
golang.org/x/text v0.3.7 // indirect
|
golang.org/x/text v0.3.7 // indirect
|
||||||
google.golang.org/protobuf v1.28.0 // indirect
|
google.golang.org/protobuf v1.28.0 // indirect
|
||||||
gopkg.in/yaml.v2 v2.4.0 // indirect
|
gopkg.in/yaml.v2 v2.4.0 // indirect
|
||||||
|
gopkg.in/yaml.v3 v3.0.1 // indirect
|
||||||
)
|
)
|
||||||
|
65
go.sum
65
go.sum
@ -1,26 +1,24 @@
|
|||||||
git.zhangdeman.cn/zhangdeman/exception v0.0.0-20220625143611-42a85f7b80c3 h1:bQh+GCEfdusiirGm/XV7gqt7dkejqnvFxplatBUrSSI=
|
|
||||||
git.zhangdeman.cn/zhangdeman/exception v0.0.0-20220625143611-42a85f7b80c3/go.mod h1:mIMM/t9BkrKHAcDCmarLCHQhHfWf0/ZjtcqJPboqmSA=
|
|
||||||
git.zhangdeman.cn/zhangdeman/exception v0.0.0-20220626045509-282f54bb736a h1:n9kssd90WV55PsAWJNjSdAYTtZ6ACrZgiv9TEIcsNdA=
|
|
||||||
git.zhangdeman.cn/zhangdeman/exception v0.0.0-20220626045509-282f54bb736a/go.mod h1:mIMM/t9BkrKHAcDCmarLCHQhHfWf0/ZjtcqJPboqmSA=
|
|
||||||
git.zhangdeman.cn/zhangdeman/exception v0.0.0-20220626050013-dce8cafff2c6 h1:+hAz/NpZvdsMZefwiV30bJ8Tzon+Bzs/HWiZi/9SOtc=
|
|
||||||
git.zhangdeman.cn/zhangdeman/exception v0.0.0-20220626050013-dce8cafff2c6/go.mod h1:mIMM/t9BkrKHAcDCmarLCHQhHfWf0/ZjtcqJPboqmSA=
|
|
||||||
git.zhangdeman.cn/zhangdeman/exception v0.0.0-20220626052433-f29c21f923fc h1:cD0sibF3bDr3+qpGmimmuLEqNNFdpY2VDk2+EdSeSYE=
|
|
||||||
git.zhangdeman.cn/zhangdeman/exception v0.0.0-20220626052433-f29c21f923fc/go.mod h1:mIMM/t9BkrKHAcDCmarLCHQhHfWf0/ZjtcqJPboqmSA=
|
|
||||||
git.zhangdeman.cn/zhangdeman/exception v0.0.0-20220703050824-0679ce509241 h1:tBaET7SL1ElDQ8mI3A0sHNonmycB0fFp3n8vWo410YM=
|
git.zhangdeman.cn/zhangdeman/exception v0.0.0-20220703050824-0679ce509241 h1:tBaET7SL1ElDQ8mI3A0sHNonmycB0fFp3n8vWo410YM=
|
||||||
git.zhangdeman.cn/zhangdeman/exception v0.0.0-20220703050824-0679ce509241/go.mod h1:mIMM/t9BkrKHAcDCmarLCHQhHfWf0/ZjtcqJPboqmSA=
|
git.zhangdeman.cn/zhangdeman/exception v0.0.0-20220703050824-0679ce509241/go.mod h1:mIMM/t9BkrKHAcDCmarLCHQhHfWf0/ZjtcqJPboqmSA=
|
||||||
git.zhangdeman.cn/zhangdeman/util v0.0.0-20220609072516-022a755fdf2f h1:yAxxukVUdSM5wn264el+QiAEB0OBN/5H7Xw9Z6rLzUY=
|
|
||||||
git.zhangdeman.cn/zhangdeman/util v0.0.0-20220609072516-022a755fdf2f/go.mod h1:YI/XeTmrr9+8dxa4ThPkmNcEE8WHG5pZkKujpSWwIxM=
|
|
||||||
git.zhangdeman.cn/zhangdeman/util v0.0.0-20220625151616-cfe1f4c04db4 h1:uHYTRztH/XEVtr3FLykCf/3LhFQ7zQHnzVAeDyC1huQ=
|
git.zhangdeman.cn/zhangdeman/util v0.0.0-20220625151616-cfe1f4c04db4 h1:uHYTRztH/XEVtr3FLykCf/3LhFQ7zQHnzVAeDyC1huQ=
|
||||||
git.zhangdeman.cn/zhangdeman/util v0.0.0-20220625151616-cfe1f4c04db4/go.mod h1:YI/XeTmrr9+8dxa4ThPkmNcEE8WHG5pZkKujpSWwIxM=
|
git.zhangdeman.cn/zhangdeman/util v0.0.0-20220625151616-cfe1f4c04db4/go.mod h1:YI/XeTmrr9+8dxa4ThPkmNcEE8WHG5pZkKujpSWwIxM=
|
||||||
|
git.zhangdeman.cn/zhangdeman/util v0.0.0-20220714054940-3cfcad0c6547 h1:ieuPrfZDDgwz9ANQdXQrGNWlKWN6bK3qOUC+XUAITrk=
|
||||||
|
git.zhangdeman.cn/zhangdeman/util v0.0.0-20220714054940-3cfcad0c6547/go.mod h1:zTir/0IWdK3E7n0GiaogyWHADAQnBtTdl2I6Z2/OPqw=
|
||||||
|
github.com/Jeffail/gabs v1.4.0 h1://5fYRRTq1edjfIrQGvdkcd22pkYUrHZ5YC/H2GJVAo=
|
||||||
|
github.com/Jeffail/gabs v1.4.0/go.mod h1:6xMvQMK4k33lb7GUUpaAPh6nKMmemQeg5d4gn7/bOXc=
|
||||||
|
github.com/axgle/mahonia v0.0.0-20180208002826-3358181d7394 h1:OYA+5W64v3OgClL+IrOD63t4i/RW7RqrAVl9LTZ9UqQ=
|
||||||
|
github.com/axgle/mahonia v0.0.0-20180208002826-3358181d7394/go.mod h1:Q8n74mJTIgjX4RBBcHnJ05h//6/k6foqmgE45jTQtxg=
|
||||||
|
github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA=
|
||||||
github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
|
github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
|
||||||
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||||
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
|
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
|
||||||
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||||
|
github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE=
|
||||||
github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI=
|
github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI=
|
||||||
github.com/gin-gonic/gin v1.8.1 h1:4+fr/el88TOO3ewCmQr8cx/CtZ/umlIRIs5M4NTNjf8=
|
github.com/gin-gonic/gin v1.8.1 h1:4+fr/el88TOO3ewCmQr8cx/CtZ/umlIRIs5M4NTNjf8=
|
||||||
github.com/gin-gonic/gin v1.8.1/go.mod h1:ji8BvRH1azfM+SYow9zQ6SZMvR8qOMZHmsCuWR9tTTk=
|
github.com/gin-gonic/gin v1.8.1/go.mod h1:ji8BvRH1azfM+SYow9zQ6SZMvR8qOMZHmsCuWR9tTTk=
|
||||||
github.com/go-gin/gin v0.0.0-20161108173721-bb159f9260a2 h1:mFnoJYhPbOKiqx6E0bZeHW4r/im6Vn43LLJF8XUFJRQ=
|
github.com/go-ini/ini v1.66.6 h1:h6k2Bb0HWS/BXXHCXj4QHjxPmlIU4NK+7MuLp9SD+4k=
|
||||||
github.com/go-gin/gin v0.0.0-20161108173721-bb159f9260a2/go.mod h1:vit3lJJErC7VSuu9ojTL4LSD7614JVBfFMY1SGXvwJo=
|
github.com/go-ini/ini v1.66.6/go.mod h1:ByCAeIL28uOIIG0E3PJtZPDL8WnHpFKFOtgjp+3Ies8=
|
||||||
github.com/go-playground/assert/v2 v2.0.1 h1:MsBgLAaY856+nPRTKrp3/OZK38U/wa0CcBYNjji3q3A=
|
github.com/go-playground/assert/v2 v2.0.1 h1:MsBgLAaY856+nPRTKrp3/OZK38U/wa0CcBYNjji3q3A=
|
||||||
github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4=
|
github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4=
|
||||||
github.com/go-playground/locales v0.14.0 h1:u50s323jtVGugKlcYeyzC0etD1HifMjqmJqb8WugfUU=
|
github.com/go-playground/locales v0.14.0 h1:u50s323jtVGugKlcYeyzC0etD1HifMjqmJqb8WugfUU=
|
||||||
@ -47,8 +45,7 @@ github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
|
|||||||
github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
|
github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
|
||||||
github.com/leodido/go-urn v1.2.1 h1:BqpAaACuzVSgi/VLzGZIobT2z4v53pjosyNd9Yv6n/w=
|
github.com/leodido/go-urn v1.2.1 h1:BqpAaACuzVSgi/VLzGZIobT2z4v53pjosyNd9Yv6n/w=
|
||||||
github.com/leodido/go-urn v1.2.1/go.mod h1:zt4jvISO2HfUBqxjfIshjdMTYS56ZS/qv49ictyFfxY=
|
github.com/leodido/go-urn v1.2.1/go.mod h1:zt4jvISO2HfUBqxjfIshjdMTYS56ZS/qv49ictyFfxY=
|
||||||
github.com/manucorporat/sse v0.0.0-20160126180136-ee05b128a739 h1:ykXz+pRRTibcSjG1yRhpdSHInF8yZY/mfn+Rz2Nd1rE=
|
github.com/mattn/go-isatty v0.0.14 h1:yVuAays6BHfxijgZPzw+3Zlu5yQgKGP2/hcQbHb7S9Y=
|
||||||
github.com/manucorporat/sse v0.0.0-20160126180136-ee05b128a739/go.mod h1:zUx1mhth20V3VKgL5jbd1BSQcW4Fy6Qs4PZvQwRFwzM=
|
|
||||||
github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94=
|
github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94=
|
||||||
github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421 h1:ZqeYNhU3OHLH3mGKHDcjJRFFRrJa6eAM5H+CtDdOsPc=
|
github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421 h1:ZqeYNhU3OHLH3mGKHDcjJRFFRrJa6eAM5H+CtDdOsPc=
|
||||||
github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
|
github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
|
||||||
@ -57,6 +54,7 @@ github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjY
|
|||||||
github.com/pelletier/go-toml/v2 v2.0.1 h1:8e3L2cCQzLFi2CR4g7vGFuFxX7Jl1kKX8gW+iV0GUKU=
|
github.com/pelletier/go-toml/v2 v2.0.1 h1:8e3L2cCQzLFi2CR4g7vGFuFxX7Jl1kKX8gW+iV0GUKU=
|
||||||
github.com/pelletier/go-toml/v2 v2.0.1/go.mod h1:r9LEWfGN8R5k0VXJ+0BkIe7MYkRdwZOjgMj2KwnJFUo=
|
github.com/pelletier/go-toml/v2 v2.0.1/go.mod h1:r9LEWfGN8R5k0VXJ+0BkIe7MYkRdwZOjgMj2KwnJFUo=
|
||||||
github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA=
|
github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA=
|
||||||
|
github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
|
||||||
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
|
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
|
||||||
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
|
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
|
||||||
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
|
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
|
||||||
@ -74,16 +72,47 @@ github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/
|
|||||||
github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
|
github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
|
||||||
github.com/stretchr/testify v1.7.5 h1:s5PTfem8p8EbKQOctVV53k6jCJt3UX4IEJzwh+C324Q=
|
github.com/stretchr/testify v1.7.5 h1:s5PTfem8p8EbKQOctVV53k6jCJt3UX4IEJzwh+C324Q=
|
||||||
github.com/stretchr/testify v1.7.5/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
|
github.com/stretchr/testify v1.7.5/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
|
||||||
|
github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
|
||||||
|
github.com/tidwall/gjson v1.14.1 h1:iymTbGkQBhveq21bEvAQ81I0LEBork8BFe1CUZXdyuo=
|
||||||
|
github.com/tidwall/gjson v1.14.1/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=
|
||||||
|
github.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA=
|
||||||
|
github.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM=
|
||||||
|
github.com/tidwall/pretty v1.2.0 h1:RWIZEg2iJ8/g6fDDYzMpobmaoGh5OLl4AXtGUGPcqCs=
|
||||||
|
github.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=
|
||||||
github.com/ugorji/go v1.2.7 h1:qYhyWUUd6WbiM+C6JZAUkIJt/1WrjzNHY9+KCIjVqTo=
|
github.com/ugorji/go v1.2.7 h1:qYhyWUUd6WbiM+C6JZAUkIJt/1WrjzNHY9+KCIjVqTo=
|
||||||
github.com/ugorji/go v1.2.7/go.mod h1:nF9osbDWLy6bDVv/Rtoh6QgnvNDpmCalQV5urGCCS6M=
|
github.com/ugorji/go v1.2.7/go.mod h1:nF9osbDWLy6bDVv/Rtoh6QgnvNDpmCalQV5urGCCS6M=
|
||||||
github.com/ugorji/go/codec v1.2.7 h1:YPXUKf7fYbp/y8xloBqZOw2qaVggbfwMlI8WM3wZUJ0=
|
github.com/ugorji/go/codec v1.2.7 h1:YPXUKf7fYbp/y8xloBqZOw2qaVggbfwMlI8WM3wZUJ0=
|
||||||
github.com/ugorji/go/codec v1.2.7/go.mod h1:WGN1fab3R1fzQlVQTkfxVtIBhWDRqOviHU95kRgeqEY=
|
github.com/ugorji/go/codec v1.2.7/go.mod h1:WGN1fab3R1fzQlVQTkfxVtIBhWDRqOviHU95kRgeqEY=
|
||||||
|
github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=
|
||||||
|
go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc=
|
||||||
|
go.uber.org/atomic v1.9.0 h1:ECmE8Bn/WFTYwEW/bpKD3M8VtR/zQVbavAoalC1PYyE=
|
||||||
|
go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc=
|
||||||
|
go.uber.org/goleak v1.1.11/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ=
|
||||||
|
go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU=
|
||||||
|
go.uber.org/multierr v1.8.0 h1:dg6GjLku4EH+249NNmoIciG9N/jURbDG+pFlTkhzIC8=
|
||||||
|
go.uber.org/multierr v1.8.0/go.mod h1:7EAYxJLBy9rStEaz58O2t4Uvip6FSURkq8/ppBp95ak=
|
||||||
|
go.uber.org/zap v1.21.0 h1:WefMeulhovoZ2sYXz7st6K0sLj7bBhpiFaud4r4zST8=
|
||||||
|
go.uber.org/zap v1.21.0/go.mod h1:wjWOCqI0f2ZZrJF/UufIOkiC8ii6tm1iqIsLo76RfJw=
|
||||||
|
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
|
||||||
|
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
||||||
golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97 h1:/UOmuWzQfxxo9UtlXMwuQU8CMgg1eZXqTRwkSQJWKOI=
|
golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97 h1:/UOmuWzQfxxo9UtlXMwuQU8CMgg1eZXqTRwkSQJWKOI=
|
||||||
golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
|
golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
|
||||||
|
golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
|
||||||
|
golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
|
||||||
|
golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
||||||
|
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
||||||
|
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||||
golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
|
golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
|
||||||
|
golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=
|
||||||
golang.org/x/net v0.0.0-20220624214902-1bab6f366d9e h1:TsQ7F31D3bUCLeqPT0u+yjp1guoArKaNKmCr22PYgTQ=
|
golang.org/x/net v0.0.0-20220624214902-1bab6f366d9e h1:TsQ7F31D3bUCLeqPT0u+yjp1guoArKaNKmCr22PYgTQ=
|
||||||
golang.org/x/net v0.0.0-20220624214902-1bab6f366d9e/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
|
golang.org/x/net v0.0.0-20220624214902-1bab6f366d9e/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
|
||||||
|
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
|
golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
|
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||||
|
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
@ -91,13 +120,20 @@ golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a h1:dGzPydgVsqGcTRVwiLJ1jVbuf
|
|||||||
golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
|
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
|
||||||
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
|
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
|
||||||
|
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
||||||
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
||||||
golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
||||||
golang.org/x/text v0.3.7 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk=
|
golang.org/x/text v0.3.7 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk=
|
||||||
golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
|
golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
|
||||||
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
||||||
|
golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
|
||||||
|
golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
|
||||||
|
golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
|
||||||
|
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||||
|
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||||
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4=
|
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4=
|
||||||
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||||
|
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||||
google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=
|
google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=
|
||||||
google.golang.org/protobuf v1.28.0 h1:w43yiav+6bVFTBQFZX0r7ipe9JQ1QsbMgHwbBziscLw=
|
google.golang.org/protobuf v1.28.0 h1:w43yiav+6bVFTBQFZX0r7ipe9JQ1QsbMgHwbBziscLw=
|
||||||
google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
|
google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
|
||||||
@ -106,6 +142,7 @@ gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8
|
|||||||
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
|
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
|
||||||
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=
|
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=
|
||||||
gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=
|
gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=
|
||||||
|
gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
||||||
gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=
|
gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=
|
||||||
gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
|
gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
|
||||||
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
||||||
|
123
middleware/access_log.go
Normal file
123
middleware/access_log.go
Normal file
@ -0,0 +1,123 @@
|
|||||||
|
// Package middleware ...
|
||||||
|
//
|
||||||
|
// Description : middleware ...
|
||||||
|
//
|
||||||
|
// Author : go_developer@163.com<白茶清欢>
|
||||||
|
//
|
||||||
|
// Date : 2022-07-14 10:53
|
||||||
|
package middleware
|
||||||
|
|
||||||
|
import (
|
||||||
|
"strings"
|
||||||
|
|
||||||
|
"git.zhangdeman.cn/zhangdeman/util"
|
||||||
|
|
||||||
|
"git.zhangdeman.cn/zhangdeman/gin/define"
|
||||||
|
|
||||||
|
"github.com/gin-gonic/gin"
|
||||||
|
"go.uber.org/zap"
|
||||||
|
)
|
||||||
|
|
||||||
|
// Access 记录请求日志
|
||||||
|
//
|
||||||
|
// Author : go_developer@163.com<白茶清欢>
|
||||||
|
//
|
||||||
|
// Date : 10:55 2022/7/14
|
||||||
|
func Access(cfg *AccessConfig) gin.HandlerFunc {
|
||||||
|
// 未传入配置或者未传入日志实例
|
||||||
|
if nil == cfg || nil == cfg.Logger {
|
||||||
|
return func(ctx *gin.Context) {
|
||||||
|
ctx.Next()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if nil == cfg.IsRecordLog {
|
||||||
|
cfg.IsRecordLog = defaultIsRecordLog
|
||||||
|
}
|
||||||
|
if nil == cfg.ExtraFieldList {
|
||||||
|
cfg.ExtraFieldList = make([]string, 0)
|
||||||
|
}
|
||||||
|
cfg.ExtraFieldList = append(cfg.ExtraFieldList, define.RecordRequestDataField, define.RecordResponseDataField)
|
||||||
|
return func(ctx *gin.Context) {
|
||||||
|
ctx.Next()
|
||||||
|
if !cfg.IsRecordLog(ctx) {
|
||||||
|
// 不记录日志
|
||||||
|
return
|
||||||
|
}
|
||||||
|
startRequestTime := ctx.GetInt64(define.StartRequestTimeField)
|
||||||
|
logDataList := []zap.Field{
|
||||||
|
// 开始请求时间
|
||||||
|
zap.Any(define.StartRequestTimeField, util.Time.FormatUnixNano(startRequestTime)),
|
||||||
|
}
|
||||||
|
// 结束时间
|
||||||
|
finishRequestTime := ctx.GetInt64(define.FinishRequestTimeField)
|
||||||
|
logDataList = append(
|
||||||
|
logDataList,
|
||||||
|
zap.Any(define.FinishRequestTimeField, util.Time.FormatUnixNano(startRequestTime)),
|
||||||
|
zap.Int64("pkg_gin_request_cost", finishRequestTime-startRequestTime),
|
||||||
|
)
|
||||||
|
|
||||||
|
// 请求header
|
||||||
|
if len(cfg.RequestHeaderList) == 0 {
|
||||||
|
// 全部记录
|
||||||
|
zap.Any("pkg_gin_request_header", ctx.Request.Header)
|
||||||
|
} else {
|
||||||
|
headerTable := make(map[string][]string, 0)
|
||||||
|
for _, key := range cfg.RequestHeaderList {
|
||||||
|
headerTable[key] = ctx.Request.Header.Values(key)
|
||||||
|
}
|
||||||
|
zap.Any("pkg_gin_request_header", headerTable)
|
||||||
|
}
|
||||||
|
|
||||||
|
// 响应header
|
||||||
|
if len(cfg.ResponseHeaderList) == 0 {
|
||||||
|
// 全部记录
|
||||||
|
zap.Any("pkg_gin_response_header", ctx.Writer.Header())
|
||||||
|
} else {
|
||||||
|
headerTable := make(map[string][]string, 0)
|
||||||
|
for _, key := range cfg.ResponseHeaderList {
|
||||||
|
headerTable[key] = ctx.Writer.Header().Values(key)
|
||||||
|
}
|
||||||
|
zap.Any("pkg_gin_response_header", headerTable)
|
||||||
|
}
|
||||||
|
|
||||||
|
// 扩展数据
|
||||||
|
for _, field := range cfg.ExtraFieldList {
|
||||||
|
val, _ := ctx.Get(field)
|
||||||
|
logDataList = append(logDataList, zap.Any(field, val))
|
||||||
|
}
|
||||||
|
cfg.Logger.Info("请求日志记录", logDataList...)
|
||||||
|
if nil != cfg.FinishHook {
|
||||||
|
// hook 不为nil, 自动触发
|
||||||
|
cfg.FinishHook(ctx,
|
||||||
|
[]byte(ctx.GetString(define.RecordRequestDataField)),
|
||||||
|
[]byte(ctx.GetString(define.RecordResponseDataField)),
|
||||||
|
finishRequestTime-startRequestTime)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// AccessConfig 访问记录的配置
|
||||||
|
//
|
||||||
|
// Author : go_developer@163.com<白茶清欢>
|
||||||
|
//
|
||||||
|
// Date : 11:26 2022/7/14
|
||||||
|
type AccessConfig struct {
|
||||||
|
Logger *zap.Logger // 日志实例
|
||||||
|
RequestHeaderList []string // 要记录哪些header , 不传全部记录
|
||||||
|
ResponseHeaderList []string // 要记录哪些响应header, 不传全部记录
|
||||||
|
IsRecordLog func(ctx *gin.Context) bool // 验证当前请求是否记录日志
|
||||||
|
ExtraFieldList []string // 记录的扩展字段列表,请将相关数据使用 ctx.Set 写入上下文中, 日志会自动记录
|
||||||
|
FinishHook func(ctx *gin.Context, requestData []byte, responseData []byte, cost int64) // 请求处理完成之后, 触发的hook函数
|
||||||
|
}
|
||||||
|
|
||||||
|
// defaultIsRecordLog 默认仅记录 json api 日志
|
||||||
|
//
|
||||||
|
// Author : go_developer@163.com<白茶清欢>
|
||||||
|
//
|
||||||
|
// Date : 11:31 2022/7/14
|
||||||
|
func defaultIsRecordLog(ctx *gin.Context) bool {
|
||||||
|
if strings.Contains(ctx.Writer.Header().Get("Content-type"), "application/json") {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
40
middleware/request_cors/config.go
Normal file
40
middleware/request_cors/config.go
Normal file
@ -0,0 +1,40 @@
|
|||||||
|
// Package request_cors ...
|
||||||
|
//
|
||||||
|
// Description : request_cors ...
|
||||||
|
//
|
||||||
|
// Author : go_developer@163.com<白茶清欢>
|
||||||
|
//
|
||||||
|
// Date : 2022-07-13 16:27
|
||||||
|
package request_cors
|
||||||
|
|
||||||
|
import "net/http"
|
||||||
|
|
||||||
|
type cors struct {
|
||||||
|
allowAllOrigins bool
|
||||||
|
allowCredentials bool
|
||||||
|
allowOriginFunc func(string) bool
|
||||||
|
allowOrigins []string
|
||||||
|
normalHeaders http.Header
|
||||||
|
preflightHeaders http.Header
|
||||||
|
wildcardOrigins [][]string
|
||||||
|
}
|
||||||
|
|
||||||
|
var (
|
||||||
|
DefaultSchemas = []string{
|
||||||
|
"http://",
|
||||||
|
"https://",
|
||||||
|
}
|
||||||
|
ExtensionSchemas = []string{
|
||||||
|
"chrome-extension://",
|
||||||
|
"safari-extension://",
|
||||||
|
"moz-extension://",
|
||||||
|
"ms-browser-extension://",
|
||||||
|
}
|
||||||
|
FileSchemas = []string{
|
||||||
|
"file://",
|
||||||
|
}
|
||||||
|
WebSocketSchemas = []string{
|
||||||
|
"ws://",
|
||||||
|
"wss://",
|
||||||
|
}
|
||||||
|
)
|
277
middleware/request_cors/cros.go
Normal file
277
middleware/request_cors/cros.go
Normal file
@ -0,0 +1,277 @@
|
|||||||
|
// Package request_cors ...
|
||||||
|
//
|
||||||
|
// Description : 支持跨域的中间件
|
||||||
|
//
|
||||||
|
// Author : go_developer@163.com<白茶清欢>
|
||||||
|
//
|
||||||
|
// Date : 2022-07-13 16:25
|
||||||
|
package request_cors
|
||||||
|
|
||||||
|
import (
|
||||||
|
"errors"
|
||||||
|
"net/http"
|
||||||
|
"strings"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"github.com/gin-gonic/gin"
|
||||||
|
)
|
||||||
|
|
||||||
|
func newCors(config Config) *cors {
|
||||||
|
if err := config.Validate(); err != nil {
|
||||||
|
panic(err.Error())
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, origin := range config.AllowOrigins {
|
||||||
|
if origin == "*" {
|
||||||
|
config.AllowAllOrigins = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return &cors{
|
||||||
|
allowOriginFunc: config.AllowOriginFunc,
|
||||||
|
allowAllOrigins: config.AllowAllOrigins,
|
||||||
|
allowCredentials: config.AllowCredentials,
|
||||||
|
allowOrigins: normalize(config.AllowOrigins),
|
||||||
|
normalHeaders: generateNormalHeaders(config),
|
||||||
|
preflightHeaders: generatePreflightHeaders(config),
|
||||||
|
wildcardOrigins: config.parseWildcardRules(),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (cors *cors) applyCors(c *gin.Context) {
|
||||||
|
origin := c.Request.Header.Get("Origin")
|
||||||
|
if len(origin) == 0 {
|
||||||
|
// request is not a CORS request
|
||||||
|
return
|
||||||
|
}
|
||||||
|
host := c.Request.Host
|
||||||
|
|
||||||
|
if origin == "http://"+host || origin == "https://"+host {
|
||||||
|
// request is not a CORS request but have origin header.
|
||||||
|
// for example, use fetch api
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
if !cors.validateOrigin(origin) {
|
||||||
|
c.AbortWithStatus(http.StatusForbidden)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
if c.Request.Method == "OPTIONS" {
|
||||||
|
cors.handlePreflight(c)
|
||||||
|
defer c.AbortWithStatus(http.StatusNoContent) // Using 204 is better than 200 when the request status is OPTIONS
|
||||||
|
} else {
|
||||||
|
cors.handleNormal(c)
|
||||||
|
}
|
||||||
|
|
||||||
|
if !cors.allowAllOrigins {
|
||||||
|
c.Header("Access-Control-Allow-Origin", origin)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (cors *cors) validateWildcardOrigin(origin string) bool {
|
||||||
|
for _, w := range cors.wildcardOrigins {
|
||||||
|
if w[0] == "*" && strings.HasSuffix(origin, w[1]) {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
if w[1] == "*" && strings.HasPrefix(origin, w[0]) {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
if strings.HasPrefix(origin, w[0]) && strings.HasSuffix(origin, w[1]) {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
func (cors *cors) validateOrigin(origin string) bool {
|
||||||
|
if cors.allowAllOrigins {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
for _, value := range cors.allowOrigins {
|
||||||
|
if value == origin {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if len(cors.wildcardOrigins) > 0 && cors.validateWildcardOrigin(origin) {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
if cors.allowOriginFunc != nil {
|
||||||
|
return cors.allowOriginFunc(origin)
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
func (cors *cors) handlePreflight(c *gin.Context) {
|
||||||
|
header := c.Writer.Header()
|
||||||
|
for key, value := range cors.preflightHeaders {
|
||||||
|
header[key] = value
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (cors *cors) handleNormal(c *gin.Context) {
|
||||||
|
header := c.Writer.Header()
|
||||||
|
for key, value := range cors.normalHeaders {
|
||||||
|
header[key] = value
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Config represents all available options for the middleware.
|
||||||
|
type Config struct {
|
||||||
|
AllowAllOrigins bool
|
||||||
|
|
||||||
|
// AllowOrigins is a list of origins a cross-domain request can be executed from.
|
||||||
|
// If the special "*" value is present in the list, all origins will be allowed.
|
||||||
|
// Default value is []
|
||||||
|
AllowOrigins []string
|
||||||
|
|
||||||
|
// AllowOriginFunc is a custom function to validate the origin. It take the origin
|
||||||
|
// as argument and returns true if allowed or false otherwise. If this option is
|
||||||
|
// set, the content of AllowOrigins is ignored.
|
||||||
|
AllowOriginFunc func(origin string) bool
|
||||||
|
|
||||||
|
// AllowMethods is a list of methods the client is allowed to use with
|
||||||
|
// cross-domain requests. Default value is simple methods (GET, POST, PUT, PATCH, DELETE, HEAD, and OPTIONS)
|
||||||
|
AllowMethods []string
|
||||||
|
|
||||||
|
// AllowHeaders is list of non simple headers the client is allowed to use with
|
||||||
|
// cross-domain requests.
|
||||||
|
AllowHeaders []string
|
||||||
|
|
||||||
|
// AllowCredentials indicates whether the request can include user credentials like
|
||||||
|
// cookies, HTTP authentication or client side SSL certificates.
|
||||||
|
AllowCredentials bool
|
||||||
|
|
||||||
|
// ExposeHeaders indicates which headers are safe to expose to the API of a CORS
|
||||||
|
// API specification
|
||||||
|
ExposeHeaders []string
|
||||||
|
|
||||||
|
// MaxAge indicates how long (with second-precision) the results of a preflight request
|
||||||
|
// can be cached
|
||||||
|
MaxAge time.Duration
|
||||||
|
|
||||||
|
// Allows to add origins like http://some-domain/*, https://api.* or http://some.*.subdomain.com
|
||||||
|
AllowWildcard bool
|
||||||
|
|
||||||
|
// Allows usage of popular browser extensions schemas
|
||||||
|
AllowBrowserExtensions bool
|
||||||
|
|
||||||
|
// Allows usage of WebSocket protocol
|
||||||
|
AllowWebSockets bool
|
||||||
|
|
||||||
|
// Allows usage of file:// schema (dangerous!) use it only when you 100% sure it's needed
|
||||||
|
AllowFiles bool
|
||||||
|
}
|
||||||
|
|
||||||
|
// AddAllowMethods is allowed to add custom methods
|
||||||
|
func (c *Config) AddAllowMethods(methods ...string) {
|
||||||
|
c.AllowMethods = append(c.AllowMethods, methods...)
|
||||||
|
}
|
||||||
|
|
||||||
|
// AddAllowHeaders is allowed to add custom headers
|
||||||
|
func (c *Config) AddAllowHeaders(headers ...string) {
|
||||||
|
c.AllowHeaders = append(c.AllowHeaders, headers...)
|
||||||
|
}
|
||||||
|
|
||||||
|
// AddExposeHeaders is allowed to add custom expose headers
|
||||||
|
func (c *Config) AddExposeHeaders(headers ...string) {
|
||||||
|
c.ExposeHeaders = append(c.ExposeHeaders, headers...)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c Config) getAllowedSchemas() []string {
|
||||||
|
allowedSchemas := DefaultSchemas
|
||||||
|
if c.AllowBrowserExtensions {
|
||||||
|
allowedSchemas = append(allowedSchemas, ExtensionSchemas...)
|
||||||
|
}
|
||||||
|
if c.AllowWebSockets {
|
||||||
|
allowedSchemas = append(allowedSchemas, WebSocketSchemas...)
|
||||||
|
}
|
||||||
|
if c.AllowFiles {
|
||||||
|
allowedSchemas = append(allowedSchemas, FileSchemas...)
|
||||||
|
}
|
||||||
|
return allowedSchemas
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c Config) validateAllowedSchemas(origin string) bool {
|
||||||
|
allowedSchemas := c.getAllowedSchemas()
|
||||||
|
for _, schema := range allowedSchemas {
|
||||||
|
if strings.HasPrefix(origin, schema) {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
// Validate is check configuration of user defined.
|
||||||
|
func (c Config) Validate() error {
|
||||||
|
if c.AllowAllOrigins && (c.AllowOriginFunc != nil || len(c.AllowOrigins) > 0) {
|
||||||
|
return errors.New("conflict settings: all origins are allowed. AllowOriginFunc or AllowOrigins is not needed")
|
||||||
|
}
|
||||||
|
if !c.AllowAllOrigins && c.AllowOriginFunc == nil && len(c.AllowOrigins) == 0 {
|
||||||
|
return errors.New("conflict settings: all origins disabled")
|
||||||
|
}
|
||||||
|
for _, origin := range c.AllowOrigins {
|
||||||
|
if !strings.Contains(origin, "*") && !c.validateAllowedSchemas(origin) {
|
||||||
|
return errors.New("bad origin: origins must contain '*' or include " + strings.Join(c.getAllowedSchemas(), ","))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c Config) parseWildcardRules() [][]string {
|
||||||
|
var wRules [][]string
|
||||||
|
|
||||||
|
if !c.AllowWildcard {
|
||||||
|
return wRules
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, o := range c.AllowOrigins {
|
||||||
|
if !strings.Contains(o, "*") {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
if c := strings.Count(o, "*"); c > 1 {
|
||||||
|
panic(errors.New("only one * is allowed").Error())
|
||||||
|
}
|
||||||
|
|
||||||
|
i := strings.Index(o, "*")
|
||||||
|
if i == 0 {
|
||||||
|
wRules = append(wRules, []string{"*", o[1:]})
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
if i == (len(o) - 1) {
|
||||||
|
wRules = append(wRules, []string{o[:i-1], "*"})
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
wRules = append(wRules, []string{o[:i], o[i+1:]})
|
||||||
|
}
|
||||||
|
|
||||||
|
return wRules
|
||||||
|
}
|
||||||
|
|
||||||
|
// DefaultConfig returns a generic default configuration mapped to localhost.
|
||||||
|
func DefaultConfig() Config {
|
||||||
|
return Config{
|
||||||
|
AllowMethods: []string{"GET", "POST", "PUT", "PATCH", "DELETE", "HEAD", "OPTIONS"},
|
||||||
|
AllowHeaders: []string{"Origin", "Content-Length", "Content-Type"},
|
||||||
|
AllowCredentials: false,
|
||||||
|
MaxAge: 12 * time.Hour,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Default returns the location middleware with default configuration.
|
||||||
|
func Default() gin.HandlerFunc {
|
||||||
|
config := DefaultConfig()
|
||||||
|
config.AllowAllOrigins = true
|
||||||
|
return New(config)
|
||||||
|
}
|
||||||
|
|
||||||
|
// New returns the location middleware with user-defined custom configuration.
|
||||||
|
func New(config Config) gin.HandlerFunc {
|
||||||
|
cors := newCors(config)
|
||||||
|
return func(c *gin.Context) {
|
||||||
|
cors.applyCors(c)
|
||||||
|
}
|
||||||
|
}
|
92
middleware/request_cors/util.go
Normal file
92
middleware/request_cors/util.go
Normal file
@ -0,0 +1,92 @@
|
|||||||
|
// Package request_cors ...
|
||||||
|
//
|
||||||
|
// Description : request_cors ...
|
||||||
|
//
|
||||||
|
// Author : go_developer@163.com<白茶清欢>
|
||||||
|
//
|
||||||
|
// Date : 2022-07-13 16:28
|
||||||
|
package request_cors
|
||||||
|
|
||||||
|
import (
|
||||||
|
"net/http"
|
||||||
|
"strconv"
|
||||||
|
"strings"
|
||||||
|
"time"
|
||||||
|
)
|
||||||
|
|
||||||
|
type converter func(string) string
|
||||||
|
|
||||||
|
func generateNormalHeaders(c Config) http.Header {
|
||||||
|
headers := make(http.Header)
|
||||||
|
if c.AllowCredentials {
|
||||||
|
headers.Set("Access-Control-Allow-Credentials", "true")
|
||||||
|
}
|
||||||
|
if len(c.ExposeHeaders) > 0 {
|
||||||
|
exposeHeaders := convert(normalize(c.ExposeHeaders), http.CanonicalHeaderKey)
|
||||||
|
headers.Set("Access-Control-Expose-Headers", strings.Join(exposeHeaders, ","))
|
||||||
|
}
|
||||||
|
if c.AllowAllOrigins {
|
||||||
|
headers.Set("Access-Control-Allow-Origin", "*")
|
||||||
|
} else {
|
||||||
|
headers.Set("Vary", "Origin")
|
||||||
|
}
|
||||||
|
return headers
|
||||||
|
}
|
||||||
|
|
||||||
|
func generatePreflightHeaders(c Config) http.Header {
|
||||||
|
headers := make(http.Header)
|
||||||
|
if c.AllowCredentials {
|
||||||
|
headers.Set("Access-Control-Allow-Credentials", "true")
|
||||||
|
}
|
||||||
|
if len(c.AllowMethods) > 0 {
|
||||||
|
allowMethods := convert(normalize(c.AllowMethods), strings.ToUpper)
|
||||||
|
value := strings.Join(allowMethods, ",")
|
||||||
|
headers.Set("Access-Control-Allow-Methods", value)
|
||||||
|
}
|
||||||
|
if len(c.AllowHeaders) > 0 {
|
||||||
|
allowHeaders := convert(normalize(c.AllowHeaders), http.CanonicalHeaderKey)
|
||||||
|
value := strings.Join(allowHeaders, ",")
|
||||||
|
headers.Set("Access-Control-Allow-Headers", value)
|
||||||
|
}
|
||||||
|
if c.MaxAge > time.Duration(0) {
|
||||||
|
value := strconv.FormatInt(int64(c.MaxAge/time.Second), 10)
|
||||||
|
headers.Set("Access-Control-Max-Age", value)
|
||||||
|
}
|
||||||
|
if c.AllowAllOrigins {
|
||||||
|
headers.Set("Access-Control-Allow-Origin", "*")
|
||||||
|
} else {
|
||||||
|
// Always set Vary headers
|
||||||
|
// see https://github.com/rs/cors/issues/10,
|
||||||
|
// https://github.com/rs/cors/commit/dbdca4d95feaa7511a46e6f1efb3b3aa505bc43f#commitcomment-12352001
|
||||||
|
|
||||||
|
headers.Add("Vary", "Origin")
|
||||||
|
headers.Add("Vary", "Access-Control-Request-Method")
|
||||||
|
headers.Add("Vary", "Access-Control-Request-Headers")
|
||||||
|
}
|
||||||
|
return headers
|
||||||
|
}
|
||||||
|
|
||||||
|
func normalize(values []string) []string {
|
||||||
|
if values == nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
distinctMap := make(map[string]bool, len(values))
|
||||||
|
normalized := make([]string, 0, len(values))
|
||||||
|
for _, value := range values {
|
||||||
|
value = strings.TrimSpace(value)
|
||||||
|
value = strings.ToLower(value)
|
||||||
|
if _, seen := distinctMap[value]; !seen {
|
||||||
|
normalized = append(normalized, value)
|
||||||
|
distinctMap[value] = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return normalized
|
||||||
|
}
|
||||||
|
|
||||||
|
func convert(s []string, c converter) []string {
|
||||||
|
var out []string
|
||||||
|
for _, i := range s {
|
||||||
|
out = append(out, c(i))
|
||||||
|
}
|
||||||
|
return out
|
||||||
|
}
|
@ -8,10 +8,14 @@
|
|||||||
package request
|
package request
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"bytes"
|
||||||
"errors"
|
"errors"
|
||||||
|
"io/ioutil"
|
||||||
"net/http"
|
"net/http"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
|
"git.zhangdeman.cn/zhangdeman/gin/define"
|
||||||
|
|
||||||
"github.com/gin-gonic/gin"
|
"github.com/gin-gonic/gin"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -29,6 +33,11 @@ type form struct {
|
|||||||
//
|
//
|
||||||
// Date : 00:34 2022/7/3
|
// Date : 00:34 2022/7/3
|
||||||
func (f *form) Parse(ctx *gin.Context, receiver interface{}) error {
|
func (f *form) Parse(ctx *gin.Context, receiver interface{}) error {
|
||||||
|
requestBody, _ := ioutil.ReadAll(ctx.Request.Body)
|
||||||
|
// 请求信息写入上下文
|
||||||
|
ctx.Set(define.RecordRequestDataField, string(requestBody))
|
||||||
|
// 因为请求体被读一遍之后就没了,重新赋值 requestBody
|
||||||
|
ctx.Request.Body = ioutil.NopCloser(bytes.NewReader(requestBody))
|
||||||
method := strings.ToUpper(ctx.Request.Method)
|
method := strings.ToUpper(ctx.Request.Method)
|
||||||
if method == http.MethodGet ||
|
if method == http.MethodGet ||
|
||||||
method == http.MethodPatch ||
|
method == http.MethodPatch ||
|
||||||
|
@ -8,6 +8,7 @@
|
|||||||
package response
|
package response
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"encoding/json"
|
||||||
"net/http"
|
"net/http"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
@ -32,14 +33,20 @@ func Success(ctx *gin.Context, data interface{}) {
|
|||||||
//
|
//
|
||||||
// Date : 22:40 2022/6/25
|
// Date : 22:40 2022/6/25
|
||||||
func Send(ctx *gin.Context, code interface{}, httpCode int, data interface{}) {
|
func Send(ctx *gin.Context, code interface{}, httpCode int, data interface{}) {
|
||||||
|
finishRequestTime := time.Now().UnixNano()
|
||||||
responseData := map[string]interface{}{
|
responseData := map[string]interface{}{
|
||||||
define.ResponseCodeField: code,
|
define.ResponseCodeField: code,
|
||||||
define.ResponseMessageField: exception.GetMessage(code),
|
define.ResponseMessageField: exception.GetMessage(code),
|
||||||
define.ResponseTraceIDField: ctx.GetString(define.TraceIDField),
|
define.ResponseTraceIDField: ctx.GetString(define.TraceIDField),
|
||||||
define.ResponseRequestIDField: ctx.GetString(define.RequestIDField),
|
define.ResponseRequestIDField: ctx.GetString(define.RequestIDField),
|
||||||
define.ResponseDataField: data,
|
define.ResponseDataField: data,
|
||||||
define.HandleRequestCostField: float64(time.Now().UnixNano()-ctx.GetInt64(define.StartRequestTimeField)) / 1e9,
|
define.HandleRequestCostField: (finishRequestTime - ctx.GetInt64(define.StartRequestTimeField)) / 1e6,
|
||||||
}
|
}
|
||||||
|
// 记录响应数据
|
||||||
|
recordData, _ := json.Marshal(responseData)
|
||||||
|
// 记录完成时间
|
||||||
|
ctx.Set(define.FinishRequestTimeField, finishRequestTime)
|
||||||
|
ctx.Set(define.RecordResponseDataField, string(recordData))
|
||||||
responseException := exception.New(code, httpCode, responseData)
|
responseException := exception.New(code, httpCode, responseData)
|
||||||
ctx.JSON(responseException.GetHttpCode(), responseException.GetData())
|
ctx.JSON(responseException.GetHttpCode(), responseException.GetData())
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user