Commits vergleichen
31 Commits
Autor | SHA1 | Datum | |
---|---|---|---|
5717ec7a91 | |||
9ac6b96eee | |||
818560df17 | |||
4aa50328f2 | |||
b71fcb8fa2 | |||
f8a7689fea | |||
1d647c7d00 | |||
2326ceb32e | |||
8d9b870820 | |||
b5800f09c2 | |||
0f9fded567 | |||
1b64551582 | |||
bf60ad409c | |||
d744ff8205 | |||
4244e2728d | |||
7cf90595e6 | |||
ecdf2c5b77 | |||
076e26ae0e | |||
2129c6339c | |||
3ead80fe16 | |||
e47609087f | |||
03b6c3d059 | |||
890dddb04f | |||
440d23f463 | |||
93c1b7a8b0 | |||
487a8b4c64 | |||
d0c86eb95b | |||
5c33058038 | |||
207a7ff58a | |||
044721ac8e | |||
9c6feec4ea |
27 geänderte Dateien mit 529 neuen und 515 gelöschten Zeilen
2
.gitignore
gevendort
Normale Datei
2
.gitignore
gevendort
Normale Datei
|
@ -0,0 +1,2 @@
|
|||
go.work
|
||||
go.work.sum
|
13
auth/auth.go
13
auth/auth.go
|
@ -4,6 +4,7 @@ import (
|
|||
"net/http"
|
||||
|
||||
"github.com/gin-gonic/gin"
|
||||
"go.sebtobie.de/httpserver/constants"
|
||||
)
|
||||
|
||||
// AuthenticationHandler is an interface that is used to give the account of the request.
|
||||
|
@ -17,8 +18,8 @@ type AuthenticationHandler interface {
|
|||
|
||||
// Account is an interface that gives the application access to infos about the user.
|
||||
type Account interface {
|
||||
Get(AccountConstant) interface{}
|
||||
List() []AccountConstant
|
||||
Get(constants.AccountConstant) any
|
||||
List() []constants.AccountConstant
|
||||
Anonymous() bool
|
||||
Redirect(c *gin.Context)
|
||||
}
|
||||
|
@ -36,16 +37,16 @@ func (*AnonAccountHandler) Account(*gin.Context) Account {
|
|||
type AnonAccount struct{}
|
||||
|
||||
// Get returns only AccountAnon = true
|
||||
func (*AnonAccount) Get(key AccountConstant) (in interface{}) {
|
||||
if key == AccountAnon {
|
||||
func (*AnonAccount) Get(key constants.AccountConstant) (in any) {
|
||||
if key == constants.AccountAnon {
|
||||
return true
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
// List return only AccountAnon as the only Listitem
|
||||
func (*AnonAccount) List() []AccountConstant {
|
||||
return []AccountConstant{AccountAnon}
|
||||
func (*AnonAccount) List() []constants.AccountConstant {
|
||||
return []constants.AccountConstant{constants.AccountAnon}
|
||||
}
|
||||
|
||||
// Anonymous is always true
|
||||
|
|
3
auth/doc.go
Normale Datei
3
auth/doc.go
Normale Datei
|
@ -0,0 +1,3 @@
|
|||
// Package auth is for the abstraction of the authentication method.
|
||||
// this enables the application developer to seperate the authentication from the authentication itself.
|
||||
package auth
|
|
@ -1,4 +1,4 @@
|
|||
package auth
|
||||
package constants
|
||||
|
||||
// AccountConstant is an type for easier linting.
|
||||
type AccountConstant string
|
2
constants/doc.go
Normale Datei
2
constants/doc.go
Normale Datei
|
@ -0,0 +1,2 @@
|
|||
// Package constants provides static aliases when an value from an enum is required
|
||||
package constants
|
2
doc.go
Normale Datei
2
doc.go
Normale Datei
|
@ -0,0 +1,2 @@
|
|||
// Package httpserver provides developers with an HTTP-Server that route parts of the site on different domains and is configurable after the build
|
||||
package httpserver
|
2
funcs/doc.go
Normale Datei
2
funcs/doc.go
Normale Datei
|
@ -0,0 +1,2 @@
|
|||
// Package funcs provides fome functions that for special cases
|
||||
package funcs
|
|
@ -1,41 +1,9 @@
|
|||
package funcs
|
||||
|
||||
import (
|
||||
"context"
|
||||
"net"
|
||||
|
||||
"github.com/jackc/pgx/v4"
|
||||
"github.com/phuslu/log"
|
||||
)
|
||||
|
||||
//PGXLogger is an struct to intergrate the Logger Interface of pgx
|
||||
type PGXLogger struct{}
|
||||
|
||||
// Log sends the logging data to phuslu/log
|
||||
func (PGXLogger) Log(ctx context.Context, level pgx.LogLevel, msg string, data map[string]interface{}) {
|
||||
var entry *log.Entry
|
||||
switch level {
|
||||
case pgx.LogLevelDebug:
|
||||
entry = log.Debug()
|
||||
case pgx.LogLevelError:
|
||||
entry = log.Error()
|
||||
case pgx.LogLevelInfo:
|
||||
entry = log.Info()
|
||||
case pgx.LogLevelTrace:
|
||||
entry = log.Trace()
|
||||
case pgx.LogLevelWarn:
|
||||
entry = log.Warn()
|
||||
default:
|
||||
entry = log.Info()
|
||||
}
|
||||
for key, value := range data {
|
||||
entry = entry.Interface(key, value)
|
||||
}
|
||||
entry.Msg(msg)
|
||||
}
|
||||
|
||||
var _ pgx.Logger = PGXLogger{}
|
||||
|
||||
// IsUnix tests if the address is an unix address. It returns false if its an tcp address.
|
||||
func IsUnix(address string) bool {
|
||||
if IsTCP(address) {
|
||||
|
|
|
@ -1,5 +1,3 @@
|
|||
// +build go1.16
|
||||
|
||||
package funcs
|
||||
|
||||
import (
|
||||
|
@ -9,7 +7,7 @@ import (
|
|||
"time"
|
||||
|
||||
"github.com/gin-gonic/gin"
|
||||
"github.com/phuslu/log"
|
||||
"github.com/rs/zerolog/log"
|
||||
)
|
||||
|
||||
func headheader(f fs.File, c *gin.Context) (nocontent bool) {
|
||||
|
@ -23,10 +21,10 @@ func headheader(f fs.File, c *gin.Context) (nocontent bool) {
|
|||
}
|
||||
c.Writer.Header().Set("Last-Modified", stats.ModTime().Format(time.RFC1123))
|
||||
if t, err := time.Parse(time.RFC1123, c.GetHeader("If-Modified-Since")); stats.ModTime().After(t) && err == nil {
|
||||
nocontent = true
|
||||
}
|
||||
if nocontent {
|
||||
c.Status(http.StatusNotModified)
|
||||
nocontent = true
|
||||
} else {
|
||||
c.Status(http.StatusOK)
|
||||
}
|
||||
return
|
||||
}
|
||||
|
|
|
@ -1,3 +1,4 @@
|
|||
//go:build go1.16
|
||||
// +build go1.16
|
||||
|
||||
package funcs_test
|
||||
|
@ -51,7 +52,7 @@ func getFS(depth, width int) fstest.MapFS {
|
|||
go nodes.getchildren("", &m, &wg)
|
||||
wg.Wait()
|
||||
var fs = make(fstest.MapFS)
|
||||
m.Range(func(key, value interface{}) bool {
|
||||
m.Range(func(key, value any) bool {
|
||||
fs[key.(string)] = value.(*fstest.MapFile)
|
||||
return true
|
||||
})
|
||||
|
|
60
go.mod
60
go.mod
|
@ -1,23 +1,61 @@
|
|||
module go.sebtobie.de/httpserver
|
||||
|
||||
go 1.16
|
||||
go 1.19
|
||||
|
||||
require (
|
||||
github.com/crewjam/saml v0.4.8
|
||||
github.com/flosch/pongo2/v6 v6.0.0
|
||||
github.com/gin-gonic/gin v1.8.1
|
||||
github.com/go-ap/jsonld v0.0.0-20221030091449-f2a191312c73
|
||||
github.com/golang-jwt/jwt/v4 v4.4.2
|
||||
github.com/google/uuid v1.3.0
|
||||
github.com/jackc/pgx-gofrs-uuid v0.0.0-20220402203838-5fdaf7ddb8a2
|
||||
github.com/jackc/pgx/v5 v5.1.1
|
||||
github.com/jackc/tern/v2 v2.0.0-beta.3
|
||||
github.com/rs/xid v1.4.0
|
||||
github.com/rs/zerolog v1.28.0
|
||||
go.sebtobie.de/generic v1.0.1
|
||||
)
|
||||
|
||||
require (
|
||||
github.com/Masterminds/goutils v1.1.1 // indirect
|
||||
github.com/crewjam/saml v0.4.8
|
||||
github.com/flosch/pongo2/v4 v4.0.2
|
||||
github.com/gin-gonic/gin v1.8.1
|
||||
github.com/Masterminds/semver/v3 v3.1.1 // indirect
|
||||
github.com/Masterminds/sprig/v3 v3.2.2 // indirect
|
||||
github.com/beevik/etree v1.1.0 // indirect
|
||||
github.com/crewjam/httperr v0.2.0 // indirect
|
||||
github.com/gin-contrib/sse v0.1.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/validator/v10 v10.11.1 // indirect
|
||||
github.com/golang-jwt/jwt/v4 v4.4.2
|
||||
github.com/google/uuid v1.3.0
|
||||
github.com/goccy/go-json v0.9.11 // indirect
|
||||
github.com/gofrs/uuid v4.2.0+incompatible // indirect
|
||||
github.com/huandu/xstrings v1.3.2 // indirect
|
||||
github.com/imdario/mergo v0.3.13 // indirect
|
||||
github.com/jackc/pgx/v4 v4.17.2
|
||||
github.com/jackc/tern v1.13.0
|
||||
github.com/jonboulle/clockwork v0.3.0 // indirect
|
||||
github.com/jackc/pgpassfile v1.0.0 // indirect
|
||||
github.com/jackc/pgservicefile v0.0.0-20200714003250-2b9c44734f2b // indirect
|
||||
github.com/jackc/puddle/v2 v2.1.2 // indirect
|
||||
github.com/jonboulle/clockwork v0.2.2 // indirect
|
||||
github.com/json-iterator/go v1.1.12 // indirect
|
||||
github.com/leodido/go-urn v1.2.1 // indirect
|
||||
github.com/mattermost/xml-roundtrip-validator v0.1.0 // indirect
|
||||
github.com/mattn/go-colorable v0.1.13 // indirect
|
||||
github.com/mattn/go-isatty v0.0.16 // indirect
|
||||
github.com/mitchellh/copystructure v1.2.0 // indirect
|
||||
github.com/mitchellh/reflectwalk v1.0.2 // indirect
|
||||
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
|
||||
github.com/phuslu/log v1.0.83
|
||||
golang.org/x/crypto v0.1.0 // indirect
|
||||
github.com/modern-go/reflect2 v1.0.2 // indirect
|
||||
github.com/pelletier/go-toml/v2 v2.0.6 // indirect
|
||||
github.com/pkg/errors v0.9.1 // indirect
|
||||
github.com/russellhaering/goxmldsig v1.1.1 // indirect
|
||||
github.com/shopspring/decimal v1.3.1 // indirect
|
||||
github.com/spf13/cast v1.5.0 // indirect
|
||||
github.com/ugorji/go/codec v1.2.7 // indirect
|
||||
go.uber.org/atomic v1.10.0 // indirect
|
||||
golang.org/x/crypto v0.3.0 // indirect
|
||||
golang.org/x/net v0.2.0 // indirect
|
||||
golang.org/x/sync v0.0.0-20220923202941-7f9b1623fab7 // indirect
|
||||
golang.org/x/sys v0.2.0 // indirect
|
||||
golang.org/x/text v0.4.0 // indirect
|
||||
google.golang.org/protobuf v1.28.1 // indirect
|
||||
gopkg.in/yaml.v2 v2.4.0 // indirect
|
||||
)
|
||||
|
|
364
go.sum
364
go.sum
|
@ -1,33 +1,12 @@
|
|||
cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
|
||||
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
|
||||
github.com/Masterminds/goutils v1.1.0/go.mod h1:8cTjp+g8YejhMuvIA5y2vz3BpJxksy863GQaJW2MFNU=
|
||||
github.com/Masterminds/goutils v1.1.1 h1:5nUrii3FMTL5diU80unEVvNevw1nH4+ZV4DSLVJLSYI=
|
||||
github.com/Masterminds/goutils v1.1.1/go.mod h1:8cTjp+g8YejhMuvIA5y2vz3BpJxksy863GQaJW2MFNU=
|
||||
github.com/Masterminds/semver v1.5.0 h1:H65muMkzWKEuNDnfl9d70GUjFniHKHRbFPGBuZ3QEww=
|
||||
github.com/Masterminds/semver v1.5.0/go.mod h1:MB6lktGJrhw8PrUyiEoblNEGEQ+RzHPF078ddwwvV3Y=
|
||||
github.com/Masterminds/semver/v3 v3.1.1 h1:hLg3sBzpNErnxhQtUy/mmLR2I9foDujNK030IGemrRc=
|
||||
github.com/Masterminds/semver/v3 v3.1.1/go.mod h1:VPu/7SZ7ePZ3QOrcuXROw5FAcLl4a0cBrbBpGY/8hQs=
|
||||
github.com/Masterminds/sprig v2.22.0+incompatible h1:z4yfnGrZ7netVz+0EDJ0Wi+5VZCSYp4Z0m2dk6cEM60=
|
||||
github.com/Masterminds/sprig v2.22.0+incompatible/go.mod h1:y6hNFY5UBTIWBxnzTeuNhlNS5hqE0NB0E6fgfo2Br3o=
|
||||
github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU=
|
||||
github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
|
||||
github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
|
||||
github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8=
|
||||
github.com/Masterminds/sprig/v3 v3.2.2 h1:17jRggJu518dr3QaafizSXOjKYp94wKfABxUmyxvxX8=
|
||||
github.com/Masterminds/sprig/v3 v3.2.2/go.mod h1:UoaO7Yp8KlPnJIYWTFkMaqPUYKTfGFPhxNuwnnxkKlk=
|
||||
github.com/beevik/etree v1.1.0 h1:T0xke/WvNtMoCqgzPhkX2r4rjY3GDZFi+FjpRZY2Jbs=
|
||||
github.com/beevik/etree v1.1.0/go.mod h1:r8Aw8JqVegEf0w2fDnATrX9VpkMcyFeM0FhwO62wh+A=
|
||||
github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=
|
||||
github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8=
|
||||
github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc=
|
||||
github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
|
||||
github.com/cockroachdb/apd v1.1.0 h1:3LFP3629v+1aKXU5Q37mxmRxX/pIu1nijXydLShEq5I=
|
||||
github.com/cockroachdb/apd v1.1.0/go.mod h1:8Sl8LxpKi29FqWXR16WEFZRNSz3SoPzUzeMeY4+DwBQ=
|
||||
github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk=
|
||||
github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE=
|
||||
github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk=
|
||||
github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4=
|
||||
github.com/coreos/go-systemd v0.0.0-20190719114852-fd7a80b32e1f/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4=
|
||||
github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA=
|
||||
github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU=
|
||||
github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY=
|
||||
github.com/coreos/go-systemd/v22 v22.3.3-0.20220203105225-a9a7ef127534/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc=
|
||||
github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
|
||||
github.com/crewjam/httperr v0.2.0 h1:b2BfXR8U3AlIHwNeFFvZ+BV1LFvKLlzMjzaTnZMybNo=
|
||||
github.com/crewjam/httperr v0.2.0/go.mod h1:Jlz+Sg/XqBQhyMjdDiC+GNNRzZTD7x39Gu3pglZ5oH4=
|
||||
|
@ -36,185 +15,81 @@ github.com/crewjam/saml v0.4.8/go.mod h1:9Zh6dWPtB3MSzTRt8fIFH60Z351QQ+s7hCU3J/t
|
|||
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/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||
github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ=
|
||||
github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no=
|
||||
github.com/flosch/pongo2/v4 v4.0.2 h1:gv+5Pe3vaSVmiJvh/BZa82b7/00YUGm0PIyVVLop0Hw=
|
||||
github.com/flosch/pongo2/v4 v4.0.2/go.mod h1:B5ObFANs/36VwxxlgKpdchIJHMvHB562PW+BWPhwZD8=
|
||||
github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
|
||||
github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
|
||||
github.com/flosch/pongo2/v6 v6.0.0 h1:lsGru8IAzHgIAw6H2m4PCyleO58I40ow6apih0WprMU=
|
||||
github.com/flosch/pongo2/v6 v6.0.0/go.mod h1:CuDpFm47R0uGGE7z13/tTlt1Y6zdxvr2RLT5LJhsHEU=
|
||||
github.com/frankban/quicktest v1.14.3 h1:FJKSZTDHjyhriyC81FLQ0LY93eSai0ZyR/ZIkd3ZUKE=
|
||||
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-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/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
|
||||
github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY=
|
||||
github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE=
|
||||
github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk=
|
||||
github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A=
|
||||
github.com/go-ap/jsonld v0.0.0-20221030091449-f2a191312c73 h1:GMKIYXyXPGIp+hYiWOhfqK4A023HdgisDT4YGgf99mw=
|
||||
github.com/go-ap/jsonld v0.0.0-20221030091449-f2a191312c73/go.mod h1:jyveZeGw5LaADntW+UEsMjl3IlIwk+DxlYNsbofQkGA=
|
||||
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/locales v0.14.0 h1:u50s323jtVGugKlcYeyzC0etD1HifMjqmJqb8WugfUU=
|
||||
github.com/go-playground/locales v0.14.0/go.mod h1:sawfccIbzZTqEDETgFXqTho0QybSa7l++s0DH+LDiLs=
|
||||
github.com/go-playground/universal-translator v0.18.0 h1:82dyy6p4OuJq4/CByFNOn/jYrnRPArHwAcmLoJZxyho=
|
||||
github.com/go-playground/universal-translator v0.18.0/go.mod h1:UvRDBj+xPUEGrFYl+lu/H90nyDXpg0fqeB/AQUGNTVA=
|
||||
github.com/go-playground/validator/v10 v10.10.0/go.mod h1:74x4gJWsvQexRdW8Pn3dXSGrTK4nAUsbPlLADvpJkos=
|
||||
github.com/go-playground/validator/v10 v10.11.1 h1:prmOlTVv+YjZjmRmNSF3VmspqJIxJWXmqUsHwfTRRkQ=
|
||||
github.com/go-playground/validator/v10 v10.11.1/go.mod h1:i+3WkQ1FvaUjjxh1kSvIA4dMGDBiPU55YFDl0WbKdWU=
|
||||
github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
|
||||
github.com/goccy/go-json v0.9.7 h1:IcB+Aqpx/iMHu5Yooh7jEzJk1JZ7Pjtmys2ukPr7EeM=
|
||||
github.com/goccy/go-json v0.9.7/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I=
|
||||
github.com/gofrs/uuid v3.2.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM=
|
||||
github.com/gofrs/uuid v4.0.0+incompatible h1:1SD/1F5pU8p29ybwgQSwpQk+mwdRrXCYuPhW6m+TnJw=
|
||||
github.com/gofrs/uuid v4.0.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM=
|
||||
github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
|
||||
github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4=
|
||||
github.com/goccy/go-json v0.9.11 h1:/pAaQDLHEoCq/5FFmSKBswWmK6H0e8g4159Kc/X/nqk=
|
||||
github.com/goccy/go-json v0.9.11/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I=
|
||||
github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=
|
||||
github.com/gofrs/uuid v4.2.0+incompatible h1:yyYWMnhkhrKwwr8gAOcOCYxOOscHgDS9yZgBrnJfGa0=
|
||||
github.com/gofrs/uuid v4.2.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM=
|
||||
github.com/golang-jwt/jwt/v4 v4.4.2 h1:rcc4lwaZgFMCZ5jxF9ABolDcIHdBytAFgqFPbSJQAYs=
|
||||
github.com/golang-jwt/jwt/v4 v4.4.2/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0=
|
||||
github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
|
||||
github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
|
||||
github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
|
||||
github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
|
||||
github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
|
||||
github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=
|
||||
github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
|
||||
github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
|
||||
github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
||||
github.com/google/go-cmp v0.5.8 h1:e6P7q2lk1O+qJJb4BtCQXlK8vWEO8V1ZeuEdJNOqZyg=
|
||||
github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
|
||||
github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
|
||||
github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=
|
||||
github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
|
||||
github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I=
|
||||
github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
|
||||
github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ=
|
||||
github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs=
|
||||
github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk=
|
||||
github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY=
|
||||
github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ=
|
||||
github.com/huandu/xstrings v1.3.1/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq4ovT0aE=
|
||||
github.com/huandu/xstrings v1.3.2 h1:L18LIDzqlW6xN2rEkpdV8+oL/IXWJ1APd+vsdYy4Wdw=
|
||||
github.com/huandu/xstrings v1.3.2/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq4ovT0aE=
|
||||
github.com/imdario/mergo v0.3.9/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA=
|
||||
github.com/imdario/mergo v0.3.11/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA=
|
||||
github.com/imdario/mergo v0.3.13 h1:lFzP57bqS/wsqKssCGmtLAb8A0wKjLGrve2q3PPVcBk=
|
||||
github.com/imdario/mergo v0.3.13/go.mod h1:4lJ1jqUDcsbIECGy0RUJAXNIhg+6ocWgb1ALK2O4oXg=
|
||||
github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8=
|
||||
github.com/jackc/chunkreader v1.0.0 h1:4s39bBR8ByfqH+DKm8rQA3E1LHZWB9XWcrz8fqaZbe0=
|
||||
github.com/jackc/chunkreader v1.0.0/go.mod h1:RT6O25fNZIuasFJRyZ4R/Y2BbhasbmZXF9QQ7T3kePo=
|
||||
github.com/jackc/chunkreader/v2 v2.0.0/go.mod h1:odVSm741yZoC3dpHEUXIqA9tQRhFrgOHwnPIn9lDKlk=
|
||||
github.com/jackc/chunkreader/v2 v2.0.1 h1:i+RDz65UE+mmpjTfyz0MoVTnzeYxroil2G82ki7MGG8=
|
||||
github.com/jackc/chunkreader/v2 v2.0.1/go.mod h1:odVSm741yZoC3dpHEUXIqA9tQRhFrgOHwnPIn9lDKlk=
|
||||
github.com/jackc/pgconn v0.0.0-20190420214824-7e0022ef6ba3/go.mod h1:jkELnwuX+w9qN5YIfX0fl88Ehu4XC3keFuOJJk9pcnA=
|
||||
github.com/jackc/pgconn v0.0.0-20190824142844-760dd75542eb/go.mod h1:lLjNuW/+OfW9/pnVKPazfWOgNfH2aPem8YQ7ilXGvJE=
|
||||
github.com/jackc/pgconn v0.0.0-20190831204454-2fabfa3c18b7/go.mod h1:ZJKsE/KZfsUgOEh9hBm+xYTstcNHg7UPMVJqRfQxq4s=
|
||||
github.com/jackc/pgconn v1.4.0/go.mod h1:Y2O3ZDF0q4mMacyWV3AstPJpeHXWGEetiFttmq5lahk=
|
||||
github.com/jackc/pgconn v1.5.0/go.mod h1:QeD3lBfpTFe8WUnPZWN5KY/mB8FGMIYRdd8P8Jr0fAI=
|
||||
github.com/jackc/pgconn v1.5.1-0.20200601181101-fa742c524853/go.mod h1:QeD3lBfpTFe8WUnPZWN5KY/mB8FGMIYRdd8P8Jr0fAI=
|
||||
github.com/jackc/pgconn v1.6.1/go.mod h1:g8mKMqmSUO6AzAvha7vy07g1rbGOlc7iF0nU0ei83hc=
|
||||
github.com/jackc/pgconn v1.8.0/go.mod h1:1C2Pb36bGIP9QHGBYCjnyhqu7Rv3sGshaQUvmfGIB/o=
|
||||
github.com/jackc/pgconn v1.9.0/go.mod h1:YctiPyvzfU11JFxoXokUOOKQXQmDMoJL9vJzHH8/2JY=
|
||||
github.com/jackc/pgconn v1.9.1-0.20210724152538-d89c8390a530/go.mod h1:4z2w8XhRbP1hYxkpTuBjTS3ne3J48K83+u0zoyvg2pI=
|
||||
github.com/jackc/pgconn v1.13.0 h1:3L1XMNV2Zvca/8BYhzcRFS70Lr0WlDg16Di6SFGAbys=
|
||||
github.com/jackc/pgconn v1.13.0/go.mod h1:AnowpAqO4CMIIJNZl2VJp+KrkAZciAkhEl0W0JIobpI=
|
||||
github.com/jackc/pgio v1.0.0 h1:g12B9UwVnzGhueNavwioyEEpAmqMe1E/BN9ES+8ovkE=
|
||||
github.com/jackc/pgio v1.0.0/go.mod h1:oP+2QK2wFfUWgr+gxjoBH9KGBb31Eio69xUb0w5bYf8=
|
||||
github.com/jackc/pgmock v0.0.0-20190831213851-13a1b77aafa2/go.mod h1:fGZlG77KXmcq05nJLRkk0+p82V8B8Dw8KN2/V9c/OAE=
|
||||
github.com/jackc/pgmock v0.0.0-20201204152224-4fe30f7445fd/go.mod h1:hrBW0Enj2AZTNpt/7Y5rr2xe/9Mn757Wtb2xeBzPv2c=
|
||||
github.com/jackc/pgmock v0.0.0-20210724152146-4ad1a8207f65 h1:DadwsjnMwFjfWc9y5Wi/+Zz7xoE5ALHsRQlOctkOiHc=
|
||||
github.com/jackc/pgmock v0.0.0-20210724152146-4ad1a8207f65/go.mod h1:5R2h2EEX+qri8jOWMbJCtaPWkrrNc7OHwsp2TCqp7ak=
|
||||
github.com/jackc/pgpassfile v1.0.0 h1:/6Hmqy13Ss2zCq62VdNG8tM1wchn8zjSGOBJ6icpsIM=
|
||||
github.com/jackc/pgpassfile v1.0.0/go.mod h1:CEx0iS5ambNFdcRtxPj5JhEz+xB6uRky5eyVu/W2HEg=
|
||||
github.com/jackc/pgproto3 v1.1.0 h1:FYYE4yRw+AgI8wXIinMlNjBbp/UitDJwfj5LqqewP1A=
|
||||
github.com/jackc/pgproto3 v1.1.0/go.mod h1:eR5FA3leWg7p9aeAqi37XOTgTIbkABlvcPB3E5rlc78=
|
||||
github.com/jackc/pgproto3/v2 v2.0.0-alpha1.0.20190420180111-c116219b62db/go.mod h1:bhq50y+xrl9n5mRYyCBFKkpRVTLYJVWeCc+mEAI3yXA=
|
||||
github.com/jackc/pgproto3/v2 v2.0.0-alpha1.0.20190609003834-432c2951c711/go.mod h1:uH0AWtUmuShn0bcesswc4aBTWGvw0cAxIJp+6OB//Wg=
|
||||
github.com/jackc/pgproto3/v2 v2.0.0-rc3/go.mod h1:ryONWYqW6dqSg1Lw6vXNMXoBJhpzvWKnT95C46ckYeM=
|
||||
github.com/jackc/pgproto3/v2 v2.0.0-rc3.0.20190831210041-4c03ce451f29/go.mod h1:ryONWYqW6dqSg1Lw6vXNMXoBJhpzvWKnT95C46ckYeM=
|
||||
github.com/jackc/pgproto3/v2 v2.0.1/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA=
|
||||
github.com/jackc/pgproto3/v2 v2.0.2/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA=
|
||||
github.com/jackc/pgproto3/v2 v2.0.6/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA=
|
||||
github.com/jackc/pgproto3/v2 v2.1.1/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA=
|
||||
github.com/jackc/pgproto3/v2 v2.3.1 h1:nwj7qwf0S+Q7ISFfBndqeLwSwxs+4DPsbRFjECT1Y4Y=
|
||||
github.com/jackc/pgproto3/v2 v2.3.1/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA=
|
||||
github.com/jackc/pgservicefile v0.0.0-20200307190119-3430c5407db8/go.mod h1:vsD4gTJCa9TptPL8sPkXrLZ+hDuNrZCnj29CQpr4X1E=
|
||||
github.com/jackc/pgservicefile v0.0.0-20200714003250-2b9c44734f2b h1:C8S2+VttkHFdOOCXJe+YGfa4vHYwlt4Zx+IVXQ97jYg=
|
||||
github.com/jackc/pgservicefile v0.0.0-20200714003250-2b9c44734f2b/go.mod h1:vsD4gTJCa9TptPL8sPkXrLZ+hDuNrZCnj29CQpr4X1E=
|
||||
github.com/jackc/pgtype v0.0.0-20190421001408-4ed0de4755e0/go.mod h1:hdSHsc1V01CGwFsrv11mJRHWJ6aifDLfdV3aVjFF0zg=
|
||||
github.com/jackc/pgtype v0.0.0-20190824184912-ab885b375b90/go.mod h1:KcahbBH1nCMSo2DXpzsoWOAfFkdEtEJpPbVLq8eE+mc=
|
||||
github.com/jackc/pgtype v0.0.0-20190828014616-a8802b16cc59/go.mod h1:MWlu30kVJrUS8lot6TQqcg7mtthZ9T0EoIBFiJcmcyw=
|
||||
github.com/jackc/pgtype v1.2.0/go.mod h1:5m2OfMh1wTK7x+Fk952IDmI4nw3nPrvtQdM0ZT4WpC0=
|
||||
github.com/jackc/pgtype v1.3.1-0.20200510190516-8cd94a14c75a/go.mod h1:vaogEUkALtxZMCH411K+tKzNpwzCKU+AnPzBKZ+I+Po=
|
||||
github.com/jackc/pgtype v1.3.1-0.20200606141011-f6355165a91c/go.mod h1:cvk9Bgu/VzJ9/lxTO5R5sf80p0DiucVtN7ZxvaC4GmQ=
|
||||
github.com/jackc/pgtype v1.4.0/go.mod h1:JCULISAZBFGrHaOXIIFiyfzW5VY0GRitRr8NeJsrdig=
|
||||
github.com/jackc/pgtype v1.8.1-0.20210724151600-32e20a603178/go.mod h1:C516IlIV9NKqfsMCXTdChteoXmwgUceqaLfjg2e3NlM=
|
||||
github.com/jackc/pgtype v1.12.0 h1:Dlq8Qvcch7kiehm8wPGIW0W3KsCCHJnRacKW0UM8n5w=
|
||||
github.com/jackc/pgtype v1.12.0/go.mod h1:LUMuVrfsFfdKGLw+AFFVv6KtHOFMwRgDDzBt76IqCA4=
|
||||
github.com/jackc/pgx/v4 v4.0.0-20190420224344-cc3461e65d96/go.mod h1:mdxmSJJuR08CZQyj1PVQBHy9XOp5p8/SHH6a0psbY9Y=
|
||||
github.com/jackc/pgx/v4 v4.0.0-20190421002000-1b8f0016e912/go.mod h1:no/Y67Jkk/9WuGR0JG/JseM9irFbnEPbuWV2EELPNuM=
|
||||
github.com/jackc/pgx/v4 v4.0.0-pre1.0.20190824185557-6972a5742186/go.mod h1:X+GQnOEnf1dqHGpw7JmHqHc1NxDoalibchSk9/RWuDc=
|
||||
github.com/jackc/pgx/v4 v4.5.0/go.mod h1:EpAKPLdnTorwmPUUsqrPxy5fphV18j9q3wrfRXgo+kA=
|
||||
github.com/jackc/pgx/v4 v4.6.1-0.20200510190926-94ba730bb1e9/go.mod h1:t3/cdRQl6fOLDxqtlyhe9UWgfIi9R8+8v8GKV5TRA/o=
|
||||
github.com/jackc/pgx/v4 v4.6.1-0.20200606145419-4e5062306904/go.mod h1:ZDaNWkt9sW1JMiNn0kdYBaLelIhw7Pg4qd+Vk6tw7Hg=
|
||||
github.com/jackc/pgx/v4 v4.7.1/go.mod h1:nu42q3aPjuC1M0Nak4bnoprKlXPINqopEKqbq5AZSC4=
|
||||
github.com/jackc/pgx/v4 v4.12.1-0.20210724153913-640aa07df17c/go.mod h1:1QD0+tgSXP7iUjYm9C1NxKhny7lq6ee99u/z+IHFcgs=
|
||||
github.com/jackc/pgx/v4 v4.17.2 h1:0Ut0rpeKwvIVbMQ1KbMBU4h6wxehBI535LK6Flheh8E=
|
||||
github.com/jackc/pgx/v4 v4.17.2/go.mod h1:lcxIZN44yMIrWI78a5CpucdD14hX0SBDbNRvjDBItsw=
|
||||
github.com/jackc/puddle v0.0.0-20190413234325-e4ced69a3a2b/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk=
|
||||
github.com/jackc/puddle v0.0.0-20190608224051-11cab39313c9/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk=
|
||||
github.com/jackc/puddle v1.1.0/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk=
|
||||
github.com/jackc/puddle v1.1.1/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk=
|
||||
github.com/jackc/puddle v1.1.3/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk=
|
||||
github.com/jackc/puddle v1.3.0 h1:eHK/5clGOatcjX3oWGBO/MpxpbHzSwud5EWTSCI+MX0=
|
||||
github.com/jackc/puddle v1.3.0/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk=
|
||||
github.com/jackc/tern v1.13.0 h1:nh9Jpv6Ib5IYDCY5HXXFtEKkwgmu+a9Z2jAh4N4HtKs=
|
||||
github.com/jackc/tern v1.13.0/go.mod h1:RSTSSl0BipS9yGxR2uP24R2Steyr3UjHF2XffaP7Ks4=
|
||||
github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo=
|
||||
github.com/jackc/pgx-gofrs-uuid v0.0.0-20220402203838-5fdaf7ddb8a2 h1:6qEGnCP4zC+VNPCcb3aHpK4vB51mdE0yyjreAEfjI9c=
|
||||
github.com/jackc/pgx-gofrs-uuid v0.0.0-20220402203838-5fdaf7ddb8a2/go.mod h1:qNQYZ2L+Xpfoj0yU0Moom/Hlbre7mQLS3b006rVArMs=
|
||||
github.com/jackc/pgx/v5 v5.1.1 h1:pZD79K1SYv8wc2HmCQA6VdmRQi7/OtCfv9bM3WAXUYA=
|
||||
github.com/jackc/pgx/v5 v5.1.1/go.mod h1:Ptn7zmohNsWEsdxRawMzk3gaKma2obW+NWTnKa0S4nk=
|
||||
github.com/jackc/puddle/v2 v2.1.2 h1:0f7vaaXINONKTsxYDn4otOAiJanX/BMeAtY//BXqzlg=
|
||||
github.com/jackc/puddle/v2 v2.1.2/go.mod h1:2lpufsF5mRHO6SuZkm0fNYxM6SWHfvyFj62KwNzgels=
|
||||
github.com/jackc/tern/v2 v2.0.0-beta.3 h1:eLC0C8KgIHVkcm7fJvrG4B1gTjRO1xkGN1g9gQBoh3k=
|
||||
github.com/jackc/tern/v2 v2.0.0-beta.3/go.mod h1:JC+qkR3EMEgATsTKdYojLBizn2gl4jWQmwqbUxYbA8U=
|
||||
github.com/jonboulle/clockwork v0.2.2 h1:UOGuzwb1PwsrDAObMuhUnj0p5ULPj8V/xJ7Kx9qUBdQ=
|
||||
github.com/jonboulle/clockwork v0.2.2/go.mod h1:Pkfl5aHPm1nk2H9h0bjmnJD/BcgbGXUBGnn1kMkgxc8=
|
||||
github.com/jonboulle/clockwork v0.3.0 h1:9BSCMi8C+0qdApAp4auwX0RkLGUjs956h0EkuQymUhg=
|
||||
github.com/jonboulle/clockwork v0.3.0/go.mod h1:Pkfl5aHPm1nk2H9h0bjmnJD/BcgbGXUBGnn1kMkgxc8=
|
||||
github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=
|
||||
github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=
|
||||
github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=
|
||||
github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q=
|
||||
github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
|
||||
github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
|
||||
github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
|
||||
github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc=
|
||||
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
|
||||
github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=
|
||||
github.com/kr/pretty v0.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0=
|
||||
github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk=
|
||||
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
|
||||
github.com/kr/pty v1.1.8/go.mod h1:O1sed60cT9XZ5uDucP5qwvh+TE3NnUj51EiZO/lmSfw=
|
||||
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
|
||||
github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
|
||||
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/go.mod h1:zt4jvISO2HfUBqxjfIshjdMTYS56ZS/qv49ictyFfxY=
|
||||
github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo=
|
||||
github.com/lib/pq v1.1.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo=
|
||||
github.com/lib/pq v1.2.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo=
|
||||
github.com/lib/pq v1.3.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo=
|
||||
github.com/lib/pq v1.10.2 h1:AqzbZs4ZoCBp+GtejcpCpcxM3zlSMx29dXbUSeVtJb8=
|
||||
github.com/lib/pq v1.10.2/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o=
|
||||
github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ=
|
||||
github.com/mattermost/xml-roundtrip-validator v0.1.0 h1:RXbVD2UAl7A7nOTR4u7E3ILa4IbtvKBHw64LDsmu9hU=
|
||||
github.com/mattermost/xml-roundtrip-validator v0.1.0/go.mod h1:qccnGMcpgwcNaBnxqpJpWWUiPNr5H3O8eDgGV9gT5To=
|
||||
github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ=
|
||||
github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE=
|
||||
github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=
|
||||
github.com/mattn/go-isatty v0.0.5/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=
|
||||
github.com/mattn/go-isatty v0.0.7/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=
|
||||
github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=
|
||||
github.com/mattn/go-isatty v0.0.9/go.mod h1:YNRxwqDuOph6SZLI9vUUz6OYw3QyUt7WiY2yME+cCiQ=
|
||||
github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=
|
||||
github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4=
|
||||
github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA=
|
||||
github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg=
|
||||
github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94=
|
||||
github.com/mattn/go-isatty v0.0.16 h1:bq3VjFmv/sOjHtdEhmkEV4x1AJtvUvOJ2PFAZ5+peKQ=
|
||||
github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=
|
||||
github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=
|
||||
github.com/mitchellh/copystructure v1.0.0/go.mod h1:SNtv71yrdKgLRyLFxmLdkAbkKEFWgYaq1OVrnRcwhnw=
|
||||
github.com/mitchellh/copystructure v1.2.0 h1:vpKXTN4ewci03Vljg/q9QvCGUDttBOGBIa15WveJJGw=
|
||||
github.com/mitchellh/copystructure v1.2.0/go.mod h1:qLl+cE2AmVv+CoeAwDPye/v+N2HKCj9FbZEVFJRxO9s=
|
||||
github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=
|
||||
github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=
|
||||
github.com/mitchellh/reflectwalk v1.0.0/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw=
|
||||
github.com/mitchellh/reflectwalk v1.0.2 h1:G2LzWKi524PWgd3mLHV8Y5k7s6XUvT0Gef6zxSIeXaQ=
|
||||
github.com/mitchellh/reflectwalk v1.0.2/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw=
|
||||
|
@ -223,63 +98,32 @@ github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w
|
|||
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
|
||||
github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M=
|
||||
github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=
|
||||
github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
|
||||
github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno=
|
||||
github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U=
|
||||
github.com/pelletier/go-toml v1.2.0 h1:T5zMGML61Wp+FlcbWjRDT7yAxhJNAiPPLOFECq181zc=
|
||||
github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic=
|
||||
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/phuslu/log v1.0.83 h1:zfqz5tfFPLF8w0jEscpDxE2aFg1Y1kcbORDPliKdIbU=
|
||||
github.com/phuslu/log v1.0.83/go.mod h1:yAZh4pv6KxAsJDmJIcVSMxkMiUF7mJbpFN3vROkf0dc=
|
||||
github.com/pelletier/go-toml/v2 v2.0.6 h1:nrzqCb7j9cDFj2coyLNLaZuJTLjWjlaz6nvTvIwycIU=
|
||||
github.com/pelletier/go-toml/v2 v2.0.6/go.mod h1:eumQOmlWiOPt5WriQQqoM5y18pDHwha2N+QD+EUNTek=
|
||||
github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA=
|
||||
github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
|
||||
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/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
|
||||
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
|
||||
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
||||
github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=
|
||||
github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso=
|
||||
github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=
|
||||
github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
|
||||
github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro=
|
||||
github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=
|
||||
github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
|
||||
github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=
|
||||
github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU=
|
||||
github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg=
|
||||
github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
|
||||
github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc=
|
||||
github.com/rogpeppe/go-internal v1.8.0 h1:FCbCCtXNOY3UtUuHUYaghJg4y7Fd14rXifAYUAtL9R8=
|
||||
github.com/rogpeppe/go-internal v1.8.0/go.mod h1:WmiCO8CzOY8rg0OYDC4/i/2WRWAB6poM+XZ2dLUbcbE=
|
||||
github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ=
|
||||
github.com/rs/zerolog v1.13.0/go.mod h1:YbFCdg8HfsridGWAh22vktObvhZbQsZXe4/zB0OKkWU=
|
||||
github.com/rs/zerolog v1.15.0/go.mod h1:xYTKnLHcpfU2225ny5qZjxnj9NvkumZYjJHlAThCjNc=
|
||||
github.com/rs/xid v1.4.0 h1:qd7wPTDkN6KQx2VmMBLrpHkiyQwgFXRnkOLacUiaSNY=
|
||||
github.com/rs/xid v1.4.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg=
|
||||
github.com/rs/zerolog v1.28.0 h1:MirSo27VyNi7RJYP3078AA1+Cyzd2GB66qy3aUHvsWY=
|
||||
github.com/rs/zerolog v1.28.0/go.mod h1:NILgTygv/Uej1ra5XxGf82ZFSLk58MFGAUS2o6usyD0=
|
||||
github.com/russellhaering/goxmldsig v1.1.1 h1:vI0r2osGF1A9PLvsGdPUAGwEIrKa4Pj5sesSBsebIxM=
|
||||
github.com/russellhaering/goxmldsig v1.1.1/go.mod h1:gM4MDENBQf7M+V824SGfyIUVFWydB7n0KkEubVJl+Tw=
|
||||
github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
|
||||
github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0=
|
||||
github.com/shopspring/decimal v0.0.0-20180709203117-cd690d0c9e24/go.mod h1:M+9NzErvs504Cn4c5DxATwIqPbtswREoFCre64PpcG4=
|
||||
github.com/shopspring/decimal v0.0.0-20200227202807-02e2044944cc/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o=
|
||||
github.com/shopspring/decimal v1.2.0 h1:abSATXmQEYyShuxI4/vyW3tV1MrKAJzCZ/0zLUXYbsQ=
|
||||
github.com/shopspring/decimal v1.2.0/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o=
|
||||
github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc=
|
||||
github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=
|
||||
github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q=
|
||||
github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=
|
||||
github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM=
|
||||
github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA=
|
||||
github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ=
|
||||
github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE=
|
||||
github.com/spf13/cobra v1.0.0/go.mod h1:/6GTrnGXV9HjY+aR4k0oJ5tcvakLuG6EuKReYlHNrgE=
|
||||
github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo=
|
||||
github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
|
||||
github.com/spf13/viper v1.4.0/go.mod h1:PTJ7Z/lr49W6bUbkmS1V3by4uWynFiR9p7+dSq/yZzE=
|
||||
github.com/shopspring/decimal v1.3.1 h1:2Usl1nmF/WZucqkFZhnfFYxxxu8LG21F6nPQBE5gKV8=
|
||||
github.com/shopspring/decimal v1.3.1/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o=
|
||||
github.com/spf13/cast v1.3.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE=
|
||||
github.com/spf13/cast v1.5.0 h1:rj3WzYc11XZaIZMPKmwP96zkFEnnAmV8s6XbB2aY32w=
|
||||
github.com/spf13/cast v1.5.0/go.mod h1:SpXXQ5YoyJw6s3/6cMTQuxvgRl3PCJiyaX9p6b155UU=
|
||||
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
||||
github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
||||
github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE=
|
||||
github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
|
||||
github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=
|
||||
github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
|
||||
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
|
||||
github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
|
||||
|
@ -287,150 +131,58 @@ github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5
|
|||
github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
|
||||
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
|
||||
github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
|
||||
github.com/stretchr/testify v1.8.0 h1:pSgiaMZlXftHpm5L7V1+rVB+AZJydKsMxsQBIJw4PKk=
|
||||
github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
|
||||
github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U=
|
||||
github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc=
|
||||
github.com/stretchr/testify v1.8.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKsk=
|
||||
github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
|
||||
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/codec v1.2.7 h1:YPXUKf7fYbp/y8xloBqZOw2qaVggbfwMlI8WM3wZUJ0=
|
||||
github.com/ugorji/go/codec v1.2.7/go.mod h1:WGN1fab3R1fzQlVQTkfxVtIBhWDRqOviHU95kRgeqEY=
|
||||
github.com/vaughan0/go-ini v0.0.0-20130923145212-a98ad7ee00ec/go.mod h1:owBmyHYMLkxyrugmfwE/DLJyW8Ro9mkphwuVErQ0iUw=
|
||||
github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU=
|
||||
github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q=
|
||||
github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=
|
||||
github.com/zenazn/goji v0.9.0/go.mod h1:7S9M489iMyHBNxwZnk9/EHS098H4/F6TATF2mIxtB1Q=
|
||||
go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU=
|
||||
go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE=
|
||||
go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE=
|
||||
go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ=
|
||||
go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ=
|
||||
go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0=
|
||||
go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4=
|
||||
go.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKYU=
|
||||
go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA=
|
||||
go.uber.org/zap v1.9.1/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q=
|
||||
go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q=
|
||||
go.uber.org/zap v1.13.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM=
|
||||
golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
|
||||
go.sebtobie.de/generic v1.0.1 h1:N7q6nu5y9+QowBUj49qQgcDxYOxMy+ZIzFhQntclCxQ=
|
||||
go.sebtobie.de/generic v1.0.1/go.mod h1:3AAmr4JfoP2PD7VzRJBAjn+ZiRgaLCYKSOf3wn0nNCM=
|
||||
go.uber.org/atomic v1.10.0 h1:9qC72Qh0+3MqyJbAn8YU5xVq1frD8bn3JtD2oXtafVQ=
|
||||
go.uber.org/atomic v1.10.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0=
|
||||
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
|
||||
golang.org/x/crypto v0.0.0-20190411191339-88737f569e3a/go.mod h1:WFFai1msRO1wXaEeE5yQxYXgSfI8pQAWXbQop6sCtWE=
|
||||
golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
||||
golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
||||
golang.org/x/crypto v0.0.0-20190911031432-227b76d455e7/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
||||
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
||||
golang.org/x/crypto v0.0.0-20200323165209-0ec3e9974c59/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
|
||||
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
|
||||
golang.org/x/crypto v0.0.0-20201203163018-be400aefbc4c/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I=
|
||||
golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I=
|
||||
golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
|
||||
golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
|
||||
golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
|
||||
golang.org/x/crypto v0.0.0-20200414173820-0848c9571904/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
|
||||
golang.org/x/crypto v0.0.0-20211215153901-e495a2d5b3d3/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
|
||||
golang.org/x/crypto v0.0.0-20220128200615-198e4374d7ed/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
|
||||
golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
|
||||
golang.org/x/crypto v0.1.0 h1:MDRAIl0xIo9Io2xV565hzXHw3zVseKrJKodhohM5CjU=
|
||||
golang.org/x/crypto v0.1.0/go.mod h1:RecgLatLF4+eUMCP1PoPZQb+cVrJcOPbHkTkbkB9sbw=
|
||||
golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
|
||||
golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
|
||||
golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
|
||||
golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=
|
||||
golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=
|
||||
golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=
|
||||
golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||
golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||
golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||
golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
||||
golang.org/x/crypto v0.3.0 h1:a06MkbcxBrEFc0w0QIZWXrH/9cCX6KJyWbBOIwAn+7A=
|
||||
golang.org/x/crypto v0.3.0/go.mod h1:hebNnKkNXi2UzZN1eVRvBB7co0a+JxK6XbPiWVs/3J4=
|
||||
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
||||
golang.org/x/net v0.0.0-20190522155817-f3200d17e092/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks=
|
||||
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||
golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/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-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
|
||||
golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
|
||||
golang.org/x/net v0.1.0 h1:hZ/3BUoy5aId7sCpA/Tc5lt8DkFgdVS2onTpJsZ/fl0=
|
||||
golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco=
|
||||
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
|
||||
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||
golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||
golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||
golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||
golang.org/x/net v0.2.0 h1:sZfSu1wtKLGlWI4ZZayP0ck9Y73K1ynO6gqzTdBVdPU=
|
||||
golang.org/x/net v0.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY=
|
||||
golang.org/x/sync v0.0.0-20220923202941-7f9b1623fab7 h1:ZrnxWX62AgTKOSagEqxvb3ffipvEDX2pl7E1TdqLqIc=
|
||||
golang.org/x/sync v0.0.0-20220923202941-7f9b1623fab7/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-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||
golang.org/x/sys v0.0.0-20190403152447-81d4e9dc473e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
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-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.1.0 h1:kunALQeHf1/185U1i0GOB/fy1IPRDDpuoOOqRReG57U=
|
||||
golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw=
|
||||
golang.org/x/sys v0.2.0 h1:ljd4t30dBnAvMZaQCevtY0xLLD0A+bRZXbgLMLU1F/A=
|
||||
golang.org/x/sys v0.2.0/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-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
|
||||
golang.org/x/term v0.1.0/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.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
|
||||
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
||||
golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
||||
golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
||||
golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
|
||||
golang.org/x/text v0.4.0 h1:BrVqGRd7+k1DiOgtnFvAkoQEWQvBc25ouMJM6429SFg=
|
||||
golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
|
||||
golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
||||
golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/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-20190114222345-bf090417da8b/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-20190425163242-31fd60d6bfdc/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
|
||||
golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
|
||||
golang.org/x/tools v0.0.0-20190823170909-c4a336ef6a2f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
|
||||
golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
|
||||
golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
|
||||
golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
|
||||
golang.org/x/tools v0.0.0-20200103221440-774c71fcf114/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
|
||||
golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=
|
||||
golang.org/x/xerrors v0.0.0-20190410155217-1f06c39b4373/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||
golang.org/x/xerrors v0.0.0-20190513163551-3ee3066db522/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||
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/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||
google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
|
||||
google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
|
||||
google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
|
||||
google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM=
|
||||
google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=
|
||||
google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
|
||||
google.golang.org/protobuf v1.28.1 h1:d0NfwRgPtno5B1Wa6L2DAG+KivqkdutMf1UhdNx175w=
|
||||
google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
|
||||
gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=
|
||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||
gopkg.in/check.v1 v1.0.0-20200902074654-038fdea0a05b/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||
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/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=
|
||||
gopkg.in/inconshreveable/log15.v2 v2.0.0-20180818164646-67afb5ed74ec/go.mod h1:aPpfJ7XW+gOuirDoZ8gHhLh3kZ1B08FtV2bbmy7Jv3s=
|
||||
gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo=
|
||||
gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74=
|
||||
gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
||||
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
||||
gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
||||
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.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
||||
|
@ -440,5 +192,3 @@ gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
|
|||
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
||||
gotest.tools v2.2.0+incompatible h1:VsBPFP1AI068pPrMxtb/S8Zkgf9xEmTLJjfM+P5UIEo=
|
||||
gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw=
|
||||
honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
|
||||
honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg=
|
||||
|
|
149
http.go
149
http.go
|
@ -7,9 +7,12 @@ import (
|
|||
"net/http"
|
||||
"sync"
|
||||
|
||||
"github.com/flosch/pongo2/v4"
|
||||
intlog "log"
|
||||
|
||||
"github.com/flosch/pongo2/v6"
|
||||
"github.com/gin-gonic/gin"
|
||||
"github.com/phuslu/log"
|
||||
"github.com/rs/zerolog/log"
|
||||
"go.sebtobie.de/generic"
|
||||
"go.sebtobie.de/httpserver/auth"
|
||||
"go.sebtobie.de/httpserver/constants"
|
||||
"go.sebtobie.de/httpserver/funcs"
|
||||
|
@ -36,20 +39,6 @@ type Config struct {
|
|||
Middleware map[string]middleware.Config
|
||||
}
|
||||
|
||||
/**
|
||||
// MarshalObject adds the information over the object to the *log.Entry
|
||||
func (c *Config) MarshalObject(e *log.Entry) {
|
||||
e.Strs("Address", c.Addr).Bool("TLS", c.TLSconfig != nil)
|
||||
if c.TLSconfig != nil {
|
||||
e.Str("Certfile", c.Certfile)
|
||||
e.Str("Keyfile", c.Keyfile)
|
||||
}
|
||||
e.Int("sites", len(c.Sites))
|
||||
}
|
||||
|
||||
var _ log.ObjectMarshaler = &Config{}
|
||||
/**/
|
||||
|
||||
// Server is an wrapper for the *http.Server and *gin.Engine
|
||||
type Server struct {
|
||||
http *http.Server
|
||||
|
@ -64,18 +53,20 @@ type Server struct {
|
|||
authh auth.AuthenticationHandler
|
||||
middleware gin.HandlersChain
|
||||
advmiddleware map[string]middleware.Middleware
|
||||
alldomainsites []Site
|
||||
}
|
||||
|
||||
// CreateServer creates an server that can be run in a coroutine.
|
||||
func CreateServer() *Server {
|
||||
log.Info().Msg("Redirect logging output to phuslu/log")
|
||||
gin.DefaultErrorWriter = log.DefaultLogger.Std("GIN", 0).Writer()
|
||||
gin.DefaultWriter = log.DefaultLogger.Std("GIN", 0).Writer()
|
||||
log.Info().Msg("Redirect logging output to zerolog")
|
||||
gin.DefaultErrorWriter = log.Logger.With().Str("source", "GIN").Logger()
|
||||
gin.DefaultWriter = log.Logger.With().Str("source", "GIN").Logger()
|
||||
log.Info().Msg("Creating HTTP-Server")
|
||||
var server = &Server{
|
||||
Conf: &Config{
|
||||
TLSconfig: &tls.Config{},
|
||||
Sites: map[string]SiteConfig{},
|
||||
TLSconfig: &tls.Config{},
|
||||
Sites: map[string]SiteConfig{},
|
||||
Middleware: map[string]middleware.Config{},
|
||||
},
|
||||
mrouter: map[string]*gin.Engine{},
|
||||
authh: &auth.AnonAccountHandler{},
|
||||
|
@ -84,9 +75,11 @@ func CreateServer() *Server {
|
|||
sites: map[string]Site{},
|
||||
middleware: gin.HandlersChain{},
|
||||
template: pongo2.NewSet("templates", &templates.EmptyLoader{}),
|
||||
advmiddleware: map[string]middleware.Middleware{},
|
||||
alldomainsites: []Site{},
|
||||
}
|
||||
server.http = &http.Server{
|
||||
ErrorLog: log.DefaultLogger.Std("", 0),
|
||||
ErrorLog: intlog.New(log.Logger, "", 0),
|
||||
Handler: http.HandlerFunc(server.DomainRouter),
|
||||
}
|
||||
return server
|
||||
|
@ -141,13 +134,13 @@ func (s *Server) StartServer() {
|
|||
log.Info().Msg("Starting server")
|
||||
s.http.TLSConfig = s.Conf.TLSconfig
|
||||
if s.Conf.Certfile != "" && s.Conf.Keyfile != "" {
|
||||
s.routines.Add(len(s.Conf.TLSAddr))
|
||||
for _, addr := range s.Conf.TLSAddr {
|
||||
s.routines.Add(1)
|
||||
go s.runPort(addr, true)
|
||||
}
|
||||
}
|
||||
s.routines.Add(len(s.Conf.Addr))
|
||||
for _, addr := range s.Conf.Addr {
|
||||
s.routines.Add(1)
|
||||
go s.runPort(addr, false)
|
||||
}
|
||||
s.routines.Wait()
|
||||
|
@ -165,9 +158,11 @@ func (s *Server) DomainRouter(w http.ResponseWriter, r *http.Request) {
|
|||
}
|
||||
r.Host = domain
|
||||
r.URL.Host = domain
|
||||
trch := log.Trace()
|
||||
for header, value := range map[string][]string(r.Header) {
|
||||
log.Trace().Strs(header, value).Msg("Headers")
|
||||
trch.Strs(header, value)
|
||||
}
|
||||
trch.Msg("Headers")
|
||||
if router, found := s.mrouter[domain]; found {
|
||||
router.NoMethod(gin.WrapH(s.NotFoundHandler))
|
||||
router.NoRoute(gin.WrapH(s.NotFoundHandler))
|
||||
|
@ -193,11 +188,12 @@ func (s *Server) Use(m ...gin.HandlerFunc) {
|
|||
}
|
||||
|
||||
// Stop Shuts the Server down
|
||||
func (s *Server) Stop(ctx context.Context) {
|
||||
log.Info().Err(s.http.Shutdown(ctx)).Msg("Server Shut down.")
|
||||
for _, s := range s.sites {
|
||||
func (server *Server) Stop(ctx context.Context) {
|
||||
log.Info().Err(server.http.Shutdown(ctx)).Msg("Server Shut down.")
|
||||
for _, s := range server.sites {
|
||||
if ts, ok := s.(TeardownSite); ok {
|
||||
ts.Teardown()
|
||||
server.routines.Done()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -206,13 +202,36 @@ func (s *Server) menus() []menus.Menu {
|
|||
return s.menu
|
||||
}
|
||||
|
||||
func maptoarray(m map[string]Site) (a []interface{}) {
|
||||
func maptoarray(m map[string]Site) (a []any) {
|
||||
for _, i := range m {
|
||||
a = append(a, i)
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
func (s *Server) newrouter(domain string) *gin.Engine {
|
||||
log.Info().Msgf("Setting up router for %s", domain)
|
||||
router := gin.New()
|
||||
router.Use(func(c *gin.Context) {
|
||||
c.Set(constants.Domain, domain)
|
||||
c.Set(constants.Menus, s.menus)
|
||||
c.Set(constants.Accounts, s.authh.Account(c))
|
||||
})
|
||||
router.Use(s.middleware...)
|
||||
router.HTMLRender = templates.NewPongo2Renderer(s.template)
|
||||
s.mrouter[domain] = router
|
||||
for _, site := range s.alldomainsites {
|
||||
site.Init(router.Group("/"))
|
||||
}
|
||||
return router
|
||||
}
|
||||
|
||||
func unequal[T comparable](i T) func(t T) bool {
|
||||
return func(t T) bool {
|
||||
return t != i
|
||||
}
|
||||
}
|
||||
|
||||
// Setup sets the server up. It loads the sites and prepare the server for startup.
|
||||
// The Midleware and the site are setup in this Order:
|
||||
// 1. Middleware.Setup
|
||||
|
@ -220,38 +239,50 @@ func maptoarray(m map[string]Site) (a []interface{}) {
|
|||
// 3. Middleware.Sites
|
||||
// 4. Site.Setup
|
||||
func (s *Server) Setup() {
|
||||
log.Info().Msg("Perparing server for start")
|
||||
log.Info().Msg("Preparing server for start")
|
||||
var (
|
||||
router *gin.Engine
|
||||
found bool
|
||||
site Site
|
||||
cfg string
|
||||
)
|
||||
|
||||
for cfg, middleware := range s.advmiddleware {
|
||||
middleware.Setup(s.Conf.Middleware[cfg])
|
||||
for cfg, m := range s.advmiddleware {
|
||||
m.Setup(s.Conf.Middleware[cfg])
|
||||
}
|
||||
var config SiteConfig
|
||||
var err error
|
||||
for cfg, site = range s.sites {
|
||||
config := s.Conf.Sites[cfg]
|
||||
if router, found = s.mrouter[config["domain"].(string)]; !found {
|
||||
log.Info().Msgf("Setting up router for %s", config["domain"].(string))
|
||||
router = gin.New()
|
||||
router.Use(func(c *gin.Context) {
|
||||
c.Set(constants.Domain, config["domain"])
|
||||
c.Set(constants.Menus, s.menus)
|
||||
c.Set(constants.Accounts, s.authh.Account(c))
|
||||
})
|
||||
router.Use(s.middleware...)
|
||||
router.HTMLRender = templates.NewPongo2Renderer(s.template)
|
||||
s.mrouter[config["domain"].(string)] = router
|
||||
config, found = s.Conf.Sites[cfg]
|
||||
var domain = "*"
|
||||
var path = "/"
|
||||
if found {
|
||||
if generic.Valid(config["domain"], unequal("")) {
|
||||
domain = config["domain"].(string)
|
||||
}
|
||||
if generic.Valid(config["path"], unequal("")) {
|
||||
path = config["path"].(string)
|
||||
}
|
||||
}
|
||||
log.Debug().Str("domain", domain).Str("path", path).Msgf("setting up site %s", cfg)
|
||||
if domain != "*" {
|
||||
if router, found = s.mrouter[domain]; !found {
|
||||
router = s.newrouter(domain)
|
||||
}
|
||||
group := router.Group(config["path"].(string))
|
||||
site.Init(group)
|
||||
} else {
|
||||
s.alldomainsites = append(s.alldomainsites, site)
|
||||
for _, router = range s.mrouter {
|
||||
site.Init(router.Group(path))
|
||||
}
|
||||
}
|
||||
group := router.Group(config["path"].(string))
|
||||
site.Init(group)
|
||||
}
|
||||
for _, middleware := range s.advmiddleware {
|
||||
if err := middleware.Sites(maptoarray(s.sites)); err != nil {
|
||||
log.Error().Err(err).Msg("Failed to setup midddleware. Stopping with the setup")
|
||||
return
|
||||
for _, m := range s.advmiddleware {
|
||||
if psm, ok := m.(middleware.PreSetupMiddleware); ok {
|
||||
if err = psm.PreSetup(maptoarray(s.sites)); err != nil {
|
||||
log.Error().Err(err).Msg("Failed to setup midddleware (pre-site-setup). Stopping with the setup")
|
||||
return
|
||||
}
|
||||
}
|
||||
}
|
||||
for cfg, site = range s.sites {
|
||||
|
@ -270,7 +301,21 @@ func (s *Server) Setup() {
|
|||
}
|
||||
}
|
||||
if cs, ok := site.(ConfigSite); ok {
|
||||
cs.Setup(config)
|
||||
if err = cs.Setup(config); err != nil {
|
||||
log.Error().Err(err).Msgf("Failed to setup site with config %s", cfg)
|
||||
}
|
||||
}
|
||||
if _, ok := site.(TeardownSite); ok {
|
||||
log.Trace().Msg("Added teardownsite to the sg")
|
||||
s.routines.Add(1)
|
||||
}
|
||||
}
|
||||
for _, m := range s.advmiddleware {
|
||||
if psm, ok := m.(middleware.PostSetupMiddleware); ok {
|
||||
if err = psm.PostSetup(maptoarray(s.sites)); err != nil {
|
||||
log.Error().Err(err).Msg("Failed to setup midddleware (post-site-setup). Stopping with the setup")
|
||||
return
|
||||
}
|
||||
}
|
||||
}
|
||||
s.setup = true
|
||||
|
|
2
menus/doc.go
Normale Datei
2
menus/doc.go
Normale Datei
|
@ -0,0 +1,2 @@
|
|||
// Package menus provides an abstraction for providing an global menu that covers multiple sites
|
||||
package menus
|
|
@ -5,7 +5,7 @@ import (
|
|||
"testing"
|
||||
|
||||
"github.com/gin-gonic/gin"
|
||||
"go.sebtobie.de/httpserver/auth"
|
||||
"go.sebtobie.de/httpserver/constants"
|
||||
"go.sebtobie.de/httpserver/menus"
|
||||
)
|
||||
|
||||
|
@ -17,12 +17,12 @@ func (a *account) Anonymous() bool {
|
|||
return !a.auth
|
||||
}
|
||||
|
||||
func (*account) Get(auth.AccountConstant) interface{} {
|
||||
func (*account) Get(constants.AccountConstant) any {
|
||||
return nil
|
||||
}
|
||||
|
||||
func (*account) List() []auth.AccountConstant {
|
||||
return []auth.AccountConstant{}
|
||||
func (*account) List() []constants.AccountConstant {
|
||||
return []constants.AccountConstant{}
|
||||
}
|
||||
|
||||
func (*account) Redirect(*gin.Context) {
|
||||
|
|
|
@ -1,18 +1,21 @@
|
|||
// Package db is an middleware that manages multiple database pools and provides applications with an way to access the database
|
||||
package db
|
||||
|
||||
import (
|
||||
"context"
|
||||
"errors"
|
||||
"fmt"
|
||||
"io/fs"
|
||||
"sync"
|
||||
|
||||
"github.com/gin-gonic/gin"
|
||||
"github.com/jackc/pgx/v4"
|
||||
"github.com/jackc/pgx/v4/pgxpool"
|
||||
"github.com/jackc/tern/migrate"
|
||||
"github.com/phuslu/log"
|
||||
"go.sebtobie.de/httpserver/funcs"
|
||||
"github.com/jackc/pgx/v5"
|
||||
"github.com/jackc/pgx/v5/pgxpool"
|
||||
"github.com/jackc/tern/v2/migrate"
|
||||
"github.com/rs/zerolog/log"
|
||||
"go.sebtobie.de/httpserver/middleware"
|
||||
|
||||
uuid "github.com/jackc/pgx-gofrs-uuid"
|
||||
)
|
||||
|
||||
// ContextKey is the key that is used in a gin.Context to get the Middleware
|
||||
|
@ -23,6 +26,18 @@ type ConnGet func(string) *pgxpool.Conn
|
|||
|
||||
var _ ConnGet = NewMiddleware().GetConn
|
||||
var _ middleware.Middleware = &Middleware{}
|
||||
var _ middleware.PostSetupMiddleware = &Middleware{}
|
||||
|
||||
// GetConnection is an simple helper function that returns an connection to the db
|
||||
func GetConnection(c *gin.Context, db string) (*pgxpool.Conn, error) {
|
||||
if co, ok := c.Get(ContextKey); ok {
|
||||
if cg, ok := co.(ConnGet); ok {
|
||||
return cg(db), nil
|
||||
}
|
||||
return nil, fmt.Errorf("Failed to convert the method. %T != ConnGet", co)
|
||||
}
|
||||
return nil, errors.New("No db.Middleware set up. ")
|
||||
}
|
||||
|
||||
// Middleware return a handler that sets the db into the context of every request.
|
||||
// uri is an url in the form dbtype:connectargs
|
||||
|
@ -31,7 +46,7 @@ type Middleware struct {
|
|||
lock sync.Mutex
|
||||
}
|
||||
|
||||
//NewMiddleware return an initialized Middleware Object.
|
||||
// NewMiddleware return an initialized Middleware Object.
|
||||
func NewMiddleware() *Middleware {
|
||||
return &Middleware{
|
||||
databases: make(map[string]*pgxpool.Pool),
|
||||
|
@ -46,23 +61,16 @@ func (m *Middleware) AddDB(name, uri string) (err error) {
|
|||
}
|
||||
m.lock.Unlock()
|
||||
var (
|
||||
db *pgxpool.Pool
|
||||
connobject *pgxpool.Config
|
||||
db *pgxpool.Pool
|
||||
)
|
||||
db, err = pgxpool.New(context.TODO(), uri)
|
||||
if err != nil {
|
||||
log.Error().Err(err).Msg("Could not open the database")
|
||||
return err
|
||||
}
|
||||
connobject, err = pgxpool.ParseConfig(uri)
|
||||
if err != nil {
|
||||
log.Error().Err(err).Msg("Could not open the database")
|
||||
return err
|
||||
}
|
||||
connobject.ConnConfig.Logger = funcs.PGXLogger{}
|
||||
db, err = pgxpool.ConnectConfig(context.TODO(), connobject)
|
||||
if err != nil {
|
||||
log.Error().Err(err).Msg("Could not open the database")
|
||||
return err
|
||||
db.Config().AfterConnect = func(_ context.Context, c *pgx.Conn) error {
|
||||
uuid.Register(c.TypeMap())
|
||||
return nil
|
||||
}
|
||||
m.lock.Lock()
|
||||
defer m.lock.Unlock()
|
||||
|
@ -98,7 +106,7 @@ func (m *Middleware) GetConn(name string) *pgxpool.Conn {
|
|||
|
||||
// Gin is the Entrypoint for Gin.
|
||||
func (m *Middleware) Gin(c *gin.Context) {
|
||||
c.Set(ContextKey, m.GetConn)
|
||||
c.Set(ContextKey, ConnGet(m.GetConn))
|
||||
}
|
||||
|
||||
// Setup adds the connections from the configfile into the middleware
|
||||
|
@ -114,7 +122,7 @@ func (m *Middleware) Setup(mc middleware.Config) {
|
|||
|
||||
// Defaults returns an default config for connections
|
||||
func (*Middleware) Defaults() middleware.Config {
|
||||
return map[string]interface{}{
|
||||
return map[string]any{
|
||||
"default": "host=/run/postgresql port=5432 dbname=httpserver",
|
||||
}
|
||||
}
|
||||
|
@ -128,8 +136,8 @@ func (m *Middleware) Teardown() {
|
|||
}
|
||||
}
|
||||
|
||||
// Sites is an function for getting the migrations of the site
|
||||
func (m *Middleware) Sites(sites []interface{}) (err error) {
|
||||
// PostSetup is an function for getting the migrations of the site
|
||||
func (m *Middleware) PostSetup(sites []any) (err error) {
|
||||
m.lock.Lock()
|
||||
defer m.lock.Unlock()
|
||||
var (
|
||||
|
@ -138,23 +146,26 @@ func (m *Middleware) Sites(sites []interface{}) (err error) {
|
|||
db *pgxpool.Pool
|
||||
)
|
||||
for _, s := range sites {
|
||||
site, ok := s.(MigrationSite)
|
||||
if !ok {
|
||||
continue
|
||||
}
|
||||
db, ok = m.databases[site.Database()]
|
||||
if !ok {
|
||||
return fmt.Errorf("Failed to get the database. The Databasepool %s does not exist", site.Database())
|
||||
}
|
||||
conn, err = db.Acquire(context.TODO())
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
defer conn.Release()
|
||||
mig, err = site.Migrations(conn.Conn())
|
||||
err = mig.Migrate(context.TODO())
|
||||
if err != nil {
|
||||
return
|
||||
|
||||
if site, ok := s.(MigrationSite); ok {
|
||||
|
||||
db, ok = m.databases[site.Database()]
|
||||
if !ok {
|
||||
return fmt.Errorf("Failed to get the database. The Databasepool %s does not exist", site.Database())
|
||||
}
|
||||
conn, err = db.Acquire(context.TODO())
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
defer conn.Release()
|
||||
mig, err = site.Migrations(conn.Conn())
|
||||
err = mig.Migrate(context.TODO())
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
if poolsite, ok := s.(PoolSite); ok {
|
||||
poolsite.Pool(m.databases[site.Database()])
|
||||
}
|
||||
}
|
||||
}
|
||||
return
|
||||
|
@ -171,15 +182,20 @@ type MigrationSite interface {
|
|||
Migrations(*pgx.Conn) (*migrate.Migrator, error)
|
||||
}
|
||||
|
||||
// PoolSite is an interface for site that need access to the pool outside of requests
|
||||
type PoolSite interface {
|
||||
MigrationSite
|
||||
Pool(*pgxpool.Pool)
|
||||
}
|
||||
|
||||
// SetupMigrator sets up the migrator to migrate the database.
|
||||
func SetupMigrator(prefix string, connection *pgx.Conn, migrations fs.FS) (mig *migrate.Migrator, err error) {
|
||||
mig, err = migrate.NewMigratorEx(
|
||||
context.TODO(),
|
||||
connection,
|
||||
"version",
|
||||
prefix+"version",
|
||||
&migrate.MigratorOptions{
|
||||
DisableTx: false,
|
||||
MigratorFS: &iofsMigratorFS{fsys: migrations},
|
||||
DisableTx: false,
|
||||
},
|
||||
)
|
||||
if err != nil {
|
||||
|
@ -188,5 +204,11 @@ func SetupMigrator(prefix string, connection *pgx.Conn, migrations fs.FS) (mig *
|
|||
}
|
||||
mig.OnStart = logmigrations
|
||||
mig.Data["prefix"] = prefix
|
||||
err = mig.LoadMigrations(migrations)
|
||||
if err != nil {
|
||||
log.Error().Err(err).Msg("Error while loading migrations")
|
||||
return
|
||||
}
|
||||
log.Trace().Interface("migrations", mig.Migrations).Interface("data", mig.Data).Err(err).Send()
|
||||
return
|
||||
}
|
||||
|
|
2
middleware/doc.go
Normale Datei
2
middleware/doc.go
Normale Datei
|
@ -0,0 +1,2 @@
|
|||
// Package middleware provides some middleware
|
||||
package middleware
|
|
@ -2,30 +2,35 @@ package middleware
|
|||
|
||||
import (
|
||||
"net/http"
|
||||
"time"
|
||||
|
||||
"github.com/gin-gonic/gin"
|
||||
"github.com/phuslu/log"
|
||||
"github.com/rs/xid"
|
||||
"github.com/rs/zerolog"
|
||||
"github.com/rs/zerolog/log"
|
||||
"go.sebtobie.de/httpserver/auth"
|
||||
"go.sebtobie.de/httpserver/constants"
|
||||
)
|
||||
|
||||
// LogMiddleware is an middleware to log requests to phuslu/log and catches panics.
|
||||
// LogMiddleware is an middleware to log requests to rs/zerolog and catches panics.
|
||||
// If it is added multiple times, only the first time sends entries to the log.
|
||||
func LogMiddleware(c *gin.Context) {
|
||||
if _, exists := c.Get("xid"); exists {
|
||||
return
|
||||
}
|
||||
var xid = log.NewXIDWithTime(time.Now().UnixNano())
|
||||
c.Set("xid", xid)
|
||||
id := xid.New()
|
||||
c.Set("xid", id)
|
||||
defer func() {
|
||||
var entry *log.Entry
|
||||
var entry *zerolog.Event
|
||||
interrupt := recover()
|
||||
if interrupt != nil {
|
||||
err := interrupt.(error)
|
||||
c.Header("requestid", xid.String())
|
||||
entry = log.Error().Int("statuscode", 500)
|
||||
if err, ok := interrupt.(error); ok {
|
||||
entry.Err(err).Stack()
|
||||
} else {
|
||||
entry.Interface("recover", interrupt)
|
||||
}
|
||||
c.Header("requestid", id.String())
|
||||
c.AbortWithStatus(http.StatusInternalServerError)
|
||||
entry = log.Error().Err(err).Int("statuscode", 500)
|
||||
entry.Stack()
|
||||
} else {
|
||||
statuscode := c.Writer.Status()
|
||||
|
@ -39,7 +44,7 @@ func LogMiddleware(c *gin.Context) {
|
|||
}
|
||||
entry.Int("statuscode", statuscode)
|
||||
}
|
||||
entry.Int64("goroutine", log.Goid()).Xid("ID", xid).Msg("Request")
|
||||
entry.Str("xid", id.String()).Msg("Request")
|
||||
}()
|
||||
c.Next()
|
||||
}
|
||||
|
@ -55,7 +60,7 @@ func RequireUser(c *gin.Context) {
|
|||
}
|
||||
|
||||
// Config is the type For Configuration of the Middleware
|
||||
type Config map[string]interface{}
|
||||
type Config map[string]any
|
||||
|
||||
// Middleware is an type to Save data between executions and to provide help at the teardown.
|
||||
type Middleware interface {
|
||||
|
@ -63,5 +68,16 @@ type Middleware interface {
|
|||
Defaults() Config
|
||||
Setup(Config)
|
||||
Teardown()
|
||||
Sites([]interface{}) error
|
||||
}
|
||||
|
||||
// PreSetupMiddleware is for middleware that only needs the sites after their initialization
|
||||
type PreSetupMiddleware interface {
|
||||
Middleware
|
||||
PreSetup([]any) error
|
||||
}
|
||||
|
||||
// PostSetupMiddleware is for middleware that requires sites to be already configured
|
||||
type PostSetupMiddleware interface {
|
||||
Middleware
|
||||
PostSetup([]any) error
|
||||
}
|
||||
|
|
2
middleware/wellknown/doc.go
Normale Datei
2
middleware/wellknown/doc.go
Normale Datei
|
@ -0,0 +1,2 @@
|
|||
// Package wellknown provides an middleware that lets sites to register themselfs to wellknown uris
|
||||
package wellknown
|
15
middleware/wellknown/site.go
Normale Datei
15
middleware/wellknown/site.go
Normale Datei
|
@ -0,0 +1,15 @@
|
|||
package wellknown
|
||||
|
||||
import "go.sebtobie.de/httpserver"
|
||||
|
||||
// Finger is an Simple Type for site to transport the information about the webfinger to the middleware
|
||||
type Finger struct {
|
||||
Webfinger Webfinger
|
||||
Protocol string
|
||||
}
|
||||
|
||||
// FingerSite is an type of site that provide content and want to publish it with webfinger
|
||||
type FingerSite interface {
|
||||
httpserver.Site
|
||||
RegisterFingers() []*Finger
|
||||
}
|
131
middleware/wellknown/wellknown.go
Normale Datei
131
middleware/wellknown/wellknown.go
Normale Datei
|
@ -0,0 +1,131 @@
|
|||
package wellknown
|
||||
|
||||
import (
|
||||
"net/url"
|
||||
|
||||
"github.com/gin-gonic/gin"
|
||||
"github.com/go-ap/jsonld"
|
||||
"github.com/rs/zerolog/log"
|
||||
"go.sebtobie.de/httpserver"
|
||||
"go.sebtobie.de/httpserver/middleware"
|
||||
)
|
||||
|
||||
var _ middleware.Middleware = &Middleware{}
|
||||
var _ middleware.PreSetupMiddleware = &Middleware{}
|
||||
var _ httpserver.Site = &Middleware{}
|
||||
|
||||
type (
|
||||
|
||||
// Link is the reference where the application can find the object
|
||||
Link struct {
|
||||
Rel string
|
||||
Type string
|
||||
Href *url.URL
|
||||
}
|
||||
|
||||
// Middleware is an middleware for sites to register themselfs to provide wellknown urls
|
||||
Middleware struct {
|
||||
// webfinger is an map consisting of protocol as key and an array of WebfingerAccount as value
|
||||
webfinger map[string][]Webfinger
|
||||
}
|
||||
|
||||
// Webfinger is an function that accepts the account part(after ?resource=<protocol>:) and returns the aliases and the links.
|
||||
// The bool value if for faster detection if the account was found.
|
||||
Webfinger func(resource string) ([]string, []*Link, bool)
|
||||
)
|
||||
|
||||
// New creates a new initialized Middleware
|
||||
func New() *Middleware {
|
||||
return &Middleware{
|
||||
webfinger: map[string][]Webfinger{},
|
||||
}
|
||||
}
|
||||
|
||||
// Defaults returns nothing
|
||||
func (*Middleware) Defaults() middleware.Config {
|
||||
return nil
|
||||
}
|
||||
|
||||
// Gin does nothing.
|
||||
func (*Middleware) Gin(c *gin.Context) {
|
||||
c.Next()
|
||||
}
|
||||
|
||||
// Setup does nothing
|
||||
func (*Middleware) Setup(middleware.Config) {}
|
||||
|
||||
// Teardown does nothing
|
||||
func (*Middleware) Teardown() {}
|
||||
|
||||
// PreSetup goes through all sites and collects all registrations for wellknown uris
|
||||
func (m *Middleware) PreSetup(s []any) error {
|
||||
for _, site := range s {
|
||||
if wfs, ok := site.(FingerSite); ok {
|
||||
for _, finger := range wfs.RegisterFingers() {
|
||||
if _, ok := m.webfinger[finger.Protocol]; !ok {
|
||||
m.webfinger[finger.Protocol] = []Webfinger{}
|
||||
}
|
||||
m.webfinger[finger.Protocol] = append(m.webfinger[finger.Protocol], finger.Webfinger)
|
||||
}
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// Init initializes the routergroup. It must always run on /
|
||||
func (m *Middleware) Init(rg *gin.RouterGroup) {
|
||||
if len(m.webfinger) > 0 {
|
||||
rg.GET(".well-known/webfinger", m.webfingerhf)
|
||||
}
|
||||
}
|
||||
|
||||
func (m *Middleware) webfingerhf(c *gin.Context) {
|
||||
resource := c.Query("resource")
|
||||
if resource == "" {
|
||||
c.AbortWithStatus(404)
|
||||
return
|
||||
}
|
||||
uri, err := url.Parse(resource)
|
||||
if err != nil {
|
||||
log.Error().Err(err).Str("uri", resource).Msg("Failed to parse uri")
|
||||
c.AbortWithStatus(404)
|
||||
return
|
||||
}
|
||||
var wf []Webfinger
|
||||
var found bool
|
||||
if wf, found = m.webfinger[uri.Scheme]; !found {
|
||||
c.AbortWithStatus(404)
|
||||
return
|
||||
}
|
||||
var output = struct {
|
||||
Subject string `json:"subject,omitempty"`
|
||||
Aliases []string `json:"aliases,omitempty"`
|
||||
Links []*Link `json:"links,omitempty"`
|
||||
}{Subject: resource, Aliases: []string{}, Links: []*Link{}}
|
||||
var aliases = []string{}
|
||||
var links = []*Link{}
|
||||
var input = uri.Opaque
|
||||
if uri.Opaque == "" {
|
||||
input = resource
|
||||
}
|
||||
outputok := false
|
||||
for _, finger := range wf {
|
||||
aliases, links, found = finger(input)
|
||||
if !found {
|
||||
continue
|
||||
}
|
||||
output.Aliases = append(output.Aliases, aliases...)
|
||||
output.Links = append(output.Links, links...)
|
||||
outputok = true
|
||||
}
|
||||
if outputok {
|
||||
c.Header("Access-Control-Allow-Origin", "*")
|
||||
json, err := jsonld.Marshal(output)
|
||||
if err != nil {
|
||||
c.AbortWithStatus(500)
|
||||
return
|
||||
}
|
||||
c.Data(200, jsonld.ContentType, json)
|
||||
}
|
||||
c.AbortWithStatus(404)
|
||||
}
|
|
@ -9,20 +9,24 @@ import (
|
|||
"github.com/gin-gonic/gin"
|
||||
"github.com/golang-jwt/jwt/v4"
|
||||
"github.com/google/uuid"
|
||||
"github.com/phuslu/log"
|
||||
"github.com/rs/zerolog/log"
|
||||
"go.sebtobie.de/httpserver/auth"
|
||||
"go.sebtobie.de/httpserver/constants"
|
||||
)
|
||||
|
||||
var defaccount = &account{
|
||||
data: map[auth.AccountConstant]interface{}{
|
||||
auth.AccountID: uuid.Nil,
|
||||
auth.AccountAnon: true,
|
||||
},
|
||||
}
|
||||
var (
|
||||
defaccount = &account{
|
||||
data: map[constants.AccountConstant]any{
|
||||
constants.AccountID: uuid.Nil,
|
||||
constants.AccountAnon: true,
|
||||
},
|
||||
}
|
||||
_ auth.AuthenticationHandler = &SAML{}
|
||||
)
|
||||
|
||||
func maptoarray(m map[string]interface{}) (output []interface{}) {
|
||||
func maptoarray(m map[string]any) (output []any) {
|
||||
for k, v := range m {
|
||||
output = append(output, []interface{}{k, v})
|
||||
output = append(output, []any{k, v})
|
||||
}
|
||||
return
|
||||
}
|
||||
|
@ -44,17 +48,17 @@ func (s *SAML) Account(c *gin.Context) auth.Account {
|
|||
log.Debug().Err(err).Msg("Error while parsing token")
|
||||
}
|
||||
if claim, ok = token.Claims.(*jwt.MapClaims); ok && token.Valid {
|
||||
log.Debug().KeysAndValues(claim).Msg("Got valid token")
|
||||
log.Debug().Interface("claim", claim).Msg("Got valid token")
|
||||
for key, value := range *claim {
|
||||
acc.data[auth.AccountConstant(key)] = value
|
||||
acc.data[constants.AccountConstant(key)] = value
|
||||
}
|
||||
return acc
|
||||
}
|
||||
log.Debug().Bool("valid", token.Valid).KeysAndValues(maptoarray(*claim)...).Msg("problem vith token")
|
||||
log.Debug().Bool("valid", token.Valid).Interface("claim", claim).Msg("problem vith token")
|
||||
return acc
|
||||
}
|
||||
|
||||
func (s *SAML) signingkey(token *jwt.Token) (key interface{}, err error) {
|
||||
func (s *SAML) signingkey(token *jwt.Token) (key any, err error) {
|
||||
if _, ok := token.Method.(*jwt.SigningMethodRSAPSS); !ok {
|
||||
return nil, fmt.Errorf("Unexpected signing method: %v", token.Header["alg"])
|
||||
}
|
||||
|
@ -63,18 +67,18 @@ func (s *SAML) signingkey(token *jwt.Token) (key interface{}, err error) {
|
|||
|
||||
type account struct {
|
||||
s *SAML
|
||||
data map[auth.AccountConstant]interface{}
|
||||
data map[constants.AccountConstant]any
|
||||
}
|
||||
|
||||
func (a *account) Anonymous() bool {
|
||||
return a.data[auth.AccountAnon].(bool)
|
||||
return a.data[constants.AccountAnon].(bool)
|
||||
}
|
||||
|
||||
func (a *account) Redirect(c *gin.Context) {
|
||||
id := uuid.New().String()
|
||||
tokenstring, err := jwttoken(jwt.MapClaims{
|
||||
string(auth.AccountID): id,
|
||||
string(auth.AccountAnon): true,
|
||||
string(constants.AccountID): id,
|
||||
string(constants.AccountAnon): true,
|
||||
}, a.s.jwtprivatekey)
|
||||
if err != nil {
|
||||
log.Error().Err(err).Msg("Failed to generate the token")
|
||||
|
@ -102,12 +106,12 @@ func (a *account) Redirect(c *gin.Context) {
|
|||
c.Redirect(http.StatusSeeOther, u.String())
|
||||
}
|
||||
|
||||
func (a *account) Get(key auth.AccountConstant) interface{} {
|
||||
func (a *account) Get(key constants.AccountConstant) any {
|
||||
return a.data[key]
|
||||
}
|
||||
|
||||
func (a *account) List() []auth.AccountConstant {
|
||||
var liste []auth.AccountConstant
|
||||
func (a *account) List() []constants.AccountConstant {
|
||||
var liste []constants.AccountConstant
|
||||
for key := range a.data {
|
||||
liste = append(liste, key)
|
||||
}
|
||||
|
|
2
modules/saml/doc.go
Normale Datei
2
modules/saml/doc.go
Normale Datei
|
@ -0,0 +1,2 @@
|
|||
// Package saml provides an Authentication Handler for authenticating over SAML
|
||||
package saml
|
|
@ -10,10 +10,10 @@ import (
|
|||
|
||||
"github.com/crewjam/saml"
|
||||
"github.com/golang-jwt/jwt/v4"
|
||||
"github.com/phuslu/log"
|
||||
"github.com/rs/zerolog/log"
|
||||
)
|
||||
|
||||
func initcert(file string, verify func(interface{}) bool) (key interface{}, err error) {
|
||||
func initcert(file string, verify func(any) bool) (key any, err error) {
|
||||
var blocks []*pem.Block
|
||||
if file == "" {
|
||||
err = fmt.Errorf("File %s is empty", file)
|
||||
|
@ -24,7 +24,7 @@ func initcert(file string, verify func(interface{}) bool) (key interface{}, err
|
|||
return nil, err
|
||||
}
|
||||
for _, b := range blocks {
|
||||
var key interface{}
|
||||
var key any
|
||||
key, err = x509.ParsePKCS8PrivateKey(b.Bytes)
|
||||
if err != nil {
|
||||
key, err = x509.ParseCertificate(b.Bytes)
|
||||
|
@ -75,7 +75,7 @@ func empty(data []string) bool {
|
|||
return false
|
||||
}
|
||||
|
||||
func jwttoken(claim jwt.Claims, privatekey interface{}) (string, error) {
|
||||
func jwttoken(claim jwt.Claims, privatekey any) (string, error) {
|
||||
token := jwt.NewWithClaims(
|
||||
jwt.SigningMethodPS512,
|
||||
claim,
|
||||
|
|
|
@ -15,9 +15,10 @@ import (
|
|||
"github.com/crewjam/saml/samlsp"
|
||||
"github.com/gin-gonic/gin"
|
||||
"github.com/golang-jwt/jwt/v4"
|
||||
"github.com/phuslu/log"
|
||||
"github.com/rs/zerolog/log"
|
||||
"go.sebtobie.de/httpserver"
|
||||
"go.sebtobie.de/httpserver/auth"
|
||||
"go.sebtobie.de/httpserver/constants"
|
||||
)
|
||||
|
||||
func musturi(url *url.URL, err error) *url.URL {
|
||||
|
@ -86,10 +87,10 @@ func (s *SAML) Setup(config httpserver.SiteConfig) (err error) {
|
|||
case int64:
|
||||
s.sp.MetadataValidDuration = time.Duration(config["metadatavalid"].(int64))
|
||||
}
|
||||
var key interface{}
|
||||
var key any
|
||||
if keyfile, found := config["spprivatekey"]; found {
|
||||
s.SPPrivatekey = keyfile.(string)
|
||||
key, err = initcert(s.SPPrivatekey, func(key interface{}) bool {
|
||||
key, err = initcert(s.SPPrivatekey, func(key any) bool {
|
||||
_, ok := key.(*rsa.PrivateKey)
|
||||
return ok
|
||||
})
|
||||
|
@ -102,7 +103,7 @@ func (s *SAML) Setup(config httpserver.SiteConfig) (err error) {
|
|||
}
|
||||
if keyfile, found := config["sppublickey"]; found {
|
||||
s.SPPublicKey = keyfile.(string)
|
||||
key, err = initcert(s.SPPublicKey, func(key interface{}) bool {
|
||||
key, err = initcert(s.SPPublicKey, func(key any) bool {
|
||||
_, ok := key.(*x509.Certificate)
|
||||
return ok
|
||||
})
|
||||
|
@ -116,7 +117,7 @@ func (s *SAML) Setup(config httpserver.SiteConfig) (err error) {
|
|||
|
||||
if keyfile, found := config["jwtprivatekey"]; found {
|
||||
s.JWTPrivatekey = keyfile.(string)
|
||||
key, err = initcert(s.JWTPrivatekey, func(key interface{}) bool {
|
||||
key, err = initcert(s.JWTPrivatekey, func(key any) bool {
|
||||
_, ok := key.(*rsa.PrivateKey)
|
||||
return ok
|
||||
})
|
||||
|
@ -186,9 +187,9 @@ func (s *SAML) acsHF(c *gin.Context) {
|
|||
}
|
||||
data := attributeStatementstomap(assert.AttributeStatements)
|
||||
token, err := jwttoken(jwt.MapClaims{
|
||||
string(auth.AccountAnon): false,
|
||||
string(auth.AccountID): account.Get(auth.AccountID).(string),
|
||||
string(auth.AccountUser): data["uid"][0],
|
||||
string(constants.AccountAnon): false,
|
||||
string(constants.AccountID): account.Get(constants.AccountID).(string),
|
||||
string(constants.AccountUser): data["uid"][0],
|
||||
}, s.jwtprivatekey)
|
||||
if err != nil {
|
||||
c.AbortWithStatus(http.StatusInternalServerError)
|
||||
|
@ -205,7 +206,7 @@ func (s *SAML) acsHF(c *gin.Context) {
|
|||
|
||||
// Defaults returns the default values for the config
|
||||
func (s *SAML) Defaults() httpserver.SiteConfig {
|
||||
return map[string]interface{}{
|
||||
return map[string]any{
|
||||
"domain": "example.com",
|
||||
"idp": defaultsaml.idp.String(),
|
||||
"sppublickey": "publickey.pem",
|
||||
|
|
6
site.go
6
site.go
|
@ -11,15 +11,19 @@ type Site interface {
|
|||
// ConfigSite is for sites that have to be configured
|
||||
type ConfigSite interface {
|
||||
Site
|
||||
// Defaults returns the default values for the configuration
|
||||
Defaults() SiteConfig
|
||||
// Setup configures the Site with the read configuration.
|
||||
// For the order how the methods are called refer to [Server.Setup]
|
||||
Setup(SiteConfig) error
|
||||
}
|
||||
|
||||
// TeardownSite is for sites that require to do steps before shutdown
|
||||
type TeardownSite interface {
|
||||
Site
|
||||
// Teardown is called before shutting down the server. Its for gracefully shutdowns of goroutines or longstanding connections
|
||||
Teardown()
|
||||
}
|
||||
|
||||
// SiteConfig is an interface for configitems of the site. The methods return the required items for the server
|
||||
type SiteConfig map[string]interface{}
|
||||
type SiteConfig map[string]any
|
||||
|
|
|
@ -1,3 +1,4 @@
|
|||
// Package templates helps sites to manage their templates
|
||||
package templates
|
||||
|
||||
import (
|
||||
|
@ -8,9 +9,9 @@ import (
|
|||
"net/http"
|
||||
"path/filepath"
|
||||
|
||||
"github.com/flosch/pongo2/v4"
|
||||
"github.com/flosch/pongo2/v6"
|
||||
"github.com/gin-gonic/gin/render"
|
||||
"github.com/phuslu/log"
|
||||
"github.com/rs/zerolog/log"
|
||||
)
|
||||
|
||||
var (
|
||||
|
@ -19,7 +20,7 @@ var (
|
|||
_ pongo2.TemplateLoader = &EmptyLoader{}
|
||||
)
|
||||
|
||||
//TemplateSite is an interface that is for storing templates.
|
||||
// TemplateSite is an interface that is for storing templates.
|
||||
type TemplateSite interface {
|
||||
Templates() pongo2.TemplateLoader
|
||||
}
|
||||
|
@ -61,7 +62,7 @@ func NewPongo2Renderer(ts *pongo2.TemplateSet) render.HTMLRender {
|
|||
}
|
||||
|
||||
// Instance create an new instance of an REnder object
|
||||
func (p2r *Pongo2Renderer) Instance(name string, data interface{}) render.Render {
|
||||
func (p2r *Pongo2Renderer) Instance(name string, data any) render.Render {
|
||||
tmpl, err := p2r.ts.FromFile(name)
|
||||
r := &renderer{
|
||||
tmpl: tmpl,
|
||||
|
@ -71,10 +72,10 @@ func (p2r *Pongo2Renderer) Instance(name string, data interface{}) render.Render
|
|||
switch data.(type) {
|
||||
case pongo2.Context:
|
||||
r.data = data.(pongo2.Context)
|
||||
case map[string]interface{}:
|
||||
r.data = data.(map[string]interface{})
|
||||
case map[string]any:
|
||||
r.data = data.(map[string]any)
|
||||
default:
|
||||
r.err = errors.New("Failed to detect possible format for pongo2. It needs to be map[string]interface{} or pongo2.Context")
|
||||
r.err = errors.New("Failed to detect possible format for pongo2. It needs to be map[string]any or pongo2.Context")
|
||||
}
|
||||
}
|
||||
log.Debug().Msg("Returning an instance")
|
||||
|
|
Laden …
Tabelle hinzufügen
In neuem Issue referenzieren