mirror of
https://gitea.com/Lydanne/buildx.git
synced 2025-05-18 00:47:48 +08:00
vendor: bump k8s to v0.25.4
Signed-off-by: CrazyMax <crazy-max@users.noreply.github.com>
This commit is contained in:
parent
4a73abfd64
commit
cfa6b4f7c8
24
go.mod
24
go.mod
@ -51,12 +51,14 @@ require (
|
|||||||
github.com/AdaLogics/go-fuzz-headers v0.0.0-20230106234847-43070de90fa1 // indirect
|
github.com/AdaLogics/go-fuzz-headers v0.0.0-20230106234847-43070de90fa1 // indirect
|
||||||
github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1 // indirect
|
github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1 // indirect
|
||||||
github.com/Azure/go-autorest v14.2.0+incompatible // indirect
|
github.com/Azure/go-autorest v14.2.0+incompatible // indirect
|
||||||
github.com/Azure/go-autorest/autorest v0.11.24 // indirect
|
github.com/Azure/go-autorest/autorest v0.11.27 // indirect
|
||||||
github.com/Azure/go-autorest/autorest/adal v0.9.18 // indirect
|
github.com/Azure/go-autorest/autorest/adal v0.9.20 // indirect
|
||||||
github.com/Azure/go-autorest/autorest/date v0.3.0 // indirect
|
github.com/Azure/go-autorest/autorest/date v0.3.0 // indirect
|
||||||
github.com/Azure/go-autorest/logger v0.2.1 // indirect
|
github.com/Azure/go-autorest/logger v0.2.1 // indirect
|
||||||
github.com/Azure/go-autorest/tracing v0.6.0 // indirect
|
github.com/Azure/go-autorest/tracing v0.6.0 // indirect
|
||||||
github.com/Microsoft/go-winio v0.6.0 // indirect
|
github.com/Microsoft/go-winio v0.6.0 // indirect
|
||||||
|
github.com/PuerkitoBio/purell v1.1.1 // indirect
|
||||||
|
github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 // indirect
|
||||||
github.com/agext/levenshtein v1.2.3 // indirect
|
github.com/agext/levenshtein v1.2.3 // indirect
|
||||||
github.com/agl/ed25519 v0.0.0-20170116200512-5312a6153412 // indirect
|
github.com/agl/ed25519 v0.0.0-20170116200512-5312a6153412 // indirect
|
||||||
github.com/apparentlymart/go-cidr v1.0.1 // indirect
|
github.com/apparentlymart/go-cidr v1.0.1 // indirect
|
||||||
@ -91,17 +93,21 @@ require (
|
|||||||
github.com/docker/go-metrics v0.0.1 // indirect
|
github.com/docker/go-metrics v0.0.1 // indirect
|
||||||
github.com/docker/libtrust v0.0.0-20150526203908-9cbd2a1374f4 // indirect
|
github.com/docker/libtrust v0.0.0-20150526203908-9cbd2a1374f4 // indirect
|
||||||
github.com/elazarl/goproxy v0.0.0-20191011121108-aa519ddbe484 // indirect
|
github.com/elazarl/goproxy v0.0.0-20191011121108-aa519ddbe484 // indirect
|
||||||
|
github.com/emicklei/go-restful/v3 v3.8.0 // indirect
|
||||||
github.com/felixge/httpsnoop v1.0.3 // indirect
|
github.com/felixge/httpsnoop v1.0.3 // indirect
|
||||||
github.com/fvbommel/sortorder v1.0.1 // indirect
|
github.com/fvbommel/sortorder v1.0.1 // indirect
|
||||||
github.com/go-logr/logr v1.2.3 // indirect
|
github.com/go-logr/logr v1.2.3 // indirect
|
||||||
github.com/go-logr/stdr v1.2.2 // indirect
|
github.com/go-logr/stdr v1.2.2 // indirect
|
||||||
|
github.com/go-openapi/jsonpointer v0.19.5 // indirect
|
||||||
|
github.com/go-openapi/jsonreference v0.19.5 // indirect
|
||||||
|
github.com/go-openapi/swag v0.19.14 // indirect
|
||||||
github.com/go-sql-driver/mysql v1.6.0 // indirect
|
github.com/go-sql-driver/mysql v1.6.0 // indirect
|
||||||
github.com/gogo/googleapis v1.4.1 // indirect
|
github.com/gogo/googleapis v1.4.1 // indirect
|
||||||
github.com/golang-jwt/jwt/v4 v4.4.2 // indirect
|
github.com/golang-jwt/jwt/v4 v4.4.2 // indirect
|
||||||
github.com/google/certificate-transparency-go v1.1.4 // indirect
|
github.com/google/certificate-transparency-go v1.1.4 // indirect
|
||||||
|
github.com/google/gnostic v0.5.7-v3refs // indirect
|
||||||
github.com/google/go-cmp v0.5.9 // indirect
|
github.com/google/go-cmp v0.5.9 // indirect
|
||||||
github.com/google/gofuzz v1.2.0 // indirect
|
github.com/google/gofuzz v1.2.0 // indirect
|
||||||
github.com/googleapis/gnostic v0.5.5 // indirect
|
|
||||||
github.com/gorilla/mux v1.8.0 // indirect
|
github.com/gorilla/mux v1.8.0 // indirect
|
||||||
github.com/grpc-ecosystem/go-grpc-middleware v1.3.0 // indirect
|
github.com/grpc-ecosystem/go-grpc-middleware v1.3.0 // indirect
|
||||||
github.com/grpc-ecosystem/grpc-gateway/v2 v2.7.0 // indirect
|
github.com/grpc-ecosystem/grpc-gateway/v2 v2.7.0 // indirect
|
||||||
@ -110,10 +116,12 @@ require (
|
|||||||
github.com/inconshreveable/mousetrap v1.0.1 // indirect
|
github.com/inconshreveable/mousetrap v1.0.1 // indirect
|
||||||
github.com/jinzhu/gorm v1.9.2 // indirect
|
github.com/jinzhu/gorm v1.9.2 // indirect
|
||||||
github.com/jinzhu/inflection v0.0.0-20180308033659-04140366298a // indirect
|
github.com/jinzhu/inflection v0.0.0-20180308033659-04140366298a // indirect
|
||||||
|
github.com/josharian/intern v1.0.0 // indirect
|
||||||
github.com/json-iterator/go v1.1.12 // indirect
|
github.com/json-iterator/go v1.1.12 // indirect
|
||||||
github.com/kardianos/osext v0.0.0-20190222173326-2bc1f35cddc0 // indirect
|
github.com/kardianos/osext v0.0.0-20190222173326-2bc1f35cddc0 // indirect
|
||||||
github.com/klauspost/compress v1.15.12 // indirect
|
github.com/klauspost/compress v1.15.12 // indirect
|
||||||
github.com/kr/pretty v0.3.0 // indirect
|
github.com/kr/pretty v0.3.0 // indirect
|
||||||
|
github.com/mailru/easyjson v0.7.6 // indirect
|
||||||
github.com/mattn/go-shellwords v1.0.12 // indirect
|
github.com/mattn/go-shellwords v1.0.12 // indirect
|
||||||
github.com/matttproud/golang_protobuf_extensions v1.0.4 // indirect
|
github.com/matttproud/golang_protobuf_extensions v1.0.4 // indirect
|
||||||
github.com/miekg/pkcs11 v1.1.1 // indirect
|
github.com/miekg/pkcs11 v1.1.1 // indirect
|
||||||
@ -126,6 +134,7 @@ require (
|
|||||||
github.com/moby/term v0.0.0-20221120202655-abb19827d345 // indirect
|
github.com/moby/term v0.0.0-20221120202655-abb19827d345 // indirect
|
||||||
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
|
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
|
||||||
github.com/modern-go/reflect2 v1.0.2 // indirect
|
github.com/modern-go/reflect2 v1.0.2 // indirect
|
||||||
|
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect
|
||||||
github.com/opencontainers/runc v1.1.4 // indirect
|
github.com/opencontainers/runc v1.1.4 // indirect
|
||||||
github.com/pmezard/go-difflib v1.0.0 // indirect
|
github.com/pmezard/go-difflib v1.0.0 // indirect
|
||||||
github.com/prometheus/client_golang v1.14.0 // indirect
|
github.com/prometheus/client_golang v1.14.0 // indirect
|
||||||
@ -170,14 +179,9 @@ require (
|
|||||||
gopkg.in/inf.v0 v0.9.1 // indirect
|
gopkg.in/inf.v0 v0.9.1 // indirect
|
||||||
gopkg.in/yaml.v2 v2.4.0 // indirect
|
gopkg.in/yaml.v2 v2.4.0 // indirect
|
||||||
k8s.io/klog/v2 v2.80.1 // indirect
|
k8s.io/klog/v2 v2.80.1 // indirect
|
||||||
|
k8s.io/kube-openapi v0.0.0-20220803162953-67bda5d908f1 // indirect
|
||||||
k8s.io/utils v0.0.0-20221108210102-8e77b1f39fe2 // indirect
|
k8s.io/utils v0.0.0-20221108210102-8e77b1f39fe2 // indirect
|
||||||
|
sigs.k8s.io/json v0.0.0-20220713155537-f223a00ba0e2 // indirect
|
||||||
sigs.k8s.io/structured-merge-diff/v4 v4.2.3 // indirect
|
sigs.k8s.io/structured-merge-diff/v4 v4.2.3 // indirect
|
||||||
sigs.k8s.io/yaml v1.3.0 // indirect
|
sigs.k8s.io/yaml v1.3.0 // indirect
|
||||||
)
|
)
|
||||||
|
|
||||||
replace (
|
|
||||||
k8s.io/api => k8s.io/api v0.22.4
|
|
||||||
k8s.io/apimachinery => k8s.io/apimachinery v0.22.4
|
|
||||||
k8s.io/apiserver => k8s.io/apiserver v0.22.4
|
|
||||||
k8s.io/client-go => k8s.io/client-go v0.22.4
|
|
||||||
)
|
|
||||||
|
268
go.sum
268
go.sum
@ -25,7 +25,6 @@ cloud.google.com/go/compute/metadata v0.2.1 h1:efOwf5ymceDhK6PKMnnrTHP4pppY5L22m
|
|||||||
cloud.google.com/go/compute/metadata v0.2.1/go.mod h1:jgHgmJd2RKBGzXqF5LR2EZMGxBkeanZ9wwa75XHJgOM=
|
cloud.google.com/go/compute/metadata v0.2.1/go.mod h1:jgHgmJd2RKBGzXqF5LR2EZMGxBkeanZ9wwa75XHJgOM=
|
||||||
cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE=
|
cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE=
|
||||||
cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk=
|
cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk=
|
||||||
cloud.google.com/go/firestore v1.1.0/go.mod h1:ulACoGHTpvq5r8rxGJ4ddJZBZqakUQqClKRT5SZwBmk=
|
|
||||||
cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I=
|
cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I=
|
||||||
cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw=
|
cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw=
|
||||||
cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA=
|
cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA=
|
||||||
@ -39,21 +38,20 @@ dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7
|
|||||||
github.com/AdaLogics/go-fuzz-headers v0.0.0-20230106234847-43070de90fa1 h1:EKPd1INOIyr5hWOWhvpmQpY6tKjeG0hT1s3AMC/9fic=
|
github.com/AdaLogics/go-fuzz-headers v0.0.0-20230106234847-43070de90fa1 h1:EKPd1INOIyr5hWOWhvpmQpY6tKjeG0hT1s3AMC/9fic=
|
||||||
github.com/AdaLogics/go-fuzz-headers v0.0.0-20230106234847-43070de90fa1/go.mod h1:VzwV+t+dZ9j/H867F1M2ziD+yLHtB46oM35FxxMJ4d0=
|
github.com/AdaLogics/go-fuzz-headers v0.0.0-20230106234847-43070de90fa1/go.mod h1:VzwV+t+dZ9j/H867F1M2ziD+yLHtB46oM35FxxMJ4d0=
|
||||||
github.com/AdamKorcz/go-118-fuzz-build v0.0.0-20221215162035-5330a85ea652 h1:+vTEFqeoeur6XSq06bs+roX3YiT49gUniJK7Zky7Xjg=
|
github.com/AdamKorcz/go-118-fuzz-build v0.0.0-20221215162035-5330a85ea652 h1:+vTEFqeoeur6XSq06bs+roX3YiT49gUniJK7Zky7Xjg=
|
||||||
github.com/Azure/go-ansiterm v0.0.0-20210608223527-2377c96fe795/go.mod h1:LmzpDX56iTiv29bbRTIsUNlaFfuhWRQBWjQdVyAevI8=
|
|
||||||
github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1 h1:UQHMgLO+TxOElx5B5HZ4hJQsoJ/PvUvKRhJHDQXO8P8=
|
github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1 h1:UQHMgLO+TxOElx5B5HZ4hJQsoJ/PvUvKRhJHDQXO8P8=
|
||||||
github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E=
|
github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E=
|
||||||
github.com/Azure/go-autorest v14.2.0+incompatible h1:V5VMDjClD3GiElqLWO7mz2MxNAK/vTfRHdAubSIPRgs=
|
github.com/Azure/go-autorest v14.2.0+incompatible h1:V5VMDjClD3GiElqLWO7mz2MxNAK/vTfRHdAubSIPRgs=
|
||||||
github.com/Azure/go-autorest v14.2.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24=
|
github.com/Azure/go-autorest v14.2.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24=
|
||||||
github.com/Azure/go-autorest/autorest v0.11.18/go.mod h1:dSiJPy22c3u0OtOKDNttNgqpNFY/GeWa7GH/Pz56QRA=
|
github.com/Azure/go-autorest/autorest v0.11.27 h1:F3R3q42aWytozkV8ihzcgMO4OA4cuqr3bNlsEuF6//A=
|
||||||
github.com/Azure/go-autorest/autorest v0.11.24 h1:1fIGgHKqVm54KIPT+q8Zmd1QlVsmHqeUGso5qm2BqqE=
|
github.com/Azure/go-autorest/autorest v0.11.27/go.mod h1:7l8ybrIdUmGqZMTD0sRtAr8NvbHjfofbf8RSP2q7w7U=
|
||||||
github.com/Azure/go-autorest/autorest v0.11.24/go.mod h1:G6kyRlFnTuSbEYkQGawPfsCswgme4iYf6rfSKUDzbCc=
|
|
||||||
github.com/Azure/go-autorest/autorest/adal v0.9.13/go.mod h1:W/MM4U6nLxnIskrw4UwWzlHfGjwUS50aOsc/I3yuU8M=
|
|
||||||
github.com/Azure/go-autorest/autorest/adal v0.9.18 h1:kLnPsRjzZZUF3K5REu/Kc+qMQrvuza2bwSnNdhmzLfQ=
|
|
||||||
github.com/Azure/go-autorest/autorest/adal v0.9.18/go.mod h1:XVVeme+LZwABT8K5Lc3hA4nAe8LDBVle26gTrguhhPQ=
|
github.com/Azure/go-autorest/autorest/adal v0.9.18/go.mod h1:XVVeme+LZwABT8K5Lc3hA4nAe8LDBVle26gTrguhhPQ=
|
||||||
|
github.com/Azure/go-autorest/autorest/adal v0.9.20 h1:gJ3E98kMpFB1MFqQCvA1yFab8vthOeD4VlFRQULxahg=
|
||||||
|
github.com/Azure/go-autorest/autorest/adal v0.9.20/go.mod h1:XVVeme+LZwABT8K5Lc3hA4nAe8LDBVle26gTrguhhPQ=
|
||||||
github.com/Azure/go-autorest/autorest/date v0.3.0 h1:7gUk1U5M/CQbp9WoqinNzJar+8KY+LPI6wiWrP/myHw=
|
github.com/Azure/go-autorest/autorest/date v0.3.0 h1:7gUk1U5M/CQbp9WoqinNzJar+8KY+LPI6wiWrP/myHw=
|
||||||
github.com/Azure/go-autorest/autorest/date v0.3.0/go.mod h1:BI0uouVdmngYNUzGWeSYnokU+TrmwEsOqdt8Y6sso74=
|
github.com/Azure/go-autorest/autorest/date v0.3.0/go.mod h1:BI0uouVdmngYNUzGWeSYnokU+TrmwEsOqdt8Y6sso74=
|
||||||
github.com/Azure/go-autorest/autorest/mocks v0.4.1 h1:K0laFcLE6VLTOwNgSxaGbUcLPuGXlNkbVvq4cW4nIHk=
|
|
||||||
github.com/Azure/go-autorest/autorest/mocks v0.4.1/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k=
|
github.com/Azure/go-autorest/autorest/mocks v0.4.1/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k=
|
||||||
|
github.com/Azure/go-autorest/autorest/mocks v0.4.2 h1:PGN4EDXnuQbojHbU0UWoNvmu9AGVwYHG9/fkDYhtAfw=
|
||||||
|
github.com/Azure/go-autorest/autorest/mocks v0.4.2/go.mod h1:Vy7OitM9Kei0i1Oj+LvyAWMXJHeKH1MVlzFugfVrmyU=
|
||||||
github.com/Azure/go-autorest/logger v0.2.1 h1:IG7i4p/mDa2Ce4TRyAO8IHnVhAVF3RFU+ZtXWSmf4Tg=
|
github.com/Azure/go-autorest/logger v0.2.1 h1:IG7i4p/mDa2Ce4TRyAO8IHnVhAVF3RFU+ZtXWSmf4Tg=
|
||||||
github.com/Azure/go-autorest/logger v0.2.1/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8=
|
github.com/Azure/go-autorest/logger v0.2.1/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8=
|
||||||
github.com/Azure/go-autorest/tracing v0.6.0 h1:TYi4+3m5t6K48TGI9AUdb+IzbnSxvnvUMfuitfgcfuo=
|
github.com/Azure/go-autorest/tracing v0.6.0 h1:TYi4+3m5t6K48TGI9AUdb+IzbnSxvnvUMfuitfgcfuo=
|
||||||
@ -63,10 +61,10 @@ github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym
|
|||||||
github.com/Microsoft/go-winio v0.6.0 h1:slsWYD/zyx7lCXoZVlvQrj0hPTM1HI4+v1sIda2yDvg=
|
github.com/Microsoft/go-winio v0.6.0 h1:slsWYD/zyx7lCXoZVlvQrj0hPTM1HI4+v1sIda2yDvg=
|
||||||
github.com/Microsoft/go-winio v0.6.0/go.mod h1:cTAf44im0RAYeL23bpB+fzCyDH2MJiz2BO69KH/soAE=
|
github.com/Microsoft/go-winio v0.6.0/go.mod h1:cTAf44im0RAYeL23bpB+fzCyDH2MJiz2BO69KH/soAE=
|
||||||
github.com/Microsoft/hcsshim v0.10.0-rc.4 h1:r/hSRKXFIdLYzZDbdieRxSY8T83Y0wBKNHZDKntNMSA=
|
github.com/Microsoft/hcsshim v0.10.0-rc.4 h1:r/hSRKXFIdLYzZDbdieRxSY8T83Y0wBKNHZDKntNMSA=
|
||||||
github.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ=
|
|
||||||
github.com/NYTimes/gziphandler v1.1.1/go.mod h1:n/CVRwUEOgIxrgPvAQhUUr9oeUtvrhMomdKFjzJNB0c=
|
|
||||||
github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU=
|
github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU=
|
||||||
|
github.com/PuerkitoBio/purell v1.1.1 h1:WEQqlqaGbrPkxLJWfBwQmfEAE1Z7ONdDLqrN38tNFfI=
|
||||||
github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0=
|
github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0=
|
||||||
|
github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 h1:d+Bc7a5rLufV/sSk/8dngufqelfh6jnri85riMAaF/M=
|
||||||
github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE=
|
github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE=
|
||||||
github.com/Shopify/logrus-bugsnag v0.0.0-20171204204709-577dee27f20d h1:UrqY+r/OJnIp5u0s1SbQ8dVfLCZJsnvazdBP5hS4iRs=
|
github.com/Shopify/logrus-bugsnag v0.0.0-20171204204709-577dee27f20d h1:UrqY+r/OJnIp5u0s1SbQ8dVfLCZJsnvazdBP5hS4iRs=
|
||||||
github.com/agext/levenshtein v1.2.1/go.mod h1:JEDfjyjHDjOF/1e4FlBE/PkbqA9OfWu2ki2W0IB5558=
|
github.com/agext/levenshtein v1.2.1/go.mod h1:JEDfjyjHDjOF/1e4FlBE/PkbqA9OfWu2ki2W0IB5558=
|
||||||
@ -88,10 +86,7 @@ github.com/apparentlymart/go-textseg/v12 v12.0.0 h1:bNEQyAGak9tojivJNkoqWErVCQbj
|
|||||||
github.com/apparentlymart/go-textseg/v12 v12.0.0/go.mod h1:S/4uRK2UtaQttw1GenVJEynmyUenKwP++x/+DdGV/Ec=
|
github.com/apparentlymart/go-textseg/v12 v12.0.0/go.mod h1:S/4uRK2UtaQttw1GenVJEynmyUenKwP++x/+DdGV/Ec=
|
||||||
github.com/apparentlymart/go-textseg/v13 v13.0.0 h1:Y+KvPE1NYz0xl601PVImeQfFyEy6iT90AvPUL1NNfNw=
|
github.com/apparentlymart/go-textseg/v13 v13.0.0 h1:Y+KvPE1NYz0xl601PVImeQfFyEy6iT90AvPUL1NNfNw=
|
||||||
github.com/apparentlymart/go-textseg/v13 v13.0.0/go.mod h1:ZK2fH7c4NqDTLtiYLvIkEghdlcqw7yxLeM89kiTRPUo=
|
github.com/apparentlymart/go-textseg/v13 v13.0.0/go.mod h1:ZK2fH7c4NqDTLtiYLvIkEghdlcqw7yxLeM89kiTRPUo=
|
||||||
github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o=
|
github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 h1:0CwZNZbxp69SHPdPJAN/hZIm0C4OItdklCFmMRWYpio=
|
||||||
github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY=
|
|
||||||
github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=
|
|
||||||
github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY=
|
|
||||||
github.com/aws/aws-sdk-go-v2 v1.16.3 h1:0W1TSJ7O6OzwuEvIXAtJGvOeQ0SGAhcpxPN2/NK5EhM=
|
github.com/aws/aws-sdk-go-v2 v1.16.3 h1:0W1TSJ7O6OzwuEvIXAtJGvOeQ0SGAhcpxPN2/NK5EhM=
|
||||||
github.com/aws/aws-sdk-go-v2 v1.16.3/go.mod h1:ytwTPBG6fXTZLxxeeCCWj2/EMYp/xDUgX+OET6TLNNU=
|
github.com/aws/aws-sdk-go-v2 v1.16.3/go.mod h1:ytwTPBG6fXTZLxxeeCCWj2/EMYp/xDUgX+OET6TLNNU=
|
||||||
github.com/aws/aws-sdk-go-v2/config v1.15.5 h1:P+xwhr6kabhxDTXTVH9YoHkqjLJ0wVVpIUHtFNr2hjU=
|
github.com/aws/aws-sdk-go-v2/config v1.15.5 h1:P+xwhr6kabhxDTXTVH9YoHkqjLJ0wVVpIUHtFNr2hjU=
|
||||||
@ -114,14 +109,10 @@ github.com/aws/aws-sdk-go-v2/service/sts v1.16.4 h1:+xtV90n3abQmgzk1pS++FdxZTrPE
|
|||||||
github.com/aws/aws-sdk-go-v2/service/sts v1.16.4/go.mod h1:lfSYenAXtavyX2A1LsViglqlG9eEFYxNryTZS5rn3QE=
|
github.com/aws/aws-sdk-go-v2/service/sts v1.16.4/go.mod h1:lfSYenAXtavyX2A1LsViglqlG9eEFYxNryTZS5rn3QE=
|
||||||
github.com/aws/smithy-go v1.11.2 h1:eG/N+CcUMAvsdffgMvjMKwfyDzIkjM6pfxMJ8Mzc6mE=
|
github.com/aws/smithy-go v1.11.2 h1:eG/N+CcUMAvsdffgMvjMKwfyDzIkjM6pfxMJ8Mzc6mE=
|
||||||
github.com/aws/smithy-go v1.11.2/go.mod h1:3xHYmszWVx2c0kIwQeEVf9uSm4fYZt67FBJnwub1bgM=
|
github.com/aws/smithy-go v1.11.2/go.mod h1:3xHYmszWVx2c0kIwQeEVf9uSm4fYZt67FBJnwub1bgM=
|
||||||
github.com/benbjohnson/clock v1.0.3/go.mod h1:bGMdMPoPVvcYyt1gHDf4J2KE153Yf9BuiUKYMaxlTDM=
|
|
||||||
github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=
|
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/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8=
|
||||||
github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=
|
github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=
|
||||||
github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=
|
github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=
|
||||||
github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs=
|
|
||||||
github.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c/go.mod h1:MKsuJmJgSg28kpZDP6UIiPt0e0Oz0kqKNGyRaWEPv84=
|
|
||||||
github.com/blang/semver v3.5.1+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk=
|
|
||||||
github.com/bmatcuk/doublestar v1.1.5/go.mod h1:wiQtGV+rzVYxB7WIlirSN++5HPtPlXEo9MEoZQC/PmE=
|
github.com/bmatcuk/doublestar v1.1.5/go.mod h1:wiQtGV+rzVYxB7WIlirSN++5HPtPlXEo9MEoZQC/PmE=
|
||||||
github.com/bugsnag/bugsnag-go v1.4.1 h1:TT3P9AX69w8mbSGE8L7IJOO2KBlPN0iQtYD0dUlrWHc=
|
github.com/bugsnag/bugsnag-go v1.4.1 h1:TT3P9AX69w8mbSGE8L7IJOO2KBlPN0iQtYD0dUlrWHc=
|
||||||
github.com/bugsnag/bugsnag-go v1.4.1/go.mod h1:2oa8nejYd4cQ/b0hMIopN0lCRxU0bueqREvZLWFrtK8=
|
github.com/bugsnag/bugsnag-go v1.4.1/go.mod h1:2oa8nejYd4cQ/b0hMIopN0lCRxU0bueqREvZLWFrtK8=
|
||||||
@ -132,8 +123,6 @@ github.com/cenkalti/backoff v2.1.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QH
|
|||||||
github.com/cenkalti/backoff/v4 v4.2.0 h1:HN5dHm3WBOgndBH6E8V0q2jIYIR3s9yglV8k/+MN3u4=
|
github.com/cenkalti/backoff/v4 v4.2.0 h1:HN5dHm3WBOgndBH6E8V0q2jIYIR3s9yglV8k/+MN3u4=
|
||||||
github.com/cenkalti/backoff/v4 v4.2.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE=
|
github.com/cenkalti/backoff/v4 v4.2.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE=
|
||||||
github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
|
github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
|
||||||
github.com/certifi/gocertifi v0.0.0-20191021191039-0944d244cd40/go.mod h1:sGbDF6GwGcLpkNXPUTkMRoywsNa/ol15pxFe6ERfguA=
|
|
||||||
github.com/certifi/gocertifi v0.0.0-20200922220541-2c3bb06c6054/go.mod h1:sGbDF6GwGcLpkNXPUTkMRoywsNa/ol15pxFe6ERfguA=
|
|
||||||
github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc=
|
github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc=
|
||||||
github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
|
github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
|
||||||
github.com/cespare/xxhash/v2 v2.1.2 h1:YRXhKfTDauu4ajMg1TPgFO5jnlC2HCbmLXMcTG5cbYE=
|
github.com/cespare/xxhash/v2 v2.1.2 h1:YRXhKfTDauu4ajMg1TPgFO5jnlC2HCbmLXMcTG5cbYE=
|
||||||
@ -153,9 +142,6 @@ github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWH
|
|||||||
github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
|
github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
|
||||||
github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
|
github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
|
||||||
github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
|
github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
|
||||||
github.com/cockroachdb/datadriven v0.0.0-20200714090401-bf6692d28da5/go.mod h1:h6jFvWxBdQXxjopDMZyH2UVceIRfR84bdzbkoKrsWNo=
|
|
||||||
github.com/cockroachdb/errors v1.2.4/go.mod h1:rQD95gz6FARkaKkQXUksEje/d9a6wBJoCr5oaCLELYA=
|
|
||||||
github.com/cockroachdb/logtags v0.0.0-20190617123548-eb05cc24525f/go.mod h1:i/u985jwjWRlyHXQbwatDASoW0RMlZ/3i9yJHE2xLkI=
|
|
||||||
github.com/compose-spec/compose-go v1.9.0 h1:oaewhNhUP/AClVs6ytHzcjw1xwK+2EMWuvHXj6tYvRc=
|
github.com/compose-spec/compose-go v1.9.0 h1:oaewhNhUP/AClVs6ytHzcjw1xwK+2EMWuvHXj6tYvRc=
|
||||||
github.com/compose-spec/compose-go v1.9.0/go.mod h1:Tb5Ae2PsYN3GTqYqzl2IRbTPiJtPZZjMw8UKUvmehFk=
|
github.com/compose-spec/compose-go v1.9.0/go.mod h1:Tb5Ae2PsYN3GTqYqzl2IRbTPiJtPZZjMw8UKUvmehFk=
|
||||||
github.com/containerd/cgroups v1.0.4 h1:jN/mbWBEaz+T1pi5OFtnkQ+8qnmEbAr1Oo1FRm5B0dA=
|
github.com/containerd/cgroups v1.0.4 h1:jN/mbWBEaz+T1pi5OFtnkQ+8qnmEbAr1Oo1FRm5B0dA=
|
||||||
@ -173,26 +159,16 @@ github.com/containerd/ttrpc v1.1.1-0.20220420014843-944ef4a40df3 h1:BhCp66ofL8oY
|
|||||||
github.com/containerd/ttrpc v1.1.1-0.20220420014843-944ef4a40df3/go.mod h1:YYyNVhZrTMiaf51Vj6WhAJqJw+vl/nzABhj8pWrzle4=
|
github.com/containerd/ttrpc v1.1.1-0.20220420014843-944ef4a40df3/go.mod h1:YYyNVhZrTMiaf51Vj6WhAJqJw+vl/nzABhj8pWrzle4=
|
||||||
github.com/containerd/typeurl v1.0.3-0.20220422153119-7f6e6d160d67 h1:rQvjv7gRi6Ki/NS/U9oLZFhqyk4dh/GH2M3o/4BRkMM=
|
github.com/containerd/typeurl v1.0.3-0.20220422153119-7f6e6d160d67 h1:rQvjv7gRi6Ki/NS/U9oLZFhqyk4dh/GH2M3o/4BRkMM=
|
||||||
github.com/containerd/typeurl v1.0.3-0.20220422153119-7f6e6d160d67/go.mod h1:HDkcKOXRnX6yKnXv3P0QrogFi0DoiauK/LpQi961f0A=
|
github.com/containerd/typeurl v1.0.3-0.20220422153119-7f6e6d160d67/go.mod h1:HDkcKOXRnX6yKnXv3P0QrogFi0DoiauK/LpQi961f0A=
|
||||||
github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk=
|
|
||||||
github.com/coreos/etcd v3.3.13+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE=
|
|
||||||
github.com/coreos/go-oidc v2.1.0+incompatible/go.mod h1:CgnwVTmzoESiwO9qyAFEMiHoZ1nMCKZlZ9V6mm3/LKc=
|
|
||||||
github.com/coreos/go-semver v0.3.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/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc=
|
github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc=
|
||||||
github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA=
|
|
||||||
github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU=
|
github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU=
|
||||||
github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU=
|
|
||||||
github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o=
|
github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o=
|
||||||
github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
|
github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
|
||||||
github.com/creack/pty v1.1.11 h1:07n33Z8lZxZ2qwegKbObQohDhXDQxiMMz1NOUGYlesw=
|
github.com/creack/pty v1.1.11 h1:07n33Z8lZxZ2qwegKbObQohDhXDQxiMMz1NOUGYlesw=
|
||||||
github.com/creack/pty v1.1.11/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
|
|
||||||
github.com/cyphar/filepath-securejoin v0.2.3 h1:YX6ebbZCZP7VkM3scTTokDgBL2TY741X51MTk3ycuNI=
|
github.com/cyphar/filepath-securejoin v0.2.3 h1:YX6ebbZCZP7VkM3scTTokDgBL2TY741X51MTk3ycuNI=
|
||||||
github.com/cyphar/filepath-securejoin v0.2.3/go.mod h1:aPGpWjXOXUn2NCNjFvBE6aRxGGx79pTxQpKOJNYHHl4=
|
github.com/cyphar/filepath-securejoin v0.2.3/go.mod h1:aPGpWjXOXUn2NCNjFvBE6aRxGGx79pTxQpKOJNYHHl4=
|
||||||
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||||
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
|
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
|
||||||
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||||
github.com/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/distribution/distribution/v3 v3.0.0-20221103125252-ebfa2a0ac0a9 h1:doprs/RuXCuN864IfxC3h2qocrt158wGv3A5mcqSZQw=
|
github.com/distribution/distribution/v3 v3.0.0-20221103125252-ebfa2a0ac0a9 h1:doprs/RuXCuN864IfxC3h2qocrt158wGv3A5mcqSZQw=
|
||||||
github.com/distribution/distribution/v3 v3.0.0-20221103125252-ebfa2a0ac0a9/go.mod h1:6rIc5NMSjXjjnwzWWy3HAm9gDBu+X7aCzL8VrHIKgxM=
|
github.com/distribution/distribution/v3 v3.0.0-20221103125252-ebfa2a0ac0a9/go.mod h1:6rIc5NMSjXjjnwzWWy3HAm9gDBu+X7aCzL8VrHIKgxM=
|
||||||
github.com/docker/cli v23.0.0+incompatible h1:bcM4syaQ+EM/iczJTimMOGzvnzJBFPFEf4acS7sZ+RM=
|
github.com/docker/cli v23.0.0+incompatible h1:bcM4syaQ+EM/iczJTimMOGzvnzJBFPFEf4acS7sZ+RM=
|
||||||
@ -218,35 +194,24 @@ github.com/docker/go-units v0.5.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDD
|
|||||||
github.com/docker/libtrust v0.0.0-20150526203908-9cbd2a1374f4 h1:k8TfKGeAcDQFFQOGCQMRN04N4a9YrPlRMMKnzAuvM9Q=
|
github.com/docker/libtrust v0.0.0-20150526203908-9cbd2a1374f4 h1:k8TfKGeAcDQFFQOGCQMRN04N4a9YrPlRMMKnzAuvM9Q=
|
||||||
github.com/docker/libtrust v0.0.0-20150526203908-9cbd2a1374f4/go.mod h1:cyGadeNEkKy96OOhEzfZl+yxihPEzKnqJwvfuSUqbZE=
|
github.com/docker/libtrust v0.0.0-20150526203908-9cbd2a1374f4/go.mod h1:cyGadeNEkKy96OOhEzfZl+yxihPEzKnqJwvfuSUqbZE=
|
||||||
github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE=
|
github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE=
|
||||||
github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk=
|
|
||||||
github.com/elazarl/goproxy v0.0.0-20180725130230-947c36da3153/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc=
|
|
||||||
github.com/elazarl/goproxy v0.0.0-20191011121108-aa519ddbe484 h1:pEtiCjIXx3RvGjlUJuCNxNOw0MNblyR9Wi+vJGBFh+8=
|
github.com/elazarl/goproxy v0.0.0-20191011121108-aa519ddbe484 h1:pEtiCjIXx3RvGjlUJuCNxNOw0MNblyR9Wi+vJGBFh+8=
|
||||||
github.com/elazarl/goproxy v0.0.0-20191011121108-aa519ddbe484/go.mod h1:Ro8st/ElPeALwNFlcTpWmkr6IoMFfkjXAvTHpevnDsM=
|
github.com/elazarl/goproxy v0.0.0-20191011121108-aa519ddbe484/go.mod h1:Ro8st/ElPeALwNFlcTpWmkr6IoMFfkjXAvTHpevnDsM=
|
||||||
github.com/elazarl/goproxy/ext v0.0.0-20190711103511-473e67f1d7d2/go.mod h1:gNh8nYJoAm43RfaxurUnxr+N1PwuFV3ZMl/efxlIlY8=
|
github.com/elazarl/goproxy/ext v0.0.0-20190711103511-473e67f1d7d2/go.mod h1:gNh8nYJoAm43RfaxurUnxr+N1PwuFV3ZMl/efxlIlY8=
|
||||||
github.com/emicklei/go-restful v0.0.0-20170410110728-ff4f55a20633/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs=
|
github.com/emicklei/go-restful/v3 v3.8.0 h1:eCZ8ulSerjdAiaNpF7GxXIE7ZCMo1moN1qX+S609eVw=
|
||||||
github.com/emicklei/go-restful v2.9.5+incompatible/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs=
|
github.com/emicklei/go-restful/v3 v3.8.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc=
|
||||||
github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
|
github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
|
||||||
github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
|
github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
|
||||||
github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98=
|
github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98=
|
||||||
github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=
|
github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=
|
||||||
github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=
|
|
||||||
github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ=
|
github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ=
|
||||||
github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0=
|
github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0=
|
||||||
github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
|
github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
|
||||||
github.com/evanphx/json-patch v4.11.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk=
|
|
||||||
github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=
|
|
||||||
github.com/felixge/httpsnoop v1.0.1/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U=
|
|
||||||
github.com/felixge/httpsnoop v1.0.3 h1:s/nj+GCswXYzN5v2DpNMuMQYe+0DDwt5WVCU6CWBdXk=
|
github.com/felixge/httpsnoop v1.0.3 h1:s/nj+GCswXYzN5v2DpNMuMQYe+0DDwt5WVCU6CWBdXk=
|
||||||
github.com/felixge/httpsnoop v1.0.3/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U=
|
github.com/felixge/httpsnoop v1.0.3/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U=
|
||||||
github.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k=
|
|
||||||
github.com/form3tech-oss/jwt-go v3.2.3+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k=
|
|
||||||
github.com/frankban/quicktest v1.11.3/go.mod h1:wRf/ReqHper53s+kmmSZizM8NamnL3IM0I9ntUbOk+k=
|
github.com/frankban/quicktest v1.11.3/go.mod h1:wRf/ReqHper53s+kmmSZizM8NamnL3IM0I9ntUbOk+k=
|
||||||
github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
|
|
||||||
github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ=
|
|
||||||
github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY=
|
github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY=
|
||||||
github.com/fvbommel/sortorder v1.0.1 h1:dSnXLt4mJYH25uDDGa3biZNQsozaUWDSWeKJ0qqFfzE=
|
github.com/fvbommel/sortorder v1.0.1 h1:dSnXLt4mJYH25uDDGa3biZNQsozaUWDSWeKJ0qqFfzE=
|
||||||
github.com/fvbommel/sortorder v1.0.1/go.mod h1:uk88iVf1ovNn1iLfgUVU2F9o5eO30ui720w+kxuqRs0=
|
github.com/fvbommel/sortorder v1.0.1/go.mod h1:uk88iVf1ovNn1iLfgUVU2F9o5eO30ui720w+kxuqRs0=
|
||||||
github.com/getsentry/raven-go v0.2.0/go.mod h1:KungGk8q33+aIAZUIVWZDr2OfAEBsO49PX4NzFV5kcQ=
|
|
||||||
github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
|
github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
|
||||||
github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=
|
github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=
|
||||||
github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
|
github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
|
||||||
@ -259,8 +224,6 @@ github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9
|
|||||||
github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk=
|
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-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A=
|
||||||
github.com/go-logfmt/logfmt v0.5.1/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs=
|
github.com/go-logfmt/logfmt v0.5.1/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs=
|
||||||
github.com/go-logr/logr v0.1.0/go.mod h1:ixOQHD9gLJUVQQ2ZOR7zLEifBX6tGkNJF4QyIY7sIas=
|
|
||||||
github.com/go-logr/logr v0.4.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU=
|
|
||||||
github.com/go-logr/logr v1.2.0/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
|
github.com/go-logr/logr v1.2.0/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
|
||||||
github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
|
github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
|
||||||
github.com/go-logr/logr v1.2.3 h1:2DntVwHkVopvECVRSlL5PSo9eG+cAkDCuckLubN+rq0=
|
github.com/go-logr/logr v1.2.3 h1:2DntVwHkVopvECVRSlL5PSo9eG+cAkDCuckLubN+rq0=
|
||||||
@ -268,10 +231,12 @@ github.com/go-logr/logr v1.2.3/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbV
|
|||||||
github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=
|
github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=
|
||||||
github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=
|
github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=
|
||||||
github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg=
|
github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg=
|
||||||
|
github.com/go-openapi/jsonpointer v0.19.5 h1:gZr+CIYByUqjcgeLXnQu2gHYQC9o73G2XUeOFYEICuY=
|
||||||
github.com/go-openapi/jsonpointer v0.19.5/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg=
|
github.com/go-openapi/jsonpointer v0.19.5/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg=
|
||||||
github.com/go-openapi/jsonreference v0.19.3/go.mod h1:rjx6GuL8TTa9VaixXglHmQmIL98+wF9xc8zWvFonSJ8=
|
github.com/go-openapi/jsonreference v0.19.5 h1:1WJP/wi4OjB4iV8KVbH73rQaoialJrqv8gitZLxGLtM=
|
||||||
github.com/go-openapi/jsonreference v0.19.5/go.mod h1:RdybgQwPxbL4UEjuAruzK1x3nE69AqPYEJeo/TWfEeg=
|
github.com/go-openapi/jsonreference v0.19.5/go.mod h1:RdybgQwPxbL4UEjuAruzK1x3nE69AqPYEJeo/TWfEeg=
|
||||||
github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk=
|
github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk=
|
||||||
|
github.com/go-openapi/swag v0.19.14 h1:gm3vOOXfiuw5i9p5N9xJvfjvuofpyvLA9Wr6QfK5Fng=
|
||||||
github.com/go-openapi/swag v0.19.14/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ=
|
github.com/go-openapi/swag v0.19.14/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ=
|
||||||
github.com/go-sql-driver/mysql v1.6.0 h1:BCTh4TKNUYmOmMUcQ3IipzF5prigylS7XXjEkfCHuOE=
|
github.com/go-sql-driver/mysql v1.6.0 h1:BCTh4TKNUYmOmMUcQ3IipzF5prigylS7XXjEkfCHuOE=
|
||||||
github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg=
|
github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg=
|
||||||
@ -286,8 +251,6 @@ github.com/gofrs/uuid v4.0.0+incompatible h1:1SD/1F5pU8p29ybwgQSwpQk+mwdRrXCYuPh
|
|||||||
github.com/gogo/googleapis v1.4.1 h1:1Yx4Myt7BxzvUr5ldGSbwYiZG6t9wGBZ+8/fX3Wvtq0=
|
github.com/gogo/googleapis v1.4.1 h1:1Yx4Myt7BxzvUr5ldGSbwYiZG6t9wGBZ+8/fX3Wvtq0=
|
||||||
github.com/gogo/googleapis v1.4.1/go.mod h1:2lpHqI5OcWCtVElxXnPt+s8oJvMpySlOyM6xDCrzib4=
|
github.com/gogo/googleapis v1.4.1/go.mod h1:2lpHqI5OcWCtVElxXnPt+s8oJvMpySlOyM6xDCrzib4=
|
||||||
github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
|
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/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o=
|
|
||||||
github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q=
|
github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q=
|
||||||
github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=
|
github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=
|
||||||
github.com/golang-jwt/jwt/v4 v4.0.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg=
|
github.com/golang-jwt/jwt/v4 v4.0.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg=
|
||||||
@ -297,12 +260,10 @@ github.com/golang-jwt/jwt/v4 v4.4.2/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w
|
|||||||
github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
|
github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
|
||||||
github.com/golang/glog v1.0.0 h1:nfP3RFugxnNRyKgeWd4oI1nYvXpxrx8ck8ZrcizshdQ=
|
github.com/golang/glog v1.0.0 h1:nfP3RFugxnNRyKgeWd4oI1nYvXpxrx8ck8ZrcizshdQ=
|
||||||
github.com/golang/glog v1.0.0/go.mod h1:EWib/APOK0SL3dFbYqvxE3UYd8E6s1ouQ7iEp/0LWV4=
|
github.com/golang/glog v1.0.0/go.mod h1:EWib/APOK0SL3dFbYqvxE3UYd8E6s1ouQ7iEp/0LWV4=
|
||||||
github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
|
|
||||||
github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
|
github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
|
||||||
github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
|
github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
|
||||||
github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
|
github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
|
||||||
github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE=
|
github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE=
|
||||||
github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
|
|
||||||
github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
|
github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
|
||||||
github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
|
github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
|
||||||
github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y=
|
github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y=
|
||||||
@ -326,14 +287,14 @@ github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QD
|
|||||||
github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
|
github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
|
||||||
github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
|
github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
|
||||||
github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=
|
github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=
|
||||||
github.com/golang/protobuf v1.5.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM=
|
|
||||||
github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw=
|
github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw=
|
||||||
github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=
|
github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=
|
||||||
github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
|
github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
|
||||||
github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
|
github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
|
||||||
github.com/google/btree v1.0.1/go.mod h1:xXMiIv4Fb/0kKde4SpL7qlzvu5cMJDRkFDxJfI9uaxA=
|
|
||||||
github.com/google/certificate-transparency-go v1.1.4 h1:hCyXHDbtqlr/lMXU0D4WgbalXL0Zk4dSWWMbPV8VrqY=
|
github.com/google/certificate-transparency-go v1.1.4 h1:hCyXHDbtqlr/lMXU0D4WgbalXL0Zk4dSWWMbPV8VrqY=
|
||||||
github.com/google/certificate-transparency-go v1.1.4/go.mod h1:D6lvbfwckhNrbM9WVl1EVeMOyzC19mpIjMOI4nxBHtQ=
|
github.com/google/certificate-transparency-go v1.1.4/go.mod h1:D6lvbfwckhNrbM9WVl1EVeMOyzC19mpIjMOI4nxBHtQ=
|
||||||
|
github.com/google/gnostic v0.5.7-v3refs h1:FhTMOKj2VhjpouxvWJAV1TL304uMlb9zcDqkl6cEI54=
|
||||||
|
github.com/google/gnostic v0.5.7-v3refs/go.mod h1:73MKFl6jIHelAJNaBGFzt3SPtZULs9dYrGFt8OiIsHQ=
|
||||||
github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
|
github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
|
||||||
github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
|
github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
|
||||||
github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
|
github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
|
||||||
@ -348,7 +309,6 @@ github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8
|
|||||||
github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38=
|
github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38=
|
||||||
github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
|
github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
|
||||||
github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
|
github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
|
||||||
github.com/google/gofuzz v1.1.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
|
|
||||||
github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0=
|
github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0=
|
||||||
github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
|
github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
|
||||||
github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs=
|
github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs=
|
||||||
@ -369,56 +329,27 @@ 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/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
|
||||||
github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg=
|
github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg=
|
||||||
github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk=
|
github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk=
|
||||||
github.com/googleapis/gnostic v0.5.1/go.mod h1:6U4PtQXGIEt/Z3h5MAT7FNofLnw9vXk2cUuW7uA/OeU=
|
|
||||||
github.com/googleapis/gnostic v0.5.5 h1:9fHAtK0uDfpveeqqo1hkEZJcFvYXAiCN3UutL8F9xHw=
|
|
||||||
github.com/googleapis/gnostic v0.5.5/go.mod h1:7+EbHbldMins07ALC74bsA81Ovc97DwqyJO1AENw9kA=
|
|
||||||
github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
|
|
||||||
github.com/gorilla/mux v1.8.0 h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI=
|
github.com/gorilla/mux v1.8.0 h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI=
|
||||||
github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So=
|
github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So=
|
||||||
github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
|
github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
|
||||||
github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA=
|
|
||||||
github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs=
|
|
||||||
github.com/grpc-ecosystem/go-grpc-middleware v1.3.0 h1:+9834+KizmvFV7pXQGSXQTsaWhq2GjuNUt0aUU0YBYw=
|
github.com/grpc-ecosystem/go-grpc-middleware v1.3.0 h1:+9834+KizmvFV7pXQGSXQTsaWhq2GjuNUt0aUU0YBYw=
|
||||||
github.com/grpc-ecosystem/go-grpc-middleware v1.3.0/go.mod h1:z0ButlSOZa5vEBq9m2m2hlwIgKw+rp3sdCBRoJY+30Y=
|
github.com/grpc-ecosystem/go-grpc-middleware v1.3.0/go.mod h1:z0ButlSOZa5vEBq9m2m2hlwIgKw+rp3sdCBRoJY+30Y=
|
||||||
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/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw=
|
github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw=
|
||||||
github.com/grpc-ecosystem/grpc-gateway/v2 v2.7.0 h1:BZHcxBETFHIdVyhyEfOvn/RdU/QGdLI4y34qQGjGWO0=
|
github.com/grpc-ecosystem/grpc-gateway/v2 v2.7.0 h1:BZHcxBETFHIdVyhyEfOvn/RdU/QGdLI4y34qQGjGWO0=
|
||||||
github.com/grpc-ecosystem/grpc-gateway/v2 v2.7.0/go.mod h1:hgWBS7lorOAVIJEQMi4ZsPv9hVvWI6+ch50m39Pf2Ks=
|
github.com/grpc-ecosystem/grpc-gateway/v2 v2.7.0/go.mod h1:hgWBS7lorOAVIJEQMi4ZsPv9hVvWI6+ch50m39Pf2Ks=
|
||||||
github.com/hailocab/go-hostpool v0.0.0-20160125115350-e80d13ce29ed h1:5upAirOpQc1Q53c0bnx2ufif5kANL7bfZWcc6VJWJd8=
|
github.com/hailocab/go-hostpool v0.0.0-20160125115350-e80d13ce29ed h1:5upAirOpQc1Q53c0bnx2ufif5kANL7bfZWcc6VJWJd8=
|
||||||
github.com/hailocab/go-hostpool v0.0.0-20160125115350-e80d13ce29ed/go.mod h1:tMWxXQ9wFIaZeTI9F+hmhFiGpFmhOHzyShyFUhRm0H4=
|
github.com/hailocab/go-hostpool v0.0.0-20160125115350-e80d13ce29ed/go.mod h1:tMWxXQ9wFIaZeTI9F+hmhFiGpFmhOHzyShyFUhRm0H4=
|
||||||
github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q=
|
|
||||||
github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8=
|
|
||||||
github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=
|
|
||||||
github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=
|
|
||||||
github.com/hashicorp/go-cty-funcs v0.0.0-20200930094925-2721b1e36840 h1:kgvybwEeu0SXktbB2y3uLHX9lklLo+nzUwh59A3jzQc=
|
github.com/hashicorp/go-cty-funcs v0.0.0-20200930094925-2721b1e36840 h1:kgvybwEeu0SXktbB2y3uLHX9lklLo+nzUwh59A3jzQc=
|
||||||
github.com/hashicorp/go-cty-funcs v0.0.0-20200930094925-2721b1e36840/go.mod h1:Abjk0jbRkDaNCzsRhOv2iDCofYpX1eVsjozoiK63qLA=
|
github.com/hashicorp/go-cty-funcs v0.0.0-20200930094925-2721b1e36840/go.mod h1:Abjk0jbRkDaNCzsRhOv2iDCofYpX1eVsjozoiK63qLA=
|
||||||
github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60=
|
|
||||||
github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM=
|
|
||||||
github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk=
|
|
||||||
github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU=
|
|
||||||
github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU=
|
|
||||||
github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4=
|
|
||||||
github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=
|
|
||||||
github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=
|
|
||||||
github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90=
|
|
||||||
github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
|
github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
|
||||||
github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
|
github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
|
||||||
github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4=
|
github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4=
|
||||||
github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ=
|
|
||||||
github.com/hashicorp/hcl/v2 v2.8.2 h1:wmFle3D1vu0okesm8BTLVDyJ6/OL9DCLUwn0b2OptiY=
|
github.com/hashicorp/hcl/v2 v2.8.2 h1:wmFle3D1vu0okesm8BTLVDyJ6/OL9DCLUwn0b2OptiY=
|
||||||
github.com/hashicorp/hcl/v2 v2.8.2/go.mod h1:bQTN5mpo+jewjJgh8jr0JUguIi7qPHUF6yIfAEN3jqY=
|
github.com/hashicorp/hcl/v2 v2.8.2/go.mod h1:bQTN5mpo+jewjJgh8jr0JUguIi7qPHUF6yIfAEN3jqY=
|
||||||
github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64=
|
|
||||||
github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ=
|
|
||||||
github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I=
|
|
||||||
github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc=
|
|
||||||
github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=
|
|
||||||
github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=
|
github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=
|
||||||
github.com/imdario/mergo v0.3.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA=
|
|
||||||
github.com/imdario/mergo v0.3.13 h1:lFzP57bqS/wsqKssCGmtLAb8A0wKjLGrve2q3PPVcBk=
|
github.com/imdario/mergo v0.3.13 h1:lFzP57bqS/wsqKssCGmtLAb8A0wKjLGrve2q3PPVcBk=
|
||||||
github.com/imdario/mergo v0.3.13/go.mod h1:4lJ1jqUDcsbIECGy0RUJAXNIhg+6ocWgb1ALK2O4oXg=
|
github.com/imdario/mergo v0.3.13/go.mod h1:4lJ1jqUDcsbIECGy0RUJAXNIhg+6ocWgb1ALK2O4oXg=
|
||||||
github.com/in-toto/in-toto-golang v0.5.0 h1:hb8bgwr0M2hGdDsLjkJ3ZqJ8JFLL/tgYdAxF/XEFBbY=
|
github.com/in-toto/in-toto-golang v0.5.0 h1:hb8bgwr0M2hGdDsLjkJ3ZqJ8JFLL/tgYdAxF/XEFBbY=
|
||||||
github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8=
|
|
||||||
github.com/inconshreveable/mousetrap v1.0.1 h1:U3uMjPSQEBMNp1lFxmllqCPM6P5u/Xq7Pgzkat/bFNc=
|
github.com/inconshreveable/mousetrap v1.0.1 h1:U3uMjPSQEBMNp1lFxmllqCPM6P5u/Xq7Pgzkat/bFNc=
|
||||||
github.com/inconshreveable/mousetrap v1.0.1/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw=
|
github.com/inconshreveable/mousetrap v1.0.1/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw=
|
||||||
github.com/jinzhu/gorm v1.9.2 h1:lCvgEaqe/HVE+tjAR2mt4HbbHAZsQOv3XAZiEZV37iw=
|
github.com/jinzhu/gorm v1.9.2 h1:lCvgEaqe/HVE+tjAR2mt4HbbHAZsQOv3XAZiEZV37iw=
|
||||||
@ -427,8 +358,7 @@ github.com/jinzhu/inflection v0.0.0-20180308033659-04140366298a h1:eeaG9XMUvRBYX
|
|||||||
github.com/jinzhu/inflection v0.0.0-20180308033659-04140366298a/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc=
|
github.com/jinzhu/inflection v0.0.0-20180308033659-04140366298a/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc=
|
||||||
github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo=
|
github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo=
|
||||||
github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U=
|
github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U=
|
||||||
github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo=
|
github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY=
|
||||||
github.com/jonboulle/clockwork v0.2.2/go.mod h1:Pkfl5aHPm1nk2H9h0bjmnJD/BcgbGXUBGnn1kMkgxc8=
|
|
||||||
github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y=
|
github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y=
|
||||||
github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4=
|
github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4=
|
||||||
github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=
|
github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=
|
||||||
@ -439,13 +369,10 @@ github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnr
|
|||||||
github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=
|
github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=
|
||||||
github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU=
|
github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU=
|
||||||
github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk=
|
github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk=
|
||||||
github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=
|
|
||||||
github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=
|
github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=
|
||||||
github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM=
|
github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM=
|
||||||
github.com/kardianos/osext v0.0.0-20190222173326-2bc1f35cddc0 h1:iQTw/8FWTuc7uiaSepXwyf3o52HaUYcV+Tu66S3F5GA=
|
github.com/kardianos/osext v0.0.0-20190222173326-2bc1f35cddc0 h1:iQTw/8FWTuc7uiaSepXwyf3o52HaUYcV+Tu66S3F5GA=
|
||||||
github.com/kardianos/osext v0.0.0-20190222173326-2bc1f35cddc0/go.mod h1:1NbS8ALrpOvjt0rHPNLyCIeMtbizbir8U//inJ+zuB8=
|
github.com/kardianos/osext v0.0.0-20190222173326-2bc1f35cddc0/go.mod h1:1NbS8ALrpOvjt0rHPNLyCIeMtbizbir8U//inJ+zuB8=
|
||||||
github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q=
|
|
||||||
github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00=
|
|
||||||
github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=
|
github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=
|
||||||
github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
|
github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
|
||||||
github.com/klauspost/compress v1.15.12 h1:YClS/PImqYbn+UILDnqxQCZ3RehC9N318SU3kElDUEM=
|
github.com/klauspost/compress v1.15.12 h1:YClS/PImqYbn+UILDnqxQCZ3RehC9N318SU3kElDUEM=
|
||||||
@ -464,32 +391,21 @@ github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
|
|||||||
github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
|
github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
|
||||||
github.com/kylelemons/godebug v0.0.0-20170820004349-d65d576e9348/go.mod h1:B69LEHPfb2qLo0BaaOLcbitczOKLWTsrBG9LczfCD4k=
|
github.com/kylelemons/godebug v0.0.0-20170820004349-d65d576e9348/go.mod h1:B69LEHPfb2qLo0BaaOLcbitczOKLWTsrBG9LczfCD4k=
|
||||||
github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc=
|
github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc=
|
||||||
github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ=
|
|
||||||
github.com/magiconair/properties v1.8.6 h1:5ibWZ6iY0NctNGWo87LalDlEZ6R41TqbbDamhfG/Qzo=
|
github.com/magiconair/properties v1.8.6 h1:5ibWZ6iY0NctNGWo87LalDlEZ6R41TqbbDamhfG/Qzo=
|
||||||
github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=
|
github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=
|
||||||
github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=
|
github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=
|
||||||
|
github.com/mailru/easyjson v0.7.6 h1:8yTIVnZgCoiM1TgqoeTl+LfU5Jg6/xL3QhGQnimLYnA=
|
||||||
github.com/mailru/easyjson v0.7.6/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc=
|
github.com/mailru/easyjson v0.7.6/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc=
|
||||||
github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=
|
|
||||||
github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=
|
|
||||||
github.com/mattn/go-shellwords v1.0.12 h1:M2zGm7EW6UQJvDeQxo4T51eKPurbeFbe8WtebGE2xrk=
|
github.com/mattn/go-shellwords v1.0.12 h1:M2zGm7EW6UQJvDeQxo4T51eKPurbeFbe8WtebGE2xrk=
|
||||||
github.com/mattn/go-shellwords v1.0.12/go.mod h1:EZzvwXDESEeg03EKmM+RmDnNOPKG4lLtQsUlTZDWQ8Y=
|
github.com/mattn/go-shellwords v1.0.12/go.mod h1:EZzvwXDESEeg03EKmM+RmDnNOPKG4lLtQsUlTZDWQ8Y=
|
||||||
github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=
|
github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=
|
||||||
github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4=
|
|
||||||
github.com/matttproud/golang_protobuf_extensions v1.0.4 h1:mmDVorXM7PCGKw94cs5zkfA9PSy5pEvNWRP0ET0TIVo=
|
github.com/matttproud/golang_protobuf_extensions v1.0.4 h1:mmDVorXM7PCGKw94cs5zkfA9PSy5pEvNWRP0ET0TIVo=
|
||||||
github.com/matttproud/golang_protobuf_extensions v1.0.4/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4=
|
github.com/matttproud/golang_protobuf_extensions v1.0.4/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4=
|
||||||
github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg=
|
|
||||||
github.com/miekg/pkcs11 v1.1.1 h1:Ugu9pdy6vAYku5DEpVWVFPYnzV+bxB+iRdbuFSu7TvU=
|
github.com/miekg/pkcs11 v1.1.1 h1:Ugu9pdy6vAYku5DEpVWVFPYnzV+bxB+iRdbuFSu7TvU=
|
||||||
github.com/miekg/pkcs11 v1.1.1/go.mod h1:XsNlhZGX73bx86s2hdc/FuaLm2CPZJemRLMA+WTFxgs=
|
github.com/miekg/pkcs11 v1.1.1/go.mod h1:XsNlhZGX73bx86s2hdc/FuaLm2CPZJemRLMA+WTFxgs=
|
||||||
github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc=
|
|
||||||
github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=
|
|
||||||
github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=
|
github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=
|
||||||
github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI=
|
|
||||||
github.com/mitchellh/go-wordwrap v0.0.0-20150314170334-ad45545899c7 h1:DpOJ2HYzCv8LZP15IdmG+YdwD2luVPHITV96TkirNBM=
|
github.com/mitchellh/go-wordwrap v0.0.0-20150314170334-ad45545899c7 h1:DpOJ2HYzCv8LZP15IdmG+YdwD2luVPHITV96TkirNBM=
|
||||||
github.com/mitchellh/go-wordwrap v0.0.0-20150314170334-ad45545899c7/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo=
|
github.com/mitchellh/go-wordwrap v0.0.0-20150314170334-ad45545899c7/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo=
|
||||||
github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg=
|
|
||||||
github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY=
|
|
||||||
github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=
|
|
||||||
github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=
|
|
||||||
github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY=
|
github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY=
|
||||||
github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=
|
github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=
|
||||||
github.com/moby/buildkit v0.11.0-rc3.0.20230216100651-46e4e7e51b01 h1:RTdsd8sbZn5+1pG4SrUl3S1GNvEyzcvqm9hdok/4JAY=
|
github.com/moby/buildkit v0.11.0-rc3.0.20230216100651-46e4e7e51b01 h1:RTdsd8sbZn5+1pG4SrUl3S1GNvEyzcvqm9hdok/4JAY=
|
||||||
@ -507,7 +423,6 @@ github.com/moby/sys/sequential v0.5.0 h1:OPvI35Lzn9K04PBbCLW0g4LcFAJgHsvXsRyewg5
|
|||||||
github.com/moby/sys/sequential v0.5.0/go.mod h1:tH2cOOs5V9MlPiXcQzRC+eEyab644PWKGRYaaV5ZZlo=
|
github.com/moby/sys/sequential v0.5.0/go.mod h1:tH2cOOs5V9MlPiXcQzRC+eEyab644PWKGRYaaV5ZZlo=
|
||||||
github.com/moby/sys/signal v0.7.0 h1:25RW3d5TnQEoKvRbEKUGay6DCQ46IxAVTT9CUMgmsSI=
|
github.com/moby/sys/signal v0.7.0 h1:25RW3d5TnQEoKvRbEKUGay6DCQ46IxAVTT9CUMgmsSI=
|
||||||
github.com/moby/sys/signal v0.7.0/go.mod h1:GQ6ObYZfqacOwTtlXvcmh9A26dVRul/hbOZn88Kg8Tg=
|
github.com/moby/sys/signal v0.7.0/go.mod h1:GQ6ObYZfqacOwTtlXvcmh9A26dVRul/hbOZn88Kg8Tg=
|
||||||
github.com/moby/term v0.0.0-20210610120745-9d4ed1856297/go.mod h1:vgPCkQMyxTZ7IDy8SXRufE172gr8+K/JE/7hHFxHW3A=
|
|
||||||
github.com/moby/term v0.0.0-20221120202655-abb19827d345 h1:J9c53/kxIH+2nTKBEfZYFMlhghtHpIHSXpm5VRGHSnU=
|
github.com/moby/term v0.0.0-20221120202655-abb19827d345 h1:J9c53/kxIH+2nTKBEfZYFMlhghtHpIHSXpm5VRGHSnU=
|
||||||
github.com/moby/term v0.0.0-20221120202655-abb19827d345/go.mod h1:15ce4BGCFxt7I5NQKT+HV0yEDxmf6fSysfEDiVo3zFM=
|
github.com/moby/term v0.0.0-20221120202655-abb19827d345/go.mod h1:15ce4BGCFxt7I5NQKT+HV0yEDxmf6fSysfEDiVo3zFM=
|
||||||
github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
|
github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
|
||||||
@ -520,21 +435,13 @@ github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjY
|
|||||||
github.com/morikuni/aec v1.0.0 h1:nP9CBfwrvYnBRgY6qfDQkygYDmYwOilePFkwzv4dU8A=
|
github.com/morikuni/aec v1.0.0 h1:nP9CBfwrvYnBRgY6qfDQkygYDmYwOilePFkwzv4dU8A=
|
||||||
github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc=
|
github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc=
|
||||||
github.com/mrunalp/fileutils v0.5.0/go.mod h1:M1WthSahJixYnrXQl/DFQuteStB1weuxD2QJNHXfbSQ=
|
github.com/mrunalp/fileutils v0.5.0/go.mod h1:M1WthSahJixYnrXQl/DFQuteStB1weuxD2QJNHXfbSQ=
|
||||||
github.com/munnerz/goautoneg v0.0.0-20120707110453-a547fc61f48d/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ=
|
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA=
|
||||||
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ=
|
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ=
|
||||||
github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
|
github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
|
||||||
github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
|
github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
|
||||||
github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw=
|
|
||||||
github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno=
|
github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno=
|
||||||
github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A=
|
github.com/onsi/ginkgo/v2 v2.1.6 h1:Fx2POJZfKRQcM1pH49qSZiYeu319wji004qX+GDovrU=
|
||||||
github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U=
|
github.com/onsi/gomega v1.20.1 h1:PA/3qinGoukvymdIDV8pii6tiZgC8kbmJO6Z5+b002Q=
|
||||||
github.com/onsi/ginkgo v0.0.0-20170829012221-11459a886d9c/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
|
|
||||||
github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
|
|
||||||
github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk=
|
|
||||||
github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY=
|
|
||||||
github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA=
|
|
||||||
github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY=
|
|
||||||
github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo=
|
|
||||||
github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U=
|
github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U=
|
||||||
github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM=
|
github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM=
|
||||||
github.com/opencontainers/image-spec v1.1.0-rc2.0.20221005185240-3a7f492d3f1b h1:YWuSjZCQAPM8UUBLkYUk1e+rZcvWHJmFb6i6rM44Xs8=
|
github.com/opencontainers/image-spec v1.1.0-rc2.0.20221005185240-3a7f492d3f1b h1:YWuSjZCQAPM8UUBLkYUk1e+rZcvWHJmFb6i6rM44Xs8=
|
||||||
@ -547,12 +454,9 @@ github.com/opencontainers/selinux v1.10.0/go.mod h1:2i0OySw99QjzBBQByd1Gr9gSjvuh
|
|||||||
github.com/opencontainers/selinux v1.10.2 h1:NFy2xCsjn7+WspbfZkUd5zyVeisV7VFbPSP96+8/ha4=
|
github.com/opencontainers/selinux v1.10.2 h1:NFy2xCsjn7+WspbfZkUd5zyVeisV7VFbPSP96+8/ha4=
|
||||||
github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o=
|
github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o=
|
||||||
github.com/package-url/packageurl-go v0.1.1-0.20220428063043-89078438f170 h1:DiLBVp4DAcZlBVBEtJpNWZpZVq0AEeCY7Hqk8URVs4o=
|
github.com/package-url/packageurl-go v0.1.1-0.20220428063043-89078438f170 h1:DiLBVp4DAcZlBVBEtJpNWZpZVq0AEeCY7Hqk8URVs4o=
|
||||||
github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=
|
|
||||||
github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic=
|
|
||||||
github.com/pelletier/go-toml v1.9.5 h1:4yBQzkHv+7BHq2PQUZF3Mx0IYxG7LsP222s7Agd3ve8=
|
github.com/pelletier/go-toml v1.9.5 h1:4yBQzkHv+7BHq2PQUZF3Mx0IYxG7LsP222s7Agd3ve8=
|
||||||
github.com/pelletier/go-toml v1.9.5/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c=
|
github.com/pelletier/go-toml v1.9.5/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c=
|
||||||
github.com/pelletier/go-toml/v2 v2.0.5 h1:ipoSadvV8oGUjnUbMub59IDPPwfxF694nG/jwbMiyQg=
|
github.com/pelletier/go-toml/v2 v2.0.5 h1:ipoSadvV8oGUjnUbMub59IDPPwfxF694nG/jwbMiyQg=
|
||||||
github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU=
|
|
||||||
github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA=
|
github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA=
|
||||||
github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
|
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.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
|
||||||
@ -560,10 +464,7 @@ github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
|
|||||||
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
|
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
|
||||||
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
|
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
|
||||||
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
||||||
github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI=
|
|
||||||
github.com/pquerna/cachecontrol v0.0.0-20171018203845-0dec1b30a021/go.mod h1:prYjPmNq4d1NPVmpShWobRqXY3q7Vp+80DqgxxUrUIA=
|
|
||||||
github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=
|
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_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo=
|
github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo=
|
||||||
github.com/prometheus/client_golang v1.1.0/go.mod h1:I1FGZT9+L76gKKOs5djB6ezCbFQP1xR9D75/vuwEF3g=
|
github.com/prometheus/client_golang v1.1.0/go.mod h1:I1FGZT9+L76gKKOs5djB6ezCbFQP1xR9D75/vuwEF3g=
|
||||||
github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M=
|
github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M=
|
||||||
@ -577,8 +478,6 @@ github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:
|
|||||||
github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
|
github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
|
||||||
github.com/prometheus/client_model v0.3.0 h1:UBgGFHqYdG/TPFD1B1ogZywDqEkwp3fBMvqdiQ7Xew4=
|
github.com/prometheus/client_model v0.3.0 h1:UBgGFHqYdG/TPFD1B1ogZywDqEkwp3fBMvqdiQ7Xew4=
|
||||||
github.com/prometheus/client_model v0.3.0/go.mod h1:LDGWKZIo7rky3hgvBe+caln+Dr3dPggB5dvjtD7w9+w=
|
github.com/prometheus/client_model v0.3.0/go.mod h1:LDGWKZIo7rky3hgvBe+caln+Dr3dPggB5dvjtD7w9+w=
|
||||||
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/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=
|
github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=
|
||||||
github.com/prometheus/common v0.6.0/go.mod h1:eBmuwkDJBwy6iBfxCBob6t6dR6ENT/y+J+Zk0j9GMYc=
|
github.com/prometheus/common v0.6.0/go.mod h1:eBmuwkDJBwy6iBfxCBob6t6dR6ENT/y+J+Zk0j9GMYc=
|
||||||
github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo=
|
github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo=
|
||||||
@ -587,7 +486,6 @@ github.com/prometheus/common v0.32.1/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+
|
|||||||
github.com/prometheus/common v0.37.0 h1:ccBbHCgIiT9uSoFY0vX8H3zsNR5eLt17/RQLUvn8pXE=
|
github.com/prometheus/common v0.37.0 h1:ccBbHCgIiT9uSoFY0vX8H3zsNR5eLt17/RQLUvn8pXE=
|
||||||
github.com/prometheus/common v0.37.0/go.mod h1:phzohg0JFMnBEFGxTDbfu3QyL5GI8gTQJFhYO5B3mfA=
|
github.com/prometheus/common v0.37.0/go.mod h1:phzohg0JFMnBEFGxTDbfu3QyL5GI8gTQJFhYO5B3mfA=
|
||||||
github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
|
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/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=
|
github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=
|
||||||
github.com/prometheus/procfs v0.0.3/go.mod h1:4A/X28fw3Fc593LaREMrKMqOKvUAntwMDaekg4FpcdQ=
|
github.com/prometheus/procfs v0.0.3/go.mod h1:4A/X28fw3Fc593LaREMrKMqOKvUAntwMDaekg4FpcdQ=
|
||||||
github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU=
|
github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU=
|
||||||
@ -595,8 +493,6 @@ github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1
|
|||||||
github.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA=
|
github.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA=
|
||||||
github.com/prometheus/procfs v0.8.0 h1:ODq8ZFEaYeCaZOJlZZdJA2AbQR98dSHSM1KW/You5mo=
|
github.com/prometheus/procfs v0.8.0 h1:ODq8ZFEaYeCaZOJlZZdJA2AbQR98dSHSM1KW/You5mo=
|
||||||
github.com/prometheus/procfs v0.8.0/go.mod h1:z7EfXMXOkbkqb9IINtpCn86r/to3BnA0uaxHdg830/4=
|
github.com/prometheus/procfs v0.8.0/go.mod h1:z7EfXMXOkbkqb9IINtpCn86r/to3BnA0uaxHdg830/4=
|
||||||
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/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ=
|
github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ=
|
||||||
github.com/rogpeppe/go-charset v0.0.0-20180617210344-2471d30d28b4/go.mod h1:qgYeAmZ5ZIpBWTGllZSQnw97Dj+woV0toclVaRGI8pc=
|
github.com/rogpeppe/go-charset v0.0.0-20180617210344-2471d30d28b4/go.mod h1:qgYeAmZ5ZIpBWTGllZSQnw97Dj+woV0toclVaRGI8pc=
|
||||||
github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
|
github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
|
||||||
@ -605,8 +501,6 @@ github.com/rogpeppe/go-internal v1.8.1 h1:geMPLpDpQOgVyCg5z5GoRwLHepNdb71NXb67XF
|
|||||||
github.com/rogpeppe/go-internal v1.8.1/go.mod h1:JeRgkft04UBgHMgCIwADu4Pn6Mtm5d4nPKWu0nJ5d+o=
|
github.com/rogpeppe/go-internal v1.8.1/go.mod h1:JeRgkft04UBgHMgCIwADu4Pn6Mtm5d4nPKWu0nJ5d+o=
|
||||||
github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
|
github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
|
||||||
github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
|
github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
|
||||||
github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=
|
|
||||||
github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc=
|
|
||||||
github.com/seccomp/libseccomp-golang v0.9.2-0.20220502022130-f33da4d89646/go.mod h1:JA8cRccbGaA1s33RQf7Y1+q9gHmZX1yB/z9WDN1C6fg=
|
github.com/seccomp/libseccomp-golang v0.9.2-0.20220502022130-f33da4d89646/go.mod h1:JA8cRccbGaA1s33RQf7Y1+q9gHmZX1yB/z9WDN1C6fg=
|
||||||
github.com/secure-systems-lab/go-securesystemslib v0.4.0 h1:b23VGrQhTA8cN2CbBw7/FulN9fTtqYUdS5+Oxzt+DUE=
|
github.com/secure-systems-lab/go-securesystemslib v0.4.0 h1:b23VGrQhTA8cN2CbBw7/FulN9fTtqYUdS5+Oxzt+DUE=
|
||||||
github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo=
|
github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo=
|
||||||
@ -619,32 +513,19 @@ github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeV
|
|||||||
github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=
|
github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=
|
||||||
github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=
|
github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=
|
||||||
github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88=
|
github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88=
|
||||||
github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0=
|
|
||||||
github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0=
|
github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0=
|
||||||
github.com/sirupsen/logrus v1.9.0 h1:trlNQbNUG3OdDrDil03MCb1H2o9nJ1x4/5LYw7byDE0=
|
github.com/sirupsen/logrus v1.9.0 h1:trlNQbNUG3OdDrDil03MCb1H2o9nJ1x4/5LYw7byDE0=
|
||||||
github.com/sirupsen/logrus v1.9.0/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=
|
github.com/sirupsen/logrus v1.9.0/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=
|
||||||
github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=
|
|
||||||
github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=
|
|
||||||
github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM=
|
|
||||||
github.com/soheilhy/cmux v0.1.5/go.mod h1:T7TcVDs9LWfQgPlPsdngu6I6QIoyIFZDDC6sNE1GqG0=
|
|
||||||
github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA=
|
github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA=
|
||||||
github.com/spdx/tools-golang v0.3.1-0.20230104082527-d6f58551be3f h1:9B623Cfs+mclYK6dsae7gLSwuIBHvlgmEup87qpqsAQ=
|
github.com/spdx/tools-golang v0.3.1-0.20230104082527-d6f58551be3f h1:9B623Cfs+mclYK6dsae7gLSwuIBHvlgmEup87qpqsAQ=
|
||||||
github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ=
|
|
||||||
github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk=
|
|
||||||
github.com/spf13/afero v1.9.2 h1:j49Hj62F0n+DaZ1dDCvhABaPNSGNkt32oRFxI33IEMw=
|
github.com/spf13/afero v1.9.2 h1:j49Hj62F0n+DaZ1dDCvhABaPNSGNkt32oRFxI33IEMw=
|
||||||
github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE=
|
|
||||||
github.com/spf13/cast v1.5.0 h1:rj3WzYc11XZaIZMPKmwP96zkFEnnAmV8s6XbB2aY32w=
|
github.com/spf13/cast v1.5.0 h1:rj3WzYc11XZaIZMPKmwP96zkFEnnAmV8s6XbB2aY32w=
|
||||||
github.com/spf13/cobra v1.1.3/go.mod h1:pGADOWyqRD/YMrPZigI/zbliZ2wVD/23d+is3pSWzOo=
|
|
||||||
github.com/spf13/cobra v1.6.1 h1:o94oiPyS4KD1mPy2fmcYYHHfCxLqYjJOhGsCHFZtEzA=
|
github.com/spf13/cobra v1.6.1 h1:o94oiPyS4KD1mPy2fmcYYHHfCxLqYjJOhGsCHFZtEzA=
|
||||||
github.com/spf13/cobra v1.6.1/go.mod h1:IOw/AERYS7UzyrGinqmz6HLUo219MORXGxhbaJUqzrY=
|
github.com/spf13/cobra v1.6.1/go.mod h1:IOw/AERYS7UzyrGinqmz6HLUo219MORXGxhbaJUqzrY=
|
||||||
github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo=
|
|
||||||
github.com/spf13/jwalterweatherman v1.1.0 h1:ue6voC5bR5F8YxI5S67j9i582FU4Qvo2bmqnqMYADFk=
|
github.com/spf13/jwalterweatherman v1.1.0 h1:ue6voC5bR5F8YxI5S67j9i582FU4Qvo2bmqnqMYADFk=
|
||||||
github.com/spf13/pflag v0.0.0-20170130214245-9ff6c6923cff/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
|
|
||||||
github.com/spf13/pflag v1.0.2/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
|
github.com/spf13/pflag v1.0.2/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
|
||||||
github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
|
|
||||||
github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA=
|
github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA=
|
||||||
github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
|
github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
|
||||||
github.com/spf13/viper v1.7.0/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg=
|
|
||||||
github.com/spf13/viper v1.14.0 h1:Rg7d3Lo706X9tHsJMUjdiwMpHB7W8WnSVOssIY+JElU=
|
github.com/spf13/viper v1.14.0 h1:Rg7d3Lo706X9tHsJMUjdiwMpHB7W8WnSVOssIY+JElU=
|
||||||
github.com/spf13/viper v1.14.0/go.mod h1:WT//axPky3FdvXHzGw33dNdXXXfFQqmEalje+egj8As=
|
github.com/spf13/viper v1.14.0/go.mod h1:WT//axPky3FdvXHzGw33dNdXXXfFQqmEalje+egj8As=
|
||||||
github.com/stoewer/go-strcase v1.2.0/go.mod h1:IBiWB2sKIp3wVVQ3Y035++gc+knqhUQag1KpM8ahLw8=
|
github.com/stoewer/go-strcase v1.2.0/go.mod h1:IBiWB2sKIp3wVVQ3Y035++gc+knqhUQag1KpM8ahLw8=
|
||||||
@ -662,13 +543,10 @@ github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/
|
|||||||
github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
|
github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
|
||||||
github.com/stretchr/testify v1.8.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKsk=
|
github.com/stretchr/testify v1.8.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKsk=
|
||||||
github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
|
github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
|
||||||
github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw=
|
|
||||||
github.com/subosito/gotenv v1.4.1 h1:jyEFiXpy21Wm81FBN71l9VoMMV8H8jG+qIK3GCpY6Qs=
|
github.com/subosito/gotenv v1.4.1 h1:jyEFiXpy21Wm81FBN71l9VoMMV8H8jG+qIK3GCpY6Qs=
|
||||||
github.com/syndtr/gocapability v0.0.0-20200815063812-42c35b437635/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww=
|
github.com/syndtr/gocapability v0.0.0-20200815063812-42c35b437635/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww=
|
||||||
github.com/theupdateframework/notary v0.6.1 h1:7wshjstgS9x9F5LuB1L5mBI2xNMObWqjz+cjWoom6l0=
|
github.com/theupdateframework/notary v0.6.1 h1:7wshjstgS9x9F5LuB1L5mBI2xNMObWqjz+cjWoom6l0=
|
||||||
github.com/theupdateframework/notary v0.6.1/go.mod h1:MOfgIfmox8s7/7fduvB2xyPPMJCrjRLRizA8OFwpnKY=
|
github.com/theupdateframework/notary v0.6.1/go.mod h1:MOfgIfmox8s7/7fduvB2xyPPMJCrjRLRizA8OFwpnKY=
|
||||||
github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U=
|
|
||||||
github.com/tmc/grpc-websocket-proxy v0.0.0-20201229170055-e5319fda7802/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U=
|
|
||||||
github.com/tonistiigi/fsutil v0.0.0-20230105215944-fb433841cbfa h1:XOFp/3aBXlqmOFAg3r6e0qQjPnK5I970LilqX+Is1W8=
|
github.com/tonistiigi/fsutil v0.0.0-20230105215944-fb433841cbfa h1:XOFp/3aBXlqmOFAg3r6e0qQjPnK5I970LilqX+Is1W8=
|
||||||
github.com/tonistiigi/fsutil v0.0.0-20230105215944-fb433841cbfa/go.mod h1:AvLEd1LEIl64G2Jpgwo7aVV5lGH0ePcKl0ygGIHNYl8=
|
github.com/tonistiigi/fsutil v0.0.0-20230105215944-fb433841cbfa/go.mod h1:AvLEd1LEIl64G2Jpgwo7aVV5lGH0ePcKl0ygGIHNYl8=
|
||||||
github.com/tonistiigi/units v0.0.0-20180711220420-6950e57a87ea h1:SXhTLE6pb6eld/v/cCndK0AMpt1wiVFb/YYmqB3/QG0=
|
github.com/tonistiigi/units v0.0.0-20180711220420-6950e57a87ea h1:SXhTLE6pb6eld/v/cCndK0AMpt1wiVFb/YYmqB3/QG0=
|
||||||
@ -688,44 +566,28 @@ github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 h1:EzJWgHo
|
|||||||
github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ=
|
github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ=
|
||||||
github.com/xeipuuv/gojsonschema v1.2.0 h1:LhYJRs+L4fBtjZUfuSZIKGeVu0QRy8e5Xi7D17UxZ74=
|
github.com/xeipuuv/gojsonschema v1.2.0 h1:LhYJRs+L4fBtjZUfuSZIKGeVu0QRy8e5Xi7D17UxZ74=
|
||||||
github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y=
|
github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y=
|
||||||
github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU=
|
|
||||||
github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
|
github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
|
||||||
github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
|
github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
|
||||||
github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
|
github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
|
||||||
github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
|
github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
|
||||||
github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=
|
|
||||||
github.com/zclconf/go-cty v1.2.0/go.mod h1:hOPWgoHbaTUnI5k4D2ld+GRpFJSCe6bCM7m1q/N4PQ8=
|
github.com/zclconf/go-cty v1.2.0/go.mod h1:hOPWgoHbaTUnI5k4D2ld+GRpFJSCe6bCM7m1q/N4PQ8=
|
||||||
github.com/zclconf/go-cty v1.4.0/go.mod h1:nHzOclRkoj++EU9ZjSrZvRG0BXIWt8c7loYc0qXAFGQ=
|
github.com/zclconf/go-cty v1.4.0/go.mod h1:nHzOclRkoj++EU9ZjSrZvRG0BXIWt8c7loYc0qXAFGQ=
|
||||||
github.com/zclconf/go-cty v1.10.0 h1:mp9ZXQeIcN8kAwuqorjH+Q+njbJKjLrvB2yIh4q7U+0=
|
github.com/zclconf/go-cty v1.10.0 h1:mp9ZXQeIcN8kAwuqorjH+Q+njbJKjLrvB2yIh4q7U+0=
|
||||||
github.com/zclconf/go-cty v1.10.0/go.mod h1:vVKLxnk3puL4qRAv72AO+W99LUD4da90g3uUAzyuvAk=
|
github.com/zclconf/go-cty v1.10.0/go.mod h1:vVKLxnk3puL4qRAv72AO+W99LUD4da90g3uUAzyuvAk=
|
||||||
go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU=
|
|
||||||
go.etcd.io/bbolt v1.3.6/go.mod h1:qXsaaIqmgQH0T+OPdb99Bf+PKfBBQVAdyD6TY9G8XM4=
|
|
||||||
go.etcd.io/etcd/api/v3 v3.5.0/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs=
|
|
||||||
go.etcd.io/etcd/client/pkg/v3 v3.5.0/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g=
|
|
||||||
go.etcd.io/etcd/client/v2 v2.305.0/go.mod h1:h9puh54ZTgAKtEbut2oe9P4L/oqKCVB6xsXlzd7alYQ=
|
|
||||||
go.etcd.io/etcd/client/v3 v3.5.0/go.mod h1:AIKXXVX/DQXtfTEqBryiLTUXwON+GuvO6Z7lLS/oTh0=
|
|
||||||
go.etcd.io/etcd/pkg/v3 v3.5.0/go.mod h1:UzJGatBQ1lXChBkQF0AuAtkRQMYnHubxAEYIrC3MSsE=
|
|
||||||
go.etcd.io/etcd/raft/v3 v3.5.0/go.mod h1:UFOHSIvO/nKwd4lhkwabrTD3cqW5yVyYYf/KlD00Szc=
|
|
||||||
go.etcd.io/etcd/server/v3 v3.5.0/go.mod h1:3Ah5ruV+M+7RZr0+Y/5mNLwC+eQlni+mQmOVdCRJoS4=
|
|
||||||
go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU=
|
go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU=
|
||||||
go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8=
|
go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8=
|
||||||
go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
|
go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
|
||||||
go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
|
go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
|
||||||
go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
|
go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
|
||||||
go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0=
|
go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0=
|
||||||
go.opentelemetry.io/contrib v0.20.0/go.mod h1:G/EtFaa6qaN7+LxqfIAT3GiZa7Wv5DTBUzl5H4LY0Kc=
|
|
||||||
go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.20.0/go.mod h1:oVGt1LRbBOBq1A5BQLlUg9UaU/54aiHw8cgjV3aWZ/E=
|
|
||||||
go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.37.0 h1:+uFejS4DCfNH6d3xODVIGsdhzgzhh45p9gpbHQMbdZI=
|
go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.37.0 h1:+uFejS4DCfNH6d3xODVIGsdhzgzhh45p9gpbHQMbdZI=
|
||||||
go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.37.0/go.mod h1:HSmzQvagH8pS2/xrK7ScWsk0vAMtRTGbMFgInXCi8Tc=
|
go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.37.0/go.mod h1:HSmzQvagH8pS2/xrK7ScWsk0vAMtRTGbMFgInXCi8Tc=
|
||||||
go.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace v0.37.0 h1:H0wsFGpY3uD/zB/5UubZgkgnd378/ogV9BH2itqEFbc=
|
go.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace v0.37.0 h1:H0wsFGpY3uD/zB/5UubZgkgnd378/ogV9BH2itqEFbc=
|
||||||
go.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace v0.37.0/go.mod h1:xXATK4LOREcHuSE4sWsK1VO7FUxa6L58rAORHFTdhAI=
|
go.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace v0.37.0/go.mod h1:xXATK4LOREcHuSE4sWsK1VO7FUxa6L58rAORHFTdhAI=
|
||||||
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.20.0/go.mod h1:2AboqHi0CiIZU0qwhtUfCYD1GeUzvvIXWNkhDt7ZMG4=
|
|
||||||
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.37.0 h1:yt2NKzK7Vyo6h0+X8BA4FpreZQTlVEIarnsBP/H5mzs=
|
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.37.0 h1:yt2NKzK7Vyo6h0+X8BA4FpreZQTlVEIarnsBP/H5mzs=
|
||||||
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.37.0/go.mod h1:+ARmXlUlc51J7sZeCBkBJNdHGySrdOzgzxp6VWRWM1U=
|
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.37.0/go.mod h1:+ARmXlUlc51J7sZeCBkBJNdHGySrdOzgzxp6VWRWM1U=
|
||||||
go.opentelemetry.io/otel v0.20.0/go.mod h1:Y3ugLH2oa81t5QO+Lty+zXf8zC9L26ax4Nzoxm/dooo=
|
|
||||||
go.opentelemetry.io/otel v1.11.2 h1:YBZcQlsVekzFsFbjygXMOXSs6pialIZxcjfO/mBDmR0=
|
go.opentelemetry.io/otel v1.11.2 h1:YBZcQlsVekzFsFbjygXMOXSs6pialIZxcjfO/mBDmR0=
|
||||||
go.opentelemetry.io/otel v1.11.2/go.mod h1:7p4EUV+AqgdlNV9gL97IgUZiVR3yrFXYo53f9BM3tRI=
|
go.opentelemetry.io/otel v1.11.2/go.mod h1:7p4EUV+AqgdlNV9gL97IgUZiVR3yrFXYo53f9BM3tRI=
|
||||||
go.opentelemetry.io/otel/exporters/otlp v0.20.0/go.mod h1:YIieizyaN77rtLJra0buKiNBOm9XQfkPEKBeuhoMwAM=
|
|
||||||
go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.11.2 h1:htgM8vZIF8oPSCxa341e3IZ4yr/sKxgu8KZYllByiVY=
|
go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.11.2 h1:htgM8vZIF8oPSCxa341e3IZ4yr/sKxgu8KZYllByiVY=
|
||||||
go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.11.2/go.mod h1:rqbht/LlhVBgn5+k3M5QK96K5Xb0DvXpMJ5SFQpY6uw=
|
go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.11.2/go.mod h1:rqbht/LlhVBgn5+k3M5QK96K5Xb0DvXpMJ5SFQpY6uw=
|
||||||
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.11.2 h1:fqR1kli93643au1RKo0Uma3d2aPQKT+WBKfTSBaKbOc=
|
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.11.2 h1:fqR1kli93643au1RKo0Uma3d2aPQKT+WBKfTSBaKbOc=
|
||||||
@ -734,31 +596,20 @@ go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.11.2 h1:ERwKP
|
|||||||
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.11.2/go.mod h1:jWZUM2MWhWCJ9J9xVbRx7tzK1mXKpAlze4CeulycwVY=
|
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.11.2/go.mod h1:jWZUM2MWhWCJ9J9xVbRx7tzK1mXKpAlze4CeulycwVY=
|
||||||
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.11.2 h1:Us8tbCmuN16zAnK5TC69AtODLycKbwnskQzaB6DfFhc=
|
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.11.2 h1:Us8tbCmuN16zAnK5TC69AtODLycKbwnskQzaB6DfFhc=
|
||||||
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.11.2/go.mod h1:GZWSQQky8AgdJj50r1KJm8oiQiIPaAX7uZCFQX9GzC8=
|
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.11.2/go.mod h1:GZWSQQky8AgdJj50r1KJm8oiQiIPaAX7uZCFQX9GzC8=
|
||||||
go.opentelemetry.io/otel/metric v0.20.0/go.mod h1:598I5tYlH1vzBjn+BTuhzTCSb/9debfNp6R3s7Pr1eU=
|
|
||||||
go.opentelemetry.io/otel/metric v0.34.0 h1:MCPoQxcg/26EuuJwpYN1mZTeCYAUGx8ABxfW07YkjP8=
|
go.opentelemetry.io/otel/metric v0.34.0 h1:MCPoQxcg/26EuuJwpYN1mZTeCYAUGx8ABxfW07YkjP8=
|
||||||
go.opentelemetry.io/otel/metric v0.34.0/go.mod h1:ZFuI4yQGNCupurTXCwkeD/zHBt+C2bR7bw5JqUm/AP8=
|
go.opentelemetry.io/otel/metric v0.34.0/go.mod h1:ZFuI4yQGNCupurTXCwkeD/zHBt+C2bR7bw5JqUm/AP8=
|
||||||
go.opentelemetry.io/otel/oteltest v0.20.0/go.mod h1:L7bgKf9ZB7qCwT9Up7i9/pn0PWIa9FqQ2IQ8LoxiGnw=
|
|
||||||
go.opentelemetry.io/otel/sdk v0.20.0/go.mod h1:g/IcepuwNsoiX5Byy2nNV0ySUF1em498m7hBWC279Yc=
|
|
||||||
go.opentelemetry.io/otel/sdk v1.11.2 h1:GF4JoaEx7iihdMFu30sOyRx52HDHOkl9xQ8SMqNXUiU=
|
go.opentelemetry.io/otel/sdk v1.11.2 h1:GF4JoaEx7iihdMFu30sOyRx52HDHOkl9xQ8SMqNXUiU=
|
||||||
go.opentelemetry.io/otel/sdk v1.11.2/go.mod h1:wZ1WxImwpq+lVRo4vsmSOxdd+xwoUJ6rqyLc3SyX9aU=
|
go.opentelemetry.io/otel/sdk v1.11.2/go.mod h1:wZ1WxImwpq+lVRo4vsmSOxdd+xwoUJ6rqyLc3SyX9aU=
|
||||||
go.opentelemetry.io/otel/sdk/export/metric v0.20.0/go.mod h1:h7RBNMsDJ5pmI1zExLi+bJK+Dr8NQCh0qGhm1KDnNlE=
|
|
||||||
go.opentelemetry.io/otel/sdk/metric v0.20.0/go.mod h1:knxiS8Xd4E/N+ZqKmUPf3gTTZ4/0TjTXukfxjzSTpHE=
|
|
||||||
go.opentelemetry.io/otel/trace v0.20.0/go.mod h1:6GjCW8zgDjwGHGa6GkyeB8+/5vjT16gUEi0Nf1iBdgw=
|
|
||||||
go.opentelemetry.io/otel/trace v1.11.2 h1:Xf7hWSF2Glv0DE3MH7fBHvtpSBsjcBUe5MYAmZM/+y0=
|
go.opentelemetry.io/otel/trace v1.11.2 h1:Xf7hWSF2Glv0DE3MH7fBHvtpSBsjcBUe5MYAmZM/+y0=
|
||||||
go.opentelemetry.io/otel/trace v1.11.2/go.mod h1:4N+yC7QEz7TTsG9BSRLNAa63eg5E06ObSbKPmxQ/pKA=
|
go.opentelemetry.io/otel/trace v1.11.2/go.mod h1:4N+yC7QEz7TTsG9BSRLNAa63eg5E06ObSbKPmxQ/pKA=
|
||||||
go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI=
|
go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI=
|
||||||
go.opentelemetry.io/proto/otlp v0.19.0 h1:IVN6GR+mhC4s5yfcTbmzHYODqvWAp3ZedA2SJPI1Nnw=
|
go.opentelemetry.io/proto/otlp v0.19.0 h1:IVN6GR+mhC4s5yfcTbmzHYODqvWAp3ZedA2SJPI1Nnw=
|
||||||
go.opentelemetry.io/proto/otlp v0.19.0/go.mod h1:H7XAot3MsfNsj7EXtrA2q5xSNQ10UqI405h3+duxN4U=
|
go.opentelemetry.io/proto/otlp v0.19.0/go.mod h1:H7XAot3MsfNsj7EXtrA2q5xSNQ10UqI405h3+duxN4U=
|
||||||
go.uber.org/atomic v1.4.0/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.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc=
|
|
||||||
go.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A=
|
|
||||||
go.uber.org/goleak v1.2.0 h1:xqgm/S+aQvhWFTtR0XK3Jvg7z8kGV8P4X14IzwN3Eqk=
|
go.uber.org/goleak v1.2.0 h1:xqgm/S+aQvhWFTtR0XK3Jvg7z8kGV8P4X14IzwN3Eqk=
|
||||||
go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0=
|
go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0=
|
||||||
go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU=
|
|
||||||
go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q=
|
go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q=
|
||||||
go.uber.org/zap v1.17.0/go.mod h1:MXVU+bhUf/A7Xi2HNOnopQOrmycQ5Ih87HtOu4q5SSo=
|
|
||||||
golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
|
golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
|
||||||
golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
|
|
||||||
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
|
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
|
||||||
golang.org/x/crypto v0.0.0-20190426145343-a29dc8fdc734/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
golang.org/x/crypto v0.0.0-20190426145343-a29dc8fdc734/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
||||||
golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
||||||
@ -766,8 +617,6 @@ golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8U
|
|||||||
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
||||||
golang.org/x/crypto v0.0.0-20200422194213-44a606286825/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
|
golang.org/x/crypto v0.0.0-20200422194213-44a606286825/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
|
||||||
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
|
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
|
||||||
golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
|
|
||||||
golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I=
|
|
||||||
golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/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-20211215153901-e495a2d5b3d3/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
|
golang.org/x/crypto v0.0.0-20211215153901-e495a2d5b3d3/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
|
||||||
golang.org/x/crypto v0.2.0 h1:BRXPfhNivWL5Yq0BGQ39a2sW6t44aODpfxkWjYdzewE=
|
golang.org/x/crypto v0.2.0 h1:BRXPfhNivWL5Yq0BGQ39a2sW6t44aODpfxkWjYdzewE=
|
||||||
@ -794,7 +643,6 @@ golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHl
|
|||||||
golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs=
|
golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs=
|
||||||
golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=
|
golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=
|
||||||
golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=
|
golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=
|
||||||
golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=
|
|
||||||
golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE=
|
golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE=
|
||||||
golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o=
|
golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o=
|
||||||
golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=
|
golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=
|
||||||
@ -803,17 +651,12 @@ golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzB
|
|||||||
golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=
|
golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=
|
||||||
golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
|
golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
|
||||||
golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
|
golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
|
||||||
golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
|
|
||||||
golang.org/x/mod v0.6.0 h1:b9gGHsz9/HhJ3HF5DHQytPpuwocVTChQJK3AvoLRD5I=
|
golang.org/x/mod v0.6.0 h1:b9gGHsz9/HhJ3HF5DHQytPpuwocVTChQJK3AvoLRD5I=
|
||||||
golang.org/x/mod v0.6.0/go.mod h1:4mET923SAdbXp2ki8ey+zGs1SLqsuM2Y0uvdZR/fUNI=
|
golang.org/x/mod v0.6.0/go.mod h1:4mET923SAdbXp2ki8ey+zGs1SLqsuM2Y0uvdZR/fUNI=
|
||||||
golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||||
golang.org/x/net v0.0.0-20180811021610-c39426892332/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
golang.org/x/net v0.0.0-20180811021610-c39426892332/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||||
golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||||
golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
|
||||||
golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/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-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||||
golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/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-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||||
golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||||
golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
||||||
@ -836,17 +679,14 @@ golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/
|
|||||||
golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
|
golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
|
||||||
golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
|
golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
|
||||||
golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
|
golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
|
||||||
golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
|
|
||||||
golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
|
golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
|
||||||
golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
|
golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
|
||||||
golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
|
golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
|
||||||
golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
|
golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
|
||||||
golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
|
golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
|
||||||
golang.org/x/net v0.0.0-20201202161906-c7110b5ffcbb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
|
|
||||||
golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
|
golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
|
||||||
golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
|
golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
|
||||||
golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=
|
golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=
|
||||||
golang.org/x/net v0.0.0-20210520170846-37e1c6afe023/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
|
|
||||||
golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
|
golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
|
||||||
golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
|
golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
|
||||||
golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
|
golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
|
||||||
@ -873,15 +713,10 @@ golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJ
|
|||||||
golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
|
||||||
golang.org/x/sync v0.1.0 h1:wsuoTGHzEhffawBOhz5CYhcrV4IdKZbEyZjBMuTp12o=
|
golang.org/x/sync v0.1.0 h1:wsuoTGHzEhffawBOhz5CYhcrV4IdKZbEyZjBMuTp12o=
|
||||||
golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
|
||||||
golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
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-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||||
golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
|
||||||
golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/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/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||||
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||||
golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
@ -895,12 +730,9 @@ golang.org/x/sys v0.0.0-20190606203320-7fc4e5ec1444/go.mod h1:h1NjWce9XRLGQEsW7w
|
|||||||
golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20190801041406-cbf593c0f2f3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20190801041406-cbf593c0f2f3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
|
||||||
golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
|
||||||
golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20191115151921-52ab43148777/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20191115151921-52ab43148777/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
|
||||||
golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
@ -915,18 +747,14 @@ golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7w
|
|||||||
golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
|
||||||
golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20200831180312-196b9ba8737a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
|
||||||
golang.org/x/sys v0.0.0-20200923182605-d9f96fdee20d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
|
||||||
golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
|
||||||
golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
@ -941,9 +769,7 @@ golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBc
|
|||||||
golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
golang.org/x/sys v0.5.0 h1:MUK/U/4lj1t1oPg0HfuXDN/Z1wv31ZJ/YcPiGccS4DU=
|
golang.org/x/sys v0.5.0 h1:MUK/U/4lj1t1oPg0HfuXDN/Z1wv31ZJ/YcPiGccS4DU=
|
||||||
golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw=
|
|
||||||
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
|
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
|
||||||
golang.org/x/term v0.0.0-20210220032956-6a3ed077a48d/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
|
|
||||||
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
|
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
|
||||||
golang.org/x/term v0.5.0 h1:n2a8QNdAb0sZNpU9R1ALUXBbY+w51fCQDN+7EdxNBsY=
|
golang.org/x/term v0.5.0 h1:n2a8QNdAb0sZNpU9R1ALUXBbY+w51fCQDN+7EdxNBsY=
|
||||||
golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=
|
golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=
|
||||||
@ -960,31 +786,23 @@ golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
|
|||||||
golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
||||||
golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
||||||
golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
||||||
golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
|
||||||
golang.org/x/time v0.0.0-20210723032227-1f47c861a9ac/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
|
||||||
golang.org/x/time v0.1.0 h1:xYY+Bajn2a7VBmTM5GikTmnK8ZuX8YgnQCqZpbBNtmA=
|
golang.org/x/time v0.1.0 h1:xYY+Bajn2a7VBmTM5GikTmnK8ZuX8YgnQCqZpbBNtmA=
|
||||||
golang.org/x/time v0.1.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
golang.org/x/time v0.1.0/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-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
||||||
golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/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-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
||||||
golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=
|
golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=
|
||||||
golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
|
golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
|
||||||
golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
|
golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
|
||||||
golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
|
golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
|
||||||
golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
|
|
||||||
golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
|
golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
|
||||||
golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
|
golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
|
||||||
golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
|
golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
|
||||||
golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
|
golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
|
||||||
golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
|
golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
|
||||||
golang.org/x/tools v0.0.0-20190624222133-a101b041ded4/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
|
|
||||||
golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
|
golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
|
||||||
golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
|
golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
|
||||||
golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
|
golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
|
||||||
golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
|
golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
|
||||||
golang.org/x/tools v0.0.0-20191108193012-7d206e10da11/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
|
|
||||||
golang.org/x/tools v0.0.0-20191112195655-aa38f8e97acc/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
|
|
||||||
golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
|
golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
|
||||||
golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
|
golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/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-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
|
||||||
@ -1012,7 +830,6 @@ golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc
|
|||||||
golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
|
golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
|
||||||
golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
|
golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
|
||||||
golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
|
golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
|
||||||
golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
|
|
||||||
golang.org/x/tools v0.2.0 h1:G6AHpWxTMGY1KyEYoAQ5WTtIekUUvDNjan3ugu60JvE=
|
golang.org/x/tools v0.2.0 h1:G6AHpWxTMGY1KyEYoAQ5WTtIekUUvDNjan3ugu60JvE=
|
||||||
golang.org/x/tools v0.2.0/go.mod h1:y4OqIKeOV/fWJetJ8bXPU1sEVniLMIyDAZWeHdV+NTA=
|
golang.org/x/tools v0.2.0/go.mod h1:y4OqIKeOV/fWJetJ8bXPU1sEVniLMIyDAZWeHdV+NTA=
|
||||||
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||||
@ -1075,7 +892,6 @@ google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6D
|
|||||||
google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
|
google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
|
||||||
google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
|
google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
|
||||||
google.golang.org/genproto v0.0.0-20201019141844-1ed22bb0c154/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
|
google.golang.org/genproto v0.0.0-20201019141844-1ed22bb0c154/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
|
||||||
google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0=
|
|
||||||
google.golang.org/genproto v0.0.0-20211118181313-81c1377c94b1/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc=
|
google.golang.org/genproto v0.0.0-20211118181313-81c1377c94b1/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc=
|
||||||
google.golang.org/genproto v0.0.0-20221206210731-b1a01be3a5f6 h1:AGXp12e/9rItf6/4QymU7WsAUwCf+ICW75cuR91nJIc=
|
google.golang.org/genproto v0.0.0-20221206210731-b1a01be3a5f6 h1:AGXp12e/9rItf6/4QymU7WsAUwCf+ICW75cuR91nJIc=
|
||||||
google.golang.org/genproto v0.0.0-20221206210731-b1a01be3a5f6/go.mod h1:1dOng4TWOomJrDGhpXjfCD35wQC6jnC7HpRmOFRqEV0=
|
google.golang.org/genproto v0.0.0-20221206210731-b1a01be3a5f6/go.mod h1:1dOng4TWOomJrDGhpXjfCD35wQC6jnC7HpRmOFRqEV0=
|
||||||
@ -1093,8 +909,6 @@ google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM
|
|||||||
google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=
|
google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=
|
||||||
google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0=
|
google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0=
|
||||||
google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=
|
google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=
|
||||||
google.golang.org/grpc v1.37.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM=
|
|
||||||
google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM=
|
|
||||||
google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34=
|
google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34=
|
||||||
google.golang.org/grpc v1.42.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU=
|
google.golang.org/grpc v1.42.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU=
|
||||||
google.golang.org/grpc v1.51.0 h1:E1eGv1FTqoLIdnBCZufiSHgKjlqG6fKFf6pPWtMTh8U=
|
google.golang.org/grpc v1.51.0 h1:E1eGv1FTqoLIdnBCZufiSHgKjlqG6fKFf6pPWtMTh8U=
|
||||||
@ -1126,18 +940,11 @@ gopkg.in/dancannon/gorethink.v3 v3.0.5/go.mod h1:GXsi1e3N2OcKhcP6nsYABTiUejbWMFO
|
|||||||
gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=
|
gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=
|
||||||
gopkg.in/fatih/pool.v2 v2.0.0 h1:xIFeWtxifuQJGk/IEPKsTduEKcKvPmhoiVDGpC40nKg=
|
gopkg.in/fatih/pool.v2 v2.0.0 h1:xIFeWtxifuQJGk/IEPKsTduEKcKvPmhoiVDGpC40nKg=
|
||||||
gopkg.in/fatih/pool.v2 v2.0.0/go.mod h1:8xVGeu1/2jr2wm5V9SPuMht2H5AEmf5aFMGSQixtjTY=
|
gopkg.in/fatih/pool.v2 v2.0.0/go.mod h1:8xVGeu1/2jr2wm5V9SPuMht2H5AEmf5aFMGSQixtjTY=
|
||||||
gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys=
|
|
||||||
gopkg.in/gorethink/gorethink.v3 v3.0.5 h1:e2Uc/Xe+hpcVQFsj6MuHlYog3r0JYpnTzwDj/y2O4MU=
|
gopkg.in/gorethink/gorethink.v3 v3.0.5 h1:e2Uc/Xe+hpcVQFsj6MuHlYog3r0JYpnTzwDj/y2O4MU=
|
||||||
gopkg.in/gorethink/gorethink.v3 v3.0.5/go.mod h1:+3yIIHJUGMBK+wyPH+iN5TP+88ikFDfZdqTlK3Y9q8I=
|
gopkg.in/gorethink/gorethink.v3 v3.0.5/go.mod h1:+3yIIHJUGMBK+wyPH+iN5TP+88ikFDfZdqTlK3Y9q8I=
|
||||||
gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc=
|
gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc=
|
||||||
gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw=
|
gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw=
|
||||||
gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=
|
|
||||||
gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA=
|
gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA=
|
||||||
gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k=
|
|
||||||
gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo=
|
|
||||||
gopkg.in/square/go-jose.v2 v2.2.2/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI=
|
|
||||||
gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw=
|
|
||||||
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.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.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
||||||
gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
||||||
@ -1149,12 +956,9 @@ gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=
|
|||||||
gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
|
gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
|
||||||
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
||||||
gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
||||||
gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
|
||||||
gopkg.in/yaml.v3 v3.0.0/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
gopkg.in/yaml.v3 v3.0.0/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
||||||
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
|
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
|
||||||
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
||||||
gotest.tools/v3 v3.0.2/go.mod h1:3SzNCllyD9/Y+b5r9JIKQ474KzkZyqLqEfYqMsX94Bk=
|
|
||||||
gotest.tools/v3 v3.0.3/go.mod h1:Z7Lb0S5l+klDB31fvDQX8ss/FlKDxtlFlw3Oa8Ymbl8=
|
|
||||||
gotest.tools/v3 v3.4.0 h1:ZazjZUfuVeZGLAmlKKuyv3IKP5orXcwtOwDQH6YVr6o=
|
gotest.tools/v3 v3.4.0 h1:ZazjZUfuVeZGLAmlKKuyv3IKP5orXcwtOwDQH6YVr6o=
|
||||||
honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
|
honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
|
||||||
honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
|
honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
|
||||||
@ -1163,32 +967,26 @@ honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWh
|
|||||||
honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg=
|
honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg=
|
||||||
honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=
|
honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=
|
||||||
honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=
|
honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=
|
||||||
k8s.io/api v0.22.4 h1:UvyHW0ezB2oIgHAxlYoo6UJQObYXU7awuNarwoHEOjw=
|
k8s.io/api v0.25.4 h1:3YO8J4RtmG7elEgaWMb4HgmpS2CfY1QlaOz9nwB+ZSs=
|
||||||
k8s.io/api v0.22.4/go.mod h1:Rgs+9gIGYC5laXQSZZ9JqT5NevNgoGiOdVWi1BAB3qk=
|
k8s.io/api v0.25.4/go.mod h1:IG2+RzyPQLllQxnhzD8KQNEu4c4YvyDTpSMztf4A0OQ=
|
||||||
k8s.io/apimachinery v0.22.4 h1:9uwcvPpukBw/Ri0EUmWz+49cnFtaoiyEhQTK+xOe7Ck=
|
k8s.io/apimachinery v0.25.4 h1:CtXsuaitMESSu339tfhVXhQrPET+EiWnIY1rcurKnAc=
|
||||||
k8s.io/apimachinery v0.22.4/go.mod h1:yU6oA6Gnax9RrxGzVvPFFJ+mpnW6PBSqp0sx0I0HHW0=
|
k8s.io/apimachinery v0.25.4/go.mod h1:jaF9C/iPNM1FuLl7Zuy5b9v+n35HGSh6AQ4HYRkCqwo=
|
||||||
k8s.io/apiserver v0.22.4 h1:L+220cy+94UWmyBl1kiVTklBXrBtKsbjlPV60eL2u6s=
|
k8s.io/apiserver v0.25.4 h1:/3TwZcgLqX7wUxq7TtXOUqXeBTwXIblVMQdhR5XZ7yo=
|
||||||
k8s.io/apiserver v0.22.4/go.mod h1:38WmcUZiiy41A7Aty8/VorWRa8vDGqoUzDf2XYlku0E=
|
k8s.io/apiserver v0.25.4/go.mod h1:rPcm567XxjOnnd7jedDUnGJGmDGAo+cT6H7QHAN+xV0=
|
||||||
k8s.io/client-go v0.22.4 h1:aAQ1Wk+I3bjCNk35YWUqbaueqrIonkfDPJSPDDe8Kfg=
|
k8s.io/client-go v0.25.4 h1:3RNRDffAkNU56M/a7gUfXaEzdhZlYhoW8dgViGy5fn8=
|
||||||
k8s.io/client-go v0.22.4/go.mod h1:Yzw4e5e7h1LNHA4uqnMVrpEpUs1hJOiuBsJKIlRCHDA=
|
k8s.io/client-go v0.25.4/go.mod h1:8trHCAC83XKY0wsBIpbirZU4NTUpbuhc2JnI7OruGZw=
|
||||||
k8s.io/component-base v0.22.4/go.mod h1:MrSaQy4a3tFVViff8TZL6JHYSewNCLshZCwHYM58v5A=
|
|
||||||
k8s.io/gengo v0.0.0-20200413195148-3a45101e95ac/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0=
|
|
||||||
k8s.io/klog/v2 v2.0.0/go.mod h1:PBfzABfn139FHAV07az/IF9Wp1bkk3vpT2XSJ76fSDE=
|
|
||||||
k8s.io/klog/v2 v2.9.0/go.mod h1:hy9LJ/NvuK+iVyP4Ehqva4HxZG/oXyIS3n3Jmire4Ec=
|
|
||||||
k8s.io/klog/v2 v2.80.1 h1:atnLQ121W371wYYFawwYx1aEY2eUfs4l3J72wtgAwV4=
|
k8s.io/klog/v2 v2.80.1 h1:atnLQ121W371wYYFawwYx1aEY2eUfs4l3J72wtgAwV4=
|
||||||
k8s.io/klog/v2 v2.80.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0=
|
k8s.io/klog/v2 v2.80.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0=
|
||||||
k8s.io/kube-openapi v0.0.0-20211109043538-20434351676c/go.mod h1:vHXdDvt9+2spS2Rx9ql3I8tycm3H9FDfdUoIuKCefvw=
|
k8s.io/kube-openapi v0.0.0-20220803162953-67bda5d908f1 h1:MQ8BAZPZlWk3S9K4a9NCkIFQtZShWqoha7snGixVgEA=
|
||||||
k8s.io/utils v0.0.0-20210819203725-bdf08cb9a70a/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA=
|
k8s.io/kube-openapi v0.0.0-20220803162953-67bda5d908f1/go.mod h1:C/N6wCaBHeBHkHUesQOQy2/MZqGgMAFPqGsGQLdbZBU=
|
||||||
k8s.io/utils v0.0.0-20221108210102-8e77b1f39fe2 h1:GfD9OzL11kvZN5iArC6oTS7RTj7oJOIfnislxYlqTj8=
|
k8s.io/utils v0.0.0-20221108210102-8e77b1f39fe2 h1:GfD9OzL11kvZN5iArC6oTS7RTj7oJOIfnislxYlqTj8=
|
||||||
k8s.io/utils v0.0.0-20221108210102-8e77b1f39fe2/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0=
|
k8s.io/utils v0.0.0-20221108210102-8e77b1f39fe2/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0=
|
||||||
rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8=
|
rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8=
|
||||||
rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0=
|
rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0=
|
||||||
rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA=
|
rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA=
|
||||||
sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.22/go.mod h1:LEScyzhFmoF5pso/YSeBstl57mOzx9xlU9n85RGrDQg=
|
sigs.k8s.io/json v0.0.0-20220713155537-f223a00ba0e2 h1:iXTIw73aPyC+oRdyqqvVJuloN1p0AC/kzH07hu3NE+k=
|
||||||
sigs.k8s.io/structured-merge-diff/v4 v4.0.2/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw=
|
sigs.k8s.io/json v0.0.0-20220713155537-f223a00ba0e2/go.mod h1:B8JuhiUyNFVKdsE8h686QcCxMaH6HrOAZj4vswFpcB0=
|
||||||
sigs.k8s.io/structured-merge-diff/v4 v4.1.2/go.mod h1:j/nl6xW8vLS49O8YvXW1ocPhZawJtm+Yrr7PPRQ0Vg4=
|
|
||||||
sigs.k8s.io/structured-merge-diff/v4 v4.2.3 h1:PRbqxJClWWYMNV1dhaG4NsibJbArud9kFxnAMREiWFE=
|
sigs.k8s.io/structured-merge-diff/v4 v4.2.3 h1:PRbqxJClWWYMNV1dhaG4NsibJbArud9kFxnAMREiWFE=
|
||||||
sigs.k8s.io/structured-merge-diff/v4 v4.2.3/go.mod h1:qjx8mGObPmV2aSZepjQjbmb2ihdVs8cGKBraizNC69E=
|
sigs.k8s.io/structured-merge-diff/v4 v4.2.3/go.mod h1:qjx8mGObPmV2aSZepjQjbmb2ihdVs8cGKBraizNC69E=
|
||||||
sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc=
|
|
||||||
sigs.k8s.io/yaml v1.3.0 h1:a2VclLzOGrwOHDiV8EfBGhvjHvP46CtW5j6POvhYGGo=
|
sigs.k8s.io/yaml v1.3.0 h1:a2VclLzOGrwOHDiV8EfBGhvjHvP46CtW5j6POvhYGGo=
|
||||||
sigs.k8s.io/yaml v1.3.0/go.mod h1:GeOyir5tyXNByN85N/dRIT9es5UQNerPYEKK56eTBm8=
|
sigs.k8s.io/yaml v1.3.0/go.mod h1:GeOyir5tyXNByN85N/dRIT9es5UQNerPYEKK56eTBm8=
|
||||||
|
8
vendor/github.com/Azure/go-autorest/autorest/adal/README.md
generated
vendored
8
vendor/github.com/Azure/go-autorest/autorest/adal/README.md
generated
vendored
@ -1,3 +1,5 @@
|
|||||||
|
# NOTE: This module will go out of support by March 31, 2023. For authenticating with Azure AD, use module [azidentity](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/azidentity) instead. For help migrating from `adal` to `azidentiy` please consult the [migration guide](https://aka.ms/azsdk/go/identity/migration). General information about the retirement of this and other legacy modules can be found [here](https://azure.microsoft.com/updates/support-for-azure-sdk-libraries-that-do-not-conform-to-our-current-azure-sdk-guidelines-will-be-retired-as-of-31-march-2023/).
|
||||||
|
|
||||||
# Azure Active Directory authentication for Go
|
# Azure Active Directory authentication for Go
|
||||||
|
|
||||||
This is a standalone package for authenticating with Azure Active
|
This is a standalone package for authenticating with Azure Active
|
||||||
@ -18,7 +20,7 @@ go get -u github.com/Azure/go-autorest/autorest/adal
|
|||||||
|
|
||||||
## Usage
|
## Usage
|
||||||
|
|
||||||
An Active Directory application is required in order to use this library. An application can be registered in the [Azure Portal](https://portal.azure.com/) by following these [guidelines](https://docs.microsoft.com/en-us/azure/active-directory/develop/active-directory-integrating-applications) or using the [Azure CLI](https://github.com/Azure/azure-cli).
|
An Active Directory application is required in order to use this library. An application can be registered in the [Azure Portal](https://portal.azure.com/) by following these [guidelines](https://docs.microsoft.com/azure/active-directory/develop/active-directory-integrating-applications) or using the [Azure CLI](https://github.com/Azure/azure-cli).
|
||||||
|
|
||||||
### Register an Azure AD Application with secret
|
### Register an Azure AD Application with secret
|
||||||
|
|
||||||
@ -88,7 +90,7 @@ An Active Directory application is required in order to use this library. An app
|
|||||||
### Grant the necessary permissions
|
### Grant the necessary permissions
|
||||||
|
|
||||||
Azure relies on a Role-Based Access Control (RBAC) model to manage the access to resources at a fine-grained
|
Azure relies on a Role-Based Access Control (RBAC) model to manage the access to resources at a fine-grained
|
||||||
level. There is a set of [pre-defined roles](https://docs.microsoft.com/en-us/azure/active-directory/role-based-access-built-in-roles)
|
level. There is a set of [pre-defined roles](https://docs.microsoft.com/azure/active-directory/role-based-access-built-in-roles)
|
||||||
which can be assigned to a service principal of an Azure AD application depending of your needs.
|
which can be assigned to a service principal of an Azure AD application depending of your needs.
|
||||||
|
|
||||||
```
|
```
|
||||||
@ -104,7 +106,7 @@ It is also possible to define custom role definitions.
|
|||||||
az role definition create --role-definition role-definition.json
|
az role definition create --role-definition role-definition.json
|
||||||
```
|
```
|
||||||
|
|
||||||
* Check [custom roles](https://docs.microsoft.com/en-us/azure/active-directory/role-based-access-control-custom-roles) for more details regarding the content of `role-definition.json` file.
|
* Check [custom roles](https://docs.microsoft.com/azure/active-directory/role-based-access-control-custom-roles) for more details regarding the content of `role-definition.json` file.
|
||||||
|
|
||||||
|
|
||||||
### Acquire Access Token
|
### Acquire Access Token
|
||||||
|
92
vendor/github.com/Azure/go-autorest/autorest/adal/token.go
generated
vendored
92
vendor/github.com/Azure/go-autorest/autorest/adal/token.go
generated
vendored
@ -365,6 +365,25 @@ func (secret ServicePrincipalAuthorizationCodeSecret) MarshalJSON() ([]byte, err
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ServicePrincipalFederatedSecret implements ServicePrincipalSecret for Federated JWTs.
|
||||||
|
type ServicePrincipalFederatedSecret struct {
|
||||||
|
jwt string
|
||||||
|
}
|
||||||
|
|
||||||
|
// SetAuthenticationValues is a method of the interface ServicePrincipalSecret.
|
||||||
|
// It will populate the form submitted during OAuth Token Acquisition using a JWT signed by an OIDC issuer.
|
||||||
|
func (secret *ServicePrincipalFederatedSecret) SetAuthenticationValues(spt *ServicePrincipalToken, v *url.Values) error {
|
||||||
|
|
||||||
|
v.Set("client_assertion", secret.jwt)
|
||||||
|
v.Set("client_assertion_type", "urn:ietf:params:oauth:client-assertion-type:jwt-bearer")
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// MarshalJSON implements the json.Marshaler interface.
|
||||||
|
func (secret ServicePrincipalFederatedSecret) MarshalJSON() ([]byte, error) {
|
||||||
|
return nil, errors.New("marshalling ServicePrincipalFederatedSecret is not supported")
|
||||||
|
}
|
||||||
|
|
||||||
// ServicePrincipalToken encapsulates a Token created for a Service Principal.
|
// ServicePrincipalToken encapsulates a Token created for a Service Principal.
|
||||||
type ServicePrincipalToken struct {
|
type ServicePrincipalToken struct {
|
||||||
inner servicePrincipalToken
|
inner servicePrincipalToken
|
||||||
@ -419,6 +438,8 @@ func (spt *ServicePrincipalToken) UnmarshalJSON(data []byte) error {
|
|||||||
spt.inner.Secret = &ServicePrincipalUsernamePasswordSecret{}
|
spt.inner.Secret = &ServicePrincipalUsernamePasswordSecret{}
|
||||||
case "ServicePrincipalAuthorizationCodeSecret":
|
case "ServicePrincipalAuthorizationCodeSecret":
|
||||||
spt.inner.Secret = &ServicePrincipalAuthorizationCodeSecret{}
|
spt.inner.Secret = &ServicePrincipalAuthorizationCodeSecret{}
|
||||||
|
case "ServicePrincipalFederatedSecret":
|
||||||
|
return errors.New("unmarshalling ServicePrincipalFederatedSecret is not supported")
|
||||||
default:
|
default:
|
||||||
return fmt.Errorf("unrecognized token type '%s'", secret["type"])
|
return fmt.Errorf("unrecognized token type '%s'", secret["type"])
|
||||||
}
|
}
|
||||||
@ -665,6 +686,31 @@ func NewServicePrincipalTokenFromAuthorizationCode(oauthConfig OAuthConfig, clie
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// NewServicePrincipalTokenFromFederatedToken creates a ServicePrincipalToken from the supplied federated OIDC JWT.
|
||||||
|
func NewServicePrincipalTokenFromFederatedToken(oauthConfig OAuthConfig, clientID string, jwt string, resource string, callbacks ...TokenRefreshCallback) (*ServicePrincipalToken, error) {
|
||||||
|
if err := validateOAuthConfig(oauthConfig); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
if err := validateStringParam(clientID, "clientID"); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
if err := validateStringParam(resource, "resource"); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
if jwt == "" {
|
||||||
|
return nil, fmt.Errorf("parameter 'jwt' cannot be empty")
|
||||||
|
}
|
||||||
|
return NewServicePrincipalTokenWithSecret(
|
||||||
|
oauthConfig,
|
||||||
|
clientID,
|
||||||
|
resource,
|
||||||
|
&ServicePrincipalFederatedSecret{
|
||||||
|
jwt: jwt,
|
||||||
|
},
|
||||||
|
callbacks...,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
type msiType int
|
type msiType int
|
||||||
|
|
||||||
const (
|
const (
|
||||||
@ -1058,8 +1104,8 @@ func (spt *ServicePrincipalToken) refreshInternal(ctx context.Context, resource
|
|||||||
|
|
||||||
// AAD returns expires_in as a string, ADFS returns it as an int
|
// AAD returns expires_in as a string, ADFS returns it as an int
|
||||||
ExpiresIn json.Number `json:"expires_in"`
|
ExpiresIn json.Number `json:"expires_in"`
|
||||||
// expires_on can be in two formats, a UTC time stamp or the number of seconds.
|
// expires_on can be in three formats, a UTC time stamp, or the number of seconds as a string *or* int.
|
||||||
ExpiresOn string `json:"expires_on"`
|
ExpiresOn interface{} `json:"expires_on"`
|
||||||
NotBefore json.Number `json:"not_before"`
|
NotBefore json.Number `json:"not_before"`
|
||||||
|
|
||||||
Resource string `json:"resource"`
|
Resource string `json:"resource"`
|
||||||
@ -1072,7 +1118,7 @@ func (spt *ServicePrincipalToken) refreshInternal(ctx context.Context, resource
|
|||||||
}
|
}
|
||||||
expiresOn := json.Number("")
|
expiresOn := json.Number("")
|
||||||
// ADFS doesn't include the expires_on field
|
// ADFS doesn't include the expires_on field
|
||||||
if token.ExpiresOn != "" {
|
if token.ExpiresOn != nil {
|
||||||
if expiresOn, err = parseExpiresOn(token.ExpiresOn); err != nil {
|
if expiresOn, err = parseExpiresOn(token.ExpiresOn); err != nil {
|
||||||
return newTokenRefreshError(fmt.Sprintf("adal: failed to parse expires_on: %v value '%s'", err, token.ExpiresOn), resp)
|
return newTokenRefreshError(fmt.Sprintf("adal: failed to parse expires_on: %v value '%s'", err, token.ExpiresOn), resp)
|
||||||
}
|
}
|
||||||
@ -1089,18 +1135,27 @@ func (spt *ServicePrincipalToken) refreshInternal(ctx context.Context, resource
|
|||||||
}
|
}
|
||||||
|
|
||||||
// converts expires_on to the number of seconds
|
// converts expires_on to the number of seconds
|
||||||
func parseExpiresOn(s string) (json.Number, error) {
|
func parseExpiresOn(s interface{}) (json.Number, error) {
|
||||||
// convert the expiration date to the number of seconds from now
|
// the JSON unmarshaler treats JSON numbers unmarshaled into an interface{} as float64
|
||||||
timeToDuration := func(t time.Time) json.Number {
|
asFloat64, ok := s.(float64)
|
||||||
dur := t.Sub(time.Now().UTC())
|
if ok {
|
||||||
return json.Number(strconv.FormatInt(int64(dur.Round(time.Second).Seconds()), 10))
|
// this is the number of seconds as int case
|
||||||
|
return json.Number(strconv.FormatInt(int64(asFloat64), 10)), nil
|
||||||
}
|
}
|
||||||
if _, err := strconv.ParseInt(s, 10, 64); err == nil {
|
asStr, ok := s.(string)
|
||||||
|
if !ok {
|
||||||
|
return "", fmt.Errorf("unexpected expires_on type %T", s)
|
||||||
|
}
|
||||||
|
// convert the expiration date to the number of seconds from the unix epoch
|
||||||
|
timeToDuration := func(t time.Time) json.Number {
|
||||||
|
return json.Number(strconv.FormatInt(t.UTC().Unix(), 10))
|
||||||
|
}
|
||||||
|
if _, err := json.Number(asStr).Int64(); err == nil {
|
||||||
// this is the number of seconds case, no conversion required
|
// this is the number of seconds case, no conversion required
|
||||||
return json.Number(s), nil
|
return json.Number(asStr), nil
|
||||||
} else if eo, err := time.Parse(expiresOnDateFormatPM, s); err == nil {
|
} else if eo, err := time.Parse(expiresOnDateFormatPM, asStr); err == nil {
|
||||||
return timeToDuration(eo), nil
|
return timeToDuration(eo), nil
|
||||||
} else if eo, err := time.Parse(expiresOnDateFormat, s); err == nil {
|
} else if eo, err := time.Parse(expiresOnDateFormat, asStr); err == nil {
|
||||||
return timeToDuration(eo), nil
|
return timeToDuration(eo), nil
|
||||||
} else {
|
} else {
|
||||||
// unknown format
|
// unknown format
|
||||||
@ -1317,12 +1372,25 @@ func NewMultiTenantServicePrincipalTokenFromCertificate(multiTenantCfg MultiTena
|
|||||||
|
|
||||||
// MSIAvailable returns true if the MSI endpoint is available for authentication.
|
// MSIAvailable returns true if the MSI endpoint is available for authentication.
|
||||||
func MSIAvailable(ctx context.Context, s Sender) bool {
|
func MSIAvailable(ctx context.Context, s Sender) bool {
|
||||||
|
msiType, _, err := getMSIType()
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
if msiType != msiTypeIMDS {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
if s == nil {
|
if s == nil {
|
||||||
s = sender()
|
s = sender()
|
||||||
}
|
}
|
||||||
|
|
||||||
resp, err := getMSIEndpoint(ctx, s)
|
resp, err := getMSIEndpoint(ctx, s)
|
||||||
|
|
||||||
if err == nil {
|
if err == nil {
|
||||||
resp.Body.Close()
|
resp.Body.Close()
|
||||||
}
|
}
|
||||||
|
|
||||||
return err == nil
|
return err == nil
|
||||||
}
|
}
|
||||||
|
38
vendor/github.com/Azure/go-autorest/autorest/azure/environments.go
generated
vendored
38
vendor/github.com/Azure/go-autorest/autorest/azure/environments.go
generated
vendored
@ -34,8 +34,10 @@ const (
|
|||||||
var environments = map[string]Environment{
|
var environments = map[string]Environment{
|
||||||
"AZURECHINACLOUD": ChinaCloud,
|
"AZURECHINACLOUD": ChinaCloud,
|
||||||
"AZUREGERMANCLOUD": GermanCloud,
|
"AZUREGERMANCLOUD": GermanCloud,
|
||||||
|
"AZURECLOUD": PublicCloud,
|
||||||
"AZUREPUBLICCLOUD": PublicCloud,
|
"AZUREPUBLICCLOUD": PublicCloud,
|
||||||
"AZUREUSGOVERNMENTCLOUD": USGovernmentCloud,
|
"AZUREUSGOVERNMENT": USGovernmentCloud,
|
||||||
|
"AZUREUSGOVERNMENTCLOUD": USGovernmentCloud, //TODO: deprecate
|
||||||
}
|
}
|
||||||
|
|
||||||
// ResourceIdentifier contains a set of Azure resource IDs.
|
// ResourceIdentifier contains a set of Azure resource IDs.
|
||||||
@ -51,6 +53,8 @@ type ResourceIdentifier struct {
|
|||||||
ServiceBus string `json:"serviceBus"`
|
ServiceBus string `json:"serviceBus"`
|
||||||
SQLDatabase string `json:"sqlDatabase"`
|
SQLDatabase string `json:"sqlDatabase"`
|
||||||
CosmosDB string `json:"cosmosDB"`
|
CosmosDB string `json:"cosmosDB"`
|
||||||
|
ManagedHSM string `json:"managedHSM"`
|
||||||
|
MicrosoftGraph string `json:"microsoftGraph"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// Environment represents a set of endpoints for each of Azure's Clouds.
|
// Environment represents a set of endpoints for each of Azure's Clouds.
|
||||||
@ -63,9 +67,11 @@ type Environment struct {
|
|||||||
ActiveDirectoryEndpoint string `json:"activeDirectoryEndpoint"`
|
ActiveDirectoryEndpoint string `json:"activeDirectoryEndpoint"`
|
||||||
GalleryEndpoint string `json:"galleryEndpoint"`
|
GalleryEndpoint string `json:"galleryEndpoint"`
|
||||||
KeyVaultEndpoint string `json:"keyVaultEndpoint"`
|
KeyVaultEndpoint string `json:"keyVaultEndpoint"`
|
||||||
|
ManagedHSMEndpoint string `json:"managedHSMEndpoint"`
|
||||||
GraphEndpoint string `json:"graphEndpoint"`
|
GraphEndpoint string `json:"graphEndpoint"`
|
||||||
ServiceBusEndpoint string `json:"serviceBusEndpoint"`
|
ServiceBusEndpoint string `json:"serviceBusEndpoint"`
|
||||||
BatchManagementEndpoint string `json:"batchManagementEndpoint"`
|
BatchManagementEndpoint string `json:"batchManagementEndpoint"`
|
||||||
|
MicrosoftGraphEndpoint string `json:"microsoftGraphEndpoint"`
|
||||||
StorageEndpointSuffix string `json:"storageEndpointSuffix"`
|
StorageEndpointSuffix string `json:"storageEndpointSuffix"`
|
||||||
CosmosDBDNSSuffix string `json:"cosmosDBDNSSuffix"`
|
CosmosDBDNSSuffix string `json:"cosmosDBDNSSuffix"`
|
||||||
MariaDBDNSSuffix string `json:"mariaDBDNSSuffix"`
|
MariaDBDNSSuffix string `json:"mariaDBDNSSuffix"`
|
||||||
@ -74,6 +80,7 @@ type Environment struct {
|
|||||||
SQLDatabaseDNSSuffix string `json:"sqlDatabaseDNSSuffix"`
|
SQLDatabaseDNSSuffix string `json:"sqlDatabaseDNSSuffix"`
|
||||||
TrafficManagerDNSSuffix string `json:"trafficManagerDNSSuffix"`
|
TrafficManagerDNSSuffix string `json:"trafficManagerDNSSuffix"`
|
||||||
KeyVaultDNSSuffix string `json:"keyVaultDNSSuffix"`
|
KeyVaultDNSSuffix string `json:"keyVaultDNSSuffix"`
|
||||||
|
ManagedHSMDNSSuffix string `json:"managedHSMDNSSuffix"`
|
||||||
ServiceBusEndpointSuffix string `json:"serviceBusEndpointSuffix"`
|
ServiceBusEndpointSuffix string `json:"serviceBusEndpointSuffix"`
|
||||||
ServiceManagementVMDNSSuffix string `json:"serviceManagementVMDNSSuffix"`
|
ServiceManagementVMDNSSuffix string `json:"serviceManagementVMDNSSuffix"`
|
||||||
ResourceManagerVMDNSSuffix string `json:"resourceManagerVMDNSSuffix"`
|
ResourceManagerVMDNSSuffix string `json:"resourceManagerVMDNSSuffix"`
|
||||||
@ -81,6 +88,7 @@ type Environment struct {
|
|||||||
TokenAudience string `json:"tokenAudience"`
|
TokenAudience string `json:"tokenAudience"`
|
||||||
APIManagementHostNameSuffix string `json:"apiManagementHostNameSuffix"`
|
APIManagementHostNameSuffix string `json:"apiManagementHostNameSuffix"`
|
||||||
SynapseEndpointSuffix string `json:"synapseEndpointSuffix"`
|
SynapseEndpointSuffix string `json:"synapseEndpointSuffix"`
|
||||||
|
DatalakeSuffix string `json:"datalakeSuffix"`
|
||||||
ResourceIdentifiers ResourceIdentifier `json:"resourceIdentifiers"`
|
ResourceIdentifiers ResourceIdentifier `json:"resourceIdentifiers"`
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -95,9 +103,11 @@ var (
|
|||||||
ActiveDirectoryEndpoint: "https://login.microsoftonline.com/",
|
ActiveDirectoryEndpoint: "https://login.microsoftonline.com/",
|
||||||
GalleryEndpoint: "https://gallery.azure.com/",
|
GalleryEndpoint: "https://gallery.azure.com/",
|
||||||
KeyVaultEndpoint: "https://vault.azure.net/",
|
KeyVaultEndpoint: "https://vault.azure.net/",
|
||||||
|
ManagedHSMEndpoint: "https://managedhsm.azure.net/",
|
||||||
GraphEndpoint: "https://graph.windows.net/",
|
GraphEndpoint: "https://graph.windows.net/",
|
||||||
ServiceBusEndpoint: "https://servicebus.windows.net/",
|
ServiceBusEndpoint: "https://servicebus.windows.net/",
|
||||||
BatchManagementEndpoint: "https://batch.core.windows.net/",
|
BatchManagementEndpoint: "https://batch.core.windows.net/",
|
||||||
|
MicrosoftGraphEndpoint: "https://graph.microsoft.com/",
|
||||||
StorageEndpointSuffix: "core.windows.net",
|
StorageEndpointSuffix: "core.windows.net",
|
||||||
CosmosDBDNSSuffix: "documents.azure.com",
|
CosmosDBDNSSuffix: "documents.azure.com",
|
||||||
MariaDBDNSSuffix: "mariadb.database.azure.com",
|
MariaDBDNSSuffix: "mariadb.database.azure.com",
|
||||||
@ -106,6 +116,7 @@ var (
|
|||||||
SQLDatabaseDNSSuffix: "database.windows.net",
|
SQLDatabaseDNSSuffix: "database.windows.net",
|
||||||
TrafficManagerDNSSuffix: "trafficmanager.net",
|
TrafficManagerDNSSuffix: "trafficmanager.net",
|
||||||
KeyVaultDNSSuffix: "vault.azure.net",
|
KeyVaultDNSSuffix: "vault.azure.net",
|
||||||
|
ManagedHSMDNSSuffix: "managedhsm.azure.net",
|
||||||
ServiceBusEndpointSuffix: "servicebus.windows.net",
|
ServiceBusEndpointSuffix: "servicebus.windows.net",
|
||||||
ServiceManagementVMDNSSuffix: "cloudapp.net",
|
ServiceManagementVMDNSSuffix: "cloudapp.net",
|
||||||
ResourceManagerVMDNSSuffix: "cloudapp.azure.com",
|
ResourceManagerVMDNSSuffix: "cloudapp.azure.com",
|
||||||
@ -113,6 +124,7 @@ var (
|
|||||||
TokenAudience: "https://management.azure.com/",
|
TokenAudience: "https://management.azure.com/",
|
||||||
APIManagementHostNameSuffix: "azure-api.net",
|
APIManagementHostNameSuffix: "azure-api.net",
|
||||||
SynapseEndpointSuffix: "dev.azuresynapse.net",
|
SynapseEndpointSuffix: "dev.azuresynapse.net",
|
||||||
|
DatalakeSuffix: "azuredatalakestore.net",
|
||||||
ResourceIdentifiers: ResourceIdentifier{
|
ResourceIdentifiers: ResourceIdentifier{
|
||||||
Graph: "https://graph.windows.net/",
|
Graph: "https://graph.windows.net/",
|
||||||
KeyVault: "https://vault.azure.net",
|
KeyVault: "https://vault.azure.net",
|
||||||
@ -125,6 +137,8 @@ var (
|
|||||||
ServiceBus: "https://servicebus.azure.net/",
|
ServiceBus: "https://servicebus.azure.net/",
|
||||||
SQLDatabase: "https://database.windows.net/",
|
SQLDatabase: "https://database.windows.net/",
|
||||||
CosmosDB: "https://cosmos.azure.com",
|
CosmosDB: "https://cosmos.azure.com",
|
||||||
|
ManagedHSM: "https://managedhsm.azure.net",
|
||||||
|
MicrosoftGraph: "https://graph.microsoft.com/",
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -138,9 +152,11 @@ var (
|
|||||||
ActiveDirectoryEndpoint: "https://login.microsoftonline.us/",
|
ActiveDirectoryEndpoint: "https://login.microsoftonline.us/",
|
||||||
GalleryEndpoint: "https://gallery.usgovcloudapi.net/",
|
GalleryEndpoint: "https://gallery.usgovcloudapi.net/",
|
||||||
KeyVaultEndpoint: "https://vault.usgovcloudapi.net/",
|
KeyVaultEndpoint: "https://vault.usgovcloudapi.net/",
|
||||||
|
ManagedHSMEndpoint: NotAvailable,
|
||||||
GraphEndpoint: "https://graph.windows.net/",
|
GraphEndpoint: "https://graph.windows.net/",
|
||||||
ServiceBusEndpoint: "https://servicebus.usgovcloudapi.net/",
|
ServiceBusEndpoint: "https://servicebus.usgovcloudapi.net/",
|
||||||
BatchManagementEndpoint: "https://batch.core.usgovcloudapi.net/",
|
BatchManagementEndpoint: "https://batch.core.usgovcloudapi.net/",
|
||||||
|
MicrosoftGraphEndpoint: "https://graph.microsoft.us/",
|
||||||
StorageEndpointSuffix: "core.usgovcloudapi.net",
|
StorageEndpointSuffix: "core.usgovcloudapi.net",
|
||||||
CosmosDBDNSSuffix: "documents.azure.us",
|
CosmosDBDNSSuffix: "documents.azure.us",
|
||||||
MariaDBDNSSuffix: "mariadb.database.usgovcloudapi.net",
|
MariaDBDNSSuffix: "mariadb.database.usgovcloudapi.net",
|
||||||
@ -149,13 +165,15 @@ var (
|
|||||||
SQLDatabaseDNSSuffix: "database.usgovcloudapi.net",
|
SQLDatabaseDNSSuffix: "database.usgovcloudapi.net",
|
||||||
TrafficManagerDNSSuffix: "usgovtrafficmanager.net",
|
TrafficManagerDNSSuffix: "usgovtrafficmanager.net",
|
||||||
KeyVaultDNSSuffix: "vault.usgovcloudapi.net",
|
KeyVaultDNSSuffix: "vault.usgovcloudapi.net",
|
||||||
|
ManagedHSMDNSSuffix: NotAvailable,
|
||||||
ServiceBusEndpointSuffix: "servicebus.usgovcloudapi.net",
|
ServiceBusEndpointSuffix: "servicebus.usgovcloudapi.net",
|
||||||
ServiceManagementVMDNSSuffix: "usgovcloudapp.net",
|
ServiceManagementVMDNSSuffix: "usgovcloudapp.net",
|
||||||
ResourceManagerVMDNSSuffix: "cloudapp.usgovcloudapi.net",
|
ResourceManagerVMDNSSuffix: "cloudapp.usgovcloudapi.net",
|
||||||
ContainerRegistryDNSSuffix: "azurecr.us",
|
ContainerRegistryDNSSuffix: "azurecr.us",
|
||||||
TokenAudience: "https://management.usgovcloudapi.net/",
|
TokenAudience: "https://management.usgovcloudapi.net/",
|
||||||
APIManagementHostNameSuffix: "azure-api.us",
|
APIManagementHostNameSuffix: "azure-api.us",
|
||||||
SynapseEndpointSuffix: NotAvailable,
|
SynapseEndpointSuffix: "dev.azuresynapse.usgovcloudapi.net",
|
||||||
|
DatalakeSuffix: NotAvailable,
|
||||||
ResourceIdentifiers: ResourceIdentifier{
|
ResourceIdentifiers: ResourceIdentifier{
|
||||||
Graph: "https://graph.windows.net/",
|
Graph: "https://graph.windows.net/",
|
||||||
KeyVault: "https://vault.usgovcloudapi.net",
|
KeyVault: "https://vault.usgovcloudapi.net",
|
||||||
@ -164,10 +182,12 @@ var (
|
|||||||
OperationalInsights: "https://api.loganalytics.us",
|
OperationalInsights: "https://api.loganalytics.us",
|
||||||
OSSRDBMS: "https://ossrdbms-aad.database.usgovcloudapi.net",
|
OSSRDBMS: "https://ossrdbms-aad.database.usgovcloudapi.net",
|
||||||
Storage: "https://storage.azure.com/",
|
Storage: "https://storage.azure.com/",
|
||||||
Synapse: NotAvailable,
|
Synapse: "https://dev.azuresynapse.usgovcloudapi.net",
|
||||||
ServiceBus: "https://servicebus.azure.net/",
|
ServiceBus: "https://servicebus.azure.net/",
|
||||||
SQLDatabase: "https://database.usgovcloudapi.net/",
|
SQLDatabase: "https://database.usgovcloudapi.net/",
|
||||||
CosmosDB: "https://cosmos.azure.com",
|
CosmosDB: "https://cosmos.azure.com",
|
||||||
|
ManagedHSM: NotAvailable,
|
||||||
|
MicrosoftGraph: "https://graph.microsoft.us/",
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -181,9 +201,11 @@ var (
|
|||||||
ActiveDirectoryEndpoint: "https://login.chinacloudapi.cn/",
|
ActiveDirectoryEndpoint: "https://login.chinacloudapi.cn/",
|
||||||
GalleryEndpoint: "https://gallery.chinacloudapi.cn/",
|
GalleryEndpoint: "https://gallery.chinacloudapi.cn/",
|
||||||
KeyVaultEndpoint: "https://vault.azure.cn/",
|
KeyVaultEndpoint: "https://vault.azure.cn/",
|
||||||
|
ManagedHSMEndpoint: NotAvailable,
|
||||||
GraphEndpoint: "https://graph.chinacloudapi.cn/",
|
GraphEndpoint: "https://graph.chinacloudapi.cn/",
|
||||||
ServiceBusEndpoint: "https://servicebus.chinacloudapi.cn/",
|
ServiceBusEndpoint: "https://servicebus.chinacloudapi.cn/",
|
||||||
BatchManagementEndpoint: "https://batch.chinacloudapi.cn/",
|
BatchManagementEndpoint: "https://batch.chinacloudapi.cn/",
|
||||||
|
MicrosoftGraphEndpoint: "https://microsoftgraph.chinacloudapi.cn/",
|
||||||
StorageEndpointSuffix: "core.chinacloudapi.cn",
|
StorageEndpointSuffix: "core.chinacloudapi.cn",
|
||||||
CosmosDBDNSSuffix: "documents.azure.cn",
|
CosmosDBDNSSuffix: "documents.azure.cn",
|
||||||
MariaDBDNSSuffix: "mariadb.database.chinacloudapi.cn",
|
MariaDBDNSSuffix: "mariadb.database.chinacloudapi.cn",
|
||||||
@ -192,6 +214,7 @@ var (
|
|||||||
SQLDatabaseDNSSuffix: "database.chinacloudapi.cn",
|
SQLDatabaseDNSSuffix: "database.chinacloudapi.cn",
|
||||||
TrafficManagerDNSSuffix: "trafficmanager.cn",
|
TrafficManagerDNSSuffix: "trafficmanager.cn",
|
||||||
KeyVaultDNSSuffix: "vault.azure.cn",
|
KeyVaultDNSSuffix: "vault.azure.cn",
|
||||||
|
ManagedHSMDNSSuffix: NotAvailable,
|
||||||
ServiceBusEndpointSuffix: "servicebus.chinacloudapi.cn",
|
ServiceBusEndpointSuffix: "servicebus.chinacloudapi.cn",
|
||||||
ServiceManagementVMDNSSuffix: "chinacloudapp.cn",
|
ServiceManagementVMDNSSuffix: "chinacloudapp.cn",
|
||||||
ResourceManagerVMDNSSuffix: "cloudapp.chinacloudapi.cn",
|
ResourceManagerVMDNSSuffix: "cloudapp.chinacloudapi.cn",
|
||||||
@ -199,6 +222,7 @@ var (
|
|||||||
TokenAudience: "https://management.chinacloudapi.cn/",
|
TokenAudience: "https://management.chinacloudapi.cn/",
|
||||||
APIManagementHostNameSuffix: "azure-api.cn",
|
APIManagementHostNameSuffix: "azure-api.cn",
|
||||||
SynapseEndpointSuffix: "dev.azuresynapse.azure.cn",
|
SynapseEndpointSuffix: "dev.azuresynapse.azure.cn",
|
||||||
|
DatalakeSuffix: NotAvailable,
|
||||||
ResourceIdentifiers: ResourceIdentifier{
|
ResourceIdentifiers: ResourceIdentifier{
|
||||||
Graph: "https://graph.chinacloudapi.cn/",
|
Graph: "https://graph.chinacloudapi.cn/",
|
||||||
KeyVault: "https://vault.azure.cn",
|
KeyVault: "https://vault.azure.cn",
|
||||||
@ -211,6 +235,8 @@ var (
|
|||||||
ServiceBus: "https://servicebus.azure.net/",
|
ServiceBus: "https://servicebus.azure.net/",
|
||||||
SQLDatabase: "https://database.chinacloudapi.cn/",
|
SQLDatabase: "https://database.chinacloudapi.cn/",
|
||||||
CosmosDB: "https://cosmos.azure.com",
|
CosmosDB: "https://cosmos.azure.com",
|
||||||
|
ManagedHSM: NotAvailable,
|
||||||
|
MicrosoftGraph: "https://microsoftgraph.chinacloudapi.cn",
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -224,9 +250,11 @@ var (
|
|||||||
ActiveDirectoryEndpoint: "https://login.microsoftonline.de/",
|
ActiveDirectoryEndpoint: "https://login.microsoftonline.de/",
|
||||||
GalleryEndpoint: "https://gallery.cloudapi.de/",
|
GalleryEndpoint: "https://gallery.cloudapi.de/",
|
||||||
KeyVaultEndpoint: "https://vault.microsoftazure.de/",
|
KeyVaultEndpoint: "https://vault.microsoftazure.de/",
|
||||||
|
ManagedHSMEndpoint: NotAvailable,
|
||||||
GraphEndpoint: "https://graph.cloudapi.de/",
|
GraphEndpoint: "https://graph.cloudapi.de/",
|
||||||
ServiceBusEndpoint: "https://servicebus.cloudapi.de/",
|
ServiceBusEndpoint: "https://servicebus.cloudapi.de/",
|
||||||
BatchManagementEndpoint: "https://batch.cloudapi.de/",
|
BatchManagementEndpoint: "https://batch.cloudapi.de/",
|
||||||
|
MicrosoftGraphEndpoint: NotAvailable,
|
||||||
StorageEndpointSuffix: "core.cloudapi.de",
|
StorageEndpointSuffix: "core.cloudapi.de",
|
||||||
CosmosDBDNSSuffix: "documents.microsoftazure.de",
|
CosmosDBDNSSuffix: "documents.microsoftazure.de",
|
||||||
MariaDBDNSSuffix: "mariadb.database.cloudapi.de",
|
MariaDBDNSSuffix: "mariadb.database.cloudapi.de",
|
||||||
@ -235,6 +263,7 @@ var (
|
|||||||
SQLDatabaseDNSSuffix: "database.cloudapi.de",
|
SQLDatabaseDNSSuffix: "database.cloudapi.de",
|
||||||
TrafficManagerDNSSuffix: "azuretrafficmanager.de",
|
TrafficManagerDNSSuffix: "azuretrafficmanager.de",
|
||||||
KeyVaultDNSSuffix: "vault.microsoftazure.de",
|
KeyVaultDNSSuffix: "vault.microsoftazure.de",
|
||||||
|
ManagedHSMDNSSuffix: NotAvailable,
|
||||||
ServiceBusEndpointSuffix: "servicebus.cloudapi.de",
|
ServiceBusEndpointSuffix: "servicebus.cloudapi.de",
|
||||||
ServiceManagementVMDNSSuffix: "azurecloudapp.de",
|
ServiceManagementVMDNSSuffix: "azurecloudapp.de",
|
||||||
ResourceManagerVMDNSSuffix: "cloudapp.microsoftazure.de",
|
ResourceManagerVMDNSSuffix: "cloudapp.microsoftazure.de",
|
||||||
@ -242,6 +271,7 @@ var (
|
|||||||
TokenAudience: "https://management.microsoftazure.de/",
|
TokenAudience: "https://management.microsoftazure.de/",
|
||||||
APIManagementHostNameSuffix: NotAvailable,
|
APIManagementHostNameSuffix: NotAvailable,
|
||||||
SynapseEndpointSuffix: NotAvailable,
|
SynapseEndpointSuffix: NotAvailable,
|
||||||
|
DatalakeSuffix: NotAvailable,
|
||||||
ResourceIdentifiers: ResourceIdentifier{
|
ResourceIdentifiers: ResourceIdentifier{
|
||||||
Graph: "https://graph.cloudapi.de/",
|
Graph: "https://graph.cloudapi.de/",
|
||||||
KeyVault: "https://vault.microsoftazure.de",
|
KeyVault: "https://vault.microsoftazure.de",
|
||||||
@ -254,6 +284,8 @@ var (
|
|||||||
ServiceBus: "https://servicebus.azure.net/",
|
ServiceBus: "https://servicebus.azure.net/",
|
||||||
SQLDatabase: "https://database.cloudapi.de/",
|
SQLDatabase: "https://database.cloudapi.de/",
|
||||||
CosmosDB: "https://cosmos.azure.com",
|
CosmosDB: "https://cosmos.azure.com",
|
||||||
|
ManagedHSM: NotAvailable,
|
||||||
|
MicrosoftGraph: NotAvailable,
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
2
vendor/github.com/Azure/go-autorest/autorest/azure/rp.go
generated
vendored
2
vendor/github.com/Azure/go-autorest/autorest/azure/rp.go
generated
vendored
@ -64,7 +64,7 @@ func DoRetryWithRegistration(client autorest.Client) autorest.SendDecorator {
|
|||||||
if re.ServiceError != nil && re.ServiceError.Code == "MissingSubscriptionRegistration" {
|
if re.ServiceError != nil && re.ServiceError.Code == "MissingSubscriptionRegistration" {
|
||||||
regErr := register(client, r, re)
|
regErr := register(client, r, re)
|
||||||
if regErr != nil {
|
if regErr != nil {
|
||||||
return resp, fmt.Errorf("failed auto registering Resource Provider: %s. Original error: %s", regErr, err)
|
return resp, fmt.Errorf("failed auto registering Resource Provider: %s. Original error: %w", regErr, err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
5
vendor/github.com/PuerkitoBio/purell/.gitignore
generated
vendored
Normal file
5
vendor/github.com/PuerkitoBio/purell/.gitignore
generated
vendored
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
*.sublime-*
|
||||||
|
.DS_Store
|
||||||
|
*.swp
|
||||||
|
*.swo
|
||||||
|
tags
|
12
vendor/github.com/PuerkitoBio/purell/.travis.yml
generated
vendored
Normal file
12
vendor/github.com/PuerkitoBio/purell/.travis.yml
generated
vendored
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
language: go
|
||||||
|
|
||||||
|
go:
|
||||||
|
- 1.4.x
|
||||||
|
- 1.5.x
|
||||||
|
- 1.6.x
|
||||||
|
- 1.7.x
|
||||||
|
- 1.8.x
|
||||||
|
- 1.9.x
|
||||||
|
- "1.10.x"
|
||||||
|
- "1.11.x"
|
||||||
|
- tip
|
12
vendor/github.com/PuerkitoBio/purell/LICENSE
generated
vendored
Normal file
12
vendor/github.com/PuerkitoBio/purell/LICENSE
generated
vendored
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
Copyright (c) 2012, Martin Angers
|
||||||
|
All rights reserved.
|
||||||
|
|
||||||
|
Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
|
||||||
|
|
||||||
|
* Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
|
||||||
|
|
||||||
|
* Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
|
||||||
|
|
||||||
|
* Neither the name of the author nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
|
||||||
|
|
||||||
|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
188
vendor/github.com/PuerkitoBio/purell/README.md
generated
vendored
Normal file
188
vendor/github.com/PuerkitoBio/purell/README.md
generated
vendored
Normal file
@ -0,0 +1,188 @@
|
|||||||
|
# Purell
|
||||||
|
|
||||||
|
Purell is a tiny Go library to normalize URLs. It returns a pure URL. Pure-ell. Sanitizer and all. Yeah, I know...
|
||||||
|
|
||||||
|
Based on the [wikipedia paper][wiki] and the [RFC 3986 document][rfc].
|
||||||
|
|
||||||
|
[](http://travis-ci.org/PuerkitoBio/purell)
|
||||||
|
|
||||||
|
## Install
|
||||||
|
|
||||||
|
`go get github.com/PuerkitoBio/purell`
|
||||||
|
|
||||||
|
## Changelog
|
||||||
|
|
||||||
|
* **v1.1.1** : Fix failing test due to Go1.12 changes (thanks to @ianlancetaylor).
|
||||||
|
* **2016-11-14 (v1.1.0)** : IDN: Conform to RFC 5895: Fold character width (thanks to @beeker1121).
|
||||||
|
* **2016-07-27 (v1.0.0)** : Normalize IDN to ASCII (thanks to @zenovich).
|
||||||
|
* **2015-02-08** : Add fix for relative paths issue ([PR #5][pr5]) and add fix for unnecessary encoding of reserved characters ([see issue #7][iss7]).
|
||||||
|
* **v0.2.0** : Add benchmarks, Attempt IDN support.
|
||||||
|
* **v0.1.0** : Initial release.
|
||||||
|
|
||||||
|
## Examples
|
||||||
|
|
||||||
|
From `example_test.go` (note that in your code, you would import "github.com/PuerkitoBio/purell", and would prefix references to its methods and constants with "purell."):
|
||||||
|
|
||||||
|
```go
|
||||||
|
package purell
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"net/url"
|
||||||
|
)
|
||||||
|
|
||||||
|
func ExampleNormalizeURLString() {
|
||||||
|
if normalized, err := NormalizeURLString("hTTp://someWEBsite.com:80/Amazing%3f/url/",
|
||||||
|
FlagLowercaseScheme|FlagLowercaseHost|FlagUppercaseEscapes); err != nil {
|
||||||
|
panic(err)
|
||||||
|
} else {
|
||||||
|
fmt.Print(normalized)
|
||||||
|
}
|
||||||
|
// Output: http://somewebsite.com:80/Amazing%3F/url/
|
||||||
|
}
|
||||||
|
|
||||||
|
func ExampleMustNormalizeURLString() {
|
||||||
|
normalized := MustNormalizeURLString("hTTpS://someWEBsite.com:443/Amazing%fa/url/",
|
||||||
|
FlagsUnsafeGreedy)
|
||||||
|
fmt.Print(normalized)
|
||||||
|
|
||||||
|
// Output: http://somewebsite.com/Amazing%FA/url
|
||||||
|
}
|
||||||
|
|
||||||
|
func ExampleNormalizeURL() {
|
||||||
|
if u, err := url.Parse("Http://SomeUrl.com:8080/a/b/.././c///g?c=3&a=1&b=9&c=0#target"); err != nil {
|
||||||
|
panic(err)
|
||||||
|
} else {
|
||||||
|
normalized := NormalizeURL(u, FlagsUsuallySafeGreedy|FlagRemoveDuplicateSlashes|FlagRemoveFragment)
|
||||||
|
fmt.Print(normalized)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Output: http://someurl.com:8080/a/c/g?c=3&a=1&b=9&c=0
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## API
|
||||||
|
|
||||||
|
As seen in the examples above, purell offers three methods, `NormalizeURLString(string, NormalizationFlags) (string, error)`, `MustNormalizeURLString(string, NormalizationFlags) (string)` and `NormalizeURL(*url.URL, NormalizationFlags) (string)`. They all normalize the provided URL based on the specified flags. Here are the available flags:
|
||||||
|
|
||||||
|
```go
|
||||||
|
const (
|
||||||
|
// Safe normalizations
|
||||||
|
FlagLowercaseScheme NormalizationFlags = 1 << iota // HTTP://host -> http://host, applied by default in Go1.1
|
||||||
|
FlagLowercaseHost // http://HOST -> http://host
|
||||||
|
FlagUppercaseEscapes // http://host/t%ef -> http://host/t%EF
|
||||||
|
FlagDecodeUnnecessaryEscapes // http://host/t%41 -> http://host/tA
|
||||||
|
FlagEncodeNecessaryEscapes // http://host/!"#$ -> http://host/%21%22#$
|
||||||
|
FlagRemoveDefaultPort // http://host:80 -> http://host
|
||||||
|
FlagRemoveEmptyQuerySeparator // http://host/path? -> http://host/path
|
||||||
|
|
||||||
|
// Usually safe normalizations
|
||||||
|
FlagRemoveTrailingSlash // http://host/path/ -> http://host/path
|
||||||
|
FlagAddTrailingSlash // http://host/path -> http://host/path/ (should choose only one of these add/remove trailing slash flags)
|
||||||
|
FlagRemoveDotSegments // http://host/path/./a/b/../c -> http://host/path/a/c
|
||||||
|
|
||||||
|
// Unsafe normalizations
|
||||||
|
FlagRemoveDirectoryIndex // http://host/path/index.html -> http://host/path/
|
||||||
|
FlagRemoveFragment // http://host/path#fragment -> http://host/path
|
||||||
|
FlagForceHTTP // https://host -> http://host
|
||||||
|
FlagRemoveDuplicateSlashes // http://host/path//a///b -> http://host/path/a/b
|
||||||
|
FlagRemoveWWW // http://www.host/ -> http://host/
|
||||||
|
FlagAddWWW // http://host/ -> http://www.host/ (should choose only one of these add/remove WWW flags)
|
||||||
|
FlagSortQuery // http://host/path?c=3&b=2&a=1&b=1 -> http://host/path?a=1&b=1&b=2&c=3
|
||||||
|
|
||||||
|
// Normalizations not in the wikipedia article, required to cover tests cases
|
||||||
|
// submitted by jehiah
|
||||||
|
FlagDecodeDWORDHost // http://1113982867 -> http://66.102.7.147
|
||||||
|
FlagDecodeOctalHost // http://0102.0146.07.0223 -> http://66.102.7.147
|
||||||
|
FlagDecodeHexHost // http://0x42660793 -> http://66.102.7.147
|
||||||
|
FlagRemoveUnnecessaryHostDots // http://.host../path -> http://host/path
|
||||||
|
FlagRemoveEmptyPortSeparator // http://host:/path -> http://host/path
|
||||||
|
|
||||||
|
// Convenience set of safe normalizations
|
||||||
|
FlagsSafe NormalizationFlags = FlagLowercaseHost | FlagLowercaseScheme | FlagUppercaseEscapes | FlagDecodeUnnecessaryEscapes | FlagEncodeNecessaryEscapes | FlagRemoveDefaultPort | FlagRemoveEmptyQuerySeparator
|
||||||
|
|
||||||
|
// For convenience sets, "greedy" uses the "remove trailing slash" and "remove www. prefix" flags,
|
||||||
|
// while "non-greedy" uses the "add (or keep) the trailing slash" and "add www. prefix".
|
||||||
|
|
||||||
|
// Convenience set of usually safe normalizations (includes FlagsSafe)
|
||||||
|
FlagsUsuallySafeGreedy NormalizationFlags = FlagsSafe | FlagRemoveTrailingSlash | FlagRemoveDotSegments
|
||||||
|
FlagsUsuallySafeNonGreedy NormalizationFlags = FlagsSafe | FlagAddTrailingSlash | FlagRemoveDotSegments
|
||||||
|
|
||||||
|
// Convenience set of unsafe normalizations (includes FlagsUsuallySafe)
|
||||||
|
FlagsUnsafeGreedy NormalizationFlags = FlagsUsuallySafeGreedy | FlagRemoveDirectoryIndex | FlagRemoveFragment | FlagForceHTTP | FlagRemoveDuplicateSlashes | FlagRemoveWWW | FlagSortQuery
|
||||||
|
FlagsUnsafeNonGreedy NormalizationFlags = FlagsUsuallySafeNonGreedy | FlagRemoveDirectoryIndex | FlagRemoveFragment | FlagForceHTTP | FlagRemoveDuplicateSlashes | FlagAddWWW | FlagSortQuery
|
||||||
|
|
||||||
|
// Convenience set of all available flags
|
||||||
|
FlagsAllGreedy = FlagsUnsafeGreedy | FlagDecodeDWORDHost | FlagDecodeOctalHost | FlagDecodeHexHost | FlagRemoveUnnecessaryHostDots | FlagRemoveEmptyPortSeparator
|
||||||
|
FlagsAllNonGreedy = FlagsUnsafeNonGreedy | FlagDecodeDWORDHost | FlagDecodeOctalHost | FlagDecodeHexHost | FlagRemoveUnnecessaryHostDots | FlagRemoveEmptyPortSeparator
|
||||||
|
)
|
||||||
|
```
|
||||||
|
|
||||||
|
For convenience, the set of flags `FlagsSafe`, `FlagsUsuallySafe[Greedy|NonGreedy]`, `FlagsUnsafe[Greedy|NonGreedy]` and `FlagsAll[Greedy|NonGreedy]` are provided for the similarly grouped normalizations on [wikipedia's URL normalization page][wiki]. You can add (using the bitwise OR `|` operator) or remove (using the bitwise AND NOT `&^` operator) individual flags from the sets if required, to build your own custom set.
|
||||||
|
|
||||||
|
The [full godoc reference is available on gopkgdoc][godoc].
|
||||||
|
|
||||||
|
Some things to note:
|
||||||
|
|
||||||
|
* `FlagDecodeUnnecessaryEscapes`, `FlagEncodeNecessaryEscapes`, `FlagUppercaseEscapes` and `FlagRemoveEmptyQuerySeparator` are always implicitly set, because internally, the URL string is parsed as an URL object, which automatically decodes unnecessary escapes, uppercases and encodes necessary ones, and removes empty query separators (an unnecessary `?` at the end of the url). So this operation cannot **not** be done. For this reason, `FlagRemoveEmptyQuerySeparator` (as well as the other three) has been included in the `FlagsSafe` convenience set, instead of `FlagsUnsafe`, where Wikipedia puts it.
|
||||||
|
|
||||||
|
* The `FlagDecodeUnnecessaryEscapes` decodes the following escapes (*from -> to*):
|
||||||
|
- %24 -> $
|
||||||
|
- %26 -> &
|
||||||
|
- %2B-%3B -> +,-./0123456789:;
|
||||||
|
- %3D -> =
|
||||||
|
- %40-%5A -> @ABCDEFGHIJKLMNOPQRSTUVWXYZ
|
||||||
|
- %5F -> _
|
||||||
|
- %61-%7A -> abcdefghijklmnopqrstuvwxyz
|
||||||
|
- %7E -> ~
|
||||||
|
|
||||||
|
|
||||||
|
* When the `NormalizeURL` function is used (passing an URL object), this source URL object is modified (that is, after the call, the URL object will be modified to reflect the normalization).
|
||||||
|
|
||||||
|
* The *replace IP with domain name* normalization (`http://208.77.188.166/ → http://www.example.com/`) is obviously not possible for a library without making some network requests. This is not implemented in purell.
|
||||||
|
|
||||||
|
* The *remove unused query string parameters* and *remove default query parameters* are also not implemented, since this is a very case-specific normalization, and it is quite trivial to do with an URL object.
|
||||||
|
|
||||||
|
### Safe vs Usually Safe vs Unsafe
|
||||||
|
|
||||||
|
Purell allows you to control the level of risk you take while normalizing an URL. You can aggressively normalize, play it totally safe, or anything in between.
|
||||||
|
|
||||||
|
Consider the following URL:
|
||||||
|
|
||||||
|
`HTTPS://www.RooT.com/toto/t%45%1f///a/./b/../c/?z=3&w=2&a=4&w=1#invalid`
|
||||||
|
|
||||||
|
Normalizing with the `FlagsSafe` gives:
|
||||||
|
|
||||||
|
`https://www.root.com/toto/tE%1F///a/./b/../c/?z=3&w=2&a=4&w=1#invalid`
|
||||||
|
|
||||||
|
With the `FlagsUsuallySafeGreedy`:
|
||||||
|
|
||||||
|
`https://www.root.com/toto/tE%1F///a/c?z=3&w=2&a=4&w=1#invalid`
|
||||||
|
|
||||||
|
And with `FlagsUnsafeGreedy`:
|
||||||
|
|
||||||
|
`http://root.com/toto/tE%1F/a/c?a=4&w=1&w=2&z=3`
|
||||||
|
|
||||||
|
## TODOs
|
||||||
|
|
||||||
|
* Add a class/default instance to allow specifying custom directory index names? At the moment, removing directory index removes `(^|/)((?:default|index)\.\w{1,4})$`.
|
||||||
|
|
||||||
|
## Thanks / Contributions
|
||||||
|
|
||||||
|
@rogpeppe
|
||||||
|
@jehiah
|
||||||
|
@opennota
|
||||||
|
@pchristopher1275
|
||||||
|
@zenovich
|
||||||
|
@beeker1121
|
||||||
|
|
||||||
|
## License
|
||||||
|
|
||||||
|
The [BSD 3-Clause license][bsd].
|
||||||
|
|
||||||
|
[bsd]: http://opensource.org/licenses/BSD-3-Clause
|
||||||
|
[wiki]: http://en.wikipedia.org/wiki/URL_normalization
|
||||||
|
[rfc]: http://tools.ietf.org/html/rfc3986#section-6
|
||||||
|
[godoc]: http://go.pkgdoc.org/github.com/PuerkitoBio/purell
|
||||||
|
[pr5]: https://github.com/PuerkitoBio/purell/pull/5
|
||||||
|
[iss7]: https://github.com/PuerkitoBio/purell/issues/7
|
379
vendor/github.com/PuerkitoBio/purell/purell.go
generated
vendored
Normal file
379
vendor/github.com/PuerkitoBio/purell/purell.go
generated
vendored
Normal file
@ -0,0 +1,379 @@
|
|||||||
|
/*
|
||||||
|
Package purell offers URL normalization as described on the wikipedia page:
|
||||||
|
http://en.wikipedia.org/wiki/URL_normalization
|
||||||
|
*/
|
||||||
|
package purell
|
||||||
|
|
||||||
|
import (
|
||||||
|
"bytes"
|
||||||
|
"fmt"
|
||||||
|
"net/url"
|
||||||
|
"regexp"
|
||||||
|
"sort"
|
||||||
|
"strconv"
|
||||||
|
"strings"
|
||||||
|
|
||||||
|
"github.com/PuerkitoBio/urlesc"
|
||||||
|
"golang.org/x/net/idna"
|
||||||
|
"golang.org/x/text/unicode/norm"
|
||||||
|
"golang.org/x/text/width"
|
||||||
|
)
|
||||||
|
|
||||||
|
// A set of normalization flags determines how a URL will
|
||||||
|
// be normalized.
|
||||||
|
type NormalizationFlags uint
|
||||||
|
|
||||||
|
const (
|
||||||
|
// Safe normalizations
|
||||||
|
FlagLowercaseScheme NormalizationFlags = 1 << iota // HTTP://host -> http://host, applied by default in Go1.1
|
||||||
|
FlagLowercaseHost // http://HOST -> http://host
|
||||||
|
FlagUppercaseEscapes // http://host/t%ef -> http://host/t%EF
|
||||||
|
FlagDecodeUnnecessaryEscapes // http://host/t%41 -> http://host/tA
|
||||||
|
FlagEncodeNecessaryEscapes // http://host/!"#$ -> http://host/%21%22#$
|
||||||
|
FlagRemoveDefaultPort // http://host:80 -> http://host
|
||||||
|
FlagRemoveEmptyQuerySeparator // http://host/path? -> http://host/path
|
||||||
|
|
||||||
|
// Usually safe normalizations
|
||||||
|
FlagRemoveTrailingSlash // http://host/path/ -> http://host/path
|
||||||
|
FlagAddTrailingSlash // http://host/path -> http://host/path/ (should choose only one of these add/remove trailing slash flags)
|
||||||
|
FlagRemoveDotSegments // http://host/path/./a/b/../c -> http://host/path/a/c
|
||||||
|
|
||||||
|
// Unsafe normalizations
|
||||||
|
FlagRemoveDirectoryIndex // http://host/path/index.html -> http://host/path/
|
||||||
|
FlagRemoveFragment // http://host/path#fragment -> http://host/path
|
||||||
|
FlagForceHTTP // https://host -> http://host
|
||||||
|
FlagRemoveDuplicateSlashes // http://host/path//a///b -> http://host/path/a/b
|
||||||
|
FlagRemoveWWW // http://www.host/ -> http://host/
|
||||||
|
FlagAddWWW // http://host/ -> http://www.host/ (should choose only one of these add/remove WWW flags)
|
||||||
|
FlagSortQuery // http://host/path?c=3&b=2&a=1&b=1 -> http://host/path?a=1&b=1&b=2&c=3
|
||||||
|
|
||||||
|
// Normalizations not in the wikipedia article, required to cover tests cases
|
||||||
|
// submitted by jehiah
|
||||||
|
FlagDecodeDWORDHost // http://1113982867 -> http://66.102.7.147
|
||||||
|
FlagDecodeOctalHost // http://0102.0146.07.0223 -> http://66.102.7.147
|
||||||
|
FlagDecodeHexHost // http://0x42660793 -> http://66.102.7.147
|
||||||
|
FlagRemoveUnnecessaryHostDots // http://.host../path -> http://host/path
|
||||||
|
FlagRemoveEmptyPortSeparator // http://host:/path -> http://host/path
|
||||||
|
|
||||||
|
// Convenience set of safe normalizations
|
||||||
|
FlagsSafe NormalizationFlags = FlagLowercaseHost | FlagLowercaseScheme | FlagUppercaseEscapes | FlagDecodeUnnecessaryEscapes | FlagEncodeNecessaryEscapes | FlagRemoveDefaultPort | FlagRemoveEmptyQuerySeparator
|
||||||
|
|
||||||
|
// For convenience sets, "greedy" uses the "remove trailing slash" and "remove www. prefix" flags,
|
||||||
|
// while "non-greedy" uses the "add (or keep) the trailing slash" and "add www. prefix".
|
||||||
|
|
||||||
|
// Convenience set of usually safe normalizations (includes FlagsSafe)
|
||||||
|
FlagsUsuallySafeGreedy NormalizationFlags = FlagsSafe | FlagRemoveTrailingSlash | FlagRemoveDotSegments
|
||||||
|
FlagsUsuallySafeNonGreedy NormalizationFlags = FlagsSafe | FlagAddTrailingSlash | FlagRemoveDotSegments
|
||||||
|
|
||||||
|
// Convenience set of unsafe normalizations (includes FlagsUsuallySafe)
|
||||||
|
FlagsUnsafeGreedy NormalizationFlags = FlagsUsuallySafeGreedy | FlagRemoveDirectoryIndex | FlagRemoveFragment | FlagForceHTTP | FlagRemoveDuplicateSlashes | FlagRemoveWWW | FlagSortQuery
|
||||||
|
FlagsUnsafeNonGreedy NormalizationFlags = FlagsUsuallySafeNonGreedy | FlagRemoveDirectoryIndex | FlagRemoveFragment | FlagForceHTTP | FlagRemoveDuplicateSlashes | FlagAddWWW | FlagSortQuery
|
||||||
|
|
||||||
|
// Convenience set of all available flags
|
||||||
|
FlagsAllGreedy = FlagsUnsafeGreedy | FlagDecodeDWORDHost | FlagDecodeOctalHost | FlagDecodeHexHost | FlagRemoveUnnecessaryHostDots | FlagRemoveEmptyPortSeparator
|
||||||
|
FlagsAllNonGreedy = FlagsUnsafeNonGreedy | FlagDecodeDWORDHost | FlagDecodeOctalHost | FlagDecodeHexHost | FlagRemoveUnnecessaryHostDots | FlagRemoveEmptyPortSeparator
|
||||||
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
defaultHttpPort = ":80"
|
||||||
|
defaultHttpsPort = ":443"
|
||||||
|
)
|
||||||
|
|
||||||
|
// Regular expressions used by the normalizations
|
||||||
|
var rxPort = regexp.MustCompile(`(:\d+)/?$`)
|
||||||
|
var rxDirIndex = regexp.MustCompile(`(^|/)((?:default|index)\.\w{1,4})$`)
|
||||||
|
var rxDupSlashes = regexp.MustCompile(`/{2,}`)
|
||||||
|
var rxDWORDHost = regexp.MustCompile(`^(\d+)((?:\.+)?(?:\:\d*)?)$`)
|
||||||
|
var rxOctalHost = regexp.MustCompile(`^(0\d*)\.(0\d*)\.(0\d*)\.(0\d*)((?:\.+)?(?:\:\d*)?)$`)
|
||||||
|
var rxHexHost = regexp.MustCompile(`^0x([0-9A-Fa-f]+)((?:\.+)?(?:\:\d*)?)$`)
|
||||||
|
var rxHostDots = regexp.MustCompile(`^(.+?)(:\d+)?$`)
|
||||||
|
var rxEmptyPort = regexp.MustCompile(`:+$`)
|
||||||
|
|
||||||
|
// Map of flags to implementation function.
|
||||||
|
// FlagDecodeUnnecessaryEscapes has no action, since it is done automatically
|
||||||
|
// by parsing the string as an URL. Same for FlagUppercaseEscapes and FlagRemoveEmptyQuerySeparator.
|
||||||
|
|
||||||
|
// Since maps have undefined traversing order, make a slice of ordered keys
|
||||||
|
var flagsOrder = []NormalizationFlags{
|
||||||
|
FlagLowercaseScheme,
|
||||||
|
FlagLowercaseHost,
|
||||||
|
FlagRemoveDefaultPort,
|
||||||
|
FlagRemoveDirectoryIndex,
|
||||||
|
FlagRemoveDotSegments,
|
||||||
|
FlagRemoveFragment,
|
||||||
|
FlagForceHTTP, // Must be after remove default port (because https=443/http=80)
|
||||||
|
FlagRemoveDuplicateSlashes,
|
||||||
|
FlagRemoveWWW,
|
||||||
|
FlagAddWWW,
|
||||||
|
FlagSortQuery,
|
||||||
|
FlagDecodeDWORDHost,
|
||||||
|
FlagDecodeOctalHost,
|
||||||
|
FlagDecodeHexHost,
|
||||||
|
FlagRemoveUnnecessaryHostDots,
|
||||||
|
FlagRemoveEmptyPortSeparator,
|
||||||
|
FlagRemoveTrailingSlash, // These two (add/remove trailing slash) must be last
|
||||||
|
FlagAddTrailingSlash,
|
||||||
|
}
|
||||||
|
|
||||||
|
// ... and then the map, where order is unimportant
|
||||||
|
var flags = map[NormalizationFlags]func(*url.URL){
|
||||||
|
FlagLowercaseScheme: lowercaseScheme,
|
||||||
|
FlagLowercaseHost: lowercaseHost,
|
||||||
|
FlagRemoveDefaultPort: removeDefaultPort,
|
||||||
|
FlagRemoveDirectoryIndex: removeDirectoryIndex,
|
||||||
|
FlagRemoveDotSegments: removeDotSegments,
|
||||||
|
FlagRemoveFragment: removeFragment,
|
||||||
|
FlagForceHTTP: forceHTTP,
|
||||||
|
FlagRemoveDuplicateSlashes: removeDuplicateSlashes,
|
||||||
|
FlagRemoveWWW: removeWWW,
|
||||||
|
FlagAddWWW: addWWW,
|
||||||
|
FlagSortQuery: sortQuery,
|
||||||
|
FlagDecodeDWORDHost: decodeDWORDHost,
|
||||||
|
FlagDecodeOctalHost: decodeOctalHost,
|
||||||
|
FlagDecodeHexHost: decodeHexHost,
|
||||||
|
FlagRemoveUnnecessaryHostDots: removeUnncessaryHostDots,
|
||||||
|
FlagRemoveEmptyPortSeparator: removeEmptyPortSeparator,
|
||||||
|
FlagRemoveTrailingSlash: removeTrailingSlash,
|
||||||
|
FlagAddTrailingSlash: addTrailingSlash,
|
||||||
|
}
|
||||||
|
|
||||||
|
// MustNormalizeURLString returns the normalized string, and panics if an error occurs.
|
||||||
|
// It takes an URL string as input, as well as the normalization flags.
|
||||||
|
func MustNormalizeURLString(u string, f NormalizationFlags) string {
|
||||||
|
result, e := NormalizeURLString(u, f)
|
||||||
|
if e != nil {
|
||||||
|
panic(e)
|
||||||
|
}
|
||||||
|
return result
|
||||||
|
}
|
||||||
|
|
||||||
|
// NormalizeURLString returns the normalized string, or an error if it can't be parsed into an URL object.
|
||||||
|
// It takes an URL string as input, as well as the normalization flags.
|
||||||
|
func NormalizeURLString(u string, f NormalizationFlags) (string, error) {
|
||||||
|
parsed, err := url.Parse(u)
|
||||||
|
if err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
|
||||||
|
if f&FlagLowercaseHost == FlagLowercaseHost {
|
||||||
|
parsed.Host = strings.ToLower(parsed.Host)
|
||||||
|
}
|
||||||
|
|
||||||
|
// The idna package doesn't fully conform to RFC 5895
|
||||||
|
// (https://tools.ietf.org/html/rfc5895), so we do it here.
|
||||||
|
// Taken from Go 1.8 cycle source, courtesy of bradfitz.
|
||||||
|
// TODO: Remove when (if?) idna package conforms to RFC 5895.
|
||||||
|
parsed.Host = width.Fold.String(parsed.Host)
|
||||||
|
parsed.Host = norm.NFC.String(parsed.Host)
|
||||||
|
if parsed.Host, err = idna.ToASCII(parsed.Host); err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
|
||||||
|
return NormalizeURL(parsed, f), nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// NormalizeURL returns the normalized string.
|
||||||
|
// It takes a parsed URL object as input, as well as the normalization flags.
|
||||||
|
func NormalizeURL(u *url.URL, f NormalizationFlags) string {
|
||||||
|
for _, k := range flagsOrder {
|
||||||
|
if f&k == k {
|
||||||
|
flags[k](u)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return urlesc.Escape(u)
|
||||||
|
}
|
||||||
|
|
||||||
|
func lowercaseScheme(u *url.URL) {
|
||||||
|
if len(u.Scheme) > 0 {
|
||||||
|
u.Scheme = strings.ToLower(u.Scheme)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func lowercaseHost(u *url.URL) {
|
||||||
|
if len(u.Host) > 0 {
|
||||||
|
u.Host = strings.ToLower(u.Host)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func removeDefaultPort(u *url.URL) {
|
||||||
|
if len(u.Host) > 0 {
|
||||||
|
scheme := strings.ToLower(u.Scheme)
|
||||||
|
u.Host = rxPort.ReplaceAllStringFunc(u.Host, func(val string) string {
|
||||||
|
if (scheme == "http" && val == defaultHttpPort) || (scheme == "https" && val == defaultHttpsPort) {
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
return val
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func removeTrailingSlash(u *url.URL) {
|
||||||
|
if l := len(u.Path); l > 0 {
|
||||||
|
if strings.HasSuffix(u.Path, "/") {
|
||||||
|
u.Path = u.Path[:l-1]
|
||||||
|
}
|
||||||
|
} else if l = len(u.Host); l > 0 {
|
||||||
|
if strings.HasSuffix(u.Host, "/") {
|
||||||
|
u.Host = u.Host[:l-1]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func addTrailingSlash(u *url.URL) {
|
||||||
|
if l := len(u.Path); l > 0 {
|
||||||
|
if !strings.HasSuffix(u.Path, "/") {
|
||||||
|
u.Path += "/"
|
||||||
|
}
|
||||||
|
} else if l = len(u.Host); l > 0 {
|
||||||
|
if !strings.HasSuffix(u.Host, "/") {
|
||||||
|
u.Host += "/"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func removeDotSegments(u *url.URL) {
|
||||||
|
if len(u.Path) > 0 {
|
||||||
|
var dotFree []string
|
||||||
|
var lastIsDot bool
|
||||||
|
|
||||||
|
sections := strings.Split(u.Path, "/")
|
||||||
|
for _, s := range sections {
|
||||||
|
if s == ".." {
|
||||||
|
if len(dotFree) > 0 {
|
||||||
|
dotFree = dotFree[:len(dotFree)-1]
|
||||||
|
}
|
||||||
|
} else if s != "." {
|
||||||
|
dotFree = append(dotFree, s)
|
||||||
|
}
|
||||||
|
lastIsDot = (s == "." || s == "..")
|
||||||
|
}
|
||||||
|
// Special case if host does not end with / and new path does not begin with /
|
||||||
|
u.Path = strings.Join(dotFree, "/")
|
||||||
|
if u.Host != "" && !strings.HasSuffix(u.Host, "/") && !strings.HasPrefix(u.Path, "/") {
|
||||||
|
u.Path = "/" + u.Path
|
||||||
|
}
|
||||||
|
// Special case if the last segment was a dot, make sure the path ends with a slash
|
||||||
|
if lastIsDot && !strings.HasSuffix(u.Path, "/") {
|
||||||
|
u.Path += "/"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func removeDirectoryIndex(u *url.URL) {
|
||||||
|
if len(u.Path) > 0 {
|
||||||
|
u.Path = rxDirIndex.ReplaceAllString(u.Path, "$1")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func removeFragment(u *url.URL) {
|
||||||
|
u.Fragment = ""
|
||||||
|
}
|
||||||
|
|
||||||
|
func forceHTTP(u *url.URL) {
|
||||||
|
if strings.ToLower(u.Scheme) == "https" {
|
||||||
|
u.Scheme = "http"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func removeDuplicateSlashes(u *url.URL) {
|
||||||
|
if len(u.Path) > 0 {
|
||||||
|
u.Path = rxDupSlashes.ReplaceAllString(u.Path, "/")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func removeWWW(u *url.URL) {
|
||||||
|
if len(u.Host) > 0 && strings.HasPrefix(strings.ToLower(u.Host), "www.") {
|
||||||
|
u.Host = u.Host[4:]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func addWWW(u *url.URL) {
|
||||||
|
if len(u.Host) > 0 && !strings.HasPrefix(strings.ToLower(u.Host), "www.") {
|
||||||
|
u.Host = "www." + u.Host
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func sortQuery(u *url.URL) {
|
||||||
|
q := u.Query()
|
||||||
|
|
||||||
|
if len(q) > 0 {
|
||||||
|
arKeys := make([]string, len(q))
|
||||||
|
i := 0
|
||||||
|
for k := range q {
|
||||||
|
arKeys[i] = k
|
||||||
|
i++
|
||||||
|
}
|
||||||
|
sort.Strings(arKeys)
|
||||||
|
buf := new(bytes.Buffer)
|
||||||
|
for _, k := range arKeys {
|
||||||
|
sort.Strings(q[k])
|
||||||
|
for _, v := range q[k] {
|
||||||
|
if buf.Len() > 0 {
|
||||||
|
buf.WriteRune('&')
|
||||||
|
}
|
||||||
|
buf.WriteString(fmt.Sprintf("%s=%s", k, urlesc.QueryEscape(v)))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Rebuild the raw query string
|
||||||
|
u.RawQuery = buf.String()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func decodeDWORDHost(u *url.URL) {
|
||||||
|
if len(u.Host) > 0 {
|
||||||
|
if matches := rxDWORDHost.FindStringSubmatch(u.Host); len(matches) > 2 {
|
||||||
|
var parts [4]int64
|
||||||
|
|
||||||
|
dword, _ := strconv.ParseInt(matches[1], 10, 0)
|
||||||
|
for i, shift := range []uint{24, 16, 8, 0} {
|
||||||
|
parts[i] = dword >> shift & 0xFF
|
||||||
|
}
|
||||||
|
u.Host = fmt.Sprintf("%d.%d.%d.%d%s", parts[0], parts[1], parts[2], parts[3], matches[2])
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func decodeOctalHost(u *url.URL) {
|
||||||
|
if len(u.Host) > 0 {
|
||||||
|
if matches := rxOctalHost.FindStringSubmatch(u.Host); len(matches) > 5 {
|
||||||
|
var parts [4]int64
|
||||||
|
|
||||||
|
for i := 1; i <= 4; i++ {
|
||||||
|
parts[i-1], _ = strconv.ParseInt(matches[i], 8, 0)
|
||||||
|
}
|
||||||
|
u.Host = fmt.Sprintf("%d.%d.%d.%d%s", parts[0], parts[1], parts[2], parts[3], matches[5])
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func decodeHexHost(u *url.URL) {
|
||||||
|
if len(u.Host) > 0 {
|
||||||
|
if matches := rxHexHost.FindStringSubmatch(u.Host); len(matches) > 2 {
|
||||||
|
// Conversion is safe because of regex validation
|
||||||
|
parsed, _ := strconv.ParseInt(matches[1], 16, 0)
|
||||||
|
// Set host as DWORD (base 10) encoded host
|
||||||
|
u.Host = fmt.Sprintf("%d%s", parsed, matches[2])
|
||||||
|
// The rest is the same as decoding a DWORD host
|
||||||
|
decodeDWORDHost(u)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func removeUnncessaryHostDots(u *url.URL) {
|
||||||
|
if len(u.Host) > 0 {
|
||||||
|
if matches := rxHostDots.FindStringSubmatch(u.Host); len(matches) > 1 {
|
||||||
|
// Trim the leading and trailing dots
|
||||||
|
u.Host = strings.Trim(matches[1], ".")
|
||||||
|
if len(matches) > 2 {
|
||||||
|
u.Host += matches[2]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func removeEmptyPortSeparator(u *url.URL) {
|
||||||
|
if len(u.Host) > 0 {
|
||||||
|
u.Host = rxEmptyPort.ReplaceAllString(u.Host, "")
|
||||||
|
}
|
||||||
|
}
|
15
vendor/github.com/PuerkitoBio/urlesc/.travis.yml
generated
vendored
Normal file
15
vendor/github.com/PuerkitoBio/urlesc/.travis.yml
generated
vendored
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
language: go
|
||||||
|
|
||||||
|
go:
|
||||||
|
- 1.4.x
|
||||||
|
- 1.5.x
|
||||||
|
- 1.6.x
|
||||||
|
- 1.7.x
|
||||||
|
- 1.8.x
|
||||||
|
- tip
|
||||||
|
|
||||||
|
install:
|
||||||
|
- go build .
|
||||||
|
|
||||||
|
script:
|
||||||
|
- go test -v
|
27
vendor/github.com/PuerkitoBio/urlesc/LICENSE
generated
vendored
Normal file
27
vendor/github.com/PuerkitoBio/urlesc/LICENSE
generated
vendored
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
Copyright (c) 2012 The Go Authors. All rights reserved.
|
||||||
|
|
||||||
|
Redistribution and use in source and binary forms, with or without
|
||||||
|
modification, are permitted provided that the following conditions are
|
||||||
|
met:
|
||||||
|
|
||||||
|
* Redistributions of source code must retain the above copyright
|
||||||
|
notice, this list of conditions and the following disclaimer.
|
||||||
|
* Redistributions in binary form must reproduce the above
|
||||||
|
copyright notice, this list of conditions and the following disclaimer
|
||||||
|
in the documentation and/or other materials provided with the
|
||||||
|
distribution.
|
||||||
|
* Neither the name of Google Inc. nor the names of its
|
||||||
|
contributors may be used to endorse or promote products derived from
|
||||||
|
this software without specific prior written permission.
|
||||||
|
|
||||||
|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||||
|
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||||
|
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||||
|
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||||
|
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||||
|
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||||
|
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||||
|
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||||
|
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
16
vendor/github.com/PuerkitoBio/urlesc/README.md
generated
vendored
Normal file
16
vendor/github.com/PuerkitoBio/urlesc/README.md
generated
vendored
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
urlesc [](https://travis-ci.org/PuerkitoBio/urlesc) [](http://godoc.org/github.com/PuerkitoBio/urlesc)
|
||||||
|
======
|
||||||
|
|
||||||
|
Package urlesc implements query escaping as per RFC 3986.
|
||||||
|
|
||||||
|
It contains some parts of the net/url package, modified so as to allow
|
||||||
|
some reserved characters incorrectly escaped by net/url (see [issue 5684](https://github.com/golang/go/issues/5684)).
|
||||||
|
|
||||||
|
## Install
|
||||||
|
|
||||||
|
go get github.com/PuerkitoBio/urlesc
|
||||||
|
|
||||||
|
## License
|
||||||
|
|
||||||
|
Go license (BSD-3-Clause)
|
||||||
|
|
180
vendor/github.com/PuerkitoBio/urlesc/urlesc.go
generated
vendored
Normal file
180
vendor/github.com/PuerkitoBio/urlesc/urlesc.go
generated
vendored
Normal file
@ -0,0 +1,180 @@
|
|||||||
|
// Copyright 2009 The Go Authors. All rights reserved.
|
||||||
|
// Use of this source code is governed by a BSD-style
|
||||||
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
|
// Package urlesc implements query escaping as per RFC 3986.
|
||||||
|
// It contains some parts of the net/url package, modified so as to allow
|
||||||
|
// some reserved characters incorrectly escaped by net/url.
|
||||||
|
// See https://github.com/golang/go/issues/5684
|
||||||
|
package urlesc
|
||||||
|
|
||||||
|
import (
|
||||||
|
"bytes"
|
||||||
|
"net/url"
|
||||||
|
"strings"
|
||||||
|
)
|
||||||
|
|
||||||
|
type encoding int
|
||||||
|
|
||||||
|
const (
|
||||||
|
encodePath encoding = 1 + iota
|
||||||
|
encodeUserPassword
|
||||||
|
encodeQueryComponent
|
||||||
|
encodeFragment
|
||||||
|
)
|
||||||
|
|
||||||
|
// Return true if the specified character should be escaped when
|
||||||
|
// appearing in a URL string, according to RFC 3986.
|
||||||
|
func shouldEscape(c byte, mode encoding) bool {
|
||||||
|
// §2.3 Unreserved characters (alphanum)
|
||||||
|
if 'A' <= c && c <= 'Z' || 'a' <= c && c <= 'z' || '0' <= c && c <= '9' {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
switch c {
|
||||||
|
case '-', '.', '_', '~': // §2.3 Unreserved characters (mark)
|
||||||
|
return false
|
||||||
|
|
||||||
|
// §2.2 Reserved characters (reserved)
|
||||||
|
case ':', '/', '?', '#', '[', ']', '@', // gen-delims
|
||||||
|
'!', '$', '&', '\'', '(', ')', '*', '+', ',', ';', '=': // sub-delims
|
||||||
|
// Different sections of the URL allow a few of
|
||||||
|
// the reserved characters to appear unescaped.
|
||||||
|
switch mode {
|
||||||
|
case encodePath: // §3.3
|
||||||
|
// The RFC allows sub-delims and : @.
|
||||||
|
// '/', '[' and ']' can be used to assign meaning to individual path
|
||||||
|
// segments. This package only manipulates the path as a whole,
|
||||||
|
// so we allow those as well. That leaves only ? and # to escape.
|
||||||
|
return c == '?' || c == '#'
|
||||||
|
|
||||||
|
case encodeUserPassword: // §3.2.1
|
||||||
|
// The RFC allows : and sub-delims in
|
||||||
|
// userinfo. The parsing of userinfo treats ':' as special so we must escape
|
||||||
|
// all the gen-delims.
|
||||||
|
return c == ':' || c == '/' || c == '?' || c == '#' || c == '[' || c == ']' || c == '@'
|
||||||
|
|
||||||
|
case encodeQueryComponent: // §3.4
|
||||||
|
// The RFC allows / and ?.
|
||||||
|
return c != '/' && c != '?'
|
||||||
|
|
||||||
|
case encodeFragment: // §4.1
|
||||||
|
// The RFC text is silent but the grammar allows
|
||||||
|
// everything, so escape nothing but #
|
||||||
|
return c == '#'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Everything else must be escaped.
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
// QueryEscape escapes the string so it can be safely placed
|
||||||
|
// inside a URL query.
|
||||||
|
func QueryEscape(s string) string {
|
||||||
|
return escape(s, encodeQueryComponent)
|
||||||
|
}
|
||||||
|
|
||||||
|
func escape(s string, mode encoding) string {
|
||||||
|
spaceCount, hexCount := 0, 0
|
||||||
|
for i := 0; i < len(s); i++ {
|
||||||
|
c := s[i]
|
||||||
|
if shouldEscape(c, mode) {
|
||||||
|
if c == ' ' && mode == encodeQueryComponent {
|
||||||
|
spaceCount++
|
||||||
|
} else {
|
||||||
|
hexCount++
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if spaceCount == 0 && hexCount == 0 {
|
||||||
|
return s
|
||||||
|
}
|
||||||
|
|
||||||
|
t := make([]byte, len(s)+2*hexCount)
|
||||||
|
j := 0
|
||||||
|
for i := 0; i < len(s); i++ {
|
||||||
|
switch c := s[i]; {
|
||||||
|
case c == ' ' && mode == encodeQueryComponent:
|
||||||
|
t[j] = '+'
|
||||||
|
j++
|
||||||
|
case shouldEscape(c, mode):
|
||||||
|
t[j] = '%'
|
||||||
|
t[j+1] = "0123456789ABCDEF"[c>>4]
|
||||||
|
t[j+2] = "0123456789ABCDEF"[c&15]
|
||||||
|
j += 3
|
||||||
|
default:
|
||||||
|
t[j] = s[i]
|
||||||
|
j++
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return string(t)
|
||||||
|
}
|
||||||
|
|
||||||
|
var uiReplacer = strings.NewReplacer(
|
||||||
|
"%21", "!",
|
||||||
|
"%27", "'",
|
||||||
|
"%28", "(",
|
||||||
|
"%29", ")",
|
||||||
|
"%2A", "*",
|
||||||
|
)
|
||||||
|
|
||||||
|
// unescapeUserinfo unescapes some characters that need not to be escaped as per RFC3986.
|
||||||
|
func unescapeUserinfo(s string) string {
|
||||||
|
return uiReplacer.Replace(s)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Escape reassembles the URL into a valid URL string.
|
||||||
|
// The general form of the result is one of:
|
||||||
|
//
|
||||||
|
// scheme:opaque
|
||||||
|
// scheme://userinfo@host/path?query#fragment
|
||||||
|
//
|
||||||
|
// If u.Opaque is non-empty, String uses the first form;
|
||||||
|
// otherwise it uses the second form.
|
||||||
|
//
|
||||||
|
// In the second form, the following rules apply:
|
||||||
|
// - if u.Scheme is empty, scheme: is omitted.
|
||||||
|
// - if u.User is nil, userinfo@ is omitted.
|
||||||
|
// - if u.Host is empty, host/ is omitted.
|
||||||
|
// - if u.Scheme and u.Host are empty and u.User is nil,
|
||||||
|
// the entire scheme://userinfo@host/ is omitted.
|
||||||
|
// - if u.Host is non-empty and u.Path begins with a /,
|
||||||
|
// the form host/path does not add its own /.
|
||||||
|
// - if u.RawQuery is empty, ?query is omitted.
|
||||||
|
// - if u.Fragment is empty, #fragment is omitted.
|
||||||
|
func Escape(u *url.URL) string {
|
||||||
|
var buf bytes.Buffer
|
||||||
|
if u.Scheme != "" {
|
||||||
|
buf.WriteString(u.Scheme)
|
||||||
|
buf.WriteByte(':')
|
||||||
|
}
|
||||||
|
if u.Opaque != "" {
|
||||||
|
buf.WriteString(u.Opaque)
|
||||||
|
} else {
|
||||||
|
if u.Scheme != "" || u.Host != "" || u.User != nil {
|
||||||
|
buf.WriteString("//")
|
||||||
|
if ui := u.User; ui != nil {
|
||||||
|
buf.WriteString(unescapeUserinfo(ui.String()))
|
||||||
|
buf.WriteByte('@')
|
||||||
|
}
|
||||||
|
if h := u.Host; h != "" {
|
||||||
|
buf.WriteString(h)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if u.Path != "" && u.Path[0] != '/' && u.Host != "" {
|
||||||
|
buf.WriteByte('/')
|
||||||
|
}
|
||||||
|
buf.WriteString(escape(u.Path, encodePath))
|
||||||
|
}
|
||||||
|
if u.RawQuery != "" {
|
||||||
|
buf.WriteByte('?')
|
||||||
|
buf.WriteString(u.RawQuery)
|
||||||
|
}
|
||||||
|
if u.Fragment != "" {
|
||||||
|
buf.WriteByte('#')
|
||||||
|
buf.WriteString(escape(u.Fragment, encodeFragment))
|
||||||
|
}
|
||||||
|
return buf.String()
|
||||||
|
}
|
71
vendor/github.com/emicklei/go-restful/v3/.gitignore
generated
vendored
Normal file
71
vendor/github.com/emicklei/go-restful/v3/.gitignore
generated
vendored
Normal file
@ -0,0 +1,71 @@
|
|||||||
|
# Compiled Object files, Static and Dynamic libs (Shared Objects)
|
||||||
|
*.o
|
||||||
|
*.a
|
||||||
|
*.so
|
||||||
|
|
||||||
|
# Folders
|
||||||
|
_obj
|
||||||
|
_test
|
||||||
|
|
||||||
|
# Architecture specific extensions/prefixes
|
||||||
|
*.[568vq]
|
||||||
|
[568vq].out
|
||||||
|
|
||||||
|
*.cgo1.go
|
||||||
|
*.cgo2.c
|
||||||
|
_cgo_defun.c
|
||||||
|
_cgo_gotypes.go
|
||||||
|
_cgo_export.*
|
||||||
|
|
||||||
|
_testmain.go
|
||||||
|
|
||||||
|
*.exe
|
||||||
|
|
||||||
|
restful.html
|
||||||
|
|
||||||
|
*.out
|
||||||
|
|
||||||
|
tmp.prof
|
||||||
|
|
||||||
|
go-restful.test
|
||||||
|
|
||||||
|
examples/restful-basic-authentication
|
||||||
|
|
||||||
|
examples/restful-encoding-filter
|
||||||
|
|
||||||
|
examples/restful-filters
|
||||||
|
|
||||||
|
examples/restful-hello-world
|
||||||
|
|
||||||
|
examples/restful-resource-functions
|
||||||
|
|
||||||
|
examples/restful-serve-static
|
||||||
|
|
||||||
|
examples/restful-user-service
|
||||||
|
|
||||||
|
*.DS_Store
|
||||||
|
examples/restful-user-resource
|
||||||
|
|
||||||
|
examples/restful-multi-containers
|
||||||
|
|
||||||
|
examples/restful-form-handling
|
||||||
|
|
||||||
|
examples/restful-CORS-filter
|
||||||
|
|
||||||
|
examples/restful-options-filter
|
||||||
|
|
||||||
|
examples/restful-curly-router
|
||||||
|
|
||||||
|
examples/restful-cpuprofiler-service
|
||||||
|
|
||||||
|
examples/restful-pre-post-filters
|
||||||
|
|
||||||
|
curly.prof
|
||||||
|
|
||||||
|
examples/restful-NCSA-logging
|
||||||
|
|
||||||
|
examples/restful-html-template
|
||||||
|
|
||||||
|
s.html
|
||||||
|
restful-path-tail
|
||||||
|
.idea
|
1
vendor/github.com/emicklei/go-restful/v3/.goconvey
generated
vendored
Normal file
1
vendor/github.com/emicklei/go-restful/v3/.goconvey
generated
vendored
Normal file
@ -0,0 +1 @@
|
|||||||
|
ignore
|
13
vendor/github.com/emicklei/go-restful/v3/.travis.yml
generated
vendored
Normal file
13
vendor/github.com/emicklei/go-restful/v3/.travis.yml
generated
vendored
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
language: go
|
||||||
|
|
||||||
|
go:
|
||||||
|
- 1.x
|
||||||
|
|
||||||
|
before_install:
|
||||||
|
- go test -v
|
||||||
|
|
||||||
|
script:
|
||||||
|
- go test -race -coverprofile=coverage.txt -covermode=atomic
|
||||||
|
|
||||||
|
after_success:
|
||||||
|
- bash <(curl -s https://codecov.io/bash)
|
372
vendor/github.com/emicklei/go-restful/v3/CHANGES.md
generated
vendored
Normal file
372
vendor/github.com/emicklei/go-restful/v3/CHANGES.md
generated
vendored
Normal file
@ -0,0 +1,372 @@
|
|||||||
|
# Change history of go-restful
|
||||||
|
|
||||||
|
## [v3.8.0] - 20221-06-06
|
||||||
|
|
||||||
|
- use exact matching of allowed domain entries, issue #489 (#493)
|
||||||
|
- this changes fixes [security] Authorization Bypass Through User-Controlled Key
|
||||||
|
by changing the behaviour of the AllowedDomains setting in the CORS filter.
|
||||||
|
To support the previous behaviour, the CORS filter type now has a AllowedDomainFunc
|
||||||
|
callback mechanism which is called when a simple domain match fails.
|
||||||
|
- add test and fix for POST without body and Content-type, issue #492 (#496)
|
||||||
|
- [Minor] Bad practice to have a mix of Receiver types. (#491)
|
||||||
|
|
||||||
|
## [v3.7.2] - 2021-11-24
|
||||||
|
|
||||||
|
- restored FilterChain (#482 by SVilgelm)
|
||||||
|
|
||||||
|
|
||||||
|
## [v3.7.1] - 2021-10-04
|
||||||
|
|
||||||
|
- fix problem with contentEncodingEnabled setting (#479)
|
||||||
|
|
||||||
|
## [v3.7.0] - 2021-09-24
|
||||||
|
|
||||||
|
- feat(parameter): adds additional openapi mappings (#478)
|
||||||
|
|
||||||
|
## [v3.6.0] - 2021-09-18
|
||||||
|
|
||||||
|
- add support for vendor extensions (#477 thx erraggy)
|
||||||
|
|
||||||
|
## [v3.5.2] - 2021-07-14
|
||||||
|
|
||||||
|
- fix removing absent route from webservice (#472)
|
||||||
|
|
||||||
|
## [v3.5.1] - 2021-04-12
|
||||||
|
|
||||||
|
- fix handling no match access selected path
|
||||||
|
- remove obsolete field
|
||||||
|
|
||||||
|
## [v3.5.0] - 2021-04-10
|
||||||
|
|
||||||
|
- add check for wildcard (#463) in CORS
|
||||||
|
- add access to Route from Request, issue #459 (#462)
|
||||||
|
|
||||||
|
## [v3.4.0] - 2020-11-10
|
||||||
|
|
||||||
|
- Added OPTIONS to WebService
|
||||||
|
|
||||||
|
## [v3.3.2] - 2020-01-23
|
||||||
|
|
||||||
|
- Fixed duplicate compression in dispatch. #449
|
||||||
|
|
||||||
|
|
||||||
|
## [v3.3.1] - 2020-08-31
|
||||||
|
|
||||||
|
- Added check on writer to prevent compression of response twice. #447
|
||||||
|
|
||||||
|
## [v3.3.0] - 2020-08-19
|
||||||
|
|
||||||
|
- Enable content encoding on Handle and ServeHTTP (#446)
|
||||||
|
- List available representations in 406 body (#437)
|
||||||
|
- Convert to string using rune() (#443)
|
||||||
|
|
||||||
|
## [v3.2.0] - 2020-06-21
|
||||||
|
|
||||||
|
- 405 Method Not Allowed must have Allow header (#436) (thx Bracken <abdawson@gmail.com>)
|
||||||
|
- add field allowedMethodsWithoutContentType (#424)
|
||||||
|
|
||||||
|
## [v3.1.0]
|
||||||
|
|
||||||
|
- support describing response headers (#426)
|
||||||
|
- fix openapi examples (#425)
|
||||||
|
|
||||||
|
v3.0.0
|
||||||
|
|
||||||
|
- fix: use request/response resulting from filter chain
|
||||||
|
- add Go module
|
||||||
|
Module consumer should use github.com/emicklei/go-restful/v3 as import path
|
||||||
|
|
||||||
|
v2.10.0
|
||||||
|
|
||||||
|
- support for Custom Verbs (thanks Vinci Xu <277040271@qq.com>)
|
||||||
|
- fixed static example (thanks Arthur <yang_yapo@126.com>)
|
||||||
|
- simplify code (thanks Christian Muehlhaeuser <muesli@gmail.com>)
|
||||||
|
- added JWT HMAC with SHA-512 authentication code example (thanks Amim Knabben <amim.knabben@gmail.com>)
|
||||||
|
|
||||||
|
v2.9.6
|
||||||
|
|
||||||
|
- small optimization in filter code
|
||||||
|
|
||||||
|
v2.11.1
|
||||||
|
|
||||||
|
- fix WriteError return value (#415)
|
||||||
|
|
||||||
|
v2.11.0
|
||||||
|
|
||||||
|
- allow prefix and suffix in path variable expression (#414)
|
||||||
|
|
||||||
|
v2.9.6
|
||||||
|
|
||||||
|
- support google custome verb (#413)
|
||||||
|
|
||||||
|
v2.9.5
|
||||||
|
|
||||||
|
- fix panic in Response.WriteError if err == nil
|
||||||
|
|
||||||
|
v2.9.4
|
||||||
|
|
||||||
|
- fix issue #400 , parsing mime type quality
|
||||||
|
- Route Builder added option for contentEncodingEnabled (#398)
|
||||||
|
|
||||||
|
v2.9.3
|
||||||
|
|
||||||
|
- Avoid return of 415 Unsupported Media Type when request body is empty (#396)
|
||||||
|
|
||||||
|
v2.9.2
|
||||||
|
|
||||||
|
- Reduce allocations in per-request methods to improve performance (#395)
|
||||||
|
|
||||||
|
v2.9.1
|
||||||
|
|
||||||
|
- Fix issue with default responses and invalid status code 0. (#393)
|
||||||
|
|
||||||
|
v2.9.0
|
||||||
|
|
||||||
|
- add per Route content encoding setting (overrides container setting)
|
||||||
|
|
||||||
|
v2.8.0
|
||||||
|
|
||||||
|
- add Request.QueryParameters()
|
||||||
|
- add json-iterator (via build tag)
|
||||||
|
- disable vgo module (until log is moved)
|
||||||
|
|
||||||
|
v2.7.1
|
||||||
|
|
||||||
|
- add vgo module
|
||||||
|
|
||||||
|
v2.6.1
|
||||||
|
|
||||||
|
- add JSONNewDecoderFunc to allow custom JSON Decoder usage (go 1.10+)
|
||||||
|
|
||||||
|
v2.6.0
|
||||||
|
|
||||||
|
- Make JSR 311 routing and path param processing consistent
|
||||||
|
- Adding description to RouteBuilder.Reads()
|
||||||
|
- Update example for Swagger12 and OpenAPI
|
||||||
|
|
||||||
|
2017-09-13
|
||||||
|
|
||||||
|
- added route condition functions using `.If(func)` in route building.
|
||||||
|
|
||||||
|
2017-02-16
|
||||||
|
|
||||||
|
- solved issue #304, make operation names unique
|
||||||
|
|
||||||
|
2017-01-30
|
||||||
|
|
||||||
|
[IMPORTANT] For swagger users, change your import statement to:
|
||||||
|
swagger "github.com/emicklei/go-restful-swagger12"
|
||||||
|
|
||||||
|
- moved swagger 1.2 code to go-restful-swagger12
|
||||||
|
- created TAG 2.0.0
|
||||||
|
|
||||||
|
2017-01-27
|
||||||
|
|
||||||
|
- remove defer request body close
|
||||||
|
- expose Dispatch for testing filters and Routefunctions
|
||||||
|
- swagger response model cannot be array
|
||||||
|
- created TAG 1.0.0
|
||||||
|
|
||||||
|
2016-12-22
|
||||||
|
|
||||||
|
- (API change) Remove code related to caching request content. Removes SetCacheReadEntity(doCache bool)
|
||||||
|
|
||||||
|
2016-11-26
|
||||||
|
|
||||||
|
- Default change! now use CurlyRouter (was RouterJSR311)
|
||||||
|
- Default change! no more caching of request content
|
||||||
|
- Default change! do not recover from panics
|
||||||
|
|
||||||
|
2016-09-22
|
||||||
|
|
||||||
|
- fix the DefaultRequestContentType feature
|
||||||
|
|
||||||
|
2016-02-14
|
||||||
|
|
||||||
|
- take the qualify factor of the Accept header mediatype into account when deciding the contentype of the response
|
||||||
|
- add constructors for custom entity accessors for xml and json
|
||||||
|
|
||||||
|
2015-09-27
|
||||||
|
|
||||||
|
- rename new WriteStatusAnd... to WriteHeaderAnd... for consistency
|
||||||
|
|
||||||
|
2015-09-25
|
||||||
|
|
||||||
|
- fixed problem with changing Header after WriteHeader (issue 235)
|
||||||
|
|
||||||
|
2015-09-14
|
||||||
|
|
||||||
|
- changed behavior of WriteHeader (immediate write) and WriteEntity (no status write)
|
||||||
|
- added support for custom EntityReaderWriters.
|
||||||
|
|
||||||
|
2015-08-06
|
||||||
|
|
||||||
|
- add support for reading entities from compressed request content
|
||||||
|
- use sync.Pool for compressors of http response and request body
|
||||||
|
- add Description to Parameter for documentation in Swagger UI
|
||||||
|
|
||||||
|
2015-03-20
|
||||||
|
|
||||||
|
- add configurable logging
|
||||||
|
|
||||||
|
2015-03-18
|
||||||
|
|
||||||
|
- if not specified, the Operation is derived from the Route function
|
||||||
|
|
||||||
|
2015-03-17
|
||||||
|
|
||||||
|
- expose Parameter creation functions
|
||||||
|
- make trace logger an interface
|
||||||
|
- fix OPTIONSFilter
|
||||||
|
- customize rendering of ServiceError
|
||||||
|
- JSR311 router now handles wildcards
|
||||||
|
- add Notes to Route
|
||||||
|
|
||||||
|
2014-11-27
|
||||||
|
|
||||||
|
- (api add) PrettyPrint per response. (as proposed in #167)
|
||||||
|
|
||||||
|
2014-11-12
|
||||||
|
|
||||||
|
- (api add) ApiVersion(.) for documentation in Swagger UI
|
||||||
|
|
||||||
|
2014-11-10
|
||||||
|
|
||||||
|
- (api change) struct fields tagged with "description" show up in Swagger UI
|
||||||
|
|
||||||
|
2014-10-31
|
||||||
|
|
||||||
|
- (api change) ReturnsError -> Returns
|
||||||
|
- (api add) RouteBuilder.Do(aBuilder) for DRY use of RouteBuilder
|
||||||
|
- fix swagger nested structs
|
||||||
|
- sort Swagger response messages by code
|
||||||
|
|
||||||
|
2014-10-23
|
||||||
|
|
||||||
|
- (api add) ReturnsError allows you to document Http codes in swagger
|
||||||
|
- fixed problem with greedy CurlyRouter
|
||||||
|
- (api add) Access-Control-Max-Age in CORS
|
||||||
|
- add tracing functionality (injectable) for debugging purposes
|
||||||
|
- support JSON parse 64bit int
|
||||||
|
- fix empty parameters for swagger
|
||||||
|
- WebServicesUrl is now optional for swagger
|
||||||
|
- fixed duplicate AccessControlAllowOrigin in CORS
|
||||||
|
- (api change) expose ServeMux in container
|
||||||
|
- (api add) added AllowedDomains in CORS
|
||||||
|
- (api add) ParameterNamed for detailed documentation
|
||||||
|
|
||||||
|
2014-04-16
|
||||||
|
|
||||||
|
- (api add) expose constructor of Request for testing.
|
||||||
|
|
||||||
|
2014-06-27
|
||||||
|
|
||||||
|
- (api add) ParameterNamed gives access to a Parameter definition and its data (for further specification).
|
||||||
|
- (api add) SetCacheReadEntity allow scontrol over whether or not the request body is being cached (default true for compatibility reasons).
|
||||||
|
|
||||||
|
2014-07-03
|
||||||
|
|
||||||
|
- (api add) CORS can be configured with a list of allowed domains
|
||||||
|
|
||||||
|
2014-03-12
|
||||||
|
|
||||||
|
- (api add) Route path parameters can use wildcard or regular expressions. (requires CurlyRouter)
|
||||||
|
|
||||||
|
2014-02-26
|
||||||
|
|
||||||
|
- (api add) Request now provides information about the matched Route, see method SelectedRoutePath
|
||||||
|
|
||||||
|
2014-02-17
|
||||||
|
|
||||||
|
- (api change) renamed parameter constants (go-lint checks)
|
||||||
|
|
||||||
|
2014-01-10
|
||||||
|
|
||||||
|
- (api add) support for CloseNotify, see http://golang.org/pkg/net/http/#CloseNotifier
|
||||||
|
|
||||||
|
2014-01-07
|
||||||
|
|
||||||
|
- (api change) Write* methods in Response now return the error or nil.
|
||||||
|
- added example of serving HTML from a Go template.
|
||||||
|
- fixed comparing Allowed headers in CORS (is now case-insensitive)
|
||||||
|
|
||||||
|
2013-11-13
|
||||||
|
|
||||||
|
- (api add) Response knows how many bytes are written to the response body.
|
||||||
|
|
||||||
|
2013-10-29
|
||||||
|
|
||||||
|
- (api add) RecoverHandler(handler RecoverHandleFunction) to change how panic recovery is handled. Default behavior is to log and return a stacktrace. This may be a security issue as it exposes sourcecode information.
|
||||||
|
|
||||||
|
2013-10-04
|
||||||
|
|
||||||
|
- (api add) Response knows what HTTP status has been written
|
||||||
|
- (api add) Request can have attributes (map of string->interface, also called request-scoped variables
|
||||||
|
|
||||||
|
2013-09-12
|
||||||
|
|
||||||
|
- (api change) Router interface simplified
|
||||||
|
- Implemented CurlyRouter, a Router that does not use|allow regular expressions in paths
|
||||||
|
|
||||||
|
2013-08-05
|
||||||
|
- add OPTIONS support
|
||||||
|
- add CORS support
|
||||||
|
|
||||||
|
2013-08-27
|
||||||
|
|
||||||
|
- fixed some reported issues (see github)
|
||||||
|
- (api change) deprecated use of WriteError; use WriteErrorString instead
|
||||||
|
|
||||||
|
2014-04-15
|
||||||
|
|
||||||
|
- (fix) v1.0.1 tag: fix Issue 111: WriteErrorString
|
||||||
|
|
||||||
|
2013-08-08
|
||||||
|
|
||||||
|
- (api add) Added implementation Container: a WebServices collection with its own http.ServeMux allowing multiple endpoints per program. Existing uses of go-restful will register their services to the DefaultContainer.
|
||||||
|
- (api add) the swagger package has be extended to have a UI per container.
|
||||||
|
- if panic is detected then a small stack trace is printed (thanks to runner-mei)
|
||||||
|
- (api add) WriteErrorString to Response
|
||||||
|
|
||||||
|
Important API changes:
|
||||||
|
|
||||||
|
- (api remove) package variable DoNotRecover no longer works ; use restful.DefaultContainer.DoNotRecover(true) instead.
|
||||||
|
- (api remove) package variable EnableContentEncoding no longer works ; use restful.DefaultContainer.EnableContentEncoding(true) instead.
|
||||||
|
|
||||||
|
|
||||||
|
2013-07-06
|
||||||
|
|
||||||
|
- (api add) Added support for response encoding (gzip and deflate(zlib)). This feature is disabled on default (for backwards compatibility). Use restful.EnableContentEncoding = true in your initialization to enable this feature.
|
||||||
|
|
||||||
|
2013-06-19
|
||||||
|
|
||||||
|
- (improve) DoNotRecover option, moved request body closer, improved ReadEntity
|
||||||
|
|
||||||
|
2013-06-03
|
||||||
|
|
||||||
|
- (api change) removed Dispatcher interface, hide PathExpression
|
||||||
|
- changed receiver names of type functions to be more idiomatic Go
|
||||||
|
|
||||||
|
2013-06-02
|
||||||
|
|
||||||
|
- (optimize) Cache the RegExp compilation of Paths.
|
||||||
|
|
||||||
|
2013-05-22
|
||||||
|
|
||||||
|
- (api add) Added support for request/response filter functions
|
||||||
|
|
||||||
|
2013-05-18
|
||||||
|
|
||||||
|
|
||||||
|
- (api add) Added feature to change the default Http Request Dispatch function (travis cline)
|
||||||
|
- (api change) Moved Swagger Webservice to swagger package (see example restful-user)
|
||||||
|
|
||||||
|
[2012-11-14 .. 2013-05-18>
|
||||||
|
|
||||||
|
- See https://github.com/emicklei/go-restful/commits
|
||||||
|
|
||||||
|
2012-11-14
|
||||||
|
|
||||||
|
- Initial commit
|
||||||
|
|
||||||
|
|
22
vendor/github.com/emicklei/go-restful/v3/LICENSE
generated
vendored
Normal file
22
vendor/github.com/emicklei/go-restful/v3/LICENSE
generated
vendored
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
Copyright (c) 2012,2013 Ernest Micklei
|
||||||
|
|
||||||
|
MIT License
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining
|
||||||
|
a copy of this software and associated documentation files (the
|
||||||
|
"Software"), to deal in the Software without restriction, including
|
||||||
|
without limitation the rights to use, copy, modify, merge, publish,
|
||||||
|
distribute, sublicense, and/or sell copies of the Software, and to
|
||||||
|
permit persons to whom the Software is furnished to do so, subject to
|
||||||
|
the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be
|
||||||
|
included in all copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||||
|
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||||
|
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||||
|
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||||
|
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||||
|
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||||
|
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
8
vendor/github.com/emicklei/go-restful/v3/Makefile
generated
vendored
Normal file
8
vendor/github.com/emicklei/go-restful/v3/Makefile
generated
vendored
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
all: test
|
||||||
|
|
||||||
|
test:
|
||||||
|
go vet .
|
||||||
|
go test -cover -v .
|
||||||
|
|
||||||
|
ex:
|
||||||
|
find ./examples -type f -name "*.go" | xargs -I {} go build -o /tmp/ignore {}
|
110
vendor/github.com/emicklei/go-restful/v3/README.md
generated
vendored
Normal file
110
vendor/github.com/emicklei/go-restful/v3/README.md
generated
vendored
Normal file
@ -0,0 +1,110 @@
|
|||||||
|
go-restful
|
||||||
|
==========
|
||||||
|
package for building REST-style Web Services using Google Go
|
||||||
|
|
||||||
|
[](https://travis-ci.org/emicklei/go-restful)
|
||||||
|
[](https://goreportcard.com/report/github.com/emicklei/go-restful)
|
||||||
|
[](https://pkg.go.dev/github.com/emicklei/go-restful)
|
||||||
|
[](https://codecov.io/gh/emicklei/go-restful)
|
||||||
|
|
||||||
|
- [Code examples use v3](https://github.com/emicklei/go-restful/tree/v3/examples)
|
||||||
|
|
||||||
|
REST asks developers to use HTTP methods explicitly and in a way that's consistent with the protocol definition. This basic REST design principle establishes a one-to-one mapping between create, read, update, and delete (CRUD) operations and HTTP methods. According to this mapping:
|
||||||
|
|
||||||
|
- GET = Retrieve a representation of a resource
|
||||||
|
- POST = Create if you are sending content to the server to create a subordinate of the specified resource collection, using some server-side algorithm.
|
||||||
|
- PUT = Create if you are sending the full content of the specified resource (URI).
|
||||||
|
- PUT = Update if you are updating the full content of the specified resource.
|
||||||
|
- DELETE = Delete if you are requesting the server to delete the resource
|
||||||
|
- PATCH = Update partial content of a resource
|
||||||
|
- OPTIONS = Get information about the communication options for the request URI
|
||||||
|
|
||||||
|
### Usage
|
||||||
|
|
||||||
|
#### Without Go Modules
|
||||||
|
|
||||||
|
All versions up to `v2.*.*` (on the master) are not supporting Go modules.
|
||||||
|
|
||||||
|
```
|
||||||
|
import (
|
||||||
|
restful "github.com/emicklei/go-restful"
|
||||||
|
)
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Using Go Modules
|
||||||
|
|
||||||
|
As of version `v3.0.0` (on the v3 branch), this package supports Go modules.
|
||||||
|
|
||||||
|
```
|
||||||
|
import (
|
||||||
|
restful "github.com/emicklei/go-restful/v3"
|
||||||
|
)
|
||||||
|
```
|
||||||
|
|
||||||
|
### Example
|
||||||
|
|
||||||
|
```Go
|
||||||
|
ws := new(restful.WebService)
|
||||||
|
ws.
|
||||||
|
Path("/users").
|
||||||
|
Consumes(restful.MIME_XML, restful.MIME_JSON).
|
||||||
|
Produces(restful.MIME_JSON, restful.MIME_XML)
|
||||||
|
|
||||||
|
ws.Route(ws.GET("/{user-id}").To(u.findUser).
|
||||||
|
Doc("get a user").
|
||||||
|
Param(ws.PathParameter("user-id", "identifier of the user").DataType("string")).
|
||||||
|
Writes(User{}))
|
||||||
|
...
|
||||||
|
|
||||||
|
func (u UserResource) findUser(request *restful.Request, response *restful.Response) {
|
||||||
|
id := request.PathParameter("user-id")
|
||||||
|
...
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
[Full API of a UserResource](https://github.com/emicklei/go-restful/blob/v3/examples/user-resource/restful-user-resource.go)
|
||||||
|
|
||||||
|
### Features
|
||||||
|
|
||||||
|
- Routes for request → function mapping with path parameter (e.g. {id} but also prefix_{var} and {var}_suffix) support
|
||||||
|
- Configurable router:
|
||||||
|
- (default) Fast routing algorithm that allows static elements, [google custom method](https://cloud.google.com/apis/design/custom_methods), regular expressions and dynamic parameters in the URL path (e.g. /resource/name:customVerb, /meetings/{id} or /static/{subpath:*})
|
||||||
|
- Routing algorithm after [JSR311](http://jsr311.java.net/nonav/releases/1.1/spec/spec.html) that is implemented using (but does **not** accept) regular expressions
|
||||||
|
- Request API for reading structs from JSON/XML and accessing parameters (path,query,header)
|
||||||
|
- Response API for writing structs to JSON/XML and setting headers
|
||||||
|
- Customizable encoding using EntityReaderWriter registration
|
||||||
|
- Filters for intercepting the request → response flow on Service or Route level
|
||||||
|
- Request-scoped variables using attributes
|
||||||
|
- Containers for WebServices on different HTTP endpoints
|
||||||
|
- Content encoding (gzip,deflate) of request and response payloads
|
||||||
|
- Automatic responses on OPTIONS (using a filter)
|
||||||
|
- Automatic CORS request handling (using a filter)
|
||||||
|
- API declaration for Swagger UI ([go-restful-openapi](https://github.com/emicklei/go-restful-openapi), see [go-restful-swagger12](https://github.com/emicklei/go-restful-swagger12))
|
||||||
|
- Panic recovery to produce HTTP 500, customizable using RecoverHandler(...)
|
||||||
|
- Route errors produce HTTP 404/405/406/415 errors, customizable using ServiceErrorHandler(...)
|
||||||
|
- Configurable (trace) logging
|
||||||
|
- Customizable gzip/deflate readers and writers using CompressorProvider registration
|
||||||
|
|
||||||
|
## How to customize
|
||||||
|
There are several hooks to customize the behavior of the go-restful package.
|
||||||
|
|
||||||
|
- Router algorithm
|
||||||
|
- Panic recovery
|
||||||
|
- JSON decoder
|
||||||
|
- Trace logging
|
||||||
|
- Compression
|
||||||
|
- Encoders for other serializers
|
||||||
|
- Use [jsoniter](https://github.com/json-iterator/go) by build this package using a tag, e.g. `go build -tags=jsoniter .`
|
||||||
|
|
||||||
|
## Resources
|
||||||
|
|
||||||
|
- [Example programs](./examples)
|
||||||
|
- [Example posted on blog](http://ernestmicklei.com/2012/11/go-restful-first-working-example/)
|
||||||
|
- [Design explained on blog](http://ernestmicklei.com/2012/11/go-restful-api-design/)
|
||||||
|
- [sourcegraph](https://sourcegraph.com/github.com/emicklei/go-restful)
|
||||||
|
- [showcase: Zazkia - tcp proxy for testing resiliency](https://github.com/emicklei/zazkia)
|
||||||
|
- [showcase: Mora - MongoDB REST Api server](https://github.com/emicklei/mora)
|
||||||
|
|
||||||
|
Type ```git shortlog -s``` for a full list of contributors.
|
||||||
|
|
||||||
|
© 2012 - 2022, http://ernestmicklei.com. MIT License. Contributions are welcome.
|
13
vendor/github.com/emicklei/go-restful/v3/SECURITY.md
generated
vendored
Normal file
13
vendor/github.com/emicklei/go-restful/v3/SECURITY.md
generated
vendored
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
# Security Policy
|
||||||
|
|
||||||
|
## Supported Versions
|
||||||
|
|
||||||
|
| Version | Supported |
|
||||||
|
| ------- | ------------------ |
|
||||||
|
| v3.7.x | :white_check_mark: |
|
||||||
|
| < v3.0.1 | :x: |
|
||||||
|
|
||||||
|
## Reporting a Vulnerability
|
||||||
|
|
||||||
|
Create an Issue and put the label `[security]` in the title of the issue.
|
||||||
|
Valid reported security issues are expected to be solved within a week.
|
1
vendor/github.com/emicklei/go-restful/v3/Srcfile
generated
vendored
Normal file
1
vendor/github.com/emicklei/go-restful/v3/Srcfile
generated
vendored
Normal file
@ -0,0 +1 @@
|
|||||||
|
{"SkipDirs": ["examples"]}
|
10
vendor/github.com/emicklei/go-restful/v3/bench_test.sh
generated
vendored
Normal file
10
vendor/github.com/emicklei/go-restful/v3/bench_test.sh
generated
vendored
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
#go test -run=none -file bench_test.go -test.bench . -cpuprofile=bench_test.out
|
||||||
|
|
||||||
|
go test -c
|
||||||
|
./go-restful.test -test.run=none -test.cpuprofile=tmp.prof -test.bench=BenchmarkMany
|
||||||
|
./go-restful.test -test.run=none -test.cpuprofile=curly.prof -test.bench=BenchmarkManyCurly
|
||||||
|
|
||||||
|
#go tool pprof go-restful.test tmp.prof
|
||||||
|
go tool pprof go-restful.test curly.prof
|
||||||
|
|
||||||
|
|
127
vendor/github.com/emicklei/go-restful/v3/compress.go
generated
vendored
Normal file
127
vendor/github.com/emicklei/go-restful/v3/compress.go
generated
vendored
Normal file
@ -0,0 +1,127 @@
|
|||||||
|
package restful
|
||||||
|
|
||||||
|
// Copyright 2013 Ernest Micklei. All rights reserved.
|
||||||
|
// Use of this source code is governed by a license
|
||||||
|
// that can be found in the LICENSE file.
|
||||||
|
|
||||||
|
import (
|
||||||
|
"bufio"
|
||||||
|
"compress/gzip"
|
||||||
|
"compress/zlib"
|
||||||
|
"errors"
|
||||||
|
"io"
|
||||||
|
"net"
|
||||||
|
"net/http"
|
||||||
|
"strings"
|
||||||
|
)
|
||||||
|
|
||||||
|
// OBSOLETE : use restful.DefaultContainer.EnableContentEncoding(true) to change this setting.
|
||||||
|
var EnableContentEncoding = false
|
||||||
|
|
||||||
|
// CompressingResponseWriter is a http.ResponseWriter that can perform content encoding (gzip and zlib)
|
||||||
|
type CompressingResponseWriter struct {
|
||||||
|
writer http.ResponseWriter
|
||||||
|
compressor io.WriteCloser
|
||||||
|
encoding string
|
||||||
|
}
|
||||||
|
|
||||||
|
// Header is part of http.ResponseWriter interface
|
||||||
|
func (c *CompressingResponseWriter) Header() http.Header {
|
||||||
|
return c.writer.Header()
|
||||||
|
}
|
||||||
|
|
||||||
|
// WriteHeader is part of http.ResponseWriter interface
|
||||||
|
func (c *CompressingResponseWriter) WriteHeader(status int) {
|
||||||
|
c.writer.WriteHeader(status)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Write is part of http.ResponseWriter interface
|
||||||
|
// It is passed through the compressor
|
||||||
|
func (c *CompressingResponseWriter) Write(bytes []byte) (int, error) {
|
||||||
|
if c.isCompressorClosed() {
|
||||||
|
return -1, errors.New("Compressing error: tried to write data using closed compressor")
|
||||||
|
}
|
||||||
|
return c.compressor.Write(bytes)
|
||||||
|
}
|
||||||
|
|
||||||
|
// CloseNotify is part of http.CloseNotifier interface
|
||||||
|
func (c *CompressingResponseWriter) CloseNotify() <-chan bool {
|
||||||
|
return c.writer.(http.CloseNotifier).CloseNotify()
|
||||||
|
}
|
||||||
|
|
||||||
|
// Close the underlying compressor
|
||||||
|
func (c *CompressingResponseWriter) Close() error {
|
||||||
|
if c.isCompressorClosed() {
|
||||||
|
return errors.New("Compressing error: tried to close already closed compressor")
|
||||||
|
}
|
||||||
|
|
||||||
|
c.compressor.Close()
|
||||||
|
if ENCODING_GZIP == c.encoding {
|
||||||
|
currentCompressorProvider.ReleaseGzipWriter(c.compressor.(*gzip.Writer))
|
||||||
|
}
|
||||||
|
if ENCODING_DEFLATE == c.encoding {
|
||||||
|
currentCompressorProvider.ReleaseZlibWriter(c.compressor.(*zlib.Writer))
|
||||||
|
}
|
||||||
|
// gc hint needed?
|
||||||
|
c.compressor = nil
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *CompressingResponseWriter) isCompressorClosed() bool {
|
||||||
|
return nil == c.compressor
|
||||||
|
}
|
||||||
|
|
||||||
|
// Hijack implements the Hijacker interface
|
||||||
|
// This is especially useful when combining Container.EnabledContentEncoding
|
||||||
|
// in combination with websockets (for instance gorilla/websocket)
|
||||||
|
func (c *CompressingResponseWriter) Hijack() (net.Conn, *bufio.ReadWriter, error) {
|
||||||
|
hijacker, ok := c.writer.(http.Hijacker)
|
||||||
|
if !ok {
|
||||||
|
return nil, nil, errors.New("ResponseWriter doesn't support Hijacker interface")
|
||||||
|
}
|
||||||
|
return hijacker.Hijack()
|
||||||
|
}
|
||||||
|
|
||||||
|
// WantsCompressedResponse reads the Accept-Encoding header to see if and which encoding is requested.
|
||||||
|
// It also inspects the httpWriter whether its content-encoding is already set (non-empty).
|
||||||
|
func wantsCompressedResponse(httpRequest *http.Request, httpWriter http.ResponseWriter) (bool, string) {
|
||||||
|
if contentEncoding := httpWriter.Header().Get(HEADER_ContentEncoding); contentEncoding != "" {
|
||||||
|
return false, ""
|
||||||
|
}
|
||||||
|
header := httpRequest.Header.Get(HEADER_AcceptEncoding)
|
||||||
|
gi := strings.Index(header, ENCODING_GZIP)
|
||||||
|
zi := strings.Index(header, ENCODING_DEFLATE)
|
||||||
|
// use in order of appearance
|
||||||
|
if gi == -1 {
|
||||||
|
return zi != -1, ENCODING_DEFLATE
|
||||||
|
} else if zi == -1 {
|
||||||
|
return gi != -1, ENCODING_GZIP
|
||||||
|
} else {
|
||||||
|
if gi < zi {
|
||||||
|
return true, ENCODING_GZIP
|
||||||
|
}
|
||||||
|
return true, ENCODING_DEFLATE
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewCompressingResponseWriter create a CompressingResponseWriter for a known encoding = {gzip,deflate}
|
||||||
|
func NewCompressingResponseWriter(httpWriter http.ResponseWriter, encoding string) (*CompressingResponseWriter, error) {
|
||||||
|
httpWriter.Header().Set(HEADER_ContentEncoding, encoding)
|
||||||
|
c := new(CompressingResponseWriter)
|
||||||
|
c.writer = httpWriter
|
||||||
|
var err error
|
||||||
|
if ENCODING_GZIP == encoding {
|
||||||
|
w := currentCompressorProvider.AcquireGzipWriter()
|
||||||
|
w.Reset(httpWriter)
|
||||||
|
c.compressor = w
|
||||||
|
c.encoding = ENCODING_GZIP
|
||||||
|
} else if ENCODING_DEFLATE == encoding {
|
||||||
|
w := currentCompressorProvider.AcquireZlibWriter()
|
||||||
|
w.Reset(httpWriter)
|
||||||
|
c.compressor = w
|
||||||
|
c.encoding = ENCODING_DEFLATE
|
||||||
|
} else {
|
||||||
|
return nil, errors.New("Unknown encoding:" + encoding)
|
||||||
|
}
|
||||||
|
return c, err
|
||||||
|
}
|
103
vendor/github.com/emicklei/go-restful/v3/compressor_cache.go
generated
vendored
Normal file
103
vendor/github.com/emicklei/go-restful/v3/compressor_cache.go
generated
vendored
Normal file
@ -0,0 +1,103 @@
|
|||||||
|
package restful
|
||||||
|
|
||||||
|
// Copyright 2015 Ernest Micklei. All rights reserved.
|
||||||
|
// Use of this source code is governed by a license
|
||||||
|
// that can be found in the LICENSE file.
|
||||||
|
|
||||||
|
import (
|
||||||
|
"compress/gzip"
|
||||||
|
"compress/zlib"
|
||||||
|
)
|
||||||
|
|
||||||
|
// BoundedCachedCompressors is a CompressorProvider that uses a cache with a fixed amount
|
||||||
|
// of writers and readers (resources).
|
||||||
|
// If a new resource is acquired and all are in use, it will return a new unmanaged resource.
|
||||||
|
type BoundedCachedCompressors struct {
|
||||||
|
gzipWriters chan *gzip.Writer
|
||||||
|
gzipReaders chan *gzip.Reader
|
||||||
|
zlibWriters chan *zlib.Writer
|
||||||
|
writersCapacity int
|
||||||
|
readersCapacity int
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewBoundedCachedCompressors returns a new, with filled cache, BoundedCachedCompressors.
|
||||||
|
func NewBoundedCachedCompressors(writersCapacity, readersCapacity int) *BoundedCachedCompressors {
|
||||||
|
b := &BoundedCachedCompressors{
|
||||||
|
gzipWriters: make(chan *gzip.Writer, writersCapacity),
|
||||||
|
gzipReaders: make(chan *gzip.Reader, readersCapacity),
|
||||||
|
zlibWriters: make(chan *zlib.Writer, writersCapacity),
|
||||||
|
writersCapacity: writersCapacity,
|
||||||
|
readersCapacity: readersCapacity,
|
||||||
|
}
|
||||||
|
for ix := 0; ix < writersCapacity; ix++ {
|
||||||
|
b.gzipWriters <- newGzipWriter()
|
||||||
|
b.zlibWriters <- newZlibWriter()
|
||||||
|
}
|
||||||
|
for ix := 0; ix < readersCapacity; ix++ {
|
||||||
|
b.gzipReaders <- newGzipReader()
|
||||||
|
}
|
||||||
|
return b
|
||||||
|
}
|
||||||
|
|
||||||
|
// AcquireGzipWriter returns an resettable *gzip.Writer. Needs to be released.
|
||||||
|
func (b *BoundedCachedCompressors) AcquireGzipWriter() *gzip.Writer {
|
||||||
|
var writer *gzip.Writer
|
||||||
|
select {
|
||||||
|
case writer, _ = <-b.gzipWriters:
|
||||||
|
default:
|
||||||
|
// return a new unmanaged one
|
||||||
|
writer = newGzipWriter()
|
||||||
|
}
|
||||||
|
return writer
|
||||||
|
}
|
||||||
|
|
||||||
|
// ReleaseGzipWriter accepts a writer (does not have to be one that was cached)
|
||||||
|
// only when the cache has room for it. It will ignore it otherwise.
|
||||||
|
func (b *BoundedCachedCompressors) ReleaseGzipWriter(w *gzip.Writer) {
|
||||||
|
// forget the unmanaged ones
|
||||||
|
if len(b.gzipWriters) < b.writersCapacity {
|
||||||
|
b.gzipWriters <- w
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// AcquireGzipReader returns a *gzip.Reader. Needs to be released.
|
||||||
|
func (b *BoundedCachedCompressors) AcquireGzipReader() *gzip.Reader {
|
||||||
|
var reader *gzip.Reader
|
||||||
|
select {
|
||||||
|
case reader, _ = <-b.gzipReaders:
|
||||||
|
default:
|
||||||
|
// return a new unmanaged one
|
||||||
|
reader = newGzipReader()
|
||||||
|
}
|
||||||
|
return reader
|
||||||
|
}
|
||||||
|
|
||||||
|
// ReleaseGzipReader accepts a reader (does not have to be one that was cached)
|
||||||
|
// only when the cache has room for it. It will ignore it otherwise.
|
||||||
|
func (b *BoundedCachedCompressors) ReleaseGzipReader(r *gzip.Reader) {
|
||||||
|
// forget the unmanaged ones
|
||||||
|
if len(b.gzipReaders) < b.readersCapacity {
|
||||||
|
b.gzipReaders <- r
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// AcquireZlibWriter returns an resettable *zlib.Writer. Needs to be released.
|
||||||
|
func (b *BoundedCachedCompressors) AcquireZlibWriter() *zlib.Writer {
|
||||||
|
var writer *zlib.Writer
|
||||||
|
select {
|
||||||
|
case writer, _ = <-b.zlibWriters:
|
||||||
|
default:
|
||||||
|
// return a new unmanaged one
|
||||||
|
writer = newZlibWriter()
|
||||||
|
}
|
||||||
|
return writer
|
||||||
|
}
|
||||||
|
|
||||||
|
// ReleaseZlibWriter accepts a writer (does not have to be one that was cached)
|
||||||
|
// only when the cache has room for it. It will ignore it otherwise.
|
||||||
|
func (b *BoundedCachedCompressors) ReleaseZlibWriter(w *zlib.Writer) {
|
||||||
|
// forget the unmanaged ones
|
||||||
|
if len(b.zlibWriters) < b.writersCapacity {
|
||||||
|
b.zlibWriters <- w
|
||||||
|
}
|
||||||
|
}
|
91
vendor/github.com/emicklei/go-restful/v3/compressor_pools.go
generated
vendored
Normal file
91
vendor/github.com/emicklei/go-restful/v3/compressor_pools.go
generated
vendored
Normal file
@ -0,0 +1,91 @@
|
|||||||
|
package restful
|
||||||
|
|
||||||
|
// Copyright 2015 Ernest Micklei. All rights reserved.
|
||||||
|
// Use of this source code is governed by a license
|
||||||
|
// that can be found in the LICENSE file.
|
||||||
|
|
||||||
|
import (
|
||||||
|
"bytes"
|
||||||
|
"compress/gzip"
|
||||||
|
"compress/zlib"
|
||||||
|
"sync"
|
||||||
|
)
|
||||||
|
|
||||||
|
// SyncPoolCompessors is a CompressorProvider that use the standard sync.Pool.
|
||||||
|
type SyncPoolCompessors struct {
|
||||||
|
GzipWriterPool *sync.Pool
|
||||||
|
GzipReaderPool *sync.Pool
|
||||||
|
ZlibWriterPool *sync.Pool
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewSyncPoolCompessors returns a new ("empty") SyncPoolCompessors.
|
||||||
|
func NewSyncPoolCompessors() *SyncPoolCompessors {
|
||||||
|
return &SyncPoolCompessors{
|
||||||
|
GzipWriterPool: &sync.Pool{
|
||||||
|
New: func() interface{} { return newGzipWriter() },
|
||||||
|
},
|
||||||
|
GzipReaderPool: &sync.Pool{
|
||||||
|
New: func() interface{} { return newGzipReader() },
|
||||||
|
},
|
||||||
|
ZlibWriterPool: &sync.Pool{
|
||||||
|
New: func() interface{} { return newZlibWriter() },
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *SyncPoolCompessors) AcquireGzipWriter() *gzip.Writer {
|
||||||
|
return s.GzipWriterPool.Get().(*gzip.Writer)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *SyncPoolCompessors) ReleaseGzipWriter(w *gzip.Writer) {
|
||||||
|
s.GzipWriterPool.Put(w)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *SyncPoolCompessors) AcquireGzipReader() *gzip.Reader {
|
||||||
|
return s.GzipReaderPool.Get().(*gzip.Reader)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *SyncPoolCompessors) ReleaseGzipReader(r *gzip.Reader) {
|
||||||
|
s.GzipReaderPool.Put(r)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *SyncPoolCompessors) AcquireZlibWriter() *zlib.Writer {
|
||||||
|
return s.ZlibWriterPool.Get().(*zlib.Writer)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *SyncPoolCompessors) ReleaseZlibWriter(w *zlib.Writer) {
|
||||||
|
s.ZlibWriterPool.Put(w)
|
||||||
|
}
|
||||||
|
|
||||||
|
func newGzipWriter() *gzip.Writer {
|
||||||
|
// create with an empty bytes writer; it will be replaced before using the gzipWriter
|
||||||
|
writer, err := gzip.NewWriterLevel(new(bytes.Buffer), gzip.BestSpeed)
|
||||||
|
if err != nil {
|
||||||
|
panic(err.Error())
|
||||||
|
}
|
||||||
|
return writer
|
||||||
|
}
|
||||||
|
|
||||||
|
func newGzipReader() *gzip.Reader {
|
||||||
|
// create with an empty reader (but with GZIP header); it will be replaced before using the gzipReader
|
||||||
|
// we can safely use currentCompressProvider because it is set on package initialization.
|
||||||
|
w := currentCompressorProvider.AcquireGzipWriter()
|
||||||
|
defer currentCompressorProvider.ReleaseGzipWriter(w)
|
||||||
|
b := new(bytes.Buffer)
|
||||||
|
w.Reset(b)
|
||||||
|
w.Flush()
|
||||||
|
w.Close()
|
||||||
|
reader, err := gzip.NewReader(bytes.NewReader(b.Bytes()))
|
||||||
|
if err != nil {
|
||||||
|
panic(err.Error())
|
||||||
|
}
|
||||||
|
return reader
|
||||||
|
}
|
||||||
|
|
||||||
|
func newZlibWriter() *zlib.Writer {
|
||||||
|
writer, err := zlib.NewWriterLevel(new(bytes.Buffer), gzip.BestSpeed)
|
||||||
|
if err != nil {
|
||||||
|
panic(err.Error())
|
||||||
|
}
|
||||||
|
return writer
|
||||||
|
}
|
54
vendor/github.com/emicklei/go-restful/v3/compressors.go
generated
vendored
Normal file
54
vendor/github.com/emicklei/go-restful/v3/compressors.go
generated
vendored
Normal file
@ -0,0 +1,54 @@
|
|||||||
|
package restful
|
||||||
|
|
||||||
|
// Copyright 2015 Ernest Micklei. All rights reserved.
|
||||||
|
// Use of this source code is governed by a license
|
||||||
|
// that can be found in the LICENSE file.
|
||||||
|
|
||||||
|
import (
|
||||||
|
"compress/gzip"
|
||||||
|
"compress/zlib"
|
||||||
|
)
|
||||||
|
|
||||||
|
// CompressorProvider describes a component that can provider compressors for the std methods.
|
||||||
|
type CompressorProvider interface {
|
||||||
|
// Returns a *gzip.Writer which needs to be released later.
|
||||||
|
// Before using it, call Reset().
|
||||||
|
AcquireGzipWriter() *gzip.Writer
|
||||||
|
|
||||||
|
// Releases an acquired *gzip.Writer.
|
||||||
|
ReleaseGzipWriter(w *gzip.Writer)
|
||||||
|
|
||||||
|
// Returns a *gzip.Reader which needs to be released later.
|
||||||
|
AcquireGzipReader() *gzip.Reader
|
||||||
|
|
||||||
|
// Releases an acquired *gzip.Reader.
|
||||||
|
ReleaseGzipReader(w *gzip.Reader)
|
||||||
|
|
||||||
|
// Returns a *zlib.Writer which needs to be released later.
|
||||||
|
// Before using it, call Reset().
|
||||||
|
AcquireZlibWriter() *zlib.Writer
|
||||||
|
|
||||||
|
// Releases an acquired *zlib.Writer.
|
||||||
|
ReleaseZlibWriter(w *zlib.Writer)
|
||||||
|
}
|
||||||
|
|
||||||
|
// DefaultCompressorProvider is the actual provider of compressors (zlib or gzip).
|
||||||
|
var currentCompressorProvider CompressorProvider
|
||||||
|
|
||||||
|
func init() {
|
||||||
|
currentCompressorProvider = NewSyncPoolCompessors()
|
||||||
|
}
|
||||||
|
|
||||||
|
// CurrentCompressorProvider returns the current CompressorProvider.
|
||||||
|
// It is initialized using a SyncPoolCompessors.
|
||||||
|
func CurrentCompressorProvider() CompressorProvider {
|
||||||
|
return currentCompressorProvider
|
||||||
|
}
|
||||||
|
|
||||||
|
// SetCompressorProvider sets the actual provider of compressors (zlib or gzip).
|
||||||
|
func SetCompressorProvider(p CompressorProvider) {
|
||||||
|
if p == nil {
|
||||||
|
panic("cannot set compressor provider to nil")
|
||||||
|
}
|
||||||
|
currentCompressorProvider = p
|
||||||
|
}
|
30
vendor/github.com/emicklei/go-restful/v3/constants.go
generated
vendored
Normal file
30
vendor/github.com/emicklei/go-restful/v3/constants.go
generated
vendored
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
package restful
|
||||||
|
|
||||||
|
// Copyright 2013 Ernest Micklei. All rights reserved.
|
||||||
|
// Use of this source code is governed by a license
|
||||||
|
// that can be found in the LICENSE file.
|
||||||
|
|
||||||
|
const (
|
||||||
|
MIME_XML = "application/xml" // Accept or Content-Type used in Consumes() and/or Produces()
|
||||||
|
MIME_JSON = "application/json" // Accept or Content-Type used in Consumes() and/or Produces()
|
||||||
|
MIME_OCTET = "application/octet-stream" // If Content-Type is not present in request, use the default
|
||||||
|
|
||||||
|
HEADER_Allow = "Allow"
|
||||||
|
HEADER_Accept = "Accept"
|
||||||
|
HEADER_Origin = "Origin"
|
||||||
|
HEADER_ContentType = "Content-Type"
|
||||||
|
HEADER_LastModified = "Last-Modified"
|
||||||
|
HEADER_AcceptEncoding = "Accept-Encoding"
|
||||||
|
HEADER_ContentEncoding = "Content-Encoding"
|
||||||
|
HEADER_AccessControlExposeHeaders = "Access-Control-Expose-Headers"
|
||||||
|
HEADER_AccessControlRequestMethod = "Access-Control-Request-Method"
|
||||||
|
HEADER_AccessControlRequestHeaders = "Access-Control-Request-Headers"
|
||||||
|
HEADER_AccessControlAllowMethods = "Access-Control-Allow-Methods"
|
||||||
|
HEADER_AccessControlAllowOrigin = "Access-Control-Allow-Origin"
|
||||||
|
HEADER_AccessControlAllowCredentials = "Access-Control-Allow-Credentials"
|
||||||
|
HEADER_AccessControlAllowHeaders = "Access-Control-Allow-Headers"
|
||||||
|
HEADER_AccessControlMaxAge = "Access-Control-Max-Age"
|
||||||
|
|
||||||
|
ENCODING_GZIP = "gzip"
|
||||||
|
ENCODING_DEFLATE = "deflate"
|
||||||
|
)
|
450
vendor/github.com/emicklei/go-restful/v3/container.go
generated
vendored
Normal file
450
vendor/github.com/emicklei/go-restful/v3/container.go
generated
vendored
Normal file
@ -0,0 +1,450 @@
|
|||||||
|
package restful
|
||||||
|
|
||||||
|
// Copyright 2013 Ernest Micklei. All rights reserved.
|
||||||
|
// Use of this source code is governed by a license
|
||||||
|
// that can be found in the LICENSE file.
|
||||||
|
|
||||||
|
import (
|
||||||
|
"bytes"
|
||||||
|
"errors"
|
||||||
|
"fmt"
|
||||||
|
"net/http"
|
||||||
|
"os"
|
||||||
|
"runtime"
|
||||||
|
"strings"
|
||||||
|
"sync"
|
||||||
|
|
||||||
|
"github.com/emicklei/go-restful/v3/log"
|
||||||
|
)
|
||||||
|
|
||||||
|
// Container holds a collection of WebServices and a http.ServeMux to dispatch http requests.
|
||||||
|
// The requests are further dispatched to routes of WebServices using a RouteSelector
|
||||||
|
type Container struct {
|
||||||
|
webServicesLock sync.RWMutex
|
||||||
|
webServices []*WebService
|
||||||
|
ServeMux *http.ServeMux
|
||||||
|
isRegisteredOnRoot bool
|
||||||
|
containerFilters []FilterFunction
|
||||||
|
doNotRecover bool // default is true
|
||||||
|
recoverHandleFunc RecoverHandleFunction
|
||||||
|
serviceErrorHandleFunc ServiceErrorHandleFunction
|
||||||
|
router RouteSelector // default is a CurlyRouter (RouterJSR311 is a slower alternative)
|
||||||
|
contentEncodingEnabled bool // default is false
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewContainer creates a new Container using a new ServeMux and default router (CurlyRouter)
|
||||||
|
func NewContainer() *Container {
|
||||||
|
return &Container{
|
||||||
|
webServices: []*WebService{},
|
||||||
|
ServeMux: http.NewServeMux(),
|
||||||
|
isRegisteredOnRoot: false,
|
||||||
|
containerFilters: []FilterFunction{},
|
||||||
|
doNotRecover: true,
|
||||||
|
recoverHandleFunc: logStackOnRecover,
|
||||||
|
serviceErrorHandleFunc: writeServiceError,
|
||||||
|
router: CurlyRouter{},
|
||||||
|
contentEncodingEnabled: false}
|
||||||
|
}
|
||||||
|
|
||||||
|
// RecoverHandleFunction declares functions that can be used to handle a panic situation.
|
||||||
|
// The first argument is what recover() returns. The second must be used to communicate an error response.
|
||||||
|
type RecoverHandleFunction func(interface{}, http.ResponseWriter)
|
||||||
|
|
||||||
|
// RecoverHandler changes the default function (logStackOnRecover) to be called
|
||||||
|
// when a panic is detected. DoNotRecover must be have its default value (=false).
|
||||||
|
func (c *Container) RecoverHandler(handler RecoverHandleFunction) {
|
||||||
|
c.recoverHandleFunc = handler
|
||||||
|
}
|
||||||
|
|
||||||
|
// ServiceErrorHandleFunction declares functions that can be used to handle a service error situation.
|
||||||
|
// The first argument is the service error, the second is the request that resulted in the error and
|
||||||
|
// the third must be used to communicate an error response.
|
||||||
|
type ServiceErrorHandleFunction func(ServiceError, *Request, *Response)
|
||||||
|
|
||||||
|
// ServiceErrorHandler changes the default function (writeServiceError) to be called
|
||||||
|
// when a ServiceError is detected.
|
||||||
|
func (c *Container) ServiceErrorHandler(handler ServiceErrorHandleFunction) {
|
||||||
|
c.serviceErrorHandleFunc = handler
|
||||||
|
}
|
||||||
|
|
||||||
|
// DoNotRecover controls whether panics will be caught to return HTTP 500.
|
||||||
|
// If set to true, Route functions are responsible for handling any error situation.
|
||||||
|
// Default value is true.
|
||||||
|
func (c *Container) DoNotRecover(doNot bool) {
|
||||||
|
c.doNotRecover = doNot
|
||||||
|
}
|
||||||
|
|
||||||
|
// Router changes the default Router (currently CurlyRouter)
|
||||||
|
func (c *Container) Router(aRouter RouteSelector) {
|
||||||
|
c.router = aRouter
|
||||||
|
}
|
||||||
|
|
||||||
|
// EnableContentEncoding (default=false) allows for GZIP or DEFLATE encoding of responses.
|
||||||
|
func (c *Container) EnableContentEncoding(enabled bool) {
|
||||||
|
c.contentEncodingEnabled = enabled
|
||||||
|
}
|
||||||
|
|
||||||
|
// Add a WebService to the Container. It will detect duplicate root paths and exit in that case.
|
||||||
|
func (c *Container) Add(service *WebService) *Container {
|
||||||
|
c.webServicesLock.Lock()
|
||||||
|
defer c.webServicesLock.Unlock()
|
||||||
|
|
||||||
|
// if rootPath was not set then lazy initialize it
|
||||||
|
if len(service.rootPath) == 0 {
|
||||||
|
service.Path("/")
|
||||||
|
}
|
||||||
|
|
||||||
|
// cannot have duplicate root paths
|
||||||
|
for _, each := range c.webServices {
|
||||||
|
if each.RootPath() == service.RootPath() {
|
||||||
|
log.Printf("WebService with duplicate root path detected:['%v']", each)
|
||||||
|
os.Exit(1)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// If not registered on root then add specific mapping
|
||||||
|
if !c.isRegisteredOnRoot {
|
||||||
|
c.isRegisteredOnRoot = c.addHandler(service, c.ServeMux)
|
||||||
|
}
|
||||||
|
c.webServices = append(c.webServices, service)
|
||||||
|
return c
|
||||||
|
}
|
||||||
|
|
||||||
|
// addHandler may set a new HandleFunc for the serveMux
|
||||||
|
// this function must run inside the critical region protected by the webServicesLock.
|
||||||
|
// returns true if the function was registered on root ("/")
|
||||||
|
func (c *Container) addHandler(service *WebService, serveMux *http.ServeMux) bool {
|
||||||
|
pattern := fixedPrefixPath(service.RootPath())
|
||||||
|
// check if root path registration is needed
|
||||||
|
if "/" == pattern || "" == pattern {
|
||||||
|
serveMux.HandleFunc("/", c.dispatch)
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
// detect if registration already exists
|
||||||
|
alreadyMapped := false
|
||||||
|
for _, each := range c.webServices {
|
||||||
|
if each.RootPath() == service.RootPath() {
|
||||||
|
alreadyMapped = true
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if !alreadyMapped {
|
||||||
|
serveMux.HandleFunc(pattern, c.dispatch)
|
||||||
|
if !strings.HasSuffix(pattern, "/") {
|
||||||
|
serveMux.HandleFunc(pattern+"/", c.dispatch)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *Container) Remove(ws *WebService) error {
|
||||||
|
if c.ServeMux == http.DefaultServeMux {
|
||||||
|
errMsg := fmt.Sprintf("cannot remove a WebService from a Container using the DefaultServeMux: ['%v']", ws)
|
||||||
|
log.Print(errMsg)
|
||||||
|
return errors.New(errMsg)
|
||||||
|
}
|
||||||
|
c.webServicesLock.Lock()
|
||||||
|
defer c.webServicesLock.Unlock()
|
||||||
|
// build a new ServeMux and re-register all WebServices
|
||||||
|
newServeMux := http.NewServeMux()
|
||||||
|
newServices := []*WebService{}
|
||||||
|
newIsRegisteredOnRoot := false
|
||||||
|
for _, each := range c.webServices {
|
||||||
|
if each.rootPath != ws.rootPath {
|
||||||
|
// If not registered on root then add specific mapping
|
||||||
|
if !newIsRegisteredOnRoot {
|
||||||
|
newIsRegisteredOnRoot = c.addHandler(each, newServeMux)
|
||||||
|
}
|
||||||
|
newServices = append(newServices, each)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
c.webServices, c.ServeMux, c.isRegisteredOnRoot = newServices, newServeMux, newIsRegisteredOnRoot
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// logStackOnRecover is the default RecoverHandleFunction and is called
|
||||||
|
// when DoNotRecover is false and the recoverHandleFunc is not set for the container.
|
||||||
|
// Default implementation logs the stacktrace and writes the stacktrace on the response.
|
||||||
|
// This may be a security issue as it exposes sourcecode information.
|
||||||
|
func logStackOnRecover(panicReason interface{}, httpWriter http.ResponseWriter) {
|
||||||
|
var buffer bytes.Buffer
|
||||||
|
buffer.WriteString(fmt.Sprintf("recover from panic situation: - %v\r\n", panicReason))
|
||||||
|
for i := 2; ; i += 1 {
|
||||||
|
_, file, line, ok := runtime.Caller(i)
|
||||||
|
if !ok {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
buffer.WriteString(fmt.Sprintf(" %s:%d\r\n", file, line))
|
||||||
|
}
|
||||||
|
log.Print(buffer.String())
|
||||||
|
httpWriter.WriteHeader(http.StatusInternalServerError)
|
||||||
|
httpWriter.Write(buffer.Bytes())
|
||||||
|
}
|
||||||
|
|
||||||
|
// writeServiceError is the default ServiceErrorHandleFunction and is called
|
||||||
|
// when a ServiceError is returned during route selection. Default implementation
|
||||||
|
// calls resp.WriteErrorString(err.Code, err.Message)
|
||||||
|
func writeServiceError(err ServiceError, req *Request, resp *Response) {
|
||||||
|
for header, values := range err.Header {
|
||||||
|
for _, value := range values {
|
||||||
|
resp.Header().Add(header, value)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
resp.WriteErrorString(err.Code, err.Message)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Dispatch the incoming Http Request to a matching WebService.
|
||||||
|
func (c *Container) Dispatch(httpWriter http.ResponseWriter, httpRequest *http.Request) {
|
||||||
|
if httpWriter == nil {
|
||||||
|
panic("httpWriter cannot be nil")
|
||||||
|
}
|
||||||
|
if httpRequest == nil {
|
||||||
|
panic("httpRequest cannot be nil")
|
||||||
|
}
|
||||||
|
c.dispatch(httpWriter, httpRequest)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Dispatch the incoming Http Request to a matching WebService.
|
||||||
|
func (c *Container) dispatch(httpWriter http.ResponseWriter, httpRequest *http.Request) {
|
||||||
|
// so we can assign a compressing one later
|
||||||
|
writer := httpWriter
|
||||||
|
|
||||||
|
// CompressingResponseWriter should be closed after all operations are done
|
||||||
|
defer func() {
|
||||||
|
if compressWriter, ok := writer.(*CompressingResponseWriter); ok {
|
||||||
|
compressWriter.Close()
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
|
||||||
|
// Instal panic recovery unless told otherwise
|
||||||
|
if !c.doNotRecover { // catch all for 500 response
|
||||||
|
defer func() {
|
||||||
|
if r := recover(); r != nil {
|
||||||
|
c.recoverHandleFunc(r, writer)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
}
|
||||||
|
|
||||||
|
// Find best match Route ; err is non nil if no match was found
|
||||||
|
var webService *WebService
|
||||||
|
var route *Route
|
||||||
|
var err error
|
||||||
|
func() {
|
||||||
|
c.webServicesLock.RLock()
|
||||||
|
defer c.webServicesLock.RUnlock()
|
||||||
|
webService, route, err = c.router.SelectRoute(
|
||||||
|
c.webServices,
|
||||||
|
httpRequest)
|
||||||
|
}()
|
||||||
|
if err != nil {
|
||||||
|
// a non-200 response (may be compressed) has already been written
|
||||||
|
// run container filters anyway ; they should not touch the response...
|
||||||
|
chain := FilterChain{Filters: c.containerFilters, Target: func(req *Request, resp *Response) {
|
||||||
|
switch err.(type) {
|
||||||
|
case ServiceError:
|
||||||
|
ser := err.(ServiceError)
|
||||||
|
c.serviceErrorHandleFunc(ser, req, resp)
|
||||||
|
}
|
||||||
|
// TODO
|
||||||
|
}}
|
||||||
|
chain.ProcessFilter(NewRequest(httpRequest), NewResponse(writer))
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// Unless httpWriter is already an CompressingResponseWriter see if we need to install one
|
||||||
|
if _, isCompressing := httpWriter.(*CompressingResponseWriter); !isCompressing {
|
||||||
|
// Detect if compression is needed
|
||||||
|
// assume without compression, test for override
|
||||||
|
contentEncodingEnabled := c.contentEncodingEnabled
|
||||||
|
if route != nil && route.contentEncodingEnabled != nil {
|
||||||
|
contentEncodingEnabled = *route.contentEncodingEnabled
|
||||||
|
}
|
||||||
|
if contentEncodingEnabled {
|
||||||
|
doCompress, encoding := wantsCompressedResponse(httpRequest, httpWriter)
|
||||||
|
if doCompress {
|
||||||
|
var err error
|
||||||
|
writer, err = NewCompressingResponseWriter(httpWriter, encoding)
|
||||||
|
if err != nil {
|
||||||
|
log.Print("unable to install compressor: ", err)
|
||||||
|
httpWriter.WriteHeader(http.StatusInternalServerError)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pathProcessor, routerProcessesPath := c.router.(PathProcessor)
|
||||||
|
if !routerProcessesPath {
|
||||||
|
pathProcessor = defaultPathProcessor{}
|
||||||
|
}
|
||||||
|
pathParams := pathProcessor.ExtractParameters(route, webService, httpRequest.URL.Path)
|
||||||
|
wrappedRequest, wrappedResponse := route.wrapRequestResponse(writer, httpRequest, pathParams)
|
||||||
|
// pass through filters (if any)
|
||||||
|
if size := len(c.containerFilters) + len(webService.filters) + len(route.Filters); size > 0 {
|
||||||
|
// compose filter chain
|
||||||
|
allFilters := make([]FilterFunction, 0, size)
|
||||||
|
allFilters = append(allFilters, c.containerFilters...)
|
||||||
|
allFilters = append(allFilters, webService.filters...)
|
||||||
|
allFilters = append(allFilters, route.Filters...)
|
||||||
|
chain := FilterChain{
|
||||||
|
Filters: allFilters,
|
||||||
|
Target: route.Function,
|
||||||
|
ParameterDocs: route.ParameterDocs,
|
||||||
|
Operation: route.Operation,
|
||||||
|
}
|
||||||
|
chain.ProcessFilter(wrappedRequest, wrappedResponse)
|
||||||
|
} else {
|
||||||
|
// no filters, handle request by route
|
||||||
|
route.Function(wrappedRequest, wrappedResponse)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// fixedPrefixPath returns the fixed part of the partspec ; it may include template vars {}
|
||||||
|
func fixedPrefixPath(pathspec string) string {
|
||||||
|
varBegin := strings.Index(pathspec, "{")
|
||||||
|
if -1 == varBegin {
|
||||||
|
return pathspec
|
||||||
|
}
|
||||||
|
return pathspec[:varBegin]
|
||||||
|
}
|
||||||
|
|
||||||
|
// ServeHTTP implements net/http.Handler therefore a Container can be a Handler in a http.Server
|
||||||
|
func (c *Container) ServeHTTP(httpWriter http.ResponseWriter, httpRequest *http.Request) {
|
||||||
|
// Skip, if content encoding is disabled
|
||||||
|
if !c.contentEncodingEnabled {
|
||||||
|
c.ServeMux.ServeHTTP(httpWriter, httpRequest)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
// content encoding is enabled
|
||||||
|
|
||||||
|
// Skip, if httpWriter is already an CompressingResponseWriter
|
||||||
|
if _, ok := httpWriter.(*CompressingResponseWriter); ok {
|
||||||
|
c.ServeMux.ServeHTTP(httpWriter, httpRequest)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
writer := httpWriter
|
||||||
|
// CompressingResponseWriter should be closed after all operations are done
|
||||||
|
defer func() {
|
||||||
|
if compressWriter, ok := writer.(*CompressingResponseWriter); ok {
|
||||||
|
compressWriter.Close()
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
|
||||||
|
doCompress, encoding := wantsCompressedResponse(httpRequest, httpWriter)
|
||||||
|
if doCompress {
|
||||||
|
var err error
|
||||||
|
writer, err = NewCompressingResponseWriter(httpWriter, encoding)
|
||||||
|
if err != nil {
|
||||||
|
log.Print("unable to install compressor: ", err)
|
||||||
|
httpWriter.WriteHeader(http.StatusInternalServerError)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
c.ServeMux.ServeHTTP(writer, httpRequest)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Handle registers the handler for the given pattern. If a handler already exists for pattern, Handle panics.
|
||||||
|
func (c *Container) Handle(pattern string, handler http.Handler) {
|
||||||
|
c.ServeMux.Handle(pattern, http.HandlerFunc(func(httpWriter http.ResponseWriter, httpRequest *http.Request) {
|
||||||
|
// Skip, if httpWriter is already an CompressingResponseWriter
|
||||||
|
if _, ok := httpWriter.(*CompressingResponseWriter); ok {
|
||||||
|
handler.ServeHTTP(httpWriter, httpRequest)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
writer := httpWriter
|
||||||
|
|
||||||
|
// CompressingResponseWriter should be closed after all operations are done
|
||||||
|
defer func() {
|
||||||
|
if compressWriter, ok := writer.(*CompressingResponseWriter); ok {
|
||||||
|
compressWriter.Close()
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
|
||||||
|
if c.contentEncodingEnabled {
|
||||||
|
doCompress, encoding := wantsCompressedResponse(httpRequest, httpWriter)
|
||||||
|
if doCompress {
|
||||||
|
var err error
|
||||||
|
writer, err = NewCompressingResponseWriter(httpWriter, encoding)
|
||||||
|
if err != nil {
|
||||||
|
log.Print("unable to install compressor: ", err)
|
||||||
|
httpWriter.WriteHeader(http.StatusInternalServerError)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
handler.ServeHTTP(writer, httpRequest)
|
||||||
|
}))
|
||||||
|
}
|
||||||
|
|
||||||
|
// HandleWithFilter registers the handler for the given pattern.
|
||||||
|
// Container's filter chain is applied for handler.
|
||||||
|
// If a handler already exists for pattern, HandleWithFilter panics.
|
||||||
|
func (c *Container) HandleWithFilter(pattern string, handler http.Handler) {
|
||||||
|
f := func(httpResponse http.ResponseWriter, httpRequest *http.Request) {
|
||||||
|
if len(c.containerFilters) == 0 {
|
||||||
|
handler.ServeHTTP(httpResponse, httpRequest)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
chain := FilterChain{Filters: c.containerFilters, Target: func(req *Request, resp *Response) {
|
||||||
|
handler.ServeHTTP(resp, req.Request)
|
||||||
|
}}
|
||||||
|
chain.ProcessFilter(NewRequest(httpRequest), NewResponse(httpResponse))
|
||||||
|
}
|
||||||
|
|
||||||
|
c.Handle(pattern, http.HandlerFunc(f))
|
||||||
|
}
|
||||||
|
|
||||||
|
// Filter appends a container FilterFunction. These are called before dispatching
|
||||||
|
// a http.Request to a WebService from the container
|
||||||
|
func (c *Container) Filter(filter FilterFunction) {
|
||||||
|
c.containerFilters = append(c.containerFilters, filter)
|
||||||
|
}
|
||||||
|
|
||||||
|
// RegisteredWebServices returns the collections of added WebServices
|
||||||
|
func (c *Container) RegisteredWebServices() []*WebService {
|
||||||
|
c.webServicesLock.RLock()
|
||||||
|
defer c.webServicesLock.RUnlock()
|
||||||
|
result := make([]*WebService, len(c.webServices))
|
||||||
|
for ix := range c.webServices {
|
||||||
|
result[ix] = c.webServices[ix]
|
||||||
|
}
|
||||||
|
return result
|
||||||
|
}
|
||||||
|
|
||||||
|
// computeAllowedMethods returns a list of HTTP methods that are valid for a Request
|
||||||
|
func (c *Container) computeAllowedMethods(req *Request) []string {
|
||||||
|
// Go through all RegisteredWebServices() and all its Routes to collect the options
|
||||||
|
methods := []string{}
|
||||||
|
requestPath := req.Request.URL.Path
|
||||||
|
for _, ws := range c.RegisteredWebServices() {
|
||||||
|
matches := ws.pathExpr.Matcher.FindStringSubmatch(requestPath)
|
||||||
|
if matches != nil {
|
||||||
|
finalMatch := matches[len(matches)-1]
|
||||||
|
for _, rt := range ws.Routes() {
|
||||||
|
matches := rt.pathExpr.Matcher.FindStringSubmatch(finalMatch)
|
||||||
|
if matches != nil {
|
||||||
|
lastMatch := matches[len(matches)-1]
|
||||||
|
if lastMatch == "" || lastMatch == "/" { // do not include if value is neither empty nor ‘/’.
|
||||||
|
methods = append(methods, rt.Method)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// methods = append(methods, "OPTIONS") not sure about this
|
||||||
|
return methods
|
||||||
|
}
|
||||||
|
|
||||||
|
// newBasicRequestResponse creates a pair of Request,Response from its http versions.
|
||||||
|
// It is basic because no parameter or (produces) content-type information is given.
|
||||||
|
func newBasicRequestResponse(httpWriter http.ResponseWriter, httpRequest *http.Request) (*Request, *Response) {
|
||||||
|
resp := NewResponse(httpWriter)
|
||||||
|
resp.requestAccept = httpRequest.Header.Get(HEADER_Accept)
|
||||||
|
return NewRequest(httpRequest), resp
|
||||||
|
}
|
193
vendor/github.com/emicklei/go-restful/v3/cors_filter.go
generated
vendored
Normal file
193
vendor/github.com/emicklei/go-restful/v3/cors_filter.go
generated
vendored
Normal file
@ -0,0 +1,193 @@
|
|||||||
|
package restful
|
||||||
|
|
||||||
|
// Copyright 2013 Ernest Micklei. All rights reserved.
|
||||||
|
// Use of this source code is governed by a license
|
||||||
|
// that can be found in the LICENSE file.
|
||||||
|
|
||||||
|
import (
|
||||||
|
"regexp"
|
||||||
|
"strconv"
|
||||||
|
"strings"
|
||||||
|
)
|
||||||
|
|
||||||
|
// CrossOriginResourceSharing is used to create a Container Filter that implements CORS.
|
||||||
|
// Cross-origin resource sharing (CORS) is a mechanism that allows JavaScript on a web page
|
||||||
|
// to make XMLHttpRequests to another domain, not the domain the JavaScript originated from.
|
||||||
|
//
|
||||||
|
// http://en.wikipedia.org/wiki/Cross-origin_resource_sharing
|
||||||
|
// http://enable-cors.org/server.html
|
||||||
|
// http://www.html5rocks.com/en/tutorials/cors/#toc-handling-a-not-so-simple-request
|
||||||
|
type CrossOriginResourceSharing struct {
|
||||||
|
ExposeHeaders []string // list of Header names
|
||||||
|
|
||||||
|
// AllowedHeaders is alist of Header names. Checking is case-insensitive.
|
||||||
|
// The list may contain the special wildcard string ".*" ; all is allowed
|
||||||
|
AllowedHeaders []string
|
||||||
|
|
||||||
|
// AllowedDomains is a list of allowed values for Http Origin.
|
||||||
|
// The list may contain the special wildcard string ".*" ; all is allowed
|
||||||
|
// If empty all are allowed.
|
||||||
|
AllowedDomains []string
|
||||||
|
|
||||||
|
// AllowedDomainFunc is optional and is a function that will do the check
|
||||||
|
// when the origin is not part of the AllowedDomains and it does not contain the wildcard ".*".
|
||||||
|
AllowedDomainFunc func(origin string) bool
|
||||||
|
|
||||||
|
// AllowedMethods is either empty or has a list of http methods names. Checking is case-insensitive.
|
||||||
|
AllowedMethods []string
|
||||||
|
MaxAge int // number of seconds before requiring new Options request
|
||||||
|
CookiesAllowed bool
|
||||||
|
Container *Container
|
||||||
|
|
||||||
|
allowedOriginPatterns []*regexp.Regexp // internal field for origin regexp check.
|
||||||
|
}
|
||||||
|
|
||||||
|
// Filter is a filter function that implements the CORS flow as documented on http://enable-cors.org/server.html
|
||||||
|
// and http://www.html5rocks.com/static/images/cors_server_flowchart.png
|
||||||
|
func (c CrossOriginResourceSharing) Filter(req *Request, resp *Response, chain *FilterChain) {
|
||||||
|
origin := req.Request.Header.Get(HEADER_Origin)
|
||||||
|
if len(origin) == 0 {
|
||||||
|
if trace {
|
||||||
|
traceLogger.Print("no Http header Origin set")
|
||||||
|
}
|
||||||
|
chain.ProcessFilter(req, resp)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if !c.isOriginAllowed(origin) { // check whether this origin is allowed
|
||||||
|
if trace {
|
||||||
|
traceLogger.Printf("HTTP Origin:%s is not part of %v, neither matches any part of %v", origin, c.AllowedDomains, c.allowedOriginPatterns)
|
||||||
|
}
|
||||||
|
chain.ProcessFilter(req, resp)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if req.Request.Method != "OPTIONS" {
|
||||||
|
c.doActualRequest(req, resp)
|
||||||
|
chain.ProcessFilter(req, resp)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if acrm := req.Request.Header.Get(HEADER_AccessControlRequestMethod); acrm != "" {
|
||||||
|
c.doPreflightRequest(req, resp)
|
||||||
|
} else {
|
||||||
|
c.doActualRequest(req, resp)
|
||||||
|
chain.ProcessFilter(req, resp)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c CrossOriginResourceSharing) doActualRequest(req *Request, resp *Response) {
|
||||||
|
c.setOptionsHeaders(req, resp)
|
||||||
|
// continue processing the response
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *CrossOriginResourceSharing) doPreflightRequest(req *Request, resp *Response) {
|
||||||
|
if len(c.AllowedMethods) == 0 {
|
||||||
|
if c.Container == nil {
|
||||||
|
c.AllowedMethods = DefaultContainer.computeAllowedMethods(req)
|
||||||
|
} else {
|
||||||
|
c.AllowedMethods = c.Container.computeAllowedMethods(req)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
acrm := req.Request.Header.Get(HEADER_AccessControlRequestMethod)
|
||||||
|
if !c.isValidAccessControlRequestMethod(acrm, c.AllowedMethods) {
|
||||||
|
if trace {
|
||||||
|
traceLogger.Printf("Http header %s:%s is not in %v",
|
||||||
|
HEADER_AccessControlRequestMethod,
|
||||||
|
acrm,
|
||||||
|
c.AllowedMethods)
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
acrhs := req.Request.Header.Get(HEADER_AccessControlRequestHeaders)
|
||||||
|
if len(acrhs) > 0 {
|
||||||
|
for _, each := range strings.Split(acrhs, ",") {
|
||||||
|
if !c.isValidAccessControlRequestHeader(strings.Trim(each, " ")) {
|
||||||
|
if trace {
|
||||||
|
traceLogger.Printf("Http header %s:%s is not in %v",
|
||||||
|
HEADER_AccessControlRequestHeaders,
|
||||||
|
acrhs,
|
||||||
|
c.AllowedHeaders)
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
resp.AddHeader(HEADER_AccessControlAllowMethods, strings.Join(c.AllowedMethods, ","))
|
||||||
|
resp.AddHeader(HEADER_AccessControlAllowHeaders, acrhs)
|
||||||
|
c.setOptionsHeaders(req, resp)
|
||||||
|
|
||||||
|
// return http 200 response, no body
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c CrossOriginResourceSharing) setOptionsHeaders(req *Request, resp *Response) {
|
||||||
|
c.checkAndSetExposeHeaders(resp)
|
||||||
|
c.setAllowOriginHeader(req, resp)
|
||||||
|
c.checkAndSetAllowCredentials(resp)
|
||||||
|
if c.MaxAge > 0 {
|
||||||
|
resp.AddHeader(HEADER_AccessControlMaxAge, strconv.Itoa(c.MaxAge))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c CrossOriginResourceSharing) isOriginAllowed(origin string) bool {
|
||||||
|
if len(origin) == 0 {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
lowerOrigin := strings.ToLower(origin)
|
||||||
|
if len(c.AllowedDomains) == 0 {
|
||||||
|
if c.AllowedDomainFunc != nil {
|
||||||
|
return c.AllowedDomainFunc(lowerOrigin)
|
||||||
|
}
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
// exact match on each allowed domain
|
||||||
|
for _, domain := range c.AllowedDomains {
|
||||||
|
if domain == ".*" || strings.ToLower(domain) == lowerOrigin {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if c.AllowedDomainFunc != nil {
|
||||||
|
return c.AllowedDomainFunc(origin)
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c CrossOriginResourceSharing) setAllowOriginHeader(req *Request, resp *Response) {
|
||||||
|
origin := req.Request.Header.Get(HEADER_Origin)
|
||||||
|
if c.isOriginAllowed(origin) {
|
||||||
|
resp.AddHeader(HEADER_AccessControlAllowOrigin, origin)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c CrossOriginResourceSharing) checkAndSetExposeHeaders(resp *Response) {
|
||||||
|
if len(c.ExposeHeaders) > 0 {
|
||||||
|
resp.AddHeader(HEADER_AccessControlExposeHeaders, strings.Join(c.ExposeHeaders, ","))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c CrossOriginResourceSharing) checkAndSetAllowCredentials(resp *Response) {
|
||||||
|
if c.CookiesAllowed {
|
||||||
|
resp.AddHeader(HEADER_AccessControlAllowCredentials, "true")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c CrossOriginResourceSharing) isValidAccessControlRequestMethod(method string, allowedMethods []string) bool {
|
||||||
|
for _, each := range allowedMethods {
|
||||||
|
if each == method {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c CrossOriginResourceSharing) isValidAccessControlRequestHeader(header string) bool {
|
||||||
|
for _, each := range c.AllowedHeaders {
|
||||||
|
if strings.ToLower(each) == strings.ToLower(header) {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
if each == "*" {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
2
vendor/github.com/emicklei/go-restful/v3/coverage.sh
generated
vendored
Normal file
2
vendor/github.com/emicklei/go-restful/v3/coverage.sh
generated
vendored
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
go test -coverprofile=coverage.out
|
||||||
|
go tool cover -html=coverage.out
|
173
vendor/github.com/emicklei/go-restful/v3/curly.go
generated
vendored
Normal file
173
vendor/github.com/emicklei/go-restful/v3/curly.go
generated
vendored
Normal file
@ -0,0 +1,173 @@
|
|||||||
|
package restful
|
||||||
|
|
||||||
|
// Copyright 2013 Ernest Micklei. All rights reserved.
|
||||||
|
// Use of this source code is governed by a license
|
||||||
|
// that can be found in the LICENSE file.
|
||||||
|
|
||||||
|
import (
|
||||||
|
"net/http"
|
||||||
|
"regexp"
|
||||||
|
"sort"
|
||||||
|
"strings"
|
||||||
|
)
|
||||||
|
|
||||||
|
// CurlyRouter expects Routes with paths that contain zero or more parameters in curly brackets.
|
||||||
|
type CurlyRouter struct{}
|
||||||
|
|
||||||
|
// SelectRoute is part of the Router interface and returns the best match
|
||||||
|
// for the WebService and its Route for the given Request.
|
||||||
|
func (c CurlyRouter) SelectRoute(
|
||||||
|
webServices []*WebService,
|
||||||
|
httpRequest *http.Request) (selectedService *WebService, selected *Route, err error) {
|
||||||
|
|
||||||
|
requestTokens := tokenizePath(httpRequest.URL.Path)
|
||||||
|
|
||||||
|
detectedService := c.detectWebService(requestTokens, webServices)
|
||||||
|
if detectedService == nil {
|
||||||
|
if trace {
|
||||||
|
traceLogger.Printf("no WebService was found to match URL path:%s\n", httpRequest.URL.Path)
|
||||||
|
}
|
||||||
|
return nil, nil, NewError(http.StatusNotFound, "404: Page Not Found")
|
||||||
|
}
|
||||||
|
candidateRoutes := c.selectRoutes(detectedService, requestTokens)
|
||||||
|
if len(candidateRoutes) == 0 {
|
||||||
|
if trace {
|
||||||
|
traceLogger.Printf("no Route in WebService with path %s was found to match URL path:%s\n", detectedService.rootPath, httpRequest.URL.Path)
|
||||||
|
}
|
||||||
|
return detectedService, nil, NewError(http.StatusNotFound, "404: Page Not Found")
|
||||||
|
}
|
||||||
|
selectedRoute, err := c.detectRoute(candidateRoutes, httpRequest)
|
||||||
|
if selectedRoute == nil {
|
||||||
|
return detectedService, nil, err
|
||||||
|
}
|
||||||
|
return detectedService, selectedRoute, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// selectRoutes return a collection of Route from a WebService that matches the path tokens from the request.
|
||||||
|
func (c CurlyRouter) selectRoutes(ws *WebService, requestTokens []string) sortableCurlyRoutes {
|
||||||
|
candidates := make(sortableCurlyRoutes, 0, 8)
|
||||||
|
for _, each := range ws.routes {
|
||||||
|
matches, paramCount, staticCount := c.matchesRouteByPathTokens(each.pathParts, requestTokens, each.hasCustomVerb)
|
||||||
|
if matches {
|
||||||
|
candidates.add(curlyRoute{each, paramCount, staticCount}) // TODO make sure Routes() return pointers?
|
||||||
|
}
|
||||||
|
}
|
||||||
|
sort.Sort(candidates)
|
||||||
|
return candidates
|
||||||
|
}
|
||||||
|
|
||||||
|
// matchesRouteByPathTokens computes whether it matches, howmany parameters do match and what the number of static path elements are.
|
||||||
|
func (c CurlyRouter) matchesRouteByPathTokens(routeTokens, requestTokens []string, routeHasCustomVerb bool) (matches bool, paramCount int, staticCount int) {
|
||||||
|
if len(routeTokens) < len(requestTokens) {
|
||||||
|
// proceed in matching only if last routeToken is wildcard
|
||||||
|
count := len(routeTokens)
|
||||||
|
if count == 0 || !strings.HasSuffix(routeTokens[count-1], "*}") {
|
||||||
|
return false, 0, 0
|
||||||
|
}
|
||||||
|
// proceed
|
||||||
|
}
|
||||||
|
for i, routeToken := range routeTokens {
|
||||||
|
if i == len(requestTokens) {
|
||||||
|
// reached end of request path
|
||||||
|
return false, 0, 0
|
||||||
|
}
|
||||||
|
requestToken := requestTokens[i]
|
||||||
|
if routeHasCustomVerb && hasCustomVerb(routeToken){
|
||||||
|
if !isMatchCustomVerb(routeToken, requestToken) {
|
||||||
|
return false, 0, 0
|
||||||
|
}
|
||||||
|
staticCount++
|
||||||
|
requestToken = removeCustomVerb(requestToken)
|
||||||
|
routeToken = removeCustomVerb(routeToken)
|
||||||
|
}
|
||||||
|
|
||||||
|
if strings.HasPrefix(routeToken, "{") {
|
||||||
|
paramCount++
|
||||||
|
if colon := strings.Index(routeToken, ":"); colon != -1 {
|
||||||
|
// match by regex
|
||||||
|
matchesToken, matchesRemainder := c.regularMatchesPathToken(routeToken, colon, requestToken)
|
||||||
|
if !matchesToken {
|
||||||
|
return false, 0, 0
|
||||||
|
}
|
||||||
|
if matchesRemainder {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else { // no { prefix
|
||||||
|
if requestToken != routeToken {
|
||||||
|
return false, 0, 0
|
||||||
|
}
|
||||||
|
staticCount++
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true, paramCount, staticCount
|
||||||
|
}
|
||||||
|
|
||||||
|
// regularMatchesPathToken tests whether the regular expression part of routeToken matches the requestToken or all remaining tokens
|
||||||
|
// format routeToken is {someVar:someExpression}, e.g. {zipcode:[\d][\d][\d][\d][A-Z][A-Z]}
|
||||||
|
func (c CurlyRouter) regularMatchesPathToken(routeToken string, colon int, requestToken string) (matchesToken bool, matchesRemainder bool) {
|
||||||
|
regPart := routeToken[colon+1 : len(routeToken)-1]
|
||||||
|
if regPart == "*" {
|
||||||
|
if trace {
|
||||||
|
traceLogger.Printf("wildcard parameter detected in route token %s that matches %s\n", routeToken, requestToken)
|
||||||
|
}
|
||||||
|
return true, true
|
||||||
|
}
|
||||||
|
matched, err := regexp.MatchString(regPart, requestToken)
|
||||||
|
return (matched && err == nil), false
|
||||||
|
}
|
||||||
|
|
||||||
|
var jsr311Router = RouterJSR311{}
|
||||||
|
|
||||||
|
// detectRoute selectes from a list of Route the first match by inspecting both the Accept and Content-Type
|
||||||
|
// headers of the Request. See also RouterJSR311 in jsr311.go
|
||||||
|
func (c CurlyRouter) detectRoute(candidateRoutes sortableCurlyRoutes, httpRequest *http.Request) (*Route, error) {
|
||||||
|
// tracing is done inside detectRoute
|
||||||
|
return jsr311Router.detectRoute(candidateRoutes.routes(), httpRequest)
|
||||||
|
}
|
||||||
|
|
||||||
|
// detectWebService returns the best matching webService given the list of path tokens.
|
||||||
|
// see also computeWebserviceScore
|
||||||
|
func (c CurlyRouter) detectWebService(requestTokens []string, webServices []*WebService) *WebService {
|
||||||
|
var best *WebService
|
||||||
|
score := -1
|
||||||
|
for _, each := range webServices {
|
||||||
|
matches, eachScore := c.computeWebserviceScore(requestTokens, each.pathExpr.tokens)
|
||||||
|
if matches && (eachScore > score) {
|
||||||
|
best = each
|
||||||
|
score = eachScore
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return best
|
||||||
|
}
|
||||||
|
|
||||||
|
// computeWebserviceScore returns whether tokens match and
|
||||||
|
// the weighted score of the longest matching consecutive tokens from the beginning.
|
||||||
|
func (c CurlyRouter) computeWebserviceScore(requestTokens []string, tokens []string) (bool, int) {
|
||||||
|
if len(tokens) > len(requestTokens) {
|
||||||
|
return false, 0
|
||||||
|
}
|
||||||
|
score := 0
|
||||||
|
for i := 0; i < len(tokens); i++ {
|
||||||
|
each := requestTokens[i]
|
||||||
|
other := tokens[i]
|
||||||
|
if len(each) == 0 && len(other) == 0 {
|
||||||
|
score++
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
if len(other) > 0 && strings.HasPrefix(other, "{") {
|
||||||
|
// no empty match
|
||||||
|
if len(each) == 0 {
|
||||||
|
return false, score
|
||||||
|
}
|
||||||
|
score += 1
|
||||||
|
} else {
|
||||||
|
// not a parameter
|
||||||
|
if each != other {
|
||||||
|
return false, score
|
||||||
|
}
|
||||||
|
score += (len(tokens) - i) * 10 //fuzzy
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true, score
|
||||||
|
}
|
54
vendor/github.com/emicklei/go-restful/v3/curly_route.go
generated
vendored
Normal file
54
vendor/github.com/emicklei/go-restful/v3/curly_route.go
generated
vendored
Normal file
@ -0,0 +1,54 @@
|
|||||||
|
package restful
|
||||||
|
|
||||||
|
// Copyright 2013 Ernest Micklei. All rights reserved.
|
||||||
|
// Use of this source code is governed by a license
|
||||||
|
// that can be found in the LICENSE file.
|
||||||
|
|
||||||
|
// curlyRoute exits for sorting Routes by the CurlyRouter based on number of parameters and number of static path elements.
|
||||||
|
type curlyRoute struct {
|
||||||
|
route Route
|
||||||
|
paramCount int
|
||||||
|
staticCount int
|
||||||
|
}
|
||||||
|
|
||||||
|
// sortableCurlyRoutes orders by most parameters and path elements first.
|
||||||
|
type sortableCurlyRoutes []curlyRoute
|
||||||
|
|
||||||
|
func (s *sortableCurlyRoutes) add(route curlyRoute) {
|
||||||
|
*s = append(*s, route)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s sortableCurlyRoutes) routes() (routes []Route) {
|
||||||
|
routes = make([]Route, 0, len(s))
|
||||||
|
for _, each := range s {
|
||||||
|
routes = append(routes, each.route) // TODO change return type
|
||||||
|
}
|
||||||
|
return routes
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s sortableCurlyRoutes) Len() int {
|
||||||
|
return len(s)
|
||||||
|
}
|
||||||
|
func (s sortableCurlyRoutes) Swap(i, j int) {
|
||||||
|
s[i], s[j] = s[j], s[i]
|
||||||
|
}
|
||||||
|
func (s sortableCurlyRoutes) Less(i, j int) bool {
|
||||||
|
a := s[j]
|
||||||
|
b := s[i]
|
||||||
|
|
||||||
|
// primary key
|
||||||
|
if a.staticCount < b.staticCount {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
if a.staticCount > b.staticCount {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
// secundary key
|
||||||
|
if a.paramCount < b.paramCount {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
if a.paramCount > b.paramCount {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
return a.route.Path < b.route.Path
|
||||||
|
}
|
29
vendor/github.com/emicklei/go-restful/v3/custom_verb.go
generated
vendored
Normal file
29
vendor/github.com/emicklei/go-restful/v3/custom_verb.go
generated
vendored
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
package restful
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"regexp"
|
||||||
|
)
|
||||||
|
|
||||||
|
var (
|
||||||
|
customVerbReg = regexp.MustCompile(":([A-Za-z]+)$")
|
||||||
|
)
|
||||||
|
|
||||||
|
func hasCustomVerb(routeToken string) bool {
|
||||||
|
return customVerbReg.MatchString(routeToken)
|
||||||
|
}
|
||||||
|
|
||||||
|
func isMatchCustomVerb(routeToken string, pathToken string) bool {
|
||||||
|
rs := customVerbReg.FindStringSubmatch(routeToken)
|
||||||
|
if len(rs) < 2 {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
customVerb := rs[1]
|
||||||
|
specificVerbReg := regexp.MustCompile(fmt.Sprintf(":%s$", customVerb))
|
||||||
|
return specificVerbReg.MatchString(pathToken)
|
||||||
|
}
|
||||||
|
|
||||||
|
func removeCustomVerb(str string) string {
|
||||||
|
return customVerbReg.ReplaceAllString(str, "")
|
||||||
|
}
|
185
vendor/github.com/emicklei/go-restful/v3/doc.go
generated
vendored
Normal file
185
vendor/github.com/emicklei/go-restful/v3/doc.go
generated
vendored
Normal file
@ -0,0 +1,185 @@
|
|||||||
|
/*
|
||||||
|
Package restful , a lean package for creating REST-style WebServices without magic.
|
||||||
|
|
||||||
|
WebServices and Routes
|
||||||
|
|
||||||
|
A WebService has a collection of Route objects that dispatch incoming Http Requests to a function calls.
|
||||||
|
Typically, a WebService has a root path (e.g. /users) and defines common MIME types for its routes.
|
||||||
|
WebServices must be added to a container (see below) in order to handler Http requests from a server.
|
||||||
|
|
||||||
|
A Route is defined by a HTTP method, an URL path and (optionally) the MIME types it consumes (Content-Type) and produces (Accept).
|
||||||
|
This package has the logic to find the best matching Route and if found, call its Function.
|
||||||
|
|
||||||
|
ws := new(restful.WebService)
|
||||||
|
ws.
|
||||||
|
Path("/users").
|
||||||
|
Consumes(restful.MIME_JSON, restful.MIME_XML).
|
||||||
|
Produces(restful.MIME_JSON, restful.MIME_XML)
|
||||||
|
|
||||||
|
ws.Route(ws.GET("/{user-id}").To(u.findUser)) // u is a UserResource
|
||||||
|
|
||||||
|
...
|
||||||
|
|
||||||
|
// GET http://localhost:8080/users/1
|
||||||
|
func (u UserResource) findUser(request *restful.Request, response *restful.Response) {
|
||||||
|
id := request.PathParameter("user-id")
|
||||||
|
...
|
||||||
|
}
|
||||||
|
|
||||||
|
The (*Request, *Response) arguments provide functions for reading information from the request and writing information back to the response.
|
||||||
|
|
||||||
|
See the example https://github.com/emicklei/go-restful/blob/v3/examples/user-resource/restful-user-resource.go with a full implementation.
|
||||||
|
|
||||||
|
Regular expression matching Routes
|
||||||
|
|
||||||
|
A Route parameter can be specified using the format "uri/{var[:regexp]}" or the special version "uri/{var:*}" for matching the tail of the path.
|
||||||
|
For example, /persons/{name:[A-Z][A-Z]} can be used to restrict values for the parameter "name" to only contain capital alphabetic characters.
|
||||||
|
Regular expressions must use the standard Go syntax as described in the regexp package. (https://code.google.com/p/re2/wiki/Syntax)
|
||||||
|
This feature requires the use of a CurlyRouter.
|
||||||
|
|
||||||
|
Containers
|
||||||
|
|
||||||
|
A Container holds a collection of WebServices, Filters and a http.ServeMux for multiplexing http requests.
|
||||||
|
Using the statements "restful.Add(...) and restful.Filter(...)" will register WebServices and Filters to the Default Container.
|
||||||
|
The Default container of go-restful uses the http.DefaultServeMux.
|
||||||
|
You can create your own Container and create a new http.Server for that particular container.
|
||||||
|
|
||||||
|
container := restful.NewContainer()
|
||||||
|
server := &http.Server{Addr: ":8081", Handler: container}
|
||||||
|
|
||||||
|
Filters
|
||||||
|
|
||||||
|
A filter dynamically intercepts requests and responses to transform or use the information contained in the requests or responses.
|
||||||
|
You can use filters to perform generic logging, measurement, authentication, redirect, set response headers etc.
|
||||||
|
In the restful package there are three hooks into the request,response flow where filters can be added.
|
||||||
|
Each filter must define a FilterFunction:
|
||||||
|
|
||||||
|
func (req *restful.Request, resp *restful.Response, chain *restful.FilterChain)
|
||||||
|
|
||||||
|
Use the following statement to pass the request,response pair to the next filter or RouteFunction
|
||||||
|
|
||||||
|
chain.ProcessFilter(req, resp)
|
||||||
|
|
||||||
|
Container Filters
|
||||||
|
|
||||||
|
These are processed before any registered WebService.
|
||||||
|
|
||||||
|
// install a (global) filter for the default container (processed before any webservice)
|
||||||
|
restful.Filter(globalLogging)
|
||||||
|
|
||||||
|
WebService Filters
|
||||||
|
|
||||||
|
These are processed before any Route of a WebService.
|
||||||
|
|
||||||
|
// install a webservice filter (processed before any route)
|
||||||
|
ws.Filter(webserviceLogging).Filter(measureTime)
|
||||||
|
|
||||||
|
|
||||||
|
Route Filters
|
||||||
|
|
||||||
|
These are processed before calling the function associated with the Route.
|
||||||
|
|
||||||
|
// install 2 chained route filters (processed before calling findUser)
|
||||||
|
ws.Route(ws.GET("/{user-id}").Filter(routeLogging).Filter(NewCountFilter().routeCounter).To(findUser))
|
||||||
|
|
||||||
|
See the example https://github.com/emicklei/go-restful/blob/v3/examples/filters/restful-filters.go with full implementations.
|
||||||
|
|
||||||
|
Response Encoding
|
||||||
|
|
||||||
|
Two encodings are supported: gzip and deflate. To enable this for all responses:
|
||||||
|
|
||||||
|
restful.DefaultContainer.EnableContentEncoding(true)
|
||||||
|
|
||||||
|
If a Http request includes the Accept-Encoding header then the response content will be compressed using the specified encoding.
|
||||||
|
Alternatively, you can create a Filter that performs the encoding and install it per WebService or Route.
|
||||||
|
|
||||||
|
See the example https://github.com/emicklei/go-restful/blob/v3/examples/encoding/restful-encoding-filter.go
|
||||||
|
|
||||||
|
OPTIONS support
|
||||||
|
|
||||||
|
By installing a pre-defined container filter, your Webservice(s) can respond to the OPTIONS Http request.
|
||||||
|
|
||||||
|
Filter(OPTIONSFilter())
|
||||||
|
|
||||||
|
CORS
|
||||||
|
|
||||||
|
By installing the filter of a CrossOriginResourceSharing (CORS), your WebService(s) can handle CORS requests.
|
||||||
|
|
||||||
|
cors := CrossOriginResourceSharing{ExposeHeaders: []string{"X-My-Header"}, CookiesAllowed: false, Container: DefaultContainer}
|
||||||
|
Filter(cors.Filter)
|
||||||
|
|
||||||
|
Error Handling
|
||||||
|
|
||||||
|
Unexpected things happen. If a request cannot be processed because of a failure, your service needs to tell via the response what happened and why.
|
||||||
|
For this reason HTTP status codes exist and it is important to use the correct code in every exceptional situation.
|
||||||
|
|
||||||
|
400: Bad Request
|
||||||
|
|
||||||
|
If path or query parameters are not valid (content or type) then use http.StatusBadRequest.
|
||||||
|
|
||||||
|
404: Not Found
|
||||||
|
|
||||||
|
Despite a valid URI, the resource requested may not be available
|
||||||
|
|
||||||
|
500: Internal Server Error
|
||||||
|
|
||||||
|
If the application logic could not process the request (or write the response) then use http.StatusInternalServerError.
|
||||||
|
|
||||||
|
405: Method Not Allowed
|
||||||
|
|
||||||
|
The request has a valid URL but the method (GET,PUT,POST,...) is not allowed.
|
||||||
|
|
||||||
|
406: Not Acceptable
|
||||||
|
|
||||||
|
The request does not have or has an unknown Accept Header set for this operation.
|
||||||
|
|
||||||
|
415: Unsupported Media Type
|
||||||
|
|
||||||
|
The request does not have or has an unknown Content-Type Header set for this operation.
|
||||||
|
|
||||||
|
ServiceError
|
||||||
|
|
||||||
|
In addition to setting the correct (error) Http status code, you can choose to write a ServiceError message on the response.
|
||||||
|
|
||||||
|
Performance options
|
||||||
|
|
||||||
|
This package has several options that affect the performance of your service. It is important to understand them and how you can change it.
|
||||||
|
|
||||||
|
restful.DefaultContainer.DoNotRecover(false)
|
||||||
|
|
||||||
|
DoNotRecover controls whether panics will be caught to return HTTP 500.
|
||||||
|
If set to false, the container will recover from panics.
|
||||||
|
Default value is true
|
||||||
|
|
||||||
|
restful.SetCompressorProvider(NewBoundedCachedCompressors(20, 20))
|
||||||
|
|
||||||
|
If content encoding is enabled then the default strategy for getting new gzip/zlib writers and readers is to use a sync.Pool.
|
||||||
|
Because writers are expensive structures, performance is even more improved when using a preloaded cache. You can also inject your own implementation.
|
||||||
|
|
||||||
|
Trouble shooting
|
||||||
|
|
||||||
|
This package has the means to produce detail logging of the complete Http request matching process and filter invocation.
|
||||||
|
Enabling this feature requires you to set an implementation of restful.StdLogger (e.g. log.Logger) instance such as:
|
||||||
|
|
||||||
|
restful.TraceLogger(log.New(os.Stdout, "[restful] ", log.LstdFlags|log.Lshortfile))
|
||||||
|
|
||||||
|
Logging
|
||||||
|
|
||||||
|
The restful.SetLogger() method allows you to override the logger used by the package. By default restful
|
||||||
|
uses the standard library `log` package and logs to stdout. Different logging packages are supported as
|
||||||
|
long as they conform to `StdLogger` interface defined in the `log` sub-package, writing an adapter for your
|
||||||
|
preferred package is simple.
|
||||||
|
|
||||||
|
Resources
|
||||||
|
|
||||||
|
[project]: https://github.com/emicklei/go-restful
|
||||||
|
|
||||||
|
[examples]: https://github.com/emicklei/go-restful/blob/master/examples
|
||||||
|
|
||||||
|
[design]: http://ernestmicklei.com/2012/11/11/go-restful-api-design/
|
||||||
|
|
||||||
|
[showcases]: https://github.com/emicklei/mora, https://github.com/emicklei/landskape
|
||||||
|
|
||||||
|
(c) 2012-2015, http://ernestmicklei.com. MIT License
|
||||||
|
*/
|
||||||
|
package restful
|
162
vendor/github.com/emicklei/go-restful/v3/entity_accessors.go
generated
vendored
Normal file
162
vendor/github.com/emicklei/go-restful/v3/entity_accessors.go
generated
vendored
Normal file
@ -0,0 +1,162 @@
|
|||||||
|
package restful
|
||||||
|
|
||||||
|
// Copyright 2015 Ernest Micklei. All rights reserved.
|
||||||
|
// Use of this source code is governed by a license
|
||||||
|
// that can be found in the LICENSE file.
|
||||||
|
|
||||||
|
import (
|
||||||
|
"encoding/xml"
|
||||||
|
"strings"
|
||||||
|
"sync"
|
||||||
|
)
|
||||||
|
|
||||||
|
// EntityReaderWriter can read and write values using an encoding such as JSON,XML.
|
||||||
|
type EntityReaderWriter interface {
|
||||||
|
// Read a serialized version of the value from the request.
|
||||||
|
// The Request may have a decompressing reader. Depends on Content-Encoding.
|
||||||
|
Read(req *Request, v interface{}) error
|
||||||
|
|
||||||
|
// Write a serialized version of the value on the response.
|
||||||
|
// The Response may have a compressing writer. Depends on Accept-Encoding.
|
||||||
|
// status should be a valid Http Status code
|
||||||
|
Write(resp *Response, status int, v interface{}) error
|
||||||
|
}
|
||||||
|
|
||||||
|
// entityAccessRegistry is a singleton
|
||||||
|
var entityAccessRegistry = &entityReaderWriters{
|
||||||
|
protection: new(sync.RWMutex),
|
||||||
|
accessors: map[string]EntityReaderWriter{},
|
||||||
|
}
|
||||||
|
|
||||||
|
// entityReaderWriters associates MIME to an EntityReaderWriter
|
||||||
|
type entityReaderWriters struct {
|
||||||
|
protection *sync.RWMutex
|
||||||
|
accessors map[string]EntityReaderWriter
|
||||||
|
}
|
||||||
|
|
||||||
|
func init() {
|
||||||
|
RegisterEntityAccessor(MIME_JSON, NewEntityAccessorJSON(MIME_JSON))
|
||||||
|
RegisterEntityAccessor(MIME_XML, NewEntityAccessorXML(MIME_XML))
|
||||||
|
}
|
||||||
|
|
||||||
|
// RegisterEntityAccessor add/overrides the ReaderWriter for encoding content with this MIME type.
|
||||||
|
func RegisterEntityAccessor(mime string, erw EntityReaderWriter) {
|
||||||
|
entityAccessRegistry.protection.Lock()
|
||||||
|
defer entityAccessRegistry.protection.Unlock()
|
||||||
|
entityAccessRegistry.accessors[mime] = erw
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewEntityAccessorJSON returns a new EntityReaderWriter for accessing JSON content.
|
||||||
|
// This package is already initialized with such an accessor using the MIME_JSON contentType.
|
||||||
|
func NewEntityAccessorJSON(contentType string) EntityReaderWriter {
|
||||||
|
return entityJSONAccess{ContentType: contentType}
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewEntityAccessorXML returns a new EntityReaderWriter for accessing XML content.
|
||||||
|
// This package is already initialized with such an accessor using the MIME_XML contentType.
|
||||||
|
func NewEntityAccessorXML(contentType string) EntityReaderWriter {
|
||||||
|
return entityXMLAccess{ContentType: contentType}
|
||||||
|
}
|
||||||
|
|
||||||
|
// accessorAt returns the registered ReaderWriter for this MIME type.
|
||||||
|
func (r *entityReaderWriters) accessorAt(mime string) (EntityReaderWriter, bool) {
|
||||||
|
r.protection.RLock()
|
||||||
|
defer r.protection.RUnlock()
|
||||||
|
er, ok := r.accessors[mime]
|
||||||
|
if !ok {
|
||||||
|
// retry with reverse lookup
|
||||||
|
// more expensive but we are in an exceptional situation anyway
|
||||||
|
for k, v := range r.accessors {
|
||||||
|
if strings.Contains(mime, k) {
|
||||||
|
return v, true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return er, ok
|
||||||
|
}
|
||||||
|
|
||||||
|
// entityXMLAccess is a EntityReaderWriter for XML encoding
|
||||||
|
type entityXMLAccess struct {
|
||||||
|
// This is used for setting the Content-Type header when writing
|
||||||
|
ContentType string
|
||||||
|
}
|
||||||
|
|
||||||
|
// Read unmarshalls the value from XML
|
||||||
|
func (e entityXMLAccess) Read(req *Request, v interface{}) error {
|
||||||
|
return xml.NewDecoder(req.Request.Body).Decode(v)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Write marshalls the value to JSON and set the Content-Type Header.
|
||||||
|
func (e entityXMLAccess) Write(resp *Response, status int, v interface{}) error {
|
||||||
|
return writeXML(resp, status, e.ContentType, v)
|
||||||
|
}
|
||||||
|
|
||||||
|
// writeXML marshalls the value to JSON and set the Content-Type Header.
|
||||||
|
func writeXML(resp *Response, status int, contentType string, v interface{}) error {
|
||||||
|
if v == nil {
|
||||||
|
resp.WriteHeader(status)
|
||||||
|
// do not write a nil representation
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
if resp.prettyPrint {
|
||||||
|
// pretty output must be created and written explicitly
|
||||||
|
output, err := xml.MarshalIndent(v, " ", " ")
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
resp.Header().Set(HEADER_ContentType, contentType)
|
||||||
|
resp.WriteHeader(status)
|
||||||
|
_, err = resp.Write([]byte(xml.Header))
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
_, err = resp.Write(output)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
// not-so-pretty
|
||||||
|
resp.Header().Set(HEADER_ContentType, contentType)
|
||||||
|
resp.WriteHeader(status)
|
||||||
|
return xml.NewEncoder(resp).Encode(v)
|
||||||
|
}
|
||||||
|
|
||||||
|
// entityJSONAccess is a EntityReaderWriter for JSON encoding
|
||||||
|
type entityJSONAccess struct {
|
||||||
|
// This is used for setting the Content-Type header when writing
|
||||||
|
ContentType string
|
||||||
|
}
|
||||||
|
|
||||||
|
// Read unmarshalls the value from JSON
|
||||||
|
func (e entityJSONAccess) Read(req *Request, v interface{}) error {
|
||||||
|
decoder := NewDecoder(req.Request.Body)
|
||||||
|
decoder.UseNumber()
|
||||||
|
return decoder.Decode(v)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Write marshalls the value to JSON and set the Content-Type Header.
|
||||||
|
func (e entityJSONAccess) Write(resp *Response, status int, v interface{}) error {
|
||||||
|
return writeJSON(resp, status, e.ContentType, v)
|
||||||
|
}
|
||||||
|
|
||||||
|
// write marshalls the value to JSON and set the Content-Type Header.
|
||||||
|
func writeJSON(resp *Response, status int, contentType string, v interface{}) error {
|
||||||
|
if v == nil {
|
||||||
|
resp.WriteHeader(status)
|
||||||
|
// do not write a nil representation
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
if resp.prettyPrint {
|
||||||
|
// pretty output must be created and written explicitly
|
||||||
|
output, err := MarshalIndent(v, "", " ")
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
resp.Header().Set(HEADER_ContentType, contentType)
|
||||||
|
resp.WriteHeader(status)
|
||||||
|
_, err = resp.Write(output)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
// not-so-pretty
|
||||||
|
resp.Header().Set(HEADER_ContentType, contentType)
|
||||||
|
resp.WriteHeader(status)
|
||||||
|
return NewEncoder(resp).Encode(v)
|
||||||
|
}
|
21
vendor/github.com/emicklei/go-restful/v3/extensions.go
generated
vendored
Normal file
21
vendor/github.com/emicklei/go-restful/v3/extensions.go
generated
vendored
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
package restful
|
||||||
|
|
||||||
|
// Copyright 2021 Ernest Micklei. All rights reserved.
|
||||||
|
// Use of this source code is governed by a license
|
||||||
|
// that can be found in the LICENSE file.
|
||||||
|
|
||||||
|
// ExtensionProperties provides storage of vendor extensions for entities
|
||||||
|
type ExtensionProperties struct {
|
||||||
|
// Extensions vendor extensions used to describe extra functionality
|
||||||
|
// (https://swagger.io/docs/specification/2-0/swagger-extensions/)
|
||||||
|
Extensions map[string]interface{}
|
||||||
|
}
|
||||||
|
|
||||||
|
// AddExtension adds or updates a key=value pair to the extension map.
|
||||||
|
func (ep *ExtensionProperties) AddExtension(key string, value interface{}) {
|
||||||
|
if ep.Extensions == nil {
|
||||||
|
ep.Extensions = map[string]interface{}{key: value}
|
||||||
|
} else {
|
||||||
|
ep.Extensions[key] = value
|
||||||
|
}
|
||||||
|
}
|
37
vendor/github.com/emicklei/go-restful/v3/filter.go
generated
vendored
Normal file
37
vendor/github.com/emicklei/go-restful/v3/filter.go
generated
vendored
Normal file
@ -0,0 +1,37 @@
|
|||||||
|
package restful
|
||||||
|
|
||||||
|
// Copyright 2013 Ernest Micklei. All rights reserved.
|
||||||
|
// Use of this source code is governed by a license
|
||||||
|
// that can be found in the LICENSE file.
|
||||||
|
|
||||||
|
// FilterChain is a request scoped object to process one or more filters before calling the target RouteFunction.
|
||||||
|
type FilterChain struct {
|
||||||
|
Filters []FilterFunction // ordered list of FilterFunction
|
||||||
|
Index int // index into filters that is currently in progress
|
||||||
|
Target RouteFunction // function to call after passing all filters
|
||||||
|
ParameterDocs []*Parameter // the parameter docs for the route
|
||||||
|
Operation string // the name of the operation
|
||||||
|
}
|
||||||
|
|
||||||
|
// ProcessFilter passes the request,response pair through the next of Filters.
|
||||||
|
// Each filter can decide to proceed to the next Filter or handle the Response itself.
|
||||||
|
func (f *FilterChain) ProcessFilter(request *Request, response *Response) {
|
||||||
|
if f.Index < len(f.Filters) {
|
||||||
|
f.Index++
|
||||||
|
f.Filters[f.Index-1](request, response, f)
|
||||||
|
} else {
|
||||||
|
f.Target(request, response)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// FilterFunction definitions must call ProcessFilter on the FilterChain to pass on the control and eventually call the RouteFunction
|
||||||
|
type FilterFunction func(*Request, *Response, *FilterChain)
|
||||||
|
|
||||||
|
// NoBrowserCacheFilter is a filter function to set HTTP headers that disable browser caching
|
||||||
|
// See examples/restful-no-cache-filter.go for usage
|
||||||
|
func NoBrowserCacheFilter(req *Request, resp *Response, chain *FilterChain) {
|
||||||
|
resp.Header().Set("Cache-Control", "no-cache, no-store, must-revalidate") // HTTP 1.1.
|
||||||
|
resp.Header().Set("Pragma", "no-cache") // HTTP 1.0.
|
||||||
|
resp.Header().Set("Expires", "0") // Proxies.
|
||||||
|
chain.ProcessFilter(req, resp)
|
||||||
|
}
|
11
vendor/github.com/emicklei/go-restful/v3/json.go
generated
vendored
Normal file
11
vendor/github.com/emicklei/go-restful/v3/json.go
generated
vendored
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
// +build !jsoniter
|
||||||
|
|
||||||
|
package restful
|
||||||
|
|
||||||
|
import "encoding/json"
|
||||||
|
|
||||||
|
var (
|
||||||
|
MarshalIndent = json.MarshalIndent
|
||||||
|
NewDecoder = json.NewDecoder
|
||||||
|
NewEncoder = json.NewEncoder
|
||||||
|
)
|
12
vendor/github.com/emicklei/go-restful/v3/jsoniter.go
generated
vendored
Normal file
12
vendor/github.com/emicklei/go-restful/v3/jsoniter.go
generated
vendored
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
// +build jsoniter
|
||||||
|
|
||||||
|
package restful
|
||||||
|
|
||||||
|
import "github.com/json-iterator/go"
|
||||||
|
|
||||||
|
var (
|
||||||
|
json = jsoniter.ConfigCompatibleWithStandardLibrary
|
||||||
|
MarshalIndent = json.MarshalIndent
|
||||||
|
NewDecoder = json.NewDecoder
|
||||||
|
NewEncoder = json.NewEncoder
|
||||||
|
)
|
326
vendor/github.com/emicklei/go-restful/v3/jsr311.go
generated
vendored
Normal file
326
vendor/github.com/emicklei/go-restful/v3/jsr311.go
generated
vendored
Normal file
@ -0,0 +1,326 @@
|
|||||||
|
package restful
|
||||||
|
|
||||||
|
// Copyright 2013 Ernest Micklei. All rights reserved.
|
||||||
|
// Use of this source code is governed by a license
|
||||||
|
// that can be found in the LICENSE file.
|
||||||
|
|
||||||
|
import (
|
||||||
|
"errors"
|
||||||
|
"fmt"
|
||||||
|
"net/http"
|
||||||
|
"sort"
|
||||||
|
"strings"
|
||||||
|
)
|
||||||
|
|
||||||
|
// RouterJSR311 implements the flow for matching Requests to Routes (and consequently Resource Functions)
|
||||||
|
// as specified by the JSR311 http://jsr311.java.net/nonav/releases/1.1/spec/spec.html.
|
||||||
|
// RouterJSR311 implements the Router interface.
|
||||||
|
// Concept of locators is not implemented.
|
||||||
|
type RouterJSR311 struct{}
|
||||||
|
|
||||||
|
// SelectRoute is part of the Router interface and returns the best match
|
||||||
|
// for the WebService and its Route for the given Request.
|
||||||
|
func (r RouterJSR311) SelectRoute(
|
||||||
|
webServices []*WebService,
|
||||||
|
httpRequest *http.Request) (selectedService *WebService, selectedRoute *Route, err error) {
|
||||||
|
|
||||||
|
// Identify the root resource class (WebService)
|
||||||
|
dispatcher, finalMatch, err := r.detectDispatcher(httpRequest.URL.Path, webServices)
|
||||||
|
if err != nil {
|
||||||
|
return nil, nil, NewError(http.StatusNotFound, "")
|
||||||
|
}
|
||||||
|
// Obtain the set of candidate methods (Routes)
|
||||||
|
routes := r.selectRoutes(dispatcher, finalMatch)
|
||||||
|
if len(routes) == 0 {
|
||||||
|
return dispatcher, nil, NewError(http.StatusNotFound, "404: Page Not Found")
|
||||||
|
}
|
||||||
|
|
||||||
|
// Identify the method (Route) that will handle the request
|
||||||
|
route, ok := r.detectRoute(routes, httpRequest)
|
||||||
|
return dispatcher, route, ok
|
||||||
|
}
|
||||||
|
|
||||||
|
// ExtractParameters is used to obtain the path parameters from the route using the same matching
|
||||||
|
// engine as the JSR 311 router.
|
||||||
|
func (r RouterJSR311) ExtractParameters(route *Route, webService *WebService, urlPath string) map[string]string {
|
||||||
|
webServiceExpr := webService.pathExpr
|
||||||
|
webServiceMatches := webServiceExpr.Matcher.FindStringSubmatch(urlPath)
|
||||||
|
pathParameters := r.extractParams(webServiceExpr, webServiceMatches)
|
||||||
|
routeExpr := route.pathExpr
|
||||||
|
routeMatches := routeExpr.Matcher.FindStringSubmatch(webServiceMatches[len(webServiceMatches)-1])
|
||||||
|
routeParams := r.extractParams(routeExpr, routeMatches)
|
||||||
|
for key, value := range routeParams {
|
||||||
|
pathParameters[key] = value
|
||||||
|
}
|
||||||
|
return pathParameters
|
||||||
|
}
|
||||||
|
|
||||||
|
func (RouterJSR311) extractParams(pathExpr *pathExpression, matches []string) map[string]string {
|
||||||
|
params := map[string]string{}
|
||||||
|
for i := 1; i < len(matches); i++ {
|
||||||
|
if len(pathExpr.VarNames) >= i {
|
||||||
|
params[pathExpr.VarNames[i-1]] = matches[i]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return params
|
||||||
|
}
|
||||||
|
|
||||||
|
// http://jsr311.java.net/nonav/releases/1.1/spec/spec3.html#x3-360003.7.2
|
||||||
|
func (r RouterJSR311) detectRoute(routes []Route, httpRequest *http.Request) (*Route, error) {
|
||||||
|
candidates := make([]*Route, 0, 8)
|
||||||
|
for i, each := range routes {
|
||||||
|
ok := true
|
||||||
|
for _, fn := range each.If {
|
||||||
|
if !fn(httpRequest) {
|
||||||
|
ok = false
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if ok {
|
||||||
|
candidates = append(candidates, &routes[i])
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if len(candidates) == 0 {
|
||||||
|
if trace {
|
||||||
|
traceLogger.Printf("no Route found (from %d) that passes conditional checks", len(routes))
|
||||||
|
}
|
||||||
|
return nil, NewError(http.StatusNotFound, "404: Not Found")
|
||||||
|
}
|
||||||
|
|
||||||
|
// http method
|
||||||
|
previous := candidates
|
||||||
|
candidates = candidates[:0]
|
||||||
|
for _, each := range previous {
|
||||||
|
if httpRequest.Method == each.Method {
|
||||||
|
candidates = append(candidates, each)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if len(candidates) == 0 {
|
||||||
|
if trace {
|
||||||
|
traceLogger.Printf("no Route found (in %d routes) that matches HTTP method %s\n", len(previous), httpRequest.Method)
|
||||||
|
}
|
||||||
|
allowed := []string{}
|
||||||
|
allowedLoop:
|
||||||
|
for _, candidate := range previous {
|
||||||
|
for _, method := range allowed {
|
||||||
|
if method == candidate.Method {
|
||||||
|
continue allowedLoop
|
||||||
|
}
|
||||||
|
}
|
||||||
|
allowed = append(allowed, candidate.Method)
|
||||||
|
}
|
||||||
|
header := http.Header{"Allow": []string{strings.Join(allowed, ", ")}}
|
||||||
|
return nil, NewErrorWithHeader(http.StatusMethodNotAllowed, "405: Method Not Allowed", header)
|
||||||
|
}
|
||||||
|
|
||||||
|
// content-type
|
||||||
|
contentType := httpRequest.Header.Get(HEADER_ContentType)
|
||||||
|
previous = candidates
|
||||||
|
candidates = candidates[:0]
|
||||||
|
for _, each := range previous {
|
||||||
|
if each.matchesContentType(contentType) {
|
||||||
|
candidates = append(candidates, each)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if len(candidates) == 0 {
|
||||||
|
if trace {
|
||||||
|
traceLogger.Printf("no Route found (from %d) that matches HTTP Content-Type: %s\n", len(previous), contentType)
|
||||||
|
}
|
||||||
|
if httpRequest.ContentLength > 0 {
|
||||||
|
return nil, NewError(http.StatusUnsupportedMediaType, "415: Unsupported Media Type")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// accept
|
||||||
|
previous = candidates
|
||||||
|
candidates = candidates[:0]
|
||||||
|
accept := httpRequest.Header.Get(HEADER_Accept)
|
||||||
|
if len(accept) == 0 {
|
||||||
|
accept = "*/*"
|
||||||
|
}
|
||||||
|
for _, each := range previous {
|
||||||
|
if each.matchesAccept(accept) {
|
||||||
|
candidates = append(candidates, each)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if len(candidates) == 0 {
|
||||||
|
if trace {
|
||||||
|
traceLogger.Printf("no Route found (from %d) that matches HTTP Accept: %s\n", len(previous), accept)
|
||||||
|
}
|
||||||
|
available := []string{}
|
||||||
|
for _, candidate := range previous {
|
||||||
|
available = append(available, candidate.Produces...)
|
||||||
|
}
|
||||||
|
// if POST,PUT,PATCH without body
|
||||||
|
method, length := httpRequest.Method, httpRequest.Header.Get("Content-Length")
|
||||||
|
if (method == http.MethodPost ||
|
||||||
|
method == http.MethodPut ||
|
||||||
|
method == http.MethodPatch) && length == "" {
|
||||||
|
return nil, NewError(
|
||||||
|
http.StatusUnsupportedMediaType,
|
||||||
|
fmt.Sprintf("415: Unsupported Media Type\n\nAvailable representations: %s", strings.Join(available, ", ")),
|
||||||
|
)
|
||||||
|
}
|
||||||
|
return nil, NewError(
|
||||||
|
http.StatusNotAcceptable,
|
||||||
|
fmt.Sprintf("406: Not Acceptable\n\nAvailable representations: %s", strings.Join(available, ", ")),
|
||||||
|
)
|
||||||
|
}
|
||||||
|
// return r.bestMatchByMedia(outputMediaOk, contentType, accept), nil
|
||||||
|
return candidates[0], nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// http://jsr311.java.net/nonav/releases/1.1/spec/spec3.html#x3-360003.7.2
|
||||||
|
// n/m > n/* > */*
|
||||||
|
func (r RouterJSR311) bestMatchByMedia(routes []Route, contentType string, accept string) *Route {
|
||||||
|
// TODO
|
||||||
|
return &routes[0]
|
||||||
|
}
|
||||||
|
|
||||||
|
// http://jsr311.java.net/nonav/releases/1.1/spec/spec3.html#x3-360003.7.2 (step 2)
|
||||||
|
func (r RouterJSR311) selectRoutes(dispatcher *WebService, pathRemainder string) []Route {
|
||||||
|
filtered := &sortableRouteCandidates{}
|
||||||
|
for _, each := range dispatcher.Routes() {
|
||||||
|
pathExpr := each.pathExpr
|
||||||
|
matches := pathExpr.Matcher.FindStringSubmatch(pathRemainder)
|
||||||
|
if matches != nil {
|
||||||
|
lastMatch := matches[len(matches)-1]
|
||||||
|
if len(lastMatch) == 0 || lastMatch == "/" { // do not include if value is neither empty nor ‘/’.
|
||||||
|
filtered.candidates = append(filtered.candidates,
|
||||||
|
routeCandidate{each, len(matches) - 1, pathExpr.LiteralCount, pathExpr.VarCount})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if len(filtered.candidates) == 0 {
|
||||||
|
if trace {
|
||||||
|
traceLogger.Printf("WebService on path %s has no routes that match URL path remainder:%s\n", dispatcher.rootPath, pathRemainder)
|
||||||
|
}
|
||||||
|
return []Route{}
|
||||||
|
}
|
||||||
|
sort.Sort(sort.Reverse(filtered))
|
||||||
|
|
||||||
|
// select other routes from candidates whoes expression matches rmatch
|
||||||
|
matchingRoutes := []Route{filtered.candidates[0].route}
|
||||||
|
for c := 1; c < len(filtered.candidates); c++ {
|
||||||
|
each := filtered.candidates[c]
|
||||||
|
if each.route.pathExpr.Matcher.MatchString(pathRemainder) {
|
||||||
|
matchingRoutes = append(matchingRoutes, each.route)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return matchingRoutes
|
||||||
|
}
|
||||||
|
|
||||||
|
// http://jsr311.java.net/nonav/releases/1.1/spec/spec3.html#x3-360003.7.2 (step 1)
|
||||||
|
func (r RouterJSR311) detectDispatcher(requestPath string, dispatchers []*WebService) (*WebService, string, error) {
|
||||||
|
filtered := &sortableDispatcherCandidates{}
|
||||||
|
for _, each := range dispatchers {
|
||||||
|
matches := each.pathExpr.Matcher.FindStringSubmatch(requestPath)
|
||||||
|
if matches != nil {
|
||||||
|
filtered.candidates = append(filtered.candidates,
|
||||||
|
dispatcherCandidate{each, matches[len(matches)-1], len(matches), each.pathExpr.LiteralCount, each.pathExpr.VarCount})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if len(filtered.candidates) == 0 {
|
||||||
|
if trace {
|
||||||
|
traceLogger.Printf("no WebService was found to match URL path:%s\n", requestPath)
|
||||||
|
}
|
||||||
|
return nil, "", errors.New("not found")
|
||||||
|
}
|
||||||
|
sort.Sort(sort.Reverse(filtered))
|
||||||
|
return filtered.candidates[0].dispatcher, filtered.candidates[0].finalMatch, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Types and functions to support the sorting of Routes
|
||||||
|
|
||||||
|
type routeCandidate struct {
|
||||||
|
route Route
|
||||||
|
matchesCount int // the number of capturing groups
|
||||||
|
literalCount int // the number of literal characters (means those not resulting from template variable substitution)
|
||||||
|
nonDefaultCount int // the number of capturing groups with non-default regular expressions (i.e. not ‘([^ /]+?)’)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (r routeCandidate) expressionToMatch() string {
|
||||||
|
return r.route.pathExpr.Source
|
||||||
|
}
|
||||||
|
|
||||||
|
func (r routeCandidate) String() string {
|
||||||
|
return fmt.Sprintf("(m=%d,l=%d,n=%d)", r.matchesCount, r.literalCount, r.nonDefaultCount)
|
||||||
|
}
|
||||||
|
|
||||||
|
type sortableRouteCandidates struct {
|
||||||
|
candidates []routeCandidate
|
||||||
|
}
|
||||||
|
|
||||||
|
func (rcs *sortableRouteCandidates) Len() int {
|
||||||
|
return len(rcs.candidates)
|
||||||
|
}
|
||||||
|
func (rcs *sortableRouteCandidates) Swap(i, j int) {
|
||||||
|
rcs.candidates[i], rcs.candidates[j] = rcs.candidates[j], rcs.candidates[i]
|
||||||
|
}
|
||||||
|
func (rcs *sortableRouteCandidates) Less(i, j int) bool {
|
||||||
|
ci := rcs.candidates[i]
|
||||||
|
cj := rcs.candidates[j]
|
||||||
|
// primary key
|
||||||
|
if ci.literalCount < cj.literalCount {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
if ci.literalCount > cj.literalCount {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
// secundary key
|
||||||
|
if ci.matchesCount < cj.matchesCount {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
if ci.matchesCount > cj.matchesCount {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
// tertiary key
|
||||||
|
if ci.nonDefaultCount < cj.nonDefaultCount {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
if ci.nonDefaultCount > cj.nonDefaultCount {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
// quaternary key ("source" is interpreted as Path)
|
||||||
|
return ci.route.Path < cj.route.Path
|
||||||
|
}
|
||||||
|
|
||||||
|
// Types and functions to support the sorting of Dispatchers
|
||||||
|
|
||||||
|
type dispatcherCandidate struct {
|
||||||
|
dispatcher *WebService
|
||||||
|
finalMatch string
|
||||||
|
matchesCount int // the number of capturing groups
|
||||||
|
literalCount int // the number of literal characters (means those not resulting from template variable substitution)
|
||||||
|
nonDefaultCount int // the number of capturing groups with non-default regular expressions (i.e. not ‘([^ /]+?)’)
|
||||||
|
}
|
||||||
|
type sortableDispatcherCandidates struct {
|
||||||
|
candidates []dispatcherCandidate
|
||||||
|
}
|
||||||
|
|
||||||
|
func (dc *sortableDispatcherCandidates) Len() int {
|
||||||
|
return len(dc.candidates)
|
||||||
|
}
|
||||||
|
func (dc *sortableDispatcherCandidates) Swap(i, j int) {
|
||||||
|
dc.candidates[i], dc.candidates[j] = dc.candidates[j], dc.candidates[i]
|
||||||
|
}
|
||||||
|
func (dc *sortableDispatcherCandidates) Less(i, j int) bool {
|
||||||
|
ci := dc.candidates[i]
|
||||||
|
cj := dc.candidates[j]
|
||||||
|
// primary key
|
||||||
|
if ci.matchesCount < cj.matchesCount {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
if ci.matchesCount > cj.matchesCount {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
// secundary key
|
||||||
|
if ci.literalCount < cj.literalCount {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
if ci.literalCount > cj.literalCount {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
// tertiary key
|
||||||
|
return ci.nonDefaultCount < cj.nonDefaultCount
|
||||||
|
}
|
34
vendor/github.com/emicklei/go-restful/v3/log/log.go
generated
vendored
Normal file
34
vendor/github.com/emicklei/go-restful/v3/log/log.go
generated
vendored
Normal file
@ -0,0 +1,34 @@
|
|||||||
|
package log
|
||||||
|
|
||||||
|
import (
|
||||||
|
stdlog "log"
|
||||||
|
"os"
|
||||||
|
)
|
||||||
|
|
||||||
|
// StdLogger corresponds to a minimal subset of the interface satisfied by stdlib log.Logger
|
||||||
|
type StdLogger interface {
|
||||||
|
Print(v ...interface{})
|
||||||
|
Printf(format string, v ...interface{})
|
||||||
|
}
|
||||||
|
|
||||||
|
var Logger StdLogger
|
||||||
|
|
||||||
|
func init() {
|
||||||
|
// default Logger
|
||||||
|
SetLogger(stdlog.New(os.Stderr, "[restful] ", stdlog.LstdFlags|stdlog.Lshortfile))
|
||||||
|
}
|
||||||
|
|
||||||
|
// SetLogger sets the logger for this package
|
||||||
|
func SetLogger(customLogger StdLogger) {
|
||||||
|
Logger = customLogger
|
||||||
|
}
|
||||||
|
|
||||||
|
// Print delegates to the Logger
|
||||||
|
func Print(v ...interface{}) {
|
||||||
|
Logger.Print(v...)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Printf delegates to the Logger
|
||||||
|
func Printf(format string, v ...interface{}) {
|
||||||
|
Logger.Printf(format, v...)
|
||||||
|
}
|
32
vendor/github.com/emicklei/go-restful/v3/logger.go
generated
vendored
Normal file
32
vendor/github.com/emicklei/go-restful/v3/logger.go
generated
vendored
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
package restful
|
||||||
|
|
||||||
|
// Copyright 2014 Ernest Micklei. All rights reserved.
|
||||||
|
// Use of this source code is governed by a license
|
||||||
|
// that can be found in the LICENSE file.
|
||||||
|
import (
|
||||||
|
"github.com/emicklei/go-restful/v3/log"
|
||||||
|
)
|
||||||
|
|
||||||
|
var trace bool = false
|
||||||
|
var traceLogger log.StdLogger
|
||||||
|
|
||||||
|
func init() {
|
||||||
|
traceLogger = log.Logger // use the package logger by default
|
||||||
|
}
|
||||||
|
|
||||||
|
// TraceLogger enables detailed logging of Http request matching and filter invocation. Default no logger is set.
|
||||||
|
// You may call EnableTracing() directly to enable trace logging to the package-wide logger.
|
||||||
|
func TraceLogger(logger log.StdLogger) {
|
||||||
|
traceLogger = logger
|
||||||
|
EnableTracing(logger != nil)
|
||||||
|
}
|
||||||
|
|
||||||
|
// SetLogger exposes the setter for the global logger on the top-level package
|
||||||
|
func SetLogger(customLogger log.StdLogger) {
|
||||||
|
log.SetLogger(customLogger)
|
||||||
|
}
|
||||||
|
|
||||||
|
// EnableTracing can be used to Trace logging on and off.
|
||||||
|
func EnableTracing(enabled bool) {
|
||||||
|
trace = enabled
|
||||||
|
}
|
50
vendor/github.com/emicklei/go-restful/v3/mime.go
generated
vendored
Normal file
50
vendor/github.com/emicklei/go-restful/v3/mime.go
generated
vendored
Normal file
@ -0,0 +1,50 @@
|
|||||||
|
package restful
|
||||||
|
|
||||||
|
import (
|
||||||
|
"strconv"
|
||||||
|
"strings"
|
||||||
|
)
|
||||||
|
|
||||||
|
type mime struct {
|
||||||
|
media string
|
||||||
|
quality float64
|
||||||
|
}
|
||||||
|
|
||||||
|
// insertMime adds a mime to a list and keeps it sorted by quality.
|
||||||
|
func insertMime(l []mime, e mime) []mime {
|
||||||
|
for i, each := range l {
|
||||||
|
// if current mime has lower quality then insert before
|
||||||
|
if e.quality > each.quality {
|
||||||
|
left := append([]mime{}, l[0:i]...)
|
||||||
|
return append(append(left, e), l[i:]...)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return append(l, e)
|
||||||
|
}
|
||||||
|
|
||||||
|
const qFactorWeightingKey = "q"
|
||||||
|
|
||||||
|
// sortedMimes returns a list of mime sorted (desc) by its specified quality.
|
||||||
|
// e.g. text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
|
||||||
|
func sortedMimes(accept string) (sorted []mime) {
|
||||||
|
for _, each := range strings.Split(accept, ",") {
|
||||||
|
typeAndQuality := strings.Split(strings.Trim(each, " "), ";")
|
||||||
|
if len(typeAndQuality) == 1 {
|
||||||
|
sorted = insertMime(sorted, mime{typeAndQuality[0], 1.0})
|
||||||
|
} else {
|
||||||
|
// take factor
|
||||||
|
qAndWeight := strings.Split(typeAndQuality[1], "=")
|
||||||
|
if len(qAndWeight) == 2 && strings.Trim(qAndWeight[0], " ") == qFactorWeightingKey {
|
||||||
|
f, err := strconv.ParseFloat(qAndWeight[1], 64)
|
||||||
|
if err != nil {
|
||||||
|
traceLogger.Printf("unable to parse quality in %s, %v", each, err)
|
||||||
|
} else {
|
||||||
|
sorted = insertMime(sorted, mime{typeAndQuality[0], f})
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
sorted = insertMime(sorted, mime{typeAndQuality[0], 1.0})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
34
vendor/github.com/emicklei/go-restful/v3/options_filter.go
generated
vendored
Normal file
34
vendor/github.com/emicklei/go-restful/v3/options_filter.go
generated
vendored
Normal file
@ -0,0 +1,34 @@
|
|||||||
|
package restful
|
||||||
|
|
||||||
|
import "strings"
|
||||||
|
|
||||||
|
// Copyright 2013 Ernest Micklei. All rights reserved.
|
||||||
|
// Use of this source code is governed by a license
|
||||||
|
// that can be found in the LICENSE file.
|
||||||
|
|
||||||
|
// OPTIONSFilter is a filter function that inspects the Http Request for the OPTIONS method
|
||||||
|
// and provides the response with a set of allowed methods for the request URL Path.
|
||||||
|
// As for any filter, you can also install it for a particular WebService within a Container.
|
||||||
|
// Note: this filter is not needed when using CrossOriginResourceSharing (for CORS).
|
||||||
|
func (c *Container) OPTIONSFilter(req *Request, resp *Response, chain *FilterChain) {
|
||||||
|
if "OPTIONS" != req.Request.Method {
|
||||||
|
chain.ProcessFilter(req, resp)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
archs := req.Request.Header.Get(HEADER_AccessControlRequestHeaders)
|
||||||
|
methods := strings.Join(c.computeAllowedMethods(req), ",")
|
||||||
|
origin := req.Request.Header.Get(HEADER_Origin)
|
||||||
|
|
||||||
|
resp.AddHeader(HEADER_Allow, methods)
|
||||||
|
resp.AddHeader(HEADER_AccessControlAllowOrigin, origin)
|
||||||
|
resp.AddHeader(HEADER_AccessControlAllowHeaders, archs)
|
||||||
|
resp.AddHeader(HEADER_AccessControlAllowMethods, methods)
|
||||||
|
}
|
||||||
|
|
||||||
|
// OPTIONSFilter is a filter function that inspects the Http Request for the OPTIONS method
|
||||||
|
// and provides the response with a set of allowed methods for the request URL Path.
|
||||||
|
// Note: this filter is not needed when using CrossOriginResourceSharing (for CORS).
|
||||||
|
func OPTIONSFilter() FilterFunction {
|
||||||
|
return DefaultContainer.OPTIONSFilter
|
||||||
|
}
|
234
vendor/github.com/emicklei/go-restful/v3/parameter.go
generated
vendored
Normal file
234
vendor/github.com/emicklei/go-restful/v3/parameter.go
generated
vendored
Normal file
@ -0,0 +1,234 @@
|
|||||||
|
package restful
|
||||||
|
|
||||||
|
import "sort"
|
||||||
|
|
||||||
|
// Copyright 2013 Ernest Micklei. All rights reserved.
|
||||||
|
// Use of this source code is governed by a license
|
||||||
|
// that can be found in the LICENSE file.
|
||||||
|
|
||||||
|
const (
|
||||||
|
// PathParameterKind = indicator of Request parameter type "path"
|
||||||
|
PathParameterKind = iota
|
||||||
|
|
||||||
|
// QueryParameterKind = indicator of Request parameter type "query"
|
||||||
|
QueryParameterKind
|
||||||
|
|
||||||
|
// BodyParameterKind = indicator of Request parameter type "body"
|
||||||
|
BodyParameterKind
|
||||||
|
|
||||||
|
// HeaderParameterKind = indicator of Request parameter type "header"
|
||||||
|
HeaderParameterKind
|
||||||
|
|
||||||
|
// FormParameterKind = indicator of Request parameter type "form"
|
||||||
|
FormParameterKind
|
||||||
|
|
||||||
|
// CollectionFormatCSV comma separated values `foo,bar`
|
||||||
|
CollectionFormatCSV = CollectionFormat("csv")
|
||||||
|
|
||||||
|
// CollectionFormatSSV space separated values `foo bar`
|
||||||
|
CollectionFormatSSV = CollectionFormat("ssv")
|
||||||
|
|
||||||
|
// CollectionFormatTSV tab separated values `foo\tbar`
|
||||||
|
CollectionFormatTSV = CollectionFormat("tsv")
|
||||||
|
|
||||||
|
// CollectionFormatPipes pipe separated values `foo|bar`
|
||||||
|
CollectionFormatPipes = CollectionFormat("pipes")
|
||||||
|
|
||||||
|
// CollectionFormatMulti corresponds to multiple parameter instances instead of multiple values for a single
|
||||||
|
// instance `foo=bar&foo=baz`. This is valid only for QueryParameters and FormParameters
|
||||||
|
CollectionFormatMulti = CollectionFormat("multi")
|
||||||
|
)
|
||||||
|
|
||||||
|
type CollectionFormat string
|
||||||
|
|
||||||
|
func (cf CollectionFormat) String() string {
|
||||||
|
return string(cf)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Parameter is for documententing the parameter used in a Http Request
|
||||||
|
// ParameterData kinds are Path,Query and Body
|
||||||
|
type Parameter struct {
|
||||||
|
data *ParameterData
|
||||||
|
}
|
||||||
|
|
||||||
|
// ParameterData represents the state of a Parameter.
|
||||||
|
// It is made public to make it accessible to e.g. the Swagger package.
|
||||||
|
type ParameterData struct {
|
||||||
|
ExtensionProperties
|
||||||
|
Name, Description, DataType, DataFormat string
|
||||||
|
Kind int
|
||||||
|
Required bool
|
||||||
|
// AllowableValues is deprecated. Use PossibleValues instead
|
||||||
|
AllowableValues map[string]string
|
||||||
|
PossibleValues []string
|
||||||
|
AllowMultiple bool
|
||||||
|
AllowEmptyValue bool
|
||||||
|
DefaultValue string
|
||||||
|
CollectionFormat string
|
||||||
|
Pattern string
|
||||||
|
Minimum *float64
|
||||||
|
Maximum *float64
|
||||||
|
MinLength *int64
|
||||||
|
MaxLength *int64
|
||||||
|
MinItems *int64
|
||||||
|
MaxItems *int64
|
||||||
|
UniqueItems bool
|
||||||
|
}
|
||||||
|
|
||||||
|
// Data returns the state of the Parameter
|
||||||
|
func (p *Parameter) Data() ParameterData {
|
||||||
|
return *p.data
|
||||||
|
}
|
||||||
|
|
||||||
|
// Kind returns the parameter type indicator (see const for valid values)
|
||||||
|
func (p *Parameter) Kind() int {
|
||||||
|
return p.data.Kind
|
||||||
|
}
|
||||||
|
|
||||||
|
func (p *Parameter) bePath() *Parameter {
|
||||||
|
p.data.Kind = PathParameterKind
|
||||||
|
return p
|
||||||
|
}
|
||||||
|
func (p *Parameter) beQuery() *Parameter {
|
||||||
|
p.data.Kind = QueryParameterKind
|
||||||
|
return p
|
||||||
|
}
|
||||||
|
func (p *Parameter) beBody() *Parameter {
|
||||||
|
p.data.Kind = BodyParameterKind
|
||||||
|
return p
|
||||||
|
}
|
||||||
|
|
||||||
|
func (p *Parameter) beHeader() *Parameter {
|
||||||
|
p.data.Kind = HeaderParameterKind
|
||||||
|
return p
|
||||||
|
}
|
||||||
|
|
||||||
|
func (p *Parameter) beForm() *Parameter {
|
||||||
|
p.data.Kind = FormParameterKind
|
||||||
|
return p
|
||||||
|
}
|
||||||
|
|
||||||
|
// Required sets the required field and returns the receiver
|
||||||
|
func (p *Parameter) Required(required bool) *Parameter {
|
||||||
|
p.data.Required = required
|
||||||
|
return p
|
||||||
|
}
|
||||||
|
|
||||||
|
// AllowMultiple sets the allowMultiple field and returns the receiver
|
||||||
|
func (p *Parameter) AllowMultiple(multiple bool) *Parameter {
|
||||||
|
p.data.AllowMultiple = multiple
|
||||||
|
return p
|
||||||
|
}
|
||||||
|
|
||||||
|
// AddExtension adds or updates a key=value pair to the extension map
|
||||||
|
func (p *Parameter) AddExtension(key string, value interface{}) *Parameter {
|
||||||
|
p.data.AddExtension(key, value)
|
||||||
|
return p
|
||||||
|
}
|
||||||
|
|
||||||
|
// AllowEmptyValue sets the AllowEmptyValue field and returns the receiver
|
||||||
|
func (p *Parameter) AllowEmptyValue(multiple bool) *Parameter {
|
||||||
|
p.data.AllowEmptyValue = multiple
|
||||||
|
return p
|
||||||
|
}
|
||||||
|
|
||||||
|
// AllowableValues is deprecated. Use PossibleValues instead. Both will be set.
|
||||||
|
func (p *Parameter) AllowableValues(values map[string]string) *Parameter {
|
||||||
|
p.data.AllowableValues = values
|
||||||
|
|
||||||
|
allowableSortedKeys := make([]string, 0, len(values))
|
||||||
|
for k := range values {
|
||||||
|
allowableSortedKeys = append(allowableSortedKeys, k)
|
||||||
|
}
|
||||||
|
sort.Strings(allowableSortedKeys)
|
||||||
|
|
||||||
|
p.data.PossibleValues = make([]string, 0, len(values))
|
||||||
|
for _, k := range allowableSortedKeys {
|
||||||
|
p.data.PossibleValues = append(p.data.PossibleValues, values[k])
|
||||||
|
}
|
||||||
|
return p
|
||||||
|
}
|
||||||
|
|
||||||
|
// PossibleValues sets the possible values field and returns the receiver
|
||||||
|
func (p *Parameter) PossibleValues(values []string) *Parameter {
|
||||||
|
p.data.PossibleValues = values
|
||||||
|
return p
|
||||||
|
}
|
||||||
|
|
||||||
|
// DataType sets the dataType field and returns the receiver
|
||||||
|
func (p *Parameter) DataType(typeName string) *Parameter {
|
||||||
|
p.data.DataType = typeName
|
||||||
|
return p
|
||||||
|
}
|
||||||
|
|
||||||
|
// DataFormat sets the dataFormat field for Swagger UI
|
||||||
|
func (p *Parameter) DataFormat(formatName string) *Parameter {
|
||||||
|
p.data.DataFormat = formatName
|
||||||
|
return p
|
||||||
|
}
|
||||||
|
|
||||||
|
// DefaultValue sets the default value field and returns the receiver
|
||||||
|
func (p *Parameter) DefaultValue(stringRepresentation string) *Parameter {
|
||||||
|
p.data.DefaultValue = stringRepresentation
|
||||||
|
return p
|
||||||
|
}
|
||||||
|
|
||||||
|
// Description sets the description value field and returns the receiver
|
||||||
|
func (p *Parameter) Description(doc string) *Parameter {
|
||||||
|
p.data.Description = doc
|
||||||
|
return p
|
||||||
|
}
|
||||||
|
|
||||||
|
// CollectionFormat sets the collection format for an array type
|
||||||
|
func (p *Parameter) CollectionFormat(format CollectionFormat) *Parameter {
|
||||||
|
p.data.CollectionFormat = format.String()
|
||||||
|
return p
|
||||||
|
}
|
||||||
|
|
||||||
|
// Pattern sets the pattern field and returns the receiver
|
||||||
|
func (p *Parameter) Pattern(pattern string) *Parameter {
|
||||||
|
p.data.Pattern = pattern
|
||||||
|
return p
|
||||||
|
}
|
||||||
|
|
||||||
|
// Minimum sets the minimum field and returns the receiver
|
||||||
|
func (p *Parameter) Minimum(minimum float64) *Parameter {
|
||||||
|
p.data.Minimum = &minimum
|
||||||
|
return p
|
||||||
|
}
|
||||||
|
|
||||||
|
// Maximum sets the maximum field and returns the receiver
|
||||||
|
func (p *Parameter) Maximum(maximum float64) *Parameter {
|
||||||
|
p.data.Maximum = &maximum
|
||||||
|
return p
|
||||||
|
}
|
||||||
|
|
||||||
|
// MinLength sets the minLength field and returns the receiver
|
||||||
|
func (p *Parameter) MinLength(minLength int64) *Parameter {
|
||||||
|
p.data.MinLength = &minLength
|
||||||
|
return p
|
||||||
|
}
|
||||||
|
|
||||||
|
// MaxLength sets the maxLength field and returns the receiver
|
||||||
|
func (p *Parameter) MaxLength(maxLength int64) *Parameter {
|
||||||
|
p.data.MaxLength = &maxLength
|
||||||
|
return p
|
||||||
|
}
|
||||||
|
|
||||||
|
// MinItems sets the minItems field and returns the receiver
|
||||||
|
func (p *Parameter) MinItems(minItems int64) *Parameter {
|
||||||
|
p.data.MinItems = &minItems
|
||||||
|
return p
|
||||||
|
}
|
||||||
|
|
||||||
|
// MaxItems sets the maxItems field and returns the receiver
|
||||||
|
func (p *Parameter) MaxItems(maxItems int64) *Parameter {
|
||||||
|
p.data.MaxItems = &maxItems
|
||||||
|
return p
|
||||||
|
}
|
||||||
|
|
||||||
|
// UniqueItems sets the uniqueItems field and returns the receiver
|
||||||
|
func (p *Parameter) UniqueItems(uniqueItems bool) *Parameter {
|
||||||
|
p.data.UniqueItems = uniqueItems
|
||||||
|
return p
|
||||||
|
}
|
74
vendor/github.com/emicklei/go-restful/v3/path_expression.go
generated
vendored
Normal file
74
vendor/github.com/emicklei/go-restful/v3/path_expression.go
generated
vendored
Normal file
@ -0,0 +1,74 @@
|
|||||||
|
package restful
|
||||||
|
|
||||||
|
// Copyright 2013 Ernest Micklei. All rights reserved.
|
||||||
|
// Use of this source code is governed by a license
|
||||||
|
// that can be found in the LICENSE file.
|
||||||
|
|
||||||
|
import (
|
||||||
|
"bytes"
|
||||||
|
"fmt"
|
||||||
|
"regexp"
|
||||||
|
"strings"
|
||||||
|
)
|
||||||
|
|
||||||
|
// PathExpression holds a compiled path expression (RegExp) needed to match against
|
||||||
|
// Http request paths and to extract path parameter values.
|
||||||
|
type pathExpression struct {
|
||||||
|
LiteralCount int // the number of literal characters (means those not resulting from template variable substitution)
|
||||||
|
VarNames []string // the names of parameters (enclosed by {}) in the path
|
||||||
|
VarCount int // the number of named parameters (enclosed by {}) in the path
|
||||||
|
Matcher *regexp.Regexp
|
||||||
|
Source string // Path as defined by the RouteBuilder
|
||||||
|
tokens []string
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewPathExpression creates a PathExpression from the input URL path.
|
||||||
|
// Returns an error if the path is invalid.
|
||||||
|
func newPathExpression(path string) (*pathExpression, error) {
|
||||||
|
expression, literalCount, varNames, varCount, tokens := templateToRegularExpression(path)
|
||||||
|
compiled, err := regexp.Compile(expression)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return &pathExpression{literalCount, varNames, varCount, compiled, expression, tokens}, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// http://jsr311.java.net/nonav/releases/1.1/spec/spec3.html#x3-370003.7.3
|
||||||
|
func templateToRegularExpression(template string) (expression string, literalCount int, varNames []string, varCount int, tokens []string) {
|
||||||
|
var buffer bytes.Buffer
|
||||||
|
buffer.WriteString("^")
|
||||||
|
//tokens = strings.Split(template, "/")
|
||||||
|
tokens = tokenizePath(template)
|
||||||
|
for _, each := range tokens {
|
||||||
|
if each == "" {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
buffer.WriteString("/")
|
||||||
|
if strings.HasPrefix(each, "{") {
|
||||||
|
// check for regular expression in variable
|
||||||
|
colon := strings.Index(each, ":")
|
||||||
|
var varName string
|
||||||
|
if colon != -1 {
|
||||||
|
// extract expression
|
||||||
|
varName = strings.TrimSpace(each[1:colon])
|
||||||
|
paramExpr := strings.TrimSpace(each[colon+1 : len(each)-1])
|
||||||
|
if paramExpr == "*" { // special case
|
||||||
|
buffer.WriteString("(.*)")
|
||||||
|
} else {
|
||||||
|
buffer.WriteString(fmt.Sprintf("(%s)", paramExpr)) // between colon and closing moustache
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// plain var
|
||||||
|
varName = strings.TrimSpace(each[1 : len(each)-1])
|
||||||
|
buffer.WriteString("([^/]+?)")
|
||||||
|
}
|
||||||
|
varNames = append(varNames, varName)
|
||||||
|
varCount += 1
|
||||||
|
} else {
|
||||||
|
literalCount += len(each)
|
||||||
|
encoded := each // TODO URI encode
|
||||||
|
buffer.WriteString(regexp.QuoteMeta(encoded))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return strings.TrimRight(buffer.String(), "/") + "(/.*)?$", literalCount, varNames, varCount, tokens
|
||||||
|
}
|
74
vendor/github.com/emicklei/go-restful/v3/path_processor.go
generated
vendored
Normal file
74
vendor/github.com/emicklei/go-restful/v3/path_processor.go
generated
vendored
Normal file
@ -0,0 +1,74 @@
|
|||||||
|
package restful
|
||||||
|
|
||||||
|
import (
|
||||||
|
"bytes"
|
||||||
|
"strings"
|
||||||
|
)
|
||||||
|
|
||||||
|
// Copyright 2018 Ernest Micklei. All rights reserved.
|
||||||
|
// Use of this source code is governed by a license
|
||||||
|
// that can be found in the LICENSE file.
|
||||||
|
|
||||||
|
// PathProcessor is extra behaviour that a Router can provide to extract path parameters from the path.
|
||||||
|
// If a Router does not implement this interface then the default behaviour will be used.
|
||||||
|
type PathProcessor interface {
|
||||||
|
// ExtractParameters gets the path parameters defined in the route and webService from the urlPath
|
||||||
|
ExtractParameters(route *Route, webService *WebService, urlPath string) map[string]string
|
||||||
|
}
|
||||||
|
|
||||||
|
type defaultPathProcessor struct{}
|
||||||
|
|
||||||
|
// Extract the parameters from the request url path
|
||||||
|
func (d defaultPathProcessor) ExtractParameters(r *Route, _ *WebService, urlPath string) map[string]string {
|
||||||
|
urlParts := tokenizePath(urlPath)
|
||||||
|
pathParameters := map[string]string{}
|
||||||
|
for i, key := range r.pathParts {
|
||||||
|
var value string
|
||||||
|
if i >= len(urlParts) {
|
||||||
|
value = ""
|
||||||
|
} else {
|
||||||
|
value = urlParts[i]
|
||||||
|
}
|
||||||
|
if r.hasCustomVerb && hasCustomVerb(key) {
|
||||||
|
key = removeCustomVerb(key)
|
||||||
|
value = removeCustomVerb(value)
|
||||||
|
}
|
||||||
|
|
||||||
|
if strings.Index(key, "{") > -1 { // path-parameter
|
||||||
|
if colon := strings.Index(key, ":"); colon != -1 {
|
||||||
|
// extract by regex
|
||||||
|
regPart := key[colon+1 : len(key)-1]
|
||||||
|
keyPart := key[1:colon]
|
||||||
|
if regPart == "*" {
|
||||||
|
pathParameters[keyPart] = untokenizePath(i, urlParts)
|
||||||
|
break
|
||||||
|
} else {
|
||||||
|
pathParameters[keyPart] = value
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// without enclosing {}
|
||||||
|
startIndex := strings.Index(key, "{")
|
||||||
|
endKeyIndex := strings.Index(key, "}")
|
||||||
|
|
||||||
|
suffixLength := len(key) - endKeyIndex - 1
|
||||||
|
endValueIndex := len(value) - suffixLength
|
||||||
|
|
||||||
|
pathParameters[key[startIndex+1:endKeyIndex]] = value[startIndex:endValueIndex]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return pathParameters
|
||||||
|
}
|
||||||
|
|
||||||
|
// Untokenize back into an URL path using the slash separator
|
||||||
|
func untokenizePath(offset int, parts []string) string {
|
||||||
|
var buffer bytes.Buffer
|
||||||
|
for p := offset; p < len(parts); p++ {
|
||||||
|
buffer.WriteString(parts[p])
|
||||||
|
// do not end
|
||||||
|
if p < len(parts)-1 {
|
||||||
|
buffer.WriteString("/")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return buffer.String()
|
||||||
|
}
|
132
vendor/github.com/emicklei/go-restful/v3/request.go
generated
vendored
Normal file
132
vendor/github.com/emicklei/go-restful/v3/request.go
generated
vendored
Normal file
@ -0,0 +1,132 @@
|
|||||||
|
package restful
|
||||||
|
|
||||||
|
// Copyright 2013 Ernest Micklei. All rights reserved.
|
||||||
|
// Use of this source code is governed by a license
|
||||||
|
// that can be found in the LICENSE file.
|
||||||
|
|
||||||
|
import (
|
||||||
|
"compress/zlib"
|
||||||
|
"net/http"
|
||||||
|
)
|
||||||
|
|
||||||
|
var defaultRequestContentType string
|
||||||
|
|
||||||
|
// Request is a wrapper for a http Request that provides convenience methods
|
||||||
|
type Request struct {
|
||||||
|
Request *http.Request
|
||||||
|
pathParameters map[string]string
|
||||||
|
attributes map[string]interface{} // for storing request-scoped values
|
||||||
|
selectedRoute *Route // is nil when no route was matched
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewRequest(httpRequest *http.Request) *Request {
|
||||||
|
return &Request{
|
||||||
|
Request: httpRequest,
|
||||||
|
pathParameters: map[string]string{},
|
||||||
|
attributes: map[string]interface{}{},
|
||||||
|
} // empty parameters, attributes
|
||||||
|
}
|
||||||
|
|
||||||
|
// If ContentType is missing or */* is given then fall back to this type, otherwise
|
||||||
|
// a "Unable to unmarshal content of type:" response is returned.
|
||||||
|
// Valid values are restful.MIME_JSON and restful.MIME_XML
|
||||||
|
// Example:
|
||||||
|
// restful.DefaultRequestContentType(restful.MIME_JSON)
|
||||||
|
func DefaultRequestContentType(mime string) {
|
||||||
|
defaultRequestContentType = mime
|
||||||
|
}
|
||||||
|
|
||||||
|
// PathParameter accesses the Path parameter value by its name
|
||||||
|
func (r *Request) PathParameter(name string) string {
|
||||||
|
return r.pathParameters[name]
|
||||||
|
}
|
||||||
|
|
||||||
|
// PathParameters accesses the Path parameter values
|
||||||
|
func (r *Request) PathParameters() map[string]string {
|
||||||
|
return r.pathParameters
|
||||||
|
}
|
||||||
|
|
||||||
|
// QueryParameter returns the (first) Query parameter value by its name
|
||||||
|
func (r *Request) QueryParameter(name string) string {
|
||||||
|
return r.Request.FormValue(name)
|
||||||
|
}
|
||||||
|
|
||||||
|
// QueryParameters returns the all the query parameters values by name
|
||||||
|
func (r *Request) QueryParameters(name string) []string {
|
||||||
|
return r.Request.URL.Query()[name]
|
||||||
|
}
|
||||||
|
|
||||||
|
// BodyParameter parses the body of the request (once for typically a POST or a PUT) and returns the value of the given name or an error.
|
||||||
|
func (r *Request) BodyParameter(name string) (string, error) {
|
||||||
|
err := r.Request.ParseForm()
|
||||||
|
if err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
return r.Request.PostFormValue(name), nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// HeaderParameter returns the HTTP Header value of a Header name or empty if missing
|
||||||
|
func (r *Request) HeaderParameter(name string) string {
|
||||||
|
return r.Request.Header.Get(name)
|
||||||
|
}
|
||||||
|
|
||||||
|
// ReadEntity checks the Accept header and reads the content into the entityPointer.
|
||||||
|
func (r *Request) ReadEntity(entityPointer interface{}) (err error) {
|
||||||
|
contentType := r.Request.Header.Get(HEADER_ContentType)
|
||||||
|
contentEncoding := r.Request.Header.Get(HEADER_ContentEncoding)
|
||||||
|
|
||||||
|
// check if the request body needs decompression
|
||||||
|
if ENCODING_GZIP == contentEncoding {
|
||||||
|
gzipReader := currentCompressorProvider.AcquireGzipReader()
|
||||||
|
defer currentCompressorProvider.ReleaseGzipReader(gzipReader)
|
||||||
|
gzipReader.Reset(r.Request.Body)
|
||||||
|
r.Request.Body = gzipReader
|
||||||
|
} else if ENCODING_DEFLATE == contentEncoding {
|
||||||
|
zlibReader, err := zlib.NewReader(r.Request.Body)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
r.Request.Body = zlibReader
|
||||||
|
}
|
||||||
|
|
||||||
|
// lookup the EntityReader, use defaultRequestContentType if needed and provided
|
||||||
|
entityReader, ok := entityAccessRegistry.accessorAt(contentType)
|
||||||
|
if !ok {
|
||||||
|
if len(defaultRequestContentType) != 0 {
|
||||||
|
entityReader, ok = entityAccessRegistry.accessorAt(defaultRequestContentType)
|
||||||
|
}
|
||||||
|
if !ok {
|
||||||
|
return NewError(http.StatusBadRequest, "Unable to unmarshal content of type:"+contentType)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return entityReader.Read(r, entityPointer)
|
||||||
|
}
|
||||||
|
|
||||||
|
// SetAttribute adds or replaces the attribute with the given value.
|
||||||
|
func (r *Request) SetAttribute(name string, value interface{}) {
|
||||||
|
r.attributes[name] = value
|
||||||
|
}
|
||||||
|
|
||||||
|
// Attribute returns the value associated to the given name. Returns nil if absent.
|
||||||
|
func (r Request) Attribute(name string) interface{} {
|
||||||
|
return r.attributes[name]
|
||||||
|
}
|
||||||
|
|
||||||
|
// SelectedRoutePath root path + route path that matched the request, e.g. /meetings/{id}/attendees
|
||||||
|
// If no route was matched then return an empty string.
|
||||||
|
func (r Request) SelectedRoutePath() string {
|
||||||
|
if r.selectedRoute == nil {
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
// skip creating an accessor
|
||||||
|
return r.selectedRoute.Path
|
||||||
|
}
|
||||||
|
|
||||||
|
// SelectedRoute returns a reader to access the selected Route by the container
|
||||||
|
// Returns nil if no route was matched.
|
||||||
|
func (r Request) SelectedRoute() RouteReader {
|
||||||
|
if r.selectedRoute == nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
return routeAccessor{route: r.selectedRoute}
|
||||||
|
}
|
256
vendor/github.com/emicklei/go-restful/v3/response.go
generated
vendored
Normal file
256
vendor/github.com/emicklei/go-restful/v3/response.go
generated
vendored
Normal file
@ -0,0 +1,256 @@
|
|||||||
|
package restful
|
||||||
|
|
||||||
|
// Copyright 2013 Ernest Micklei. All rights reserved.
|
||||||
|
// Use of this source code is governed by a license
|
||||||
|
// that can be found in the LICENSE file.
|
||||||
|
|
||||||
|
import (
|
||||||
|
"bufio"
|
||||||
|
"errors"
|
||||||
|
"net"
|
||||||
|
"net/http"
|
||||||
|
)
|
||||||
|
|
||||||
|
// DefaultResponseMimeType is DEPRECATED, use DefaultResponseContentType(mime)
|
||||||
|
var DefaultResponseMimeType string
|
||||||
|
|
||||||
|
//PrettyPrintResponses controls the indentation feature of XML and JSON serialization
|
||||||
|
var PrettyPrintResponses = true
|
||||||
|
|
||||||
|
// Response is a wrapper on the actual http ResponseWriter
|
||||||
|
// It provides several convenience methods to prepare and write response content.
|
||||||
|
type Response struct {
|
||||||
|
http.ResponseWriter
|
||||||
|
requestAccept string // mime-type what the Http Request says it wants to receive
|
||||||
|
routeProduces []string // mime-types what the Route says it can produce
|
||||||
|
statusCode int // HTTP status code that has been written explicitly (if zero then net/http has written 200)
|
||||||
|
contentLength int // number of bytes written for the response body
|
||||||
|
prettyPrint bool // controls the indentation feature of XML and JSON serialization. It is initialized using var PrettyPrintResponses.
|
||||||
|
err error // err property is kept when WriteError is called
|
||||||
|
hijacker http.Hijacker // if underlying ResponseWriter supports it
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewResponse creates a new response based on a http ResponseWriter.
|
||||||
|
func NewResponse(httpWriter http.ResponseWriter) *Response {
|
||||||
|
hijacker, _ := httpWriter.(http.Hijacker)
|
||||||
|
return &Response{ResponseWriter: httpWriter, routeProduces: []string{}, statusCode: http.StatusOK, prettyPrint: PrettyPrintResponses, hijacker: hijacker}
|
||||||
|
}
|
||||||
|
|
||||||
|
// DefaultResponseContentType set a default.
|
||||||
|
// If Accept header matching fails, fall back to this type.
|
||||||
|
// Valid values are restful.MIME_JSON and restful.MIME_XML
|
||||||
|
// Example:
|
||||||
|
// restful.DefaultResponseContentType(restful.MIME_JSON)
|
||||||
|
func DefaultResponseContentType(mime string) {
|
||||||
|
DefaultResponseMimeType = mime
|
||||||
|
}
|
||||||
|
|
||||||
|
// InternalServerError writes the StatusInternalServerError header.
|
||||||
|
// DEPRECATED, use WriteErrorString(http.StatusInternalServerError,reason)
|
||||||
|
func (r Response) InternalServerError() Response {
|
||||||
|
r.WriteHeader(http.StatusInternalServerError)
|
||||||
|
return r
|
||||||
|
}
|
||||||
|
|
||||||
|
// Hijack implements the http.Hijacker interface. This expands
|
||||||
|
// the Response to fulfill http.Hijacker if the underlying
|
||||||
|
// http.ResponseWriter supports it.
|
||||||
|
func (r *Response) Hijack() (net.Conn, *bufio.ReadWriter, error) {
|
||||||
|
if r.hijacker == nil {
|
||||||
|
return nil, nil, errors.New("http.Hijacker not implemented by underlying http.ResponseWriter")
|
||||||
|
}
|
||||||
|
return r.hijacker.Hijack()
|
||||||
|
}
|
||||||
|
|
||||||
|
// PrettyPrint changes whether this response must produce pretty (line-by-line, indented) JSON or XML output.
|
||||||
|
func (r *Response) PrettyPrint(bePretty bool) {
|
||||||
|
r.prettyPrint = bePretty
|
||||||
|
}
|
||||||
|
|
||||||
|
// AddHeader is a shortcut for .Header().Add(header,value)
|
||||||
|
func (r Response) AddHeader(header string, value string) Response {
|
||||||
|
r.Header().Add(header, value)
|
||||||
|
return r
|
||||||
|
}
|
||||||
|
|
||||||
|
// SetRequestAccepts tells the response what Mime-type(s) the HTTP request said it wants to accept. Exposed for testing.
|
||||||
|
func (r *Response) SetRequestAccepts(mime string) {
|
||||||
|
r.requestAccept = mime
|
||||||
|
}
|
||||||
|
|
||||||
|
// EntityWriter returns the registered EntityWriter that the entity (requested resource)
|
||||||
|
// can write according to what the request wants (Accept) and what the Route can produce or what the restful defaults say.
|
||||||
|
// If called before WriteEntity and WriteHeader then a false return value can be used to write a 406: Not Acceptable.
|
||||||
|
func (r *Response) EntityWriter() (EntityReaderWriter, bool) {
|
||||||
|
sorted := sortedMimes(r.requestAccept)
|
||||||
|
for _, eachAccept := range sorted {
|
||||||
|
for _, eachProduce := range r.routeProduces {
|
||||||
|
if eachProduce == eachAccept.media {
|
||||||
|
if w, ok := entityAccessRegistry.accessorAt(eachAccept.media); ok {
|
||||||
|
return w, true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if eachAccept.media == "*/*" {
|
||||||
|
for _, each := range r.routeProduces {
|
||||||
|
if w, ok := entityAccessRegistry.accessorAt(each); ok {
|
||||||
|
return w, true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// if requestAccept is empty
|
||||||
|
writer, ok := entityAccessRegistry.accessorAt(r.requestAccept)
|
||||||
|
if !ok {
|
||||||
|
// if not registered then fallback to the defaults (if set)
|
||||||
|
if DefaultResponseMimeType == MIME_JSON {
|
||||||
|
return entityAccessRegistry.accessorAt(MIME_JSON)
|
||||||
|
}
|
||||||
|
if DefaultResponseMimeType == MIME_XML {
|
||||||
|
return entityAccessRegistry.accessorAt(MIME_XML)
|
||||||
|
}
|
||||||
|
// Fallback to whatever the route says it can produce.
|
||||||
|
// https://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html
|
||||||
|
for _, each := range r.routeProduces {
|
||||||
|
if w, ok := entityAccessRegistry.accessorAt(each); ok {
|
||||||
|
return w, true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if trace {
|
||||||
|
traceLogger.Printf("no registered EntityReaderWriter found for %s", r.requestAccept)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return writer, ok
|
||||||
|
}
|
||||||
|
|
||||||
|
// WriteEntity calls WriteHeaderAndEntity with Http Status OK (200)
|
||||||
|
func (r *Response) WriteEntity(value interface{}) error {
|
||||||
|
return r.WriteHeaderAndEntity(http.StatusOK, value)
|
||||||
|
}
|
||||||
|
|
||||||
|
// WriteHeaderAndEntity marshals the value using the representation denoted by the Accept Header and the registered EntityWriters.
|
||||||
|
// If no Accept header is specified (or */*) then respond with the Content-Type as specified by the first in the Route.Produces.
|
||||||
|
// If an Accept header is specified then respond with the Content-Type as specified by the first in the Route.Produces that is matched with the Accept header.
|
||||||
|
// If the value is nil then no response is send except for the Http status. You may want to call WriteHeader(http.StatusNotFound) instead.
|
||||||
|
// If there is no writer available that can represent the value in the requested MIME type then Http Status NotAcceptable is written.
|
||||||
|
// Current implementation ignores any q-parameters in the Accept Header.
|
||||||
|
// Returns an error if the value could not be written on the response.
|
||||||
|
func (r *Response) WriteHeaderAndEntity(status int, value interface{}) error {
|
||||||
|
writer, ok := r.EntityWriter()
|
||||||
|
if !ok {
|
||||||
|
r.WriteHeader(http.StatusNotAcceptable)
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
return writer.Write(r, status, value)
|
||||||
|
}
|
||||||
|
|
||||||
|
// WriteAsXml is a convenience method for writing a value in xml (requires Xml tags on the value)
|
||||||
|
// It uses the standard encoding/xml package for marshalling the value ; not using a registered EntityReaderWriter.
|
||||||
|
func (r *Response) WriteAsXml(value interface{}) error {
|
||||||
|
return writeXML(r, http.StatusOK, MIME_XML, value)
|
||||||
|
}
|
||||||
|
|
||||||
|
// WriteHeaderAndXml is a convenience method for writing a status and value in xml (requires Xml tags on the value)
|
||||||
|
// It uses the standard encoding/xml package for marshalling the value ; not using a registered EntityReaderWriter.
|
||||||
|
func (r *Response) WriteHeaderAndXml(status int, value interface{}) error {
|
||||||
|
return writeXML(r, status, MIME_XML, value)
|
||||||
|
}
|
||||||
|
|
||||||
|
// WriteAsJson is a convenience method for writing a value in json.
|
||||||
|
// It uses the standard encoding/json package for marshalling the value ; not using a registered EntityReaderWriter.
|
||||||
|
func (r *Response) WriteAsJson(value interface{}) error {
|
||||||
|
return writeJSON(r, http.StatusOK, MIME_JSON, value)
|
||||||
|
}
|
||||||
|
|
||||||
|
// WriteJson is a convenience method for writing a value in Json with a given Content-Type.
|
||||||
|
// It uses the standard encoding/json package for marshalling the value ; not using a registered EntityReaderWriter.
|
||||||
|
func (r *Response) WriteJson(value interface{}, contentType string) error {
|
||||||
|
return writeJSON(r, http.StatusOK, contentType, value)
|
||||||
|
}
|
||||||
|
|
||||||
|
// WriteHeaderAndJson is a convenience method for writing the status and a value in Json with a given Content-Type.
|
||||||
|
// It uses the standard encoding/json package for marshalling the value ; not using a registered EntityReaderWriter.
|
||||||
|
func (r *Response) WriteHeaderAndJson(status int, value interface{}, contentType string) error {
|
||||||
|
return writeJSON(r, status, contentType, value)
|
||||||
|
}
|
||||||
|
|
||||||
|
// WriteError writes the http status and the error string on the response. err can be nil.
|
||||||
|
// Return an error if writing was not successful.
|
||||||
|
func (r *Response) WriteError(httpStatus int, err error) (writeErr error) {
|
||||||
|
r.err = err
|
||||||
|
if err == nil {
|
||||||
|
writeErr = r.WriteErrorString(httpStatus, "")
|
||||||
|
} else {
|
||||||
|
writeErr = r.WriteErrorString(httpStatus, err.Error())
|
||||||
|
}
|
||||||
|
return writeErr
|
||||||
|
}
|
||||||
|
|
||||||
|
// WriteServiceError is a convenience method for a responding with a status and a ServiceError
|
||||||
|
func (r *Response) WriteServiceError(httpStatus int, err ServiceError) error {
|
||||||
|
r.err = err
|
||||||
|
return r.WriteHeaderAndEntity(httpStatus, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
// WriteErrorString is a convenience method for an error status with the actual error
|
||||||
|
func (r *Response) WriteErrorString(httpStatus int, errorReason string) error {
|
||||||
|
if r.err == nil {
|
||||||
|
// if not called from WriteError
|
||||||
|
r.err = errors.New(errorReason)
|
||||||
|
}
|
||||||
|
r.WriteHeader(httpStatus)
|
||||||
|
if _, err := r.Write([]byte(errorReason)); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Flush implements http.Flusher interface, which sends any buffered data to the client.
|
||||||
|
func (r *Response) Flush() {
|
||||||
|
if f, ok := r.ResponseWriter.(http.Flusher); ok {
|
||||||
|
f.Flush()
|
||||||
|
} else if trace {
|
||||||
|
traceLogger.Printf("ResponseWriter %v doesn't support Flush", r)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// WriteHeader is overridden to remember the Status Code that has been written.
|
||||||
|
// Changes to the Header of the response have no effect after this.
|
||||||
|
func (r *Response) WriteHeader(httpStatus int) {
|
||||||
|
r.statusCode = httpStatus
|
||||||
|
r.ResponseWriter.WriteHeader(httpStatus)
|
||||||
|
}
|
||||||
|
|
||||||
|
// StatusCode returns the code that has been written using WriteHeader.
|
||||||
|
func (r Response) StatusCode() int {
|
||||||
|
if 0 == r.statusCode {
|
||||||
|
// no status code has been written yet; assume OK
|
||||||
|
return http.StatusOK
|
||||||
|
}
|
||||||
|
return r.statusCode
|
||||||
|
}
|
||||||
|
|
||||||
|
// Write writes the data to the connection as part of an HTTP reply.
|
||||||
|
// Write is part of http.ResponseWriter interface.
|
||||||
|
func (r *Response) Write(bytes []byte) (int, error) {
|
||||||
|
written, err := r.ResponseWriter.Write(bytes)
|
||||||
|
r.contentLength += written
|
||||||
|
return written, err
|
||||||
|
}
|
||||||
|
|
||||||
|
// ContentLength returns the number of bytes written for the response content.
|
||||||
|
// Note that this value is only correct if all data is written through the Response using its Write* methods.
|
||||||
|
// Data written directly using the underlying http.ResponseWriter is not accounted for.
|
||||||
|
func (r Response) ContentLength() int {
|
||||||
|
return r.contentLength
|
||||||
|
}
|
||||||
|
|
||||||
|
// CloseNotify is part of http.CloseNotifier interface
|
||||||
|
func (r Response) CloseNotify() <-chan bool {
|
||||||
|
return r.ResponseWriter.(http.CloseNotifier).CloseNotify()
|
||||||
|
}
|
||||||
|
|
||||||
|
// Error returns the err created by WriteError
|
||||||
|
func (r Response) Error() error {
|
||||||
|
return r.err
|
||||||
|
}
|
178
vendor/github.com/emicklei/go-restful/v3/route.go
generated
vendored
Normal file
178
vendor/github.com/emicklei/go-restful/v3/route.go
generated
vendored
Normal file
@ -0,0 +1,178 @@
|
|||||||
|
package restful
|
||||||
|
|
||||||
|
// Copyright 2013 Ernest Micklei. All rights reserved.
|
||||||
|
// Use of this source code is governed by a license
|
||||||
|
// that can be found in the LICENSE file.
|
||||||
|
|
||||||
|
import (
|
||||||
|
"net/http"
|
||||||
|
"strings"
|
||||||
|
)
|
||||||
|
|
||||||
|
// RouteFunction declares the signature of a function that can be bound to a Route.
|
||||||
|
type RouteFunction func(*Request, *Response)
|
||||||
|
|
||||||
|
// RouteSelectionConditionFunction declares the signature of a function that
|
||||||
|
// can be used to add extra conditional logic when selecting whether the route
|
||||||
|
// matches the HTTP request.
|
||||||
|
type RouteSelectionConditionFunction func(httpRequest *http.Request) bool
|
||||||
|
|
||||||
|
// Route binds a HTTP Method,Path,Consumes combination to a RouteFunction.
|
||||||
|
type Route struct {
|
||||||
|
ExtensionProperties
|
||||||
|
Method string
|
||||||
|
Produces []string
|
||||||
|
Consumes []string
|
||||||
|
Path string // webservice root path + described path
|
||||||
|
Function RouteFunction
|
||||||
|
Filters []FilterFunction
|
||||||
|
If []RouteSelectionConditionFunction
|
||||||
|
|
||||||
|
// cached values for dispatching
|
||||||
|
relativePath string
|
||||||
|
pathParts []string
|
||||||
|
pathExpr *pathExpression // cached compilation of relativePath as RegExp
|
||||||
|
|
||||||
|
// documentation
|
||||||
|
Doc string
|
||||||
|
Notes string
|
||||||
|
Operation string
|
||||||
|
ParameterDocs []*Parameter
|
||||||
|
ResponseErrors map[int]ResponseError
|
||||||
|
DefaultResponse *ResponseError
|
||||||
|
ReadSample, WriteSample interface{} // structs that model an example request or response payload
|
||||||
|
|
||||||
|
// Extra information used to store custom information about the route.
|
||||||
|
Metadata map[string]interface{}
|
||||||
|
|
||||||
|
// marks a route as deprecated
|
||||||
|
Deprecated bool
|
||||||
|
|
||||||
|
//Overrides the container.contentEncodingEnabled
|
||||||
|
contentEncodingEnabled *bool
|
||||||
|
|
||||||
|
// indicate route path has custom verb
|
||||||
|
hasCustomVerb bool
|
||||||
|
|
||||||
|
// if a request does not include a content-type header then
|
||||||
|
// depending on the method, it may return a 415 Unsupported Media
|
||||||
|
// Must have uppercase HTTP Method names such as GET,HEAD,OPTIONS,...
|
||||||
|
allowedMethodsWithoutContentType []string
|
||||||
|
}
|
||||||
|
|
||||||
|
// Initialize for Route
|
||||||
|
func (r *Route) postBuild() {
|
||||||
|
r.pathParts = tokenizePath(r.Path)
|
||||||
|
r.hasCustomVerb = hasCustomVerb(r.Path)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Create Request and Response from their http versions
|
||||||
|
func (r *Route) wrapRequestResponse(httpWriter http.ResponseWriter, httpRequest *http.Request, pathParams map[string]string) (*Request, *Response) {
|
||||||
|
wrappedRequest := NewRequest(httpRequest)
|
||||||
|
wrappedRequest.pathParameters = pathParams
|
||||||
|
wrappedRequest.selectedRoute = r
|
||||||
|
wrappedResponse := NewResponse(httpWriter)
|
||||||
|
wrappedResponse.requestAccept = httpRequest.Header.Get(HEADER_Accept)
|
||||||
|
wrappedResponse.routeProduces = r.Produces
|
||||||
|
return wrappedRequest, wrappedResponse
|
||||||
|
}
|
||||||
|
|
||||||
|
func stringTrimSpaceCutset(r rune) bool {
|
||||||
|
return r == ' '
|
||||||
|
}
|
||||||
|
|
||||||
|
// Return whether the mimeType matches to what this Route can produce.
|
||||||
|
func (r Route) matchesAccept(mimeTypesWithQuality string) bool {
|
||||||
|
remaining := mimeTypesWithQuality
|
||||||
|
for {
|
||||||
|
var mimeType string
|
||||||
|
if end := strings.Index(remaining, ","); end == -1 {
|
||||||
|
mimeType, remaining = remaining, ""
|
||||||
|
} else {
|
||||||
|
mimeType, remaining = remaining[:end], remaining[end+1:]
|
||||||
|
}
|
||||||
|
if quality := strings.Index(mimeType, ";"); quality != -1 {
|
||||||
|
mimeType = mimeType[:quality]
|
||||||
|
}
|
||||||
|
mimeType = strings.TrimFunc(mimeType, stringTrimSpaceCutset)
|
||||||
|
if mimeType == "*/*" {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
for _, producibleType := range r.Produces {
|
||||||
|
if producibleType == "*/*" || producibleType == mimeType {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if len(remaining) == 0 {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Return whether this Route can consume content with a type specified by mimeTypes (can be empty).
|
||||||
|
func (r Route) matchesContentType(mimeTypes string) bool {
|
||||||
|
|
||||||
|
if len(r.Consumes) == 0 {
|
||||||
|
// did not specify what it can consume ; any media type (“*/*”) is assumed
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(mimeTypes) == 0 {
|
||||||
|
// idempotent methods with (most-likely or guaranteed) empty content match missing Content-Type
|
||||||
|
m := r.Method
|
||||||
|
// if route specifies less or non-idempotent methods then use that
|
||||||
|
if len(r.allowedMethodsWithoutContentType) > 0 {
|
||||||
|
for _, each := range r.allowedMethodsWithoutContentType {
|
||||||
|
if m == each {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if m == "GET" || m == "HEAD" || m == "OPTIONS" || m == "DELETE" || m == "TRACE" {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// proceed with default
|
||||||
|
mimeTypes = MIME_OCTET
|
||||||
|
}
|
||||||
|
|
||||||
|
remaining := mimeTypes
|
||||||
|
for {
|
||||||
|
var mimeType string
|
||||||
|
if end := strings.Index(remaining, ","); end == -1 {
|
||||||
|
mimeType, remaining = remaining, ""
|
||||||
|
} else {
|
||||||
|
mimeType, remaining = remaining[:end], remaining[end+1:]
|
||||||
|
}
|
||||||
|
if quality := strings.Index(mimeType, ";"); quality != -1 {
|
||||||
|
mimeType = mimeType[:quality]
|
||||||
|
}
|
||||||
|
mimeType = strings.TrimFunc(mimeType, stringTrimSpaceCutset)
|
||||||
|
for _, consumeableType := range r.Consumes {
|
||||||
|
if consumeableType == "*/*" || consumeableType == mimeType {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if len(remaining) == 0 {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Tokenize an URL path using the slash separator ; the result does not have empty tokens
|
||||||
|
func tokenizePath(path string) []string {
|
||||||
|
if "/" == path {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
return strings.Split(strings.Trim(path, "/"), "/")
|
||||||
|
}
|
||||||
|
|
||||||
|
// for debugging
|
||||||
|
func (r *Route) String() string {
|
||||||
|
return r.Method + " " + r.Path
|
||||||
|
}
|
||||||
|
|
||||||
|
// EnableContentEncoding (default=false) allows for GZIP or DEFLATE encoding of responses. Overrides the container.contentEncodingEnabled value.
|
||||||
|
func (r *Route) EnableContentEncoding(enabled bool) {
|
||||||
|
r.contentEncodingEnabled = &enabled
|
||||||
|
}
|
376
vendor/github.com/emicklei/go-restful/v3/route_builder.go
generated
vendored
Normal file
376
vendor/github.com/emicklei/go-restful/v3/route_builder.go
generated
vendored
Normal file
@ -0,0 +1,376 @@
|
|||||||
|
package restful
|
||||||
|
|
||||||
|
// Copyright 2013 Ernest Micklei. All rights reserved.
|
||||||
|
// Use of this source code is governed by a license
|
||||||
|
// that can be found in the LICENSE file.
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"os"
|
||||||
|
"reflect"
|
||||||
|
"runtime"
|
||||||
|
"strings"
|
||||||
|
"sync/atomic"
|
||||||
|
|
||||||
|
"github.com/emicklei/go-restful/v3/log"
|
||||||
|
)
|
||||||
|
|
||||||
|
// RouteBuilder is a helper to construct Routes.
|
||||||
|
type RouteBuilder struct {
|
||||||
|
rootPath string
|
||||||
|
currentPath string
|
||||||
|
produces []string
|
||||||
|
consumes []string
|
||||||
|
httpMethod string // required
|
||||||
|
function RouteFunction // required
|
||||||
|
filters []FilterFunction
|
||||||
|
conditions []RouteSelectionConditionFunction
|
||||||
|
allowedMethodsWithoutContentType []string // see Route
|
||||||
|
|
||||||
|
typeNameHandleFunc TypeNameHandleFunction // required
|
||||||
|
|
||||||
|
// documentation
|
||||||
|
doc string
|
||||||
|
notes string
|
||||||
|
operation string
|
||||||
|
readSample, writeSample interface{}
|
||||||
|
parameters []*Parameter
|
||||||
|
errorMap map[int]ResponseError
|
||||||
|
defaultResponse *ResponseError
|
||||||
|
metadata map[string]interface{}
|
||||||
|
extensions map[string]interface{}
|
||||||
|
deprecated bool
|
||||||
|
contentEncodingEnabled *bool
|
||||||
|
}
|
||||||
|
|
||||||
|
// Do evaluates each argument with the RouteBuilder itself.
|
||||||
|
// This allows you to follow DRY principles without breaking the fluent programming style.
|
||||||
|
// Example:
|
||||||
|
// ws.Route(ws.DELETE("/{name}").To(t.deletePerson).Do(Returns200, Returns500))
|
||||||
|
//
|
||||||
|
// func Returns500(b *RouteBuilder) {
|
||||||
|
// b.Returns(500, "Internal Server Error", restful.ServiceError{})
|
||||||
|
// }
|
||||||
|
func (b *RouteBuilder) Do(oneArgBlocks ...func(*RouteBuilder)) *RouteBuilder {
|
||||||
|
for _, each := range oneArgBlocks {
|
||||||
|
each(b)
|
||||||
|
}
|
||||||
|
return b
|
||||||
|
}
|
||||||
|
|
||||||
|
// To bind the route to a function.
|
||||||
|
// If this route is matched with the incoming Http Request then call this function with the *Request,*Response pair. Required.
|
||||||
|
func (b *RouteBuilder) To(function RouteFunction) *RouteBuilder {
|
||||||
|
b.function = function
|
||||||
|
return b
|
||||||
|
}
|
||||||
|
|
||||||
|
// Method specifies what HTTP method to match. Required.
|
||||||
|
func (b *RouteBuilder) Method(method string) *RouteBuilder {
|
||||||
|
b.httpMethod = method
|
||||||
|
return b
|
||||||
|
}
|
||||||
|
|
||||||
|
// Produces specifies what MIME types can be produced ; the matched one will appear in the Content-Type Http header.
|
||||||
|
func (b *RouteBuilder) Produces(mimeTypes ...string) *RouteBuilder {
|
||||||
|
b.produces = mimeTypes
|
||||||
|
return b
|
||||||
|
}
|
||||||
|
|
||||||
|
// Consumes specifies what MIME types can be consumes ; the Accept Http header must matched any of these
|
||||||
|
func (b *RouteBuilder) Consumes(mimeTypes ...string) *RouteBuilder {
|
||||||
|
b.consumes = mimeTypes
|
||||||
|
return b
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path specifies the relative (w.r.t WebService root path) URL path to match. Default is "/".
|
||||||
|
func (b *RouteBuilder) Path(subPath string) *RouteBuilder {
|
||||||
|
b.currentPath = subPath
|
||||||
|
return b
|
||||||
|
}
|
||||||
|
|
||||||
|
// Doc tells what this route is all about. Optional.
|
||||||
|
func (b *RouteBuilder) Doc(documentation string) *RouteBuilder {
|
||||||
|
b.doc = documentation
|
||||||
|
return b
|
||||||
|
}
|
||||||
|
|
||||||
|
// Notes is a verbose explanation of the operation behavior. Optional.
|
||||||
|
func (b *RouteBuilder) Notes(notes string) *RouteBuilder {
|
||||||
|
b.notes = notes
|
||||||
|
return b
|
||||||
|
}
|
||||||
|
|
||||||
|
// Reads tells what resource type will be read from the request payload. Optional.
|
||||||
|
// A parameter of type "body" is added ,required is set to true and the dataType is set to the qualified name of the sample's type.
|
||||||
|
func (b *RouteBuilder) Reads(sample interface{}, optionalDescription ...string) *RouteBuilder {
|
||||||
|
fn := b.typeNameHandleFunc
|
||||||
|
if fn == nil {
|
||||||
|
fn = reflectTypeName
|
||||||
|
}
|
||||||
|
typeAsName := fn(sample)
|
||||||
|
description := ""
|
||||||
|
if len(optionalDescription) > 0 {
|
||||||
|
description = optionalDescription[0]
|
||||||
|
}
|
||||||
|
b.readSample = sample
|
||||||
|
bodyParameter := &Parameter{&ParameterData{Name: "body", Description: description}}
|
||||||
|
bodyParameter.beBody()
|
||||||
|
bodyParameter.Required(true)
|
||||||
|
bodyParameter.DataType(typeAsName)
|
||||||
|
b.Param(bodyParameter)
|
||||||
|
return b
|
||||||
|
}
|
||||||
|
|
||||||
|
// ParameterNamed returns a Parameter already known to the RouteBuilder. Returns nil if not.
|
||||||
|
// Use this to modify or extend information for the Parameter (through its Data()).
|
||||||
|
func (b RouteBuilder) ParameterNamed(name string) (p *Parameter) {
|
||||||
|
for _, each := range b.parameters {
|
||||||
|
if each.Data().Name == name {
|
||||||
|
return each
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return p
|
||||||
|
}
|
||||||
|
|
||||||
|
// Writes tells what resource type will be written as the response payload. Optional.
|
||||||
|
func (b *RouteBuilder) Writes(sample interface{}) *RouteBuilder {
|
||||||
|
b.writeSample = sample
|
||||||
|
return b
|
||||||
|
}
|
||||||
|
|
||||||
|
// Param allows you to document the parameters of the Route. It adds a new Parameter (does not check for duplicates).
|
||||||
|
func (b *RouteBuilder) Param(parameter *Parameter) *RouteBuilder {
|
||||||
|
if b.parameters == nil {
|
||||||
|
b.parameters = []*Parameter{}
|
||||||
|
}
|
||||||
|
b.parameters = append(b.parameters, parameter)
|
||||||
|
return b
|
||||||
|
}
|
||||||
|
|
||||||
|
// Operation allows you to document what the actual method/function call is of the Route.
|
||||||
|
// Unless called, the operation name is derived from the RouteFunction set using To(..).
|
||||||
|
func (b *RouteBuilder) Operation(name string) *RouteBuilder {
|
||||||
|
b.operation = name
|
||||||
|
return b
|
||||||
|
}
|
||||||
|
|
||||||
|
// ReturnsError is deprecated, use Returns instead.
|
||||||
|
func (b *RouteBuilder) ReturnsError(code int, message string, model interface{}) *RouteBuilder {
|
||||||
|
log.Print("ReturnsError is deprecated, use Returns instead.")
|
||||||
|
return b.Returns(code, message, model)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Returns allows you to document what responses (errors or regular) can be expected.
|
||||||
|
// The model parameter is optional ; either pass a struct instance or use nil if not applicable.
|
||||||
|
func (b *RouteBuilder) Returns(code int, message string, model interface{}) *RouteBuilder {
|
||||||
|
err := ResponseError{
|
||||||
|
Code: code,
|
||||||
|
Message: message,
|
||||||
|
Model: model,
|
||||||
|
IsDefault: false, // this field is deprecated, use default response instead.
|
||||||
|
}
|
||||||
|
// lazy init because there is no NewRouteBuilder (yet)
|
||||||
|
if b.errorMap == nil {
|
||||||
|
b.errorMap = map[int]ResponseError{}
|
||||||
|
}
|
||||||
|
b.errorMap[code] = err
|
||||||
|
return b
|
||||||
|
}
|
||||||
|
|
||||||
|
// ReturnsWithHeaders is similar to Returns, but can specify response headers
|
||||||
|
func (b *RouteBuilder) ReturnsWithHeaders(code int, message string, model interface{}, headers map[string]Header) *RouteBuilder {
|
||||||
|
b.Returns(code, message, model)
|
||||||
|
err := b.errorMap[code]
|
||||||
|
err.Headers = headers
|
||||||
|
b.errorMap[code] = err
|
||||||
|
return b
|
||||||
|
}
|
||||||
|
|
||||||
|
// DefaultReturns is a special Returns call that sets the default of the response.
|
||||||
|
func (b *RouteBuilder) DefaultReturns(message string, model interface{}) *RouteBuilder {
|
||||||
|
b.defaultResponse = &ResponseError{
|
||||||
|
Message: message,
|
||||||
|
Model: model,
|
||||||
|
}
|
||||||
|
return b
|
||||||
|
}
|
||||||
|
|
||||||
|
// Metadata adds or updates a key=value pair to the metadata map.
|
||||||
|
func (b *RouteBuilder) Metadata(key string, value interface{}) *RouteBuilder {
|
||||||
|
if b.metadata == nil {
|
||||||
|
b.metadata = map[string]interface{}{}
|
||||||
|
}
|
||||||
|
b.metadata[key] = value
|
||||||
|
return b
|
||||||
|
}
|
||||||
|
|
||||||
|
// AddExtension adds or updates a key=value pair to the extensions map.
|
||||||
|
func (b *RouteBuilder) AddExtension(key string, value interface{}) *RouteBuilder {
|
||||||
|
if b.extensions == nil {
|
||||||
|
b.extensions = map[string]interface{}{}
|
||||||
|
}
|
||||||
|
b.extensions[key] = value
|
||||||
|
return b
|
||||||
|
}
|
||||||
|
|
||||||
|
// Deprecate sets the value of deprecated to true. Deprecated routes have a special UI treatment to warn against use
|
||||||
|
func (b *RouteBuilder) Deprecate() *RouteBuilder {
|
||||||
|
b.deprecated = true
|
||||||
|
return b
|
||||||
|
}
|
||||||
|
|
||||||
|
// AllowedMethodsWithoutContentType overrides the default list GET,HEAD,OPTIONS,DELETE,TRACE
|
||||||
|
// If a request does not include a content-type header then
|
||||||
|
// depending on the method, it may return a 415 Unsupported Media.
|
||||||
|
// Must have uppercase HTTP Method names such as GET,HEAD,OPTIONS,...
|
||||||
|
func (b *RouteBuilder) AllowedMethodsWithoutContentType(methods []string) *RouteBuilder {
|
||||||
|
b.allowedMethodsWithoutContentType = methods
|
||||||
|
return b
|
||||||
|
}
|
||||||
|
|
||||||
|
// ResponseError represents a response; not necessarily an error.
|
||||||
|
type ResponseError struct {
|
||||||
|
ExtensionProperties
|
||||||
|
Code int
|
||||||
|
Message string
|
||||||
|
Model interface{}
|
||||||
|
Headers map[string]Header
|
||||||
|
IsDefault bool
|
||||||
|
}
|
||||||
|
|
||||||
|
// Header describes a header for a response of the API
|
||||||
|
//
|
||||||
|
// For more information: http://goo.gl/8us55a#headerObject
|
||||||
|
type Header struct {
|
||||||
|
*Items
|
||||||
|
Description string
|
||||||
|
}
|
||||||
|
|
||||||
|
// Items describe swagger simple schemas for headers
|
||||||
|
type Items struct {
|
||||||
|
Type string
|
||||||
|
Format string
|
||||||
|
Items *Items
|
||||||
|
CollectionFormat string
|
||||||
|
Default interface{}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (b *RouteBuilder) servicePath(path string) *RouteBuilder {
|
||||||
|
b.rootPath = path
|
||||||
|
return b
|
||||||
|
}
|
||||||
|
|
||||||
|
// Filter appends a FilterFunction to the end of filters for this Route to build.
|
||||||
|
func (b *RouteBuilder) Filter(filter FilterFunction) *RouteBuilder {
|
||||||
|
b.filters = append(b.filters, filter)
|
||||||
|
return b
|
||||||
|
}
|
||||||
|
|
||||||
|
// If sets a condition function that controls matching the Route based on custom logic.
|
||||||
|
// The condition function is provided the HTTP request and should return true if the route
|
||||||
|
// should be considered.
|
||||||
|
//
|
||||||
|
// Efficiency note: the condition function is called before checking the method, produces, and
|
||||||
|
// consumes criteria, so that the correct HTTP status code can be returned.
|
||||||
|
//
|
||||||
|
// Lifecycle note: no filter functions have been called prior to calling the condition function,
|
||||||
|
// so the condition function should not depend on any context that might be set up by container
|
||||||
|
// or route filters.
|
||||||
|
func (b *RouteBuilder) If(condition RouteSelectionConditionFunction) *RouteBuilder {
|
||||||
|
b.conditions = append(b.conditions, condition)
|
||||||
|
return b
|
||||||
|
}
|
||||||
|
|
||||||
|
// ContentEncodingEnabled allows you to override the Containers value for auto-compressing this route response.
|
||||||
|
func (b *RouteBuilder) ContentEncodingEnabled(enabled bool) *RouteBuilder {
|
||||||
|
b.contentEncodingEnabled = &enabled
|
||||||
|
return b
|
||||||
|
}
|
||||||
|
|
||||||
|
// If no specific Route path then set to rootPath
|
||||||
|
// If no specific Produces then set to rootProduces
|
||||||
|
// If no specific Consumes then set to rootConsumes
|
||||||
|
func (b *RouteBuilder) copyDefaults(rootProduces, rootConsumes []string) {
|
||||||
|
if len(b.produces) == 0 {
|
||||||
|
b.produces = rootProduces
|
||||||
|
}
|
||||||
|
if len(b.consumes) == 0 {
|
||||||
|
b.consumes = rootConsumes
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// typeNameHandler sets the function that will convert types to strings in the parameter
|
||||||
|
// and model definitions.
|
||||||
|
func (b *RouteBuilder) typeNameHandler(handler TypeNameHandleFunction) *RouteBuilder {
|
||||||
|
b.typeNameHandleFunc = handler
|
||||||
|
return b
|
||||||
|
}
|
||||||
|
|
||||||
|
// Build creates a new Route using the specification details collected by the RouteBuilder
|
||||||
|
func (b *RouteBuilder) Build() Route {
|
||||||
|
pathExpr, err := newPathExpression(b.currentPath)
|
||||||
|
if err != nil {
|
||||||
|
log.Printf("Invalid path:%s because:%v", b.currentPath, err)
|
||||||
|
os.Exit(1)
|
||||||
|
}
|
||||||
|
if b.function == nil {
|
||||||
|
log.Printf("No function specified for route:" + b.currentPath)
|
||||||
|
os.Exit(1)
|
||||||
|
}
|
||||||
|
operationName := b.operation
|
||||||
|
if len(operationName) == 0 && b.function != nil {
|
||||||
|
// extract from definition
|
||||||
|
operationName = nameOfFunction(b.function)
|
||||||
|
}
|
||||||
|
route := Route{
|
||||||
|
Method: b.httpMethod,
|
||||||
|
Path: concatPath(b.rootPath, b.currentPath),
|
||||||
|
Produces: b.produces,
|
||||||
|
Consumes: b.consumes,
|
||||||
|
Function: b.function,
|
||||||
|
Filters: b.filters,
|
||||||
|
If: b.conditions,
|
||||||
|
relativePath: b.currentPath,
|
||||||
|
pathExpr: pathExpr,
|
||||||
|
Doc: b.doc,
|
||||||
|
Notes: b.notes,
|
||||||
|
Operation: operationName,
|
||||||
|
ParameterDocs: b.parameters,
|
||||||
|
ResponseErrors: b.errorMap,
|
||||||
|
DefaultResponse: b.defaultResponse,
|
||||||
|
ReadSample: b.readSample,
|
||||||
|
WriteSample: b.writeSample,
|
||||||
|
Metadata: b.metadata,
|
||||||
|
Deprecated: b.deprecated,
|
||||||
|
contentEncodingEnabled: b.contentEncodingEnabled,
|
||||||
|
allowedMethodsWithoutContentType: b.allowedMethodsWithoutContentType,
|
||||||
|
}
|
||||||
|
route.Extensions = b.extensions
|
||||||
|
route.postBuild()
|
||||||
|
return route
|
||||||
|
}
|
||||||
|
|
||||||
|
func concatPath(path1, path2 string) string {
|
||||||
|
return strings.TrimRight(path1, "/") + "/" + strings.TrimLeft(path2, "/")
|
||||||
|
}
|
||||||
|
|
||||||
|
var anonymousFuncCount int32
|
||||||
|
|
||||||
|
// nameOfFunction returns the short name of the function f for documentation.
|
||||||
|
// It uses a runtime feature for debugging ; its value may change for later Go versions.
|
||||||
|
func nameOfFunction(f interface{}) string {
|
||||||
|
fun := runtime.FuncForPC(reflect.ValueOf(f).Pointer())
|
||||||
|
tokenized := strings.Split(fun.Name(), ".")
|
||||||
|
last := tokenized[len(tokenized)-1]
|
||||||
|
last = strings.TrimSuffix(last, ")·fm") // < Go 1.5
|
||||||
|
last = strings.TrimSuffix(last, ")-fm") // Go 1.5
|
||||||
|
last = strings.TrimSuffix(last, "·fm") // < Go 1.5
|
||||||
|
last = strings.TrimSuffix(last, "-fm") // Go 1.5
|
||||||
|
if last == "func1" { // this could mean conflicts in API docs
|
||||||
|
val := atomic.AddInt32(&anonymousFuncCount, 1)
|
||||||
|
last = "func" + fmt.Sprintf("%d", val)
|
||||||
|
atomic.StoreInt32(&anonymousFuncCount, val)
|
||||||
|
}
|
||||||
|
return last
|
||||||
|
}
|
66
vendor/github.com/emicklei/go-restful/v3/route_reader.go
generated
vendored
Normal file
66
vendor/github.com/emicklei/go-restful/v3/route_reader.go
generated
vendored
Normal file
@ -0,0 +1,66 @@
|
|||||||
|
package restful
|
||||||
|
|
||||||
|
// Copyright 2021 Ernest Micklei. All rights reserved.
|
||||||
|
// Use of this source code is governed by a license
|
||||||
|
// that can be found in the LICENSE file.
|
||||||
|
|
||||||
|
type RouteReader interface {
|
||||||
|
Method() string
|
||||||
|
Consumes() []string
|
||||||
|
Path() string
|
||||||
|
Doc() string
|
||||||
|
Notes() string
|
||||||
|
Operation() string
|
||||||
|
ParameterDocs() []*Parameter
|
||||||
|
// Returns a copy
|
||||||
|
Metadata() map[string]interface{}
|
||||||
|
Deprecated() bool
|
||||||
|
}
|
||||||
|
|
||||||
|
type routeAccessor struct {
|
||||||
|
route *Route
|
||||||
|
}
|
||||||
|
|
||||||
|
func (r routeAccessor) Method() string {
|
||||||
|
return r.route.Method
|
||||||
|
}
|
||||||
|
func (r routeAccessor) Consumes() []string {
|
||||||
|
return r.route.Consumes[:]
|
||||||
|
}
|
||||||
|
func (r routeAccessor) Path() string {
|
||||||
|
return r.route.Path
|
||||||
|
}
|
||||||
|
func (r routeAccessor) Doc() string {
|
||||||
|
return r.route.Doc
|
||||||
|
}
|
||||||
|
func (r routeAccessor) Notes() string {
|
||||||
|
return r.route.Notes
|
||||||
|
}
|
||||||
|
func (r routeAccessor) Operation() string {
|
||||||
|
return r.route.Operation
|
||||||
|
}
|
||||||
|
func (r routeAccessor) ParameterDocs() []*Parameter {
|
||||||
|
return r.route.ParameterDocs[:]
|
||||||
|
}
|
||||||
|
|
||||||
|
// Returns a copy
|
||||||
|
func (r routeAccessor) Metadata() map[string]interface{} {
|
||||||
|
return copyMap(r.route.Metadata)
|
||||||
|
}
|
||||||
|
func (r routeAccessor) Deprecated() bool {
|
||||||
|
return r.route.Deprecated
|
||||||
|
}
|
||||||
|
|
||||||
|
// https://stackoverflow.com/questions/23057785/how-to-copy-a-map
|
||||||
|
func copyMap(m map[string]interface{}) map[string]interface{} {
|
||||||
|
cp := make(map[string]interface{})
|
||||||
|
for k, v := range m {
|
||||||
|
vm, ok := v.(map[string]interface{})
|
||||||
|
if ok {
|
||||||
|
cp[k] = copyMap(vm)
|
||||||
|
} else {
|
||||||
|
cp[k] = v
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return cp
|
||||||
|
}
|
20
vendor/github.com/emicklei/go-restful/v3/router.go
generated
vendored
Normal file
20
vendor/github.com/emicklei/go-restful/v3/router.go
generated
vendored
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
package restful
|
||||||
|
|
||||||
|
// Copyright 2013 Ernest Micklei. All rights reserved.
|
||||||
|
// Use of this source code is governed by a license
|
||||||
|
// that can be found in the LICENSE file.
|
||||||
|
|
||||||
|
import "net/http"
|
||||||
|
|
||||||
|
// A RouteSelector finds the best matching Route given the input HTTP Request
|
||||||
|
// RouteSelectors can optionally also implement the PathProcessor interface to also calculate the
|
||||||
|
// path parameters after the route has been selected.
|
||||||
|
type RouteSelector interface {
|
||||||
|
|
||||||
|
// SelectRoute finds a Route given the input HTTP Request and a list of WebServices.
|
||||||
|
// It returns a selected Route and its containing WebService or an error indicating
|
||||||
|
// a problem.
|
||||||
|
SelectRoute(
|
||||||
|
webServices []*WebService,
|
||||||
|
httpRequest *http.Request) (selectedService *WebService, selected *Route, err error)
|
||||||
|
}
|
32
vendor/github.com/emicklei/go-restful/v3/service_error.go
generated
vendored
Normal file
32
vendor/github.com/emicklei/go-restful/v3/service_error.go
generated
vendored
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
package restful
|
||||||
|
|
||||||
|
// Copyright 2013 Ernest Micklei. All rights reserved.
|
||||||
|
// Use of this source code is governed by a license
|
||||||
|
// that can be found in the LICENSE file.
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"net/http"
|
||||||
|
)
|
||||||
|
|
||||||
|
// ServiceError is a transport object to pass information about a non-Http error occurred in a WebService while processing a request.
|
||||||
|
type ServiceError struct {
|
||||||
|
Code int
|
||||||
|
Message string
|
||||||
|
Header http.Header
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewError returns a ServiceError using the code and reason
|
||||||
|
func NewError(code int, message string) ServiceError {
|
||||||
|
return ServiceError{Code: code, Message: message}
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewErrorWithHeader returns a ServiceError using the code, reason and header
|
||||||
|
func NewErrorWithHeader(code int, message string, header http.Header) ServiceError {
|
||||||
|
return ServiceError{Code: code, Message: message, Header: header}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Error returns a text representation of the service error
|
||||||
|
func (s ServiceError) Error() string {
|
||||||
|
return fmt.Sprintf("[ServiceError:%v] %v", s.Code, s.Message)
|
||||||
|
}
|
293
vendor/github.com/emicklei/go-restful/v3/web_service.go
generated
vendored
Normal file
293
vendor/github.com/emicklei/go-restful/v3/web_service.go
generated
vendored
Normal file
@ -0,0 +1,293 @@
|
|||||||
|
package restful
|
||||||
|
|
||||||
|
import (
|
||||||
|
"errors"
|
||||||
|
"os"
|
||||||
|
"reflect"
|
||||||
|
"sync"
|
||||||
|
|
||||||
|
"github.com/emicklei/go-restful/v3/log"
|
||||||
|
)
|
||||||
|
|
||||||
|
// Copyright 2013 Ernest Micklei. All rights reserved.
|
||||||
|
// Use of this source code is governed by a license
|
||||||
|
// that can be found in the LICENSE file.
|
||||||
|
|
||||||
|
// WebService holds a collection of Route values that bind a Http Method + URL Path to a function.
|
||||||
|
type WebService struct {
|
||||||
|
rootPath string
|
||||||
|
pathExpr *pathExpression // cached compilation of rootPath as RegExp
|
||||||
|
routes []Route
|
||||||
|
produces []string
|
||||||
|
consumes []string
|
||||||
|
pathParameters []*Parameter
|
||||||
|
filters []FilterFunction
|
||||||
|
documentation string
|
||||||
|
apiVersion string
|
||||||
|
|
||||||
|
typeNameHandleFunc TypeNameHandleFunction
|
||||||
|
|
||||||
|
dynamicRoutes bool
|
||||||
|
|
||||||
|
// protects 'routes' if dynamic routes are enabled
|
||||||
|
routesLock sync.RWMutex
|
||||||
|
}
|
||||||
|
|
||||||
|
func (w *WebService) SetDynamicRoutes(enable bool) {
|
||||||
|
w.dynamicRoutes = enable
|
||||||
|
}
|
||||||
|
|
||||||
|
// TypeNameHandleFunction declares functions that can handle translating the name of a sample object
|
||||||
|
// into the restful documentation for the service.
|
||||||
|
type TypeNameHandleFunction func(sample interface{}) string
|
||||||
|
|
||||||
|
// TypeNameHandler sets the function that will convert types to strings in the parameter
|
||||||
|
// and model definitions. If not set, the web service will invoke
|
||||||
|
// reflect.TypeOf(object).String().
|
||||||
|
func (w *WebService) TypeNameHandler(handler TypeNameHandleFunction) *WebService {
|
||||||
|
w.typeNameHandleFunc = handler
|
||||||
|
return w
|
||||||
|
}
|
||||||
|
|
||||||
|
// reflectTypeName is the default TypeNameHandleFunction and for a given object
|
||||||
|
// returns the name that Go identifies it with (e.g. "string" or "v1.Object") via
|
||||||
|
// the reflection API.
|
||||||
|
func reflectTypeName(sample interface{}) string {
|
||||||
|
return reflect.TypeOf(sample).String()
|
||||||
|
}
|
||||||
|
|
||||||
|
// compilePathExpression ensures that the path is compiled into a RegEx for those routers that need it.
|
||||||
|
func (w *WebService) compilePathExpression() {
|
||||||
|
compiled, err := newPathExpression(w.rootPath)
|
||||||
|
if err != nil {
|
||||||
|
log.Printf("invalid path:%s because:%v", w.rootPath, err)
|
||||||
|
os.Exit(1)
|
||||||
|
}
|
||||||
|
w.pathExpr = compiled
|
||||||
|
}
|
||||||
|
|
||||||
|
// ApiVersion sets the API version for documentation purposes.
|
||||||
|
func (w *WebService) ApiVersion(apiVersion string) *WebService {
|
||||||
|
w.apiVersion = apiVersion
|
||||||
|
return w
|
||||||
|
}
|
||||||
|
|
||||||
|
// Version returns the API version for documentation purposes.
|
||||||
|
func (w *WebService) Version() string { return w.apiVersion }
|
||||||
|
|
||||||
|
// Path specifies the root URL template path of the WebService.
|
||||||
|
// All Routes will be relative to this path.
|
||||||
|
func (w *WebService) Path(root string) *WebService {
|
||||||
|
w.rootPath = root
|
||||||
|
if len(w.rootPath) == 0 {
|
||||||
|
w.rootPath = "/"
|
||||||
|
}
|
||||||
|
w.compilePathExpression()
|
||||||
|
return w
|
||||||
|
}
|
||||||
|
|
||||||
|
// Param adds a PathParameter to document parameters used in the root path.
|
||||||
|
func (w *WebService) Param(parameter *Parameter) *WebService {
|
||||||
|
if w.pathParameters == nil {
|
||||||
|
w.pathParameters = []*Parameter{}
|
||||||
|
}
|
||||||
|
w.pathParameters = append(w.pathParameters, parameter)
|
||||||
|
return w
|
||||||
|
}
|
||||||
|
|
||||||
|
// PathParameter creates a new Parameter of kind Path for documentation purposes.
|
||||||
|
// It is initialized as required with string as its DataType.
|
||||||
|
func (w *WebService) PathParameter(name, description string) *Parameter {
|
||||||
|
return PathParameter(name, description)
|
||||||
|
}
|
||||||
|
|
||||||
|
// PathParameter creates a new Parameter of kind Path for documentation purposes.
|
||||||
|
// It is initialized as required with string as its DataType.
|
||||||
|
func PathParameter(name, description string) *Parameter {
|
||||||
|
p := &Parameter{&ParameterData{Name: name, Description: description, Required: true, DataType: "string"}}
|
||||||
|
p.bePath()
|
||||||
|
return p
|
||||||
|
}
|
||||||
|
|
||||||
|
// QueryParameter creates a new Parameter of kind Query for documentation purposes.
|
||||||
|
// It is initialized as not required with string as its DataType.
|
||||||
|
func (w *WebService) QueryParameter(name, description string) *Parameter {
|
||||||
|
return QueryParameter(name, description)
|
||||||
|
}
|
||||||
|
|
||||||
|
// QueryParameter creates a new Parameter of kind Query for documentation purposes.
|
||||||
|
// It is initialized as not required with string as its DataType.
|
||||||
|
func QueryParameter(name, description string) *Parameter {
|
||||||
|
p := &Parameter{&ParameterData{Name: name, Description: description, Required: false, DataType: "string", CollectionFormat: CollectionFormatCSV.String()}}
|
||||||
|
p.beQuery()
|
||||||
|
return p
|
||||||
|
}
|
||||||
|
|
||||||
|
// BodyParameter creates a new Parameter of kind Body for documentation purposes.
|
||||||
|
// It is initialized as required without a DataType.
|
||||||
|
func (w *WebService) BodyParameter(name, description string) *Parameter {
|
||||||
|
return BodyParameter(name, description)
|
||||||
|
}
|
||||||
|
|
||||||
|
// BodyParameter creates a new Parameter of kind Body for documentation purposes.
|
||||||
|
// It is initialized as required without a DataType.
|
||||||
|
func BodyParameter(name, description string) *Parameter {
|
||||||
|
p := &Parameter{&ParameterData{Name: name, Description: description, Required: true}}
|
||||||
|
p.beBody()
|
||||||
|
return p
|
||||||
|
}
|
||||||
|
|
||||||
|
// HeaderParameter creates a new Parameter of kind (Http) Header for documentation purposes.
|
||||||
|
// It is initialized as not required with string as its DataType.
|
||||||
|
func (w *WebService) HeaderParameter(name, description string) *Parameter {
|
||||||
|
return HeaderParameter(name, description)
|
||||||
|
}
|
||||||
|
|
||||||
|
// HeaderParameter creates a new Parameter of kind (Http) Header for documentation purposes.
|
||||||
|
// It is initialized as not required with string as its DataType.
|
||||||
|
func HeaderParameter(name, description string) *Parameter {
|
||||||
|
p := &Parameter{&ParameterData{Name: name, Description: description, Required: false, DataType: "string"}}
|
||||||
|
p.beHeader()
|
||||||
|
return p
|
||||||
|
}
|
||||||
|
|
||||||
|
// FormParameter creates a new Parameter of kind Form (using application/x-www-form-urlencoded) for documentation purposes.
|
||||||
|
// It is initialized as required with string as its DataType.
|
||||||
|
func (w *WebService) FormParameter(name, description string) *Parameter {
|
||||||
|
return FormParameter(name, description)
|
||||||
|
}
|
||||||
|
|
||||||
|
// FormParameter creates a new Parameter of kind Form (using application/x-www-form-urlencoded) for documentation purposes.
|
||||||
|
// It is initialized as required with string as its DataType.
|
||||||
|
func FormParameter(name, description string) *Parameter {
|
||||||
|
p := &Parameter{&ParameterData{Name: name, Description: description, Required: false, DataType: "string"}}
|
||||||
|
p.beForm()
|
||||||
|
return p
|
||||||
|
}
|
||||||
|
|
||||||
|
// Route creates a new Route using the RouteBuilder and add to the ordered list of Routes.
|
||||||
|
func (w *WebService) Route(builder *RouteBuilder) *WebService {
|
||||||
|
w.routesLock.Lock()
|
||||||
|
defer w.routesLock.Unlock()
|
||||||
|
builder.copyDefaults(w.produces, w.consumes)
|
||||||
|
w.routes = append(w.routes, builder.Build())
|
||||||
|
return w
|
||||||
|
}
|
||||||
|
|
||||||
|
// RemoveRoute removes the specified route, looks for something that matches 'path' and 'method'
|
||||||
|
func (w *WebService) RemoveRoute(path, method string) error {
|
||||||
|
if !w.dynamicRoutes {
|
||||||
|
return errors.New("dynamic routes are not enabled.")
|
||||||
|
}
|
||||||
|
w.routesLock.Lock()
|
||||||
|
defer w.routesLock.Unlock()
|
||||||
|
newRoutes := []Route{}
|
||||||
|
for _, route := range w.routes {
|
||||||
|
if route.Method == method && route.Path == path {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
newRoutes = append(newRoutes, route)
|
||||||
|
}
|
||||||
|
w.routes = newRoutes
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Method creates a new RouteBuilder and initialize its http method
|
||||||
|
func (w *WebService) Method(httpMethod string) *RouteBuilder {
|
||||||
|
return new(RouteBuilder).typeNameHandler(w.typeNameHandleFunc).servicePath(w.rootPath).Method(httpMethod)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Produces specifies that this WebService can produce one or more MIME types.
|
||||||
|
// Http requests must have one of these values set for the Accept header.
|
||||||
|
func (w *WebService) Produces(contentTypes ...string) *WebService {
|
||||||
|
w.produces = contentTypes
|
||||||
|
return w
|
||||||
|
}
|
||||||
|
|
||||||
|
// Consumes specifies that this WebService can consume one or more MIME types.
|
||||||
|
// Http requests must have one of these values set for the Content-Type header.
|
||||||
|
func (w *WebService) Consumes(accepts ...string) *WebService {
|
||||||
|
w.consumes = accepts
|
||||||
|
return w
|
||||||
|
}
|
||||||
|
|
||||||
|
// Routes returns the Routes associated with this WebService
|
||||||
|
func (w *WebService) Routes() []Route {
|
||||||
|
if !w.dynamicRoutes {
|
||||||
|
return w.routes
|
||||||
|
}
|
||||||
|
// Make a copy of the array to prevent concurrency problems
|
||||||
|
w.routesLock.RLock()
|
||||||
|
defer w.routesLock.RUnlock()
|
||||||
|
result := make([]Route, len(w.routes))
|
||||||
|
for ix := range w.routes {
|
||||||
|
result[ix] = w.routes[ix]
|
||||||
|
}
|
||||||
|
return result
|
||||||
|
}
|
||||||
|
|
||||||
|
// RootPath returns the RootPath associated with this WebService. Default "/"
|
||||||
|
func (w *WebService) RootPath() string {
|
||||||
|
return w.rootPath
|
||||||
|
}
|
||||||
|
|
||||||
|
// PathParameters return the path parameter names for (shared among its Routes)
|
||||||
|
func (w *WebService) PathParameters() []*Parameter {
|
||||||
|
return w.pathParameters
|
||||||
|
}
|
||||||
|
|
||||||
|
// Filter adds a filter function to the chain of filters applicable to all its Routes
|
||||||
|
func (w *WebService) Filter(filter FilterFunction) *WebService {
|
||||||
|
w.filters = append(w.filters, filter)
|
||||||
|
return w
|
||||||
|
}
|
||||||
|
|
||||||
|
// Doc is used to set the documentation of this service.
|
||||||
|
func (w *WebService) Doc(plainText string) *WebService {
|
||||||
|
w.documentation = plainText
|
||||||
|
return w
|
||||||
|
}
|
||||||
|
|
||||||
|
// Documentation returns it.
|
||||||
|
func (w *WebService) Documentation() string {
|
||||||
|
return w.documentation
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
Convenience methods
|
||||||
|
*/
|
||||||
|
|
||||||
|
// HEAD is a shortcut for .Method("HEAD").Path(subPath)
|
||||||
|
func (w *WebService) HEAD(subPath string) *RouteBuilder {
|
||||||
|
return new(RouteBuilder).typeNameHandler(w.typeNameHandleFunc).servicePath(w.rootPath).Method("HEAD").Path(subPath)
|
||||||
|
}
|
||||||
|
|
||||||
|
// GET is a shortcut for .Method("GET").Path(subPath)
|
||||||
|
func (w *WebService) GET(subPath string) *RouteBuilder {
|
||||||
|
return new(RouteBuilder).typeNameHandler(w.typeNameHandleFunc).servicePath(w.rootPath).Method("GET").Path(subPath)
|
||||||
|
}
|
||||||
|
|
||||||
|
// POST is a shortcut for .Method("POST").Path(subPath)
|
||||||
|
func (w *WebService) POST(subPath string) *RouteBuilder {
|
||||||
|
return new(RouteBuilder).typeNameHandler(w.typeNameHandleFunc).servicePath(w.rootPath).Method("POST").Path(subPath)
|
||||||
|
}
|
||||||
|
|
||||||
|
// PUT is a shortcut for .Method("PUT").Path(subPath)
|
||||||
|
func (w *WebService) PUT(subPath string) *RouteBuilder {
|
||||||
|
return new(RouteBuilder).typeNameHandler(w.typeNameHandleFunc).servicePath(w.rootPath).Method("PUT").Path(subPath)
|
||||||
|
}
|
||||||
|
|
||||||
|
// PATCH is a shortcut for .Method("PATCH").Path(subPath)
|
||||||
|
func (w *WebService) PATCH(subPath string) *RouteBuilder {
|
||||||
|
return new(RouteBuilder).typeNameHandler(w.typeNameHandleFunc).servicePath(w.rootPath).Method("PATCH").Path(subPath)
|
||||||
|
}
|
||||||
|
|
||||||
|
// DELETE is a shortcut for .Method("DELETE").Path(subPath)
|
||||||
|
func (w *WebService) DELETE(subPath string) *RouteBuilder {
|
||||||
|
return new(RouteBuilder).typeNameHandler(w.typeNameHandleFunc).servicePath(w.rootPath).Method("DELETE").Path(subPath)
|
||||||
|
}
|
||||||
|
|
||||||
|
// OPTIONS is a shortcut for .Method("OPTIONS").Path(subPath)
|
||||||
|
func (w *WebService) OPTIONS(subPath string) *RouteBuilder {
|
||||||
|
return new(RouteBuilder).typeNameHandler(w.typeNameHandleFunc).servicePath(w.rootPath).Method("OPTIONS").Path(subPath)
|
||||||
|
}
|
39
vendor/github.com/emicklei/go-restful/v3/web_service_container.go
generated
vendored
Normal file
39
vendor/github.com/emicklei/go-restful/v3/web_service_container.go
generated
vendored
Normal file
@ -0,0 +1,39 @@
|
|||||||
|
package restful
|
||||||
|
|
||||||
|
// Copyright 2013 Ernest Micklei. All rights reserved.
|
||||||
|
// Use of this source code is governed by a license
|
||||||
|
// that can be found in the LICENSE file.
|
||||||
|
|
||||||
|
import (
|
||||||
|
"net/http"
|
||||||
|
)
|
||||||
|
|
||||||
|
// DefaultContainer is a restful.Container that uses http.DefaultServeMux
|
||||||
|
var DefaultContainer *Container
|
||||||
|
|
||||||
|
func init() {
|
||||||
|
DefaultContainer = NewContainer()
|
||||||
|
DefaultContainer.ServeMux = http.DefaultServeMux
|
||||||
|
}
|
||||||
|
|
||||||
|
// If set the true then panics will not be caught to return HTTP 500.
|
||||||
|
// In that case, Route functions are responsible for handling any error situation.
|
||||||
|
// Default value is false = recover from panics. This has performance implications.
|
||||||
|
// OBSOLETE ; use restful.DefaultContainer.DoNotRecover(true)
|
||||||
|
var DoNotRecover = false
|
||||||
|
|
||||||
|
// Add registers a new WebService add it to the DefaultContainer.
|
||||||
|
func Add(service *WebService) {
|
||||||
|
DefaultContainer.Add(service)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Filter appends a container FilterFunction from the DefaultContainer.
|
||||||
|
// These are called before dispatching a http.Request to a WebService.
|
||||||
|
func Filter(filter FilterFunction) {
|
||||||
|
DefaultContainer.Filter(filter)
|
||||||
|
}
|
||||||
|
|
||||||
|
// RegisteredWebServices returns the collections of WebServices from the DefaultContainer
|
||||||
|
func RegisteredWebServices() []*WebService {
|
||||||
|
return DefaultContainer.RegisteredWebServices()
|
||||||
|
}
|
26
vendor/github.com/go-openapi/jsonpointer/.editorconfig
generated
vendored
Normal file
26
vendor/github.com/go-openapi/jsonpointer/.editorconfig
generated
vendored
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
# top-most EditorConfig file
|
||||||
|
root = true
|
||||||
|
|
||||||
|
# Unix-style newlines with a newline ending every file
|
||||||
|
[*]
|
||||||
|
end_of_line = lf
|
||||||
|
insert_final_newline = true
|
||||||
|
indent_style = space
|
||||||
|
indent_size = 2
|
||||||
|
trim_trailing_whitespace = true
|
||||||
|
|
||||||
|
# Set default charset
|
||||||
|
[*.{js,py,go,scala,rb,java,html,css,less,sass,md}]
|
||||||
|
charset = utf-8
|
||||||
|
|
||||||
|
# Tab indentation (no size specified)
|
||||||
|
[*.go]
|
||||||
|
indent_style = tab
|
||||||
|
|
||||||
|
[*.md]
|
||||||
|
trim_trailing_whitespace = false
|
||||||
|
|
||||||
|
# Matches the exact files either package.json or .travis.yml
|
||||||
|
[{package.json,.travis.yml}]
|
||||||
|
indent_style = space
|
||||||
|
indent_size = 2
|
1
vendor/github.com/go-openapi/jsonpointer/.gitignore
generated
vendored
Normal file
1
vendor/github.com/go-openapi/jsonpointer/.gitignore
generated
vendored
Normal file
@ -0,0 +1 @@
|
|||||||
|
secrets.yml
|
15
vendor/github.com/go-openapi/jsonpointer/.travis.yml
generated
vendored
Normal file
15
vendor/github.com/go-openapi/jsonpointer/.travis.yml
generated
vendored
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
after_success:
|
||||||
|
- bash <(curl -s https://codecov.io/bash)
|
||||||
|
go:
|
||||||
|
- 1.14.x
|
||||||
|
- 1.15.x
|
||||||
|
install:
|
||||||
|
- GO111MODULE=off go get -u gotest.tools/gotestsum
|
||||||
|
env:
|
||||||
|
- GO111MODULE=on
|
||||||
|
language: go
|
||||||
|
notifications:
|
||||||
|
slack:
|
||||||
|
secure: a5VgoiwB1G/AZqzmephPZIhEB9avMlsWSlVnM1dSAtYAwdrQHGTQxAmpOxYIoSPDhWNN5bfZmjd29++UlTwLcHSR+e0kJhH6IfDlsHj/HplNCJ9tyI0zYc7XchtdKgeMxMzBKCzgwFXGSbQGydXTliDNBo0HOzmY3cou/daMFTP60K+offcjS+3LRAYb1EroSRXZqrk1nuF/xDL3792DZUdPMiFR/L/Df6y74D6/QP4sTkTDFQitz4Wy/7jbsfj8dG6qK2zivgV6/l+w4OVjFkxVpPXogDWY10vVXNVynqxfJ7to2d1I9lNCHE2ilBCkWMIPdyJF7hjF8pKW+82yP4EzRh0vu8Xn0HT5MZpQxdRY/YMxNrWaG7SxsoEaO4q5uhgdzAqLYY3TRa7MjIK+7Ur+aqOeTXn6OKwVi0CjvZ6mIU3WUKSwiwkFZMbjRAkSb5CYwMEfGFO/z964xz83qGt6WAtBXNotqCQpTIiKtDHQeLOMfksHImCg6JLhQcWBVxamVgu0G3Pdh8Y6DyPnxraXY95+QDavbjqv7TeYT9T/FNnrkXaTTK0s4iWE5H4ACU0Qvz0wUYgfQrZv0/Hp7V17+rabUwnzYySHCy9SWX/7OV9Cfh31iMp9ZIffr76xmmThtOEqs8TrTtU6BWI3rWwvA9cXQipZTVtL0oswrGw=
|
||||||
|
script:
|
||||||
|
- gotestsum -f short-verbose -- -race -coverprofile=coverage.txt -covermode=atomic ./...
|
74
vendor/github.com/go-openapi/jsonpointer/CODE_OF_CONDUCT.md
generated
vendored
Normal file
74
vendor/github.com/go-openapi/jsonpointer/CODE_OF_CONDUCT.md
generated
vendored
Normal file
@ -0,0 +1,74 @@
|
|||||||
|
# Contributor Covenant Code of Conduct
|
||||||
|
|
||||||
|
## Our Pledge
|
||||||
|
|
||||||
|
In the interest of fostering an open and welcoming environment, we as
|
||||||
|
contributors and maintainers pledge to making participation in our project and
|
||||||
|
our community a harassment-free experience for everyone, regardless of age, body
|
||||||
|
size, disability, ethnicity, gender identity and expression, level of experience,
|
||||||
|
nationality, personal appearance, race, religion, or sexual identity and
|
||||||
|
orientation.
|
||||||
|
|
||||||
|
## Our Standards
|
||||||
|
|
||||||
|
Examples of behavior that contributes to creating a positive environment
|
||||||
|
include:
|
||||||
|
|
||||||
|
* Using welcoming and inclusive language
|
||||||
|
* Being respectful of differing viewpoints and experiences
|
||||||
|
* Gracefully accepting constructive criticism
|
||||||
|
* Focusing on what is best for the community
|
||||||
|
* Showing empathy towards other community members
|
||||||
|
|
||||||
|
Examples of unacceptable behavior by participants include:
|
||||||
|
|
||||||
|
* The use of sexualized language or imagery and unwelcome sexual attention or
|
||||||
|
advances
|
||||||
|
* Trolling, insulting/derogatory comments, and personal or political attacks
|
||||||
|
* Public or private harassment
|
||||||
|
* Publishing others' private information, such as a physical or electronic
|
||||||
|
address, without explicit permission
|
||||||
|
* Other conduct which could reasonably be considered inappropriate in a
|
||||||
|
professional setting
|
||||||
|
|
||||||
|
## Our Responsibilities
|
||||||
|
|
||||||
|
Project maintainers are responsible for clarifying the standards of acceptable
|
||||||
|
behavior and are expected to take appropriate and fair corrective action in
|
||||||
|
response to any instances of unacceptable behavior.
|
||||||
|
|
||||||
|
Project maintainers have the right and responsibility to remove, edit, or
|
||||||
|
reject comments, commits, code, wiki edits, issues, and other contributions
|
||||||
|
that are not aligned to this Code of Conduct, or to ban temporarily or
|
||||||
|
permanently any contributor for other behaviors that they deem inappropriate,
|
||||||
|
threatening, offensive, or harmful.
|
||||||
|
|
||||||
|
## Scope
|
||||||
|
|
||||||
|
This Code of Conduct applies both within project spaces and in public spaces
|
||||||
|
when an individual is representing the project or its community. Examples of
|
||||||
|
representing a project or community include using an official project e-mail
|
||||||
|
address, posting via an official social media account, or acting as an appointed
|
||||||
|
representative at an online or offline event. Representation of a project may be
|
||||||
|
further defined and clarified by project maintainers.
|
||||||
|
|
||||||
|
## Enforcement
|
||||||
|
|
||||||
|
Instances of abusive, harassing, or otherwise unacceptable behavior may be
|
||||||
|
reported by contacting the project team at ivan+abuse@flanders.co.nz. All
|
||||||
|
complaints will be reviewed and investigated and will result in a response that
|
||||||
|
is deemed necessary and appropriate to the circumstances. The project team is
|
||||||
|
obligated to maintain confidentiality with regard to the reporter of an incident.
|
||||||
|
Further details of specific enforcement policies may be posted separately.
|
||||||
|
|
||||||
|
Project maintainers who do not follow or enforce the Code of Conduct in good
|
||||||
|
faith may face temporary or permanent repercussions as determined by other
|
||||||
|
members of the project's leadership.
|
||||||
|
|
||||||
|
## Attribution
|
||||||
|
|
||||||
|
This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4,
|
||||||
|
available at [http://contributor-covenant.org/version/1/4][version]
|
||||||
|
|
||||||
|
[homepage]: http://contributor-covenant.org
|
||||||
|
[version]: http://contributor-covenant.org/version/1/4/
|
202
vendor/github.com/go-openapi/jsonpointer/LICENSE
generated
vendored
Normal file
202
vendor/github.com/go-openapi/jsonpointer/LICENSE
generated
vendored
Normal file
@ -0,0 +1,202 @@
|
|||||||
|
|
||||||
|
Apache License
|
||||||
|
Version 2.0, January 2004
|
||||||
|
http://www.apache.org/licenses/
|
||||||
|
|
||||||
|
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
|
||||||
|
|
||||||
|
1. Definitions.
|
||||||
|
|
||||||
|
"License" shall mean the terms and conditions for use, reproduction,
|
||||||
|
and distribution as defined by Sections 1 through 9 of this document.
|
||||||
|
|
||||||
|
"Licensor" shall mean the copyright owner or entity authorized by
|
||||||
|
the copyright owner that is granting the License.
|
||||||
|
|
||||||
|
"Legal Entity" shall mean the union of the acting entity and all
|
||||||
|
other entities that control, are controlled by, or are under common
|
||||||
|
control with that entity. For the purposes of this definition,
|
||||||
|
"control" means (i) the power, direct or indirect, to cause the
|
||||||
|
direction or management of such entity, whether by contract or
|
||||||
|
otherwise, or (ii) ownership of fifty percent (50%) or more of the
|
||||||
|
outstanding shares, or (iii) beneficial ownership of such entity.
|
||||||
|
|
||||||
|
"You" (or "Your") shall mean an individual or Legal Entity
|
||||||
|
exercising permissions granted by this License.
|
||||||
|
|
||||||
|
"Source" form shall mean the preferred form for making modifications,
|
||||||
|
including but not limited to software source code, documentation
|
||||||
|
source, and configuration files.
|
||||||
|
|
||||||
|
"Object" form shall mean any form resulting from mechanical
|
||||||
|
transformation or translation of a Source form, including but
|
||||||
|
not limited to compiled object code, generated documentation,
|
||||||
|
and conversions to other media types.
|
||||||
|
|
||||||
|
"Work" shall mean the work of authorship, whether in Source or
|
||||||
|
Object form, made available under the License, as indicated by a
|
||||||
|
copyright notice that is included in or attached to the work
|
||||||
|
(an example is provided in the Appendix below).
|
||||||
|
|
||||||
|
"Derivative Works" shall mean any work, whether in Source or Object
|
||||||
|
form, that is based on (or derived from) the Work and for which the
|
||||||
|
editorial revisions, annotations, elaborations, or other modifications
|
||||||
|
represent, as a whole, an original work of authorship. For the purposes
|
||||||
|
of this License, Derivative Works shall not include works that remain
|
||||||
|
separable from, or merely link (or bind by name) to the interfaces of,
|
||||||
|
the Work and Derivative Works thereof.
|
||||||
|
|
||||||
|
"Contribution" shall mean any work of authorship, including
|
||||||
|
the original version of the Work and any modifications or additions
|
||||||
|
to that Work or Derivative Works thereof, that is intentionally
|
||||||
|
submitted to Licensor for inclusion in the Work by the copyright owner
|
||||||
|
or by an individual or Legal Entity authorized to submit on behalf of
|
||||||
|
the copyright owner. For the purposes of this definition, "submitted"
|
||||||
|
means any form of electronic, verbal, or written communication sent
|
||||||
|
to the Licensor or its representatives, including but not limited to
|
||||||
|
communication on electronic mailing lists, source code control systems,
|
||||||
|
and issue tracking systems that are managed by, or on behalf of, the
|
||||||
|
Licensor for the purpose of discussing and improving the Work, but
|
||||||
|
excluding communication that is conspicuously marked or otherwise
|
||||||
|
designated in writing by the copyright owner as "Not a Contribution."
|
||||||
|
|
||||||
|
"Contributor" shall mean Licensor and any individual or Legal Entity
|
||||||
|
on behalf of whom a Contribution has been received by Licensor and
|
||||||
|
subsequently incorporated within the Work.
|
||||||
|
|
||||||
|
2. Grant of Copyright License. Subject to the terms and conditions of
|
||||||
|
this License, each Contributor hereby grants to You a perpetual,
|
||||||
|
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||||
|
copyright license to reproduce, prepare Derivative Works of,
|
||||||
|
publicly display, publicly perform, sublicense, and distribute the
|
||||||
|
Work and such Derivative Works in Source or Object form.
|
||||||
|
|
||||||
|
3. Grant of Patent License. Subject to the terms and conditions of
|
||||||
|
this License, each Contributor hereby grants to You a perpetual,
|
||||||
|
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||||
|
(except as stated in this section) patent license to make, have made,
|
||||||
|
use, offer to sell, sell, import, and otherwise transfer the Work,
|
||||||
|
where such license applies only to those patent claims licensable
|
||||||
|
by such Contributor that are necessarily infringed by their
|
||||||
|
Contribution(s) alone or by combination of their Contribution(s)
|
||||||
|
with the Work to which such Contribution(s) was submitted. If You
|
||||||
|
institute patent litigation against any entity (including a
|
||||||
|
cross-claim or counterclaim in a lawsuit) alleging that the Work
|
||||||
|
or a Contribution incorporated within the Work constitutes direct
|
||||||
|
or contributory patent infringement, then any patent licenses
|
||||||
|
granted to You under this License for that Work shall terminate
|
||||||
|
as of the date such litigation is filed.
|
||||||
|
|
||||||
|
4. Redistribution. You may reproduce and distribute copies of the
|
||||||
|
Work or Derivative Works thereof in any medium, with or without
|
||||||
|
modifications, and in Source or Object form, provided that You
|
||||||
|
meet the following conditions:
|
||||||
|
|
||||||
|
(a) You must give any other recipients of the Work or
|
||||||
|
Derivative Works a copy of this License; and
|
||||||
|
|
||||||
|
(b) You must cause any modified files to carry prominent notices
|
||||||
|
stating that You changed the files; and
|
||||||
|
|
||||||
|
(c) You must retain, in the Source form of any Derivative Works
|
||||||
|
that You distribute, all copyright, patent, trademark, and
|
||||||
|
attribution notices from the Source form of the Work,
|
||||||
|
excluding those notices that do not pertain to any part of
|
||||||
|
the Derivative Works; and
|
||||||
|
|
||||||
|
(d) If the Work includes a "NOTICE" text file as part of its
|
||||||
|
distribution, then any Derivative Works that You distribute must
|
||||||
|
include a readable copy of the attribution notices contained
|
||||||
|
within such NOTICE file, excluding those notices that do not
|
||||||
|
pertain to any part of the Derivative Works, in at least one
|
||||||
|
of the following places: within a NOTICE text file distributed
|
||||||
|
as part of the Derivative Works; within the Source form or
|
||||||
|
documentation, if provided along with the Derivative Works; or,
|
||||||
|
within a display generated by the Derivative Works, if and
|
||||||
|
wherever such third-party notices normally appear. The contents
|
||||||
|
of the NOTICE file are for informational purposes only and
|
||||||
|
do not modify the License. You may add Your own attribution
|
||||||
|
notices within Derivative Works that You distribute, alongside
|
||||||
|
or as an addendum to the NOTICE text from the Work, provided
|
||||||
|
that such additional attribution notices cannot be construed
|
||||||
|
as modifying the License.
|
||||||
|
|
||||||
|
You may add Your own copyright statement to Your modifications and
|
||||||
|
may provide additional or different license terms and conditions
|
||||||
|
for use, reproduction, or distribution of Your modifications, or
|
||||||
|
for any such Derivative Works as a whole, provided Your use,
|
||||||
|
reproduction, and distribution of the Work otherwise complies with
|
||||||
|
the conditions stated in this License.
|
||||||
|
|
||||||
|
5. Submission of Contributions. Unless You explicitly state otherwise,
|
||||||
|
any Contribution intentionally submitted for inclusion in the Work
|
||||||
|
by You to the Licensor shall be under the terms and conditions of
|
||||||
|
this License, without any additional terms or conditions.
|
||||||
|
Notwithstanding the above, nothing herein shall supersede or modify
|
||||||
|
the terms of any separate license agreement you may have executed
|
||||||
|
with Licensor regarding such Contributions.
|
||||||
|
|
||||||
|
6. Trademarks. This License does not grant permission to use the trade
|
||||||
|
names, trademarks, service marks, or product names of the Licensor,
|
||||||
|
except as required for reasonable and customary use in describing the
|
||||||
|
origin of the Work and reproducing the content of the NOTICE file.
|
||||||
|
|
||||||
|
7. Disclaimer of Warranty. Unless required by applicable law or
|
||||||
|
agreed to in writing, Licensor provides the Work (and each
|
||||||
|
Contributor provides its Contributions) on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
||||||
|
implied, including, without limitation, any warranties or conditions
|
||||||
|
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
|
||||||
|
PARTICULAR PURPOSE. You are solely responsible for determining the
|
||||||
|
appropriateness of using or redistributing the Work and assume any
|
||||||
|
risks associated with Your exercise of permissions under this License.
|
||||||
|
|
||||||
|
8. Limitation of Liability. In no event and under no legal theory,
|
||||||
|
whether in tort (including negligence), contract, or otherwise,
|
||||||
|
unless required by applicable law (such as deliberate and grossly
|
||||||
|
negligent acts) or agreed to in writing, shall any Contributor be
|
||||||
|
liable to You for damages, including any direct, indirect, special,
|
||||||
|
incidental, or consequential damages of any character arising as a
|
||||||
|
result of this License or out of the use or inability to use the
|
||||||
|
Work (including but not limited to damages for loss of goodwill,
|
||||||
|
work stoppage, computer failure or malfunction, or any and all
|
||||||
|
other commercial damages or losses), even if such Contributor
|
||||||
|
has been advised of the possibility of such damages.
|
||||||
|
|
||||||
|
9. Accepting Warranty or Additional Liability. While redistributing
|
||||||
|
the Work or Derivative Works thereof, You may choose to offer,
|
||||||
|
and charge a fee for, acceptance of support, warranty, indemnity,
|
||||||
|
or other liability obligations and/or rights consistent with this
|
||||||
|
License. However, in accepting such obligations, You may act only
|
||||||
|
on Your own behalf and on Your sole responsibility, not on behalf
|
||||||
|
of any other Contributor, and only if You agree to indemnify,
|
||||||
|
defend, and hold each Contributor harmless for any liability
|
||||||
|
incurred by, or claims asserted against, such Contributor by reason
|
||||||
|
of your accepting any such warranty or additional liability.
|
||||||
|
|
||||||
|
END OF TERMS AND CONDITIONS
|
||||||
|
|
||||||
|
APPENDIX: How to apply the Apache License to your work.
|
||||||
|
|
||||||
|
To apply the Apache License to your work, attach the following
|
||||||
|
boilerplate notice, with the fields enclosed by brackets "[]"
|
||||||
|
replaced with your own identifying information. (Don't include
|
||||||
|
the brackets!) The text should be enclosed in the appropriate
|
||||||
|
comment syntax for the file format. We also recommend that a
|
||||||
|
file or class name and description of purpose be included on the
|
||||||
|
same "printed page" as the copyright notice for easier
|
||||||
|
identification within third-party archives.
|
||||||
|
|
||||||
|
Copyright [yyyy] [name of copyright owner]
|
||||||
|
|
||||||
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
you may not use this file except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
15
vendor/github.com/go-openapi/jsonpointer/README.md
generated
vendored
Normal file
15
vendor/github.com/go-openapi/jsonpointer/README.md
generated
vendored
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
# gojsonpointer [](https://travis-ci.org/go-openapi/jsonpointer) [](https://codecov.io/gh/go-openapi/jsonpointer) [](https://slackin.goswagger.io)
|
||||||
|
|
||||||
|
[](https://raw.githubusercontent.com/go-openapi/jsonpointer/master/LICENSE) [](http://godoc.org/github.com/go-openapi/jsonpointer)
|
||||||
|
An implementation of JSON Pointer - Go language
|
||||||
|
|
||||||
|
## Status
|
||||||
|
Completed YES
|
||||||
|
|
||||||
|
Tested YES
|
||||||
|
|
||||||
|
## References
|
||||||
|
http://tools.ietf.org/html/draft-ietf-appsawg-json-pointer-07
|
||||||
|
|
||||||
|
### Note
|
||||||
|
The 4.Evaluation part of the previous reference, starting with 'If the currently referenced value is a JSON array, the reference token MUST contain either...' is not implemented.
|
390
vendor/github.com/go-openapi/jsonpointer/pointer.go
generated
vendored
Normal file
390
vendor/github.com/go-openapi/jsonpointer/pointer.go
generated
vendored
Normal file
@ -0,0 +1,390 @@
|
|||||||
|
// Copyright 2013 sigu-399 ( https://github.com/sigu-399 )
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
|
||||||
|
// author sigu-399
|
||||||
|
// author-github https://github.com/sigu-399
|
||||||
|
// author-mail sigu.399@gmail.com
|
||||||
|
//
|
||||||
|
// repository-name jsonpointer
|
||||||
|
// repository-desc An implementation of JSON Pointer - Go language
|
||||||
|
//
|
||||||
|
// description Main and unique file.
|
||||||
|
//
|
||||||
|
// created 25-02-2013
|
||||||
|
|
||||||
|
package jsonpointer
|
||||||
|
|
||||||
|
import (
|
||||||
|
"errors"
|
||||||
|
"fmt"
|
||||||
|
"reflect"
|
||||||
|
"strconv"
|
||||||
|
"strings"
|
||||||
|
|
||||||
|
"github.com/go-openapi/swag"
|
||||||
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
emptyPointer = ``
|
||||||
|
pointerSeparator = `/`
|
||||||
|
|
||||||
|
invalidStart = `JSON pointer must be empty or start with a "` + pointerSeparator
|
||||||
|
)
|
||||||
|
|
||||||
|
var jsonPointableType = reflect.TypeOf(new(JSONPointable)).Elem()
|
||||||
|
var jsonSetableType = reflect.TypeOf(new(JSONSetable)).Elem()
|
||||||
|
|
||||||
|
// JSONPointable is an interface for structs to implement when they need to customize the
|
||||||
|
// json pointer process
|
||||||
|
type JSONPointable interface {
|
||||||
|
JSONLookup(string) (interface{}, error)
|
||||||
|
}
|
||||||
|
|
||||||
|
// JSONSetable is an interface for structs to implement when they need to customize the
|
||||||
|
// json pointer process
|
||||||
|
type JSONSetable interface {
|
||||||
|
JSONSet(string, interface{}) error
|
||||||
|
}
|
||||||
|
|
||||||
|
// New creates a new json pointer for the given string
|
||||||
|
func New(jsonPointerString string) (Pointer, error) {
|
||||||
|
|
||||||
|
var p Pointer
|
||||||
|
err := p.parse(jsonPointerString)
|
||||||
|
return p, err
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// Pointer the json pointer reprsentation
|
||||||
|
type Pointer struct {
|
||||||
|
referenceTokens []string
|
||||||
|
}
|
||||||
|
|
||||||
|
// "Constructor", parses the given string JSON pointer
|
||||||
|
func (p *Pointer) parse(jsonPointerString string) error {
|
||||||
|
|
||||||
|
var err error
|
||||||
|
|
||||||
|
if jsonPointerString != emptyPointer {
|
||||||
|
if !strings.HasPrefix(jsonPointerString, pointerSeparator) {
|
||||||
|
err = errors.New(invalidStart)
|
||||||
|
} else {
|
||||||
|
referenceTokens := strings.Split(jsonPointerString, pointerSeparator)
|
||||||
|
for _, referenceToken := range referenceTokens[1:] {
|
||||||
|
p.referenceTokens = append(p.referenceTokens, referenceToken)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get uses the pointer to retrieve a value from a JSON document
|
||||||
|
func (p *Pointer) Get(document interface{}) (interface{}, reflect.Kind, error) {
|
||||||
|
return p.get(document, swag.DefaultJSONNameProvider)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set uses the pointer to set a value from a JSON document
|
||||||
|
func (p *Pointer) Set(document interface{}, value interface{}) (interface{}, error) {
|
||||||
|
return document, p.set(document, value, swag.DefaultJSONNameProvider)
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetForToken gets a value for a json pointer token 1 level deep
|
||||||
|
func GetForToken(document interface{}, decodedToken string) (interface{}, reflect.Kind, error) {
|
||||||
|
return getSingleImpl(document, decodedToken, swag.DefaultJSONNameProvider)
|
||||||
|
}
|
||||||
|
|
||||||
|
// SetForToken gets a value for a json pointer token 1 level deep
|
||||||
|
func SetForToken(document interface{}, decodedToken string, value interface{}) (interface{}, error) {
|
||||||
|
return document, setSingleImpl(document, value, decodedToken, swag.DefaultJSONNameProvider)
|
||||||
|
}
|
||||||
|
|
||||||
|
func getSingleImpl(node interface{}, decodedToken string, nameProvider *swag.NameProvider) (interface{}, reflect.Kind, error) {
|
||||||
|
rValue := reflect.Indirect(reflect.ValueOf(node))
|
||||||
|
kind := rValue.Kind()
|
||||||
|
|
||||||
|
if rValue.Type().Implements(jsonPointableType) {
|
||||||
|
r, err := node.(JSONPointable).JSONLookup(decodedToken)
|
||||||
|
if err != nil {
|
||||||
|
return nil, kind, err
|
||||||
|
}
|
||||||
|
return r, kind, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
switch kind {
|
||||||
|
case reflect.Struct:
|
||||||
|
nm, ok := nameProvider.GetGoNameForType(rValue.Type(), decodedToken)
|
||||||
|
if !ok {
|
||||||
|
return nil, kind, fmt.Errorf("object has no field %q", decodedToken)
|
||||||
|
}
|
||||||
|
fld := rValue.FieldByName(nm)
|
||||||
|
return fld.Interface(), kind, nil
|
||||||
|
|
||||||
|
case reflect.Map:
|
||||||
|
kv := reflect.ValueOf(decodedToken)
|
||||||
|
mv := rValue.MapIndex(kv)
|
||||||
|
|
||||||
|
if mv.IsValid() {
|
||||||
|
return mv.Interface(), kind, nil
|
||||||
|
}
|
||||||
|
return nil, kind, fmt.Errorf("object has no key %q", decodedToken)
|
||||||
|
|
||||||
|
case reflect.Slice:
|
||||||
|
tokenIndex, err := strconv.Atoi(decodedToken)
|
||||||
|
if err != nil {
|
||||||
|
return nil, kind, err
|
||||||
|
}
|
||||||
|
sLength := rValue.Len()
|
||||||
|
if tokenIndex < 0 || tokenIndex >= sLength {
|
||||||
|
return nil, kind, fmt.Errorf("index out of bounds array[0,%d] index '%d'", sLength-1, tokenIndex)
|
||||||
|
}
|
||||||
|
|
||||||
|
elem := rValue.Index(tokenIndex)
|
||||||
|
return elem.Interface(), kind, nil
|
||||||
|
|
||||||
|
default:
|
||||||
|
return nil, kind, fmt.Errorf("invalid token reference %q", decodedToken)
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
func setSingleImpl(node, data interface{}, decodedToken string, nameProvider *swag.NameProvider) error {
|
||||||
|
rValue := reflect.Indirect(reflect.ValueOf(node))
|
||||||
|
|
||||||
|
if ns, ok := node.(JSONSetable); ok { // pointer impl
|
||||||
|
return ns.JSONSet(decodedToken, data)
|
||||||
|
}
|
||||||
|
|
||||||
|
if rValue.Type().Implements(jsonSetableType) {
|
||||||
|
return node.(JSONSetable).JSONSet(decodedToken, data)
|
||||||
|
}
|
||||||
|
|
||||||
|
switch rValue.Kind() {
|
||||||
|
case reflect.Struct:
|
||||||
|
nm, ok := nameProvider.GetGoNameForType(rValue.Type(), decodedToken)
|
||||||
|
if !ok {
|
||||||
|
return fmt.Errorf("object has no field %q", decodedToken)
|
||||||
|
}
|
||||||
|
fld := rValue.FieldByName(nm)
|
||||||
|
if fld.IsValid() {
|
||||||
|
fld.Set(reflect.ValueOf(data))
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
|
||||||
|
case reflect.Map:
|
||||||
|
kv := reflect.ValueOf(decodedToken)
|
||||||
|
rValue.SetMapIndex(kv, reflect.ValueOf(data))
|
||||||
|
return nil
|
||||||
|
|
||||||
|
case reflect.Slice:
|
||||||
|
tokenIndex, err := strconv.Atoi(decodedToken)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
sLength := rValue.Len()
|
||||||
|
if tokenIndex < 0 || tokenIndex >= sLength {
|
||||||
|
return fmt.Errorf("index out of bounds array[0,%d] index '%d'", sLength, tokenIndex)
|
||||||
|
}
|
||||||
|
|
||||||
|
elem := rValue.Index(tokenIndex)
|
||||||
|
if !elem.CanSet() {
|
||||||
|
return fmt.Errorf("can't set slice index %s to %v", decodedToken, data)
|
||||||
|
}
|
||||||
|
elem.Set(reflect.ValueOf(data))
|
||||||
|
return nil
|
||||||
|
|
||||||
|
default:
|
||||||
|
return fmt.Errorf("invalid token reference %q", decodedToken)
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
func (p *Pointer) get(node interface{}, nameProvider *swag.NameProvider) (interface{}, reflect.Kind, error) {
|
||||||
|
|
||||||
|
if nameProvider == nil {
|
||||||
|
nameProvider = swag.DefaultJSONNameProvider
|
||||||
|
}
|
||||||
|
|
||||||
|
kind := reflect.Invalid
|
||||||
|
|
||||||
|
// Full document when empty
|
||||||
|
if len(p.referenceTokens) == 0 {
|
||||||
|
return node, kind, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, token := range p.referenceTokens {
|
||||||
|
|
||||||
|
decodedToken := Unescape(token)
|
||||||
|
|
||||||
|
r, knd, err := getSingleImpl(node, decodedToken, nameProvider)
|
||||||
|
if err != nil {
|
||||||
|
return nil, knd, err
|
||||||
|
}
|
||||||
|
node, kind = r, knd
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
rValue := reflect.ValueOf(node)
|
||||||
|
kind = rValue.Kind()
|
||||||
|
|
||||||
|
return node, kind, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (p *Pointer) set(node, data interface{}, nameProvider *swag.NameProvider) error {
|
||||||
|
knd := reflect.ValueOf(node).Kind()
|
||||||
|
|
||||||
|
if knd != reflect.Ptr && knd != reflect.Struct && knd != reflect.Map && knd != reflect.Slice && knd != reflect.Array {
|
||||||
|
return fmt.Errorf("only structs, pointers, maps and slices are supported for setting values")
|
||||||
|
}
|
||||||
|
|
||||||
|
if nameProvider == nil {
|
||||||
|
nameProvider = swag.DefaultJSONNameProvider
|
||||||
|
}
|
||||||
|
|
||||||
|
// Full document when empty
|
||||||
|
if len(p.referenceTokens) == 0 {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
lastI := len(p.referenceTokens) - 1
|
||||||
|
for i, token := range p.referenceTokens {
|
||||||
|
isLastToken := i == lastI
|
||||||
|
decodedToken := Unescape(token)
|
||||||
|
|
||||||
|
if isLastToken {
|
||||||
|
|
||||||
|
return setSingleImpl(node, data, decodedToken, nameProvider)
|
||||||
|
}
|
||||||
|
|
||||||
|
rValue := reflect.Indirect(reflect.ValueOf(node))
|
||||||
|
kind := rValue.Kind()
|
||||||
|
|
||||||
|
if rValue.Type().Implements(jsonPointableType) {
|
||||||
|
r, err := node.(JSONPointable).JSONLookup(decodedToken)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
fld := reflect.ValueOf(r)
|
||||||
|
if fld.CanAddr() && fld.Kind() != reflect.Interface && fld.Kind() != reflect.Map && fld.Kind() != reflect.Slice && fld.Kind() != reflect.Ptr {
|
||||||
|
node = fld.Addr().Interface()
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
node = r
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
switch kind {
|
||||||
|
case reflect.Struct:
|
||||||
|
nm, ok := nameProvider.GetGoNameForType(rValue.Type(), decodedToken)
|
||||||
|
if !ok {
|
||||||
|
return fmt.Errorf("object has no field %q", decodedToken)
|
||||||
|
}
|
||||||
|
fld := rValue.FieldByName(nm)
|
||||||
|
if fld.CanAddr() && fld.Kind() != reflect.Interface && fld.Kind() != reflect.Map && fld.Kind() != reflect.Slice && fld.Kind() != reflect.Ptr {
|
||||||
|
node = fld.Addr().Interface()
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
node = fld.Interface()
|
||||||
|
|
||||||
|
case reflect.Map:
|
||||||
|
kv := reflect.ValueOf(decodedToken)
|
||||||
|
mv := rValue.MapIndex(kv)
|
||||||
|
|
||||||
|
if !mv.IsValid() {
|
||||||
|
return fmt.Errorf("object has no key %q", decodedToken)
|
||||||
|
}
|
||||||
|
if mv.CanAddr() && mv.Kind() != reflect.Interface && mv.Kind() != reflect.Map && mv.Kind() != reflect.Slice && mv.Kind() != reflect.Ptr {
|
||||||
|
node = mv.Addr().Interface()
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
node = mv.Interface()
|
||||||
|
|
||||||
|
case reflect.Slice:
|
||||||
|
tokenIndex, err := strconv.Atoi(decodedToken)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
sLength := rValue.Len()
|
||||||
|
if tokenIndex < 0 || tokenIndex >= sLength {
|
||||||
|
return fmt.Errorf("index out of bounds array[0,%d] index '%d'", sLength, tokenIndex)
|
||||||
|
}
|
||||||
|
|
||||||
|
elem := rValue.Index(tokenIndex)
|
||||||
|
if elem.CanAddr() && elem.Kind() != reflect.Interface && elem.Kind() != reflect.Map && elem.Kind() != reflect.Slice && elem.Kind() != reflect.Ptr {
|
||||||
|
node = elem.Addr().Interface()
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
node = elem.Interface()
|
||||||
|
|
||||||
|
default:
|
||||||
|
return fmt.Errorf("invalid token reference %q", decodedToken)
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// DecodedTokens returns the decoded tokens
|
||||||
|
func (p *Pointer) DecodedTokens() []string {
|
||||||
|
result := make([]string, 0, len(p.referenceTokens))
|
||||||
|
for _, t := range p.referenceTokens {
|
||||||
|
result = append(result, Unescape(t))
|
||||||
|
}
|
||||||
|
return result
|
||||||
|
}
|
||||||
|
|
||||||
|
// IsEmpty returns true if this is an empty json pointer
|
||||||
|
// this indicates that it points to the root document
|
||||||
|
func (p *Pointer) IsEmpty() bool {
|
||||||
|
return len(p.referenceTokens) == 0
|
||||||
|
}
|
||||||
|
|
||||||
|
// Pointer to string representation function
|
||||||
|
func (p *Pointer) String() string {
|
||||||
|
|
||||||
|
if len(p.referenceTokens) == 0 {
|
||||||
|
return emptyPointer
|
||||||
|
}
|
||||||
|
|
||||||
|
pointerString := pointerSeparator + strings.Join(p.referenceTokens, pointerSeparator)
|
||||||
|
|
||||||
|
return pointerString
|
||||||
|
}
|
||||||
|
|
||||||
|
// Specific JSON pointer encoding here
|
||||||
|
// ~0 => ~
|
||||||
|
// ~1 => /
|
||||||
|
// ... and vice versa
|
||||||
|
|
||||||
|
const (
|
||||||
|
encRefTok0 = `~0`
|
||||||
|
encRefTok1 = `~1`
|
||||||
|
decRefTok0 = `~`
|
||||||
|
decRefTok1 = `/`
|
||||||
|
)
|
||||||
|
|
||||||
|
// Unescape unescapes a json pointer reference token string to the original representation
|
||||||
|
func Unescape(token string) string {
|
||||||
|
step1 := strings.Replace(token, encRefTok1, decRefTok1, -1)
|
||||||
|
step2 := strings.Replace(step1, encRefTok0, decRefTok0, -1)
|
||||||
|
return step2
|
||||||
|
}
|
||||||
|
|
||||||
|
// Escape escapes a pointer reference token string
|
||||||
|
func Escape(token string) string {
|
||||||
|
step1 := strings.Replace(token, decRefTok0, encRefTok0, -1)
|
||||||
|
step2 := strings.Replace(step1, decRefTok1, encRefTok1, -1)
|
||||||
|
return step2
|
||||||
|
}
|
1
vendor/github.com/go-openapi/jsonreference/.gitignore
generated
vendored
Normal file
1
vendor/github.com/go-openapi/jsonreference/.gitignore
generated
vendored
Normal file
@ -0,0 +1 @@
|
|||||||
|
secrets.yml
|
41
vendor/github.com/go-openapi/jsonreference/.golangci.yml
generated
vendored
Normal file
41
vendor/github.com/go-openapi/jsonreference/.golangci.yml
generated
vendored
Normal file
@ -0,0 +1,41 @@
|
|||||||
|
linters-settings:
|
||||||
|
govet:
|
||||||
|
check-shadowing: true
|
||||||
|
golint:
|
||||||
|
min-confidence: 0
|
||||||
|
gocyclo:
|
||||||
|
min-complexity: 30
|
||||||
|
maligned:
|
||||||
|
suggest-new: true
|
||||||
|
dupl:
|
||||||
|
threshold: 100
|
||||||
|
goconst:
|
||||||
|
min-len: 2
|
||||||
|
min-occurrences: 4
|
||||||
|
linters:
|
||||||
|
enable-all: true
|
||||||
|
disable:
|
||||||
|
- maligned
|
||||||
|
- lll
|
||||||
|
- gochecknoglobals
|
||||||
|
- godox
|
||||||
|
- gocognit
|
||||||
|
- whitespace
|
||||||
|
- wsl
|
||||||
|
- funlen
|
||||||
|
- gochecknoglobals
|
||||||
|
- gochecknoinits
|
||||||
|
- scopelint
|
||||||
|
- wrapcheck
|
||||||
|
- exhaustivestruct
|
||||||
|
- exhaustive
|
||||||
|
- nlreturn
|
||||||
|
- testpackage
|
||||||
|
- gci
|
||||||
|
- gofumpt
|
||||||
|
- goerr113
|
||||||
|
- gomnd
|
||||||
|
- tparallel
|
||||||
|
- nestif
|
||||||
|
- godot
|
||||||
|
- errorlint
|
24
vendor/github.com/go-openapi/jsonreference/.travis.yml
generated
vendored
Normal file
24
vendor/github.com/go-openapi/jsonreference/.travis.yml
generated
vendored
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
after_success:
|
||||||
|
- bash <(curl -s https://codecov.io/bash)
|
||||||
|
go:
|
||||||
|
- 1.14.x
|
||||||
|
- 1.x
|
||||||
|
install:
|
||||||
|
- go get gotest.tools/gotestsum
|
||||||
|
jobs:
|
||||||
|
include:
|
||||||
|
# include linting job, but only for latest go version and amd64 arch
|
||||||
|
- go: 1.x
|
||||||
|
arch: amd64
|
||||||
|
install:
|
||||||
|
go get github.com/golangci/golangci-lint/cmd/golangci-lint
|
||||||
|
script:
|
||||||
|
- golangci-lint run --new-from-rev master
|
||||||
|
env:
|
||||||
|
- GO111MODULE=on
|
||||||
|
language: go
|
||||||
|
notifications:
|
||||||
|
slack:
|
||||||
|
secure: OpQG/36F7DSF00HLm9WZMhyqFCYYyYTsVDObW226cWiR8PWYiNfLZiSEvIzT1Gx4dDjhigKTIqcLhG34CkL5iNXDjm9Yyo2RYhQPlK8NErNqUEXuBqn4RqYHW48VGhEhOyDd4Ei0E2FN5ZbgpvHgtpkdZ6XDi64r3Ac89isP9aPHXQTuv2Jog6b4/OKKiUTftLcTIst0p4Cp3gqOJWf1wnoj+IadWiECNVQT6zb47IYjtyw6+uV8iUjTzdKcRB6Zc6b4Dq7JAg1Zd7Jfxkql3hlKp4PNlRf9Cy7y5iA3G7MLyg3FcPX5z2kmcyPt2jOTRMBWUJ5zIQpOxizAcN8WsT3WWBL5KbuYK6k0PzujrIDLqdxGpNmjkkMfDBT9cKmZpm2FdW+oZgPFJP+oKmAo4u4KJz/vjiPTXgQlN5bmrLuRMCp+AwC5wkIohTqWZVPE2TK6ZSnMYcg/W39s+RP/9mJoyryAvPSpBOLTI+biCgaUCTOAZxNTWpMFc3tPYntc41WWkdKcooZ9JA5DwfcaVFyTGQ3YXz+HvX6G1z/gW0Q/A4dBi9mj2iE1xm7tRTT+4VQ2AXFvSEI1HJpfPgYnwAtwOD1v3Qm2EUHk9sCdtEDR4wVGEPIVn44GnwFMnGKx9JWppMPYwFu3SVDdHt+E+LOlhZUply11Aa+IVrT2KUQ=
|
||||||
|
script:
|
||||||
|
- gotestsum -f short-verbose -- -race -coverprofile=coverage.txt -covermode=atomic ./...
|
74
vendor/github.com/go-openapi/jsonreference/CODE_OF_CONDUCT.md
generated
vendored
Normal file
74
vendor/github.com/go-openapi/jsonreference/CODE_OF_CONDUCT.md
generated
vendored
Normal file
@ -0,0 +1,74 @@
|
|||||||
|
# Contributor Covenant Code of Conduct
|
||||||
|
|
||||||
|
## Our Pledge
|
||||||
|
|
||||||
|
In the interest of fostering an open and welcoming environment, we as
|
||||||
|
contributors and maintainers pledge to making participation in our project and
|
||||||
|
our community a harassment-free experience for everyone, regardless of age, body
|
||||||
|
size, disability, ethnicity, gender identity and expression, level of experience,
|
||||||
|
nationality, personal appearance, race, religion, or sexual identity and
|
||||||
|
orientation.
|
||||||
|
|
||||||
|
## Our Standards
|
||||||
|
|
||||||
|
Examples of behavior that contributes to creating a positive environment
|
||||||
|
include:
|
||||||
|
|
||||||
|
* Using welcoming and inclusive language
|
||||||
|
* Being respectful of differing viewpoints and experiences
|
||||||
|
* Gracefully accepting constructive criticism
|
||||||
|
* Focusing on what is best for the community
|
||||||
|
* Showing empathy towards other community members
|
||||||
|
|
||||||
|
Examples of unacceptable behavior by participants include:
|
||||||
|
|
||||||
|
* The use of sexualized language or imagery and unwelcome sexual attention or
|
||||||
|
advances
|
||||||
|
* Trolling, insulting/derogatory comments, and personal or political attacks
|
||||||
|
* Public or private harassment
|
||||||
|
* Publishing others' private information, such as a physical or electronic
|
||||||
|
address, without explicit permission
|
||||||
|
* Other conduct which could reasonably be considered inappropriate in a
|
||||||
|
professional setting
|
||||||
|
|
||||||
|
## Our Responsibilities
|
||||||
|
|
||||||
|
Project maintainers are responsible for clarifying the standards of acceptable
|
||||||
|
behavior and are expected to take appropriate and fair corrective action in
|
||||||
|
response to any instances of unacceptable behavior.
|
||||||
|
|
||||||
|
Project maintainers have the right and responsibility to remove, edit, or
|
||||||
|
reject comments, commits, code, wiki edits, issues, and other contributions
|
||||||
|
that are not aligned to this Code of Conduct, or to ban temporarily or
|
||||||
|
permanently any contributor for other behaviors that they deem inappropriate,
|
||||||
|
threatening, offensive, or harmful.
|
||||||
|
|
||||||
|
## Scope
|
||||||
|
|
||||||
|
This Code of Conduct applies both within project spaces and in public spaces
|
||||||
|
when an individual is representing the project or its community. Examples of
|
||||||
|
representing a project or community include using an official project e-mail
|
||||||
|
address, posting via an official social media account, or acting as an appointed
|
||||||
|
representative at an online or offline event. Representation of a project may be
|
||||||
|
further defined and clarified by project maintainers.
|
||||||
|
|
||||||
|
## Enforcement
|
||||||
|
|
||||||
|
Instances of abusive, harassing, or otherwise unacceptable behavior may be
|
||||||
|
reported by contacting the project team at ivan+abuse@flanders.co.nz. All
|
||||||
|
complaints will be reviewed and investigated and will result in a response that
|
||||||
|
is deemed necessary and appropriate to the circumstances. The project team is
|
||||||
|
obligated to maintain confidentiality with regard to the reporter of an incident.
|
||||||
|
Further details of specific enforcement policies may be posted separately.
|
||||||
|
|
||||||
|
Project maintainers who do not follow or enforce the Code of Conduct in good
|
||||||
|
faith may face temporary or permanent repercussions as determined by other
|
||||||
|
members of the project's leadership.
|
||||||
|
|
||||||
|
## Attribution
|
||||||
|
|
||||||
|
This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4,
|
||||||
|
available at [http://contributor-covenant.org/version/1/4][version]
|
||||||
|
|
||||||
|
[homepage]: http://contributor-covenant.org
|
||||||
|
[version]: http://contributor-covenant.org/version/1/4/
|
202
vendor/github.com/go-openapi/jsonreference/LICENSE
generated
vendored
Normal file
202
vendor/github.com/go-openapi/jsonreference/LICENSE
generated
vendored
Normal file
@ -0,0 +1,202 @@
|
|||||||
|
|
||||||
|
Apache License
|
||||||
|
Version 2.0, January 2004
|
||||||
|
http://www.apache.org/licenses/
|
||||||
|
|
||||||
|
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
|
||||||
|
|
||||||
|
1. Definitions.
|
||||||
|
|
||||||
|
"License" shall mean the terms and conditions for use, reproduction,
|
||||||
|
and distribution as defined by Sections 1 through 9 of this document.
|
||||||
|
|
||||||
|
"Licensor" shall mean the copyright owner or entity authorized by
|
||||||
|
the copyright owner that is granting the License.
|
||||||
|
|
||||||
|
"Legal Entity" shall mean the union of the acting entity and all
|
||||||
|
other entities that control, are controlled by, or are under common
|
||||||
|
control with that entity. For the purposes of this definition,
|
||||||
|
"control" means (i) the power, direct or indirect, to cause the
|
||||||
|
direction or management of such entity, whether by contract or
|
||||||
|
otherwise, or (ii) ownership of fifty percent (50%) or more of the
|
||||||
|
outstanding shares, or (iii) beneficial ownership of such entity.
|
||||||
|
|
||||||
|
"You" (or "Your") shall mean an individual or Legal Entity
|
||||||
|
exercising permissions granted by this License.
|
||||||
|
|
||||||
|
"Source" form shall mean the preferred form for making modifications,
|
||||||
|
including but not limited to software source code, documentation
|
||||||
|
source, and configuration files.
|
||||||
|
|
||||||
|
"Object" form shall mean any form resulting from mechanical
|
||||||
|
transformation or translation of a Source form, including but
|
||||||
|
not limited to compiled object code, generated documentation,
|
||||||
|
and conversions to other media types.
|
||||||
|
|
||||||
|
"Work" shall mean the work of authorship, whether in Source or
|
||||||
|
Object form, made available under the License, as indicated by a
|
||||||
|
copyright notice that is included in or attached to the work
|
||||||
|
(an example is provided in the Appendix below).
|
||||||
|
|
||||||
|
"Derivative Works" shall mean any work, whether in Source or Object
|
||||||
|
form, that is based on (or derived from) the Work and for which the
|
||||||
|
editorial revisions, annotations, elaborations, or other modifications
|
||||||
|
represent, as a whole, an original work of authorship. For the purposes
|
||||||
|
of this License, Derivative Works shall not include works that remain
|
||||||
|
separable from, or merely link (or bind by name) to the interfaces of,
|
||||||
|
the Work and Derivative Works thereof.
|
||||||
|
|
||||||
|
"Contribution" shall mean any work of authorship, including
|
||||||
|
the original version of the Work and any modifications or additions
|
||||||
|
to that Work or Derivative Works thereof, that is intentionally
|
||||||
|
submitted to Licensor for inclusion in the Work by the copyright owner
|
||||||
|
or by an individual or Legal Entity authorized to submit on behalf of
|
||||||
|
the copyright owner. For the purposes of this definition, "submitted"
|
||||||
|
means any form of electronic, verbal, or written communication sent
|
||||||
|
to the Licensor or its representatives, including but not limited to
|
||||||
|
communication on electronic mailing lists, source code control systems,
|
||||||
|
and issue tracking systems that are managed by, or on behalf of, the
|
||||||
|
Licensor for the purpose of discussing and improving the Work, but
|
||||||
|
excluding communication that is conspicuously marked or otherwise
|
||||||
|
designated in writing by the copyright owner as "Not a Contribution."
|
||||||
|
|
||||||
|
"Contributor" shall mean Licensor and any individual or Legal Entity
|
||||||
|
on behalf of whom a Contribution has been received by Licensor and
|
||||||
|
subsequently incorporated within the Work.
|
||||||
|
|
||||||
|
2. Grant of Copyright License. Subject to the terms and conditions of
|
||||||
|
this License, each Contributor hereby grants to You a perpetual,
|
||||||
|
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||||
|
copyright license to reproduce, prepare Derivative Works of,
|
||||||
|
publicly display, publicly perform, sublicense, and distribute the
|
||||||
|
Work and such Derivative Works in Source or Object form.
|
||||||
|
|
||||||
|
3. Grant of Patent License. Subject to the terms and conditions of
|
||||||
|
this License, each Contributor hereby grants to You a perpetual,
|
||||||
|
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||||
|
(except as stated in this section) patent license to make, have made,
|
||||||
|
use, offer to sell, sell, import, and otherwise transfer the Work,
|
||||||
|
where such license applies only to those patent claims licensable
|
||||||
|
by such Contributor that are necessarily infringed by their
|
||||||
|
Contribution(s) alone or by combination of their Contribution(s)
|
||||||
|
with the Work to which such Contribution(s) was submitted. If You
|
||||||
|
institute patent litigation against any entity (including a
|
||||||
|
cross-claim or counterclaim in a lawsuit) alleging that the Work
|
||||||
|
or a Contribution incorporated within the Work constitutes direct
|
||||||
|
or contributory patent infringement, then any patent licenses
|
||||||
|
granted to You under this License for that Work shall terminate
|
||||||
|
as of the date such litigation is filed.
|
||||||
|
|
||||||
|
4. Redistribution. You may reproduce and distribute copies of the
|
||||||
|
Work or Derivative Works thereof in any medium, with or without
|
||||||
|
modifications, and in Source or Object form, provided that You
|
||||||
|
meet the following conditions:
|
||||||
|
|
||||||
|
(a) You must give any other recipients of the Work or
|
||||||
|
Derivative Works a copy of this License; and
|
||||||
|
|
||||||
|
(b) You must cause any modified files to carry prominent notices
|
||||||
|
stating that You changed the files; and
|
||||||
|
|
||||||
|
(c) You must retain, in the Source form of any Derivative Works
|
||||||
|
that You distribute, all copyright, patent, trademark, and
|
||||||
|
attribution notices from the Source form of the Work,
|
||||||
|
excluding those notices that do not pertain to any part of
|
||||||
|
the Derivative Works; and
|
||||||
|
|
||||||
|
(d) If the Work includes a "NOTICE" text file as part of its
|
||||||
|
distribution, then any Derivative Works that You distribute must
|
||||||
|
include a readable copy of the attribution notices contained
|
||||||
|
within such NOTICE file, excluding those notices that do not
|
||||||
|
pertain to any part of the Derivative Works, in at least one
|
||||||
|
of the following places: within a NOTICE text file distributed
|
||||||
|
as part of the Derivative Works; within the Source form or
|
||||||
|
documentation, if provided along with the Derivative Works; or,
|
||||||
|
within a display generated by the Derivative Works, if and
|
||||||
|
wherever such third-party notices normally appear. The contents
|
||||||
|
of the NOTICE file are for informational purposes only and
|
||||||
|
do not modify the License. You may add Your own attribution
|
||||||
|
notices within Derivative Works that You distribute, alongside
|
||||||
|
or as an addendum to the NOTICE text from the Work, provided
|
||||||
|
that such additional attribution notices cannot be construed
|
||||||
|
as modifying the License.
|
||||||
|
|
||||||
|
You may add Your own copyright statement to Your modifications and
|
||||||
|
may provide additional or different license terms and conditions
|
||||||
|
for use, reproduction, or distribution of Your modifications, or
|
||||||
|
for any such Derivative Works as a whole, provided Your use,
|
||||||
|
reproduction, and distribution of the Work otherwise complies with
|
||||||
|
the conditions stated in this License.
|
||||||
|
|
||||||
|
5. Submission of Contributions. Unless You explicitly state otherwise,
|
||||||
|
any Contribution intentionally submitted for inclusion in the Work
|
||||||
|
by You to the Licensor shall be under the terms and conditions of
|
||||||
|
this License, without any additional terms or conditions.
|
||||||
|
Notwithstanding the above, nothing herein shall supersede or modify
|
||||||
|
the terms of any separate license agreement you may have executed
|
||||||
|
with Licensor regarding such Contributions.
|
||||||
|
|
||||||
|
6. Trademarks. This License does not grant permission to use the trade
|
||||||
|
names, trademarks, service marks, or product names of the Licensor,
|
||||||
|
except as required for reasonable and customary use in describing the
|
||||||
|
origin of the Work and reproducing the content of the NOTICE file.
|
||||||
|
|
||||||
|
7. Disclaimer of Warranty. Unless required by applicable law or
|
||||||
|
agreed to in writing, Licensor provides the Work (and each
|
||||||
|
Contributor provides its Contributions) on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
||||||
|
implied, including, without limitation, any warranties or conditions
|
||||||
|
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
|
||||||
|
PARTICULAR PURPOSE. You are solely responsible for determining the
|
||||||
|
appropriateness of using or redistributing the Work and assume any
|
||||||
|
risks associated with Your exercise of permissions under this License.
|
||||||
|
|
||||||
|
8. Limitation of Liability. In no event and under no legal theory,
|
||||||
|
whether in tort (including negligence), contract, or otherwise,
|
||||||
|
unless required by applicable law (such as deliberate and grossly
|
||||||
|
negligent acts) or agreed to in writing, shall any Contributor be
|
||||||
|
liable to You for damages, including any direct, indirect, special,
|
||||||
|
incidental, or consequential damages of any character arising as a
|
||||||
|
result of this License or out of the use or inability to use the
|
||||||
|
Work (including but not limited to damages for loss of goodwill,
|
||||||
|
work stoppage, computer failure or malfunction, or any and all
|
||||||
|
other commercial damages or losses), even if such Contributor
|
||||||
|
has been advised of the possibility of such damages.
|
||||||
|
|
||||||
|
9. Accepting Warranty or Additional Liability. While redistributing
|
||||||
|
the Work or Derivative Works thereof, You may choose to offer,
|
||||||
|
and charge a fee for, acceptance of support, warranty, indemnity,
|
||||||
|
or other liability obligations and/or rights consistent with this
|
||||||
|
License. However, in accepting such obligations, You may act only
|
||||||
|
on Your own behalf and on Your sole responsibility, not on behalf
|
||||||
|
of any other Contributor, and only if You agree to indemnify,
|
||||||
|
defend, and hold each Contributor harmless for any liability
|
||||||
|
incurred by, or claims asserted against, such Contributor by reason
|
||||||
|
of your accepting any such warranty or additional liability.
|
||||||
|
|
||||||
|
END OF TERMS AND CONDITIONS
|
||||||
|
|
||||||
|
APPENDIX: How to apply the Apache License to your work.
|
||||||
|
|
||||||
|
To apply the Apache License to your work, attach the following
|
||||||
|
boilerplate notice, with the fields enclosed by brackets "[]"
|
||||||
|
replaced with your own identifying information. (Don't include
|
||||||
|
the brackets!) The text should be enclosed in the appropriate
|
||||||
|
comment syntax for the file format. We also recommend that a
|
||||||
|
file or class name and description of purpose be included on the
|
||||||
|
same "printed page" as the copyright notice for easier
|
||||||
|
identification within third-party archives.
|
||||||
|
|
||||||
|
Copyright [yyyy] [name of copyright owner]
|
||||||
|
|
||||||
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
you may not use this file except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
15
vendor/github.com/go-openapi/jsonreference/README.md
generated
vendored
Normal file
15
vendor/github.com/go-openapi/jsonreference/README.md
generated
vendored
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
# gojsonreference [](https://travis-ci.org/go-openapi/jsonreference) [](https://codecov.io/gh/go-openapi/jsonreference) [](https://slackin.goswagger.io)
|
||||||
|
|
||||||
|
[](https://raw.githubusercontent.com/go-openapi/jsonreference/master/LICENSE) [](http://godoc.org/github.com/go-openapi/jsonreference)
|
||||||
|
An implementation of JSON Reference - Go language
|
||||||
|
|
||||||
|
## Status
|
||||||
|
Feature complete. Stable API
|
||||||
|
|
||||||
|
## Dependencies
|
||||||
|
https://github.com/go-openapi/jsonpointer
|
||||||
|
|
||||||
|
## References
|
||||||
|
http://tools.ietf.org/html/draft-ietf-appsawg-json-pointer-07
|
||||||
|
|
||||||
|
http://tools.ietf.org/html/draft-pbryan-zyp-json-ref-03
|
156
vendor/github.com/go-openapi/jsonreference/reference.go
generated
vendored
Normal file
156
vendor/github.com/go-openapi/jsonreference/reference.go
generated
vendored
Normal file
@ -0,0 +1,156 @@
|
|||||||
|
// Copyright 2013 sigu-399 ( https://github.com/sigu-399 )
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
|
||||||
|
// author sigu-399
|
||||||
|
// author-github https://github.com/sigu-399
|
||||||
|
// author-mail sigu.399@gmail.com
|
||||||
|
//
|
||||||
|
// repository-name jsonreference
|
||||||
|
// repository-desc An implementation of JSON Reference - Go language
|
||||||
|
//
|
||||||
|
// description Main and unique file.
|
||||||
|
//
|
||||||
|
// created 26-02-2013
|
||||||
|
|
||||||
|
package jsonreference
|
||||||
|
|
||||||
|
import (
|
||||||
|
"errors"
|
||||||
|
"net/url"
|
||||||
|
"strings"
|
||||||
|
|
||||||
|
"github.com/PuerkitoBio/purell"
|
||||||
|
"github.com/go-openapi/jsonpointer"
|
||||||
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
fragmentRune = `#`
|
||||||
|
)
|
||||||
|
|
||||||
|
// New creates a new reference for the given string
|
||||||
|
func New(jsonReferenceString string) (Ref, error) {
|
||||||
|
|
||||||
|
var r Ref
|
||||||
|
err := r.parse(jsonReferenceString)
|
||||||
|
return r, err
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// MustCreateRef parses the ref string and panics when it's invalid.
|
||||||
|
// Use the New method for a version that returns an error
|
||||||
|
func MustCreateRef(ref string) Ref {
|
||||||
|
r, err := New(ref)
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
return r
|
||||||
|
}
|
||||||
|
|
||||||
|
// Ref represents a json reference object
|
||||||
|
type Ref struct {
|
||||||
|
referenceURL *url.URL
|
||||||
|
referencePointer jsonpointer.Pointer
|
||||||
|
|
||||||
|
HasFullURL bool
|
||||||
|
HasURLPathOnly bool
|
||||||
|
HasFragmentOnly bool
|
||||||
|
HasFileScheme bool
|
||||||
|
HasFullFilePath bool
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetURL gets the URL for this reference
|
||||||
|
func (r *Ref) GetURL() *url.URL {
|
||||||
|
return r.referenceURL
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetPointer gets the json pointer for this reference
|
||||||
|
func (r *Ref) GetPointer() *jsonpointer.Pointer {
|
||||||
|
return &r.referencePointer
|
||||||
|
}
|
||||||
|
|
||||||
|
// String returns the best version of the url for this reference
|
||||||
|
func (r *Ref) String() string {
|
||||||
|
|
||||||
|
if r.referenceURL != nil {
|
||||||
|
return r.referenceURL.String()
|
||||||
|
}
|
||||||
|
|
||||||
|
if r.HasFragmentOnly {
|
||||||
|
return fragmentRune + r.referencePointer.String()
|
||||||
|
}
|
||||||
|
|
||||||
|
return r.referencePointer.String()
|
||||||
|
}
|
||||||
|
|
||||||
|
// IsRoot returns true if this reference is a root document
|
||||||
|
func (r *Ref) IsRoot() bool {
|
||||||
|
return r.referenceURL != nil &&
|
||||||
|
!r.IsCanonical() &&
|
||||||
|
!r.HasURLPathOnly &&
|
||||||
|
r.referenceURL.Fragment == ""
|
||||||
|
}
|
||||||
|
|
||||||
|
// IsCanonical returns true when this pointer starts with http(s):// or file://
|
||||||
|
func (r *Ref) IsCanonical() bool {
|
||||||
|
return (r.HasFileScheme && r.HasFullFilePath) || (!r.HasFileScheme && r.HasFullURL)
|
||||||
|
}
|
||||||
|
|
||||||
|
// "Constructor", parses the given string JSON reference
|
||||||
|
func (r *Ref) parse(jsonReferenceString string) error {
|
||||||
|
|
||||||
|
parsed, err := url.Parse(jsonReferenceString)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
r.referenceURL, _ = url.Parse(purell.NormalizeURL(parsed, purell.FlagsSafe|purell.FlagRemoveDuplicateSlashes))
|
||||||
|
refURL := r.referenceURL
|
||||||
|
|
||||||
|
if refURL.Scheme != "" && refURL.Host != "" {
|
||||||
|
r.HasFullURL = true
|
||||||
|
} else {
|
||||||
|
if refURL.Path != "" {
|
||||||
|
r.HasURLPathOnly = true
|
||||||
|
} else if refURL.RawQuery == "" && refURL.Fragment != "" {
|
||||||
|
r.HasFragmentOnly = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
r.HasFileScheme = refURL.Scheme == "file"
|
||||||
|
r.HasFullFilePath = strings.HasPrefix(refURL.Path, "/")
|
||||||
|
|
||||||
|
// invalid json-pointer error means url has no json-pointer fragment. simply ignore error
|
||||||
|
r.referencePointer, _ = jsonpointer.New(refURL.Fragment)
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Inherits creates a new reference from a parent and a child
|
||||||
|
// If the child cannot inherit from the parent, an error is returned
|
||||||
|
func (r *Ref) Inherits(child Ref) (*Ref, error) {
|
||||||
|
childURL := child.GetURL()
|
||||||
|
parentURL := r.GetURL()
|
||||||
|
if childURL == nil {
|
||||||
|
return nil, errors.New("child url is nil")
|
||||||
|
}
|
||||||
|
if parentURL == nil {
|
||||||
|
return &child, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
ref, err := New(parentURL.ResolveReference(childURL).String())
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return &ref, nil
|
||||||
|
}
|
26
vendor/github.com/go-openapi/swag/.editorconfig
generated
vendored
Normal file
26
vendor/github.com/go-openapi/swag/.editorconfig
generated
vendored
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
# top-most EditorConfig file
|
||||||
|
root = true
|
||||||
|
|
||||||
|
# Unix-style newlines with a newline ending every file
|
||||||
|
[*]
|
||||||
|
end_of_line = lf
|
||||||
|
insert_final_newline = true
|
||||||
|
indent_style = space
|
||||||
|
indent_size = 2
|
||||||
|
trim_trailing_whitespace = true
|
||||||
|
|
||||||
|
# Set default charset
|
||||||
|
[*.{js,py,go,scala,rb,java,html,css,less,sass,md}]
|
||||||
|
charset = utf-8
|
||||||
|
|
||||||
|
# Tab indentation (no size specified)
|
||||||
|
[*.go]
|
||||||
|
indent_style = tab
|
||||||
|
|
||||||
|
[*.md]
|
||||||
|
trim_trailing_whitespace = false
|
||||||
|
|
||||||
|
# Matches the exact files either package.json or .travis.yml
|
||||||
|
[{package.json,.travis.yml}]
|
||||||
|
indent_style = space
|
||||||
|
indent_size = 2
|
4
vendor/github.com/go-openapi/swag/.gitignore
generated
vendored
Normal file
4
vendor/github.com/go-openapi/swag/.gitignore
generated
vendored
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
secrets.yml
|
||||||
|
vendor
|
||||||
|
Godeps
|
||||||
|
.idea
|
39
vendor/github.com/go-openapi/swag/.golangci.yml
generated
vendored
Normal file
39
vendor/github.com/go-openapi/swag/.golangci.yml
generated
vendored
Normal file
@ -0,0 +1,39 @@
|
|||||||
|
linters-settings:
|
||||||
|
govet:
|
||||||
|
check-shadowing: true
|
||||||
|
golint:
|
||||||
|
min-confidence: 0
|
||||||
|
gocyclo:
|
||||||
|
min-complexity: 25
|
||||||
|
maligned:
|
||||||
|
suggest-new: true
|
||||||
|
dupl:
|
||||||
|
threshold: 100
|
||||||
|
goconst:
|
||||||
|
min-len: 3
|
||||||
|
min-occurrences: 2
|
||||||
|
|
||||||
|
linters:
|
||||||
|
enable-all: true
|
||||||
|
disable:
|
||||||
|
- maligned
|
||||||
|
- lll
|
||||||
|
- gochecknoinits
|
||||||
|
- gochecknoglobals
|
||||||
|
- nlreturn
|
||||||
|
- testpackage
|
||||||
|
- wrapcheck
|
||||||
|
- gomnd
|
||||||
|
- exhaustive
|
||||||
|
- exhaustivestruct
|
||||||
|
- goerr113
|
||||||
|
- wsl
|
||||||
|
- whitespace
|
||||||
|
- gofumpt
|
||||||
|
- godot
|
||||||
|
- nestif
|
||||||
|
- godox
|
||||||
|
- funlen
|
||||||
|
- gci
|
||||||
|
- gocognit
|
||||||
|
- paralleltest
|
37
vendor/github.com/go-openapi/swag/.travis.yml
generated
vendored
Normal file
37
vendor/github.com/go-openapi/swag/.travis.yml
generated
vendored
Normal file
@ -0,0 +1,37 @@
|
|||||||
|
after_success:
|
||||||
|
- bash <(curl -s https://codecov.io/bash)
|
||||||
|
go:
|
||||||
|
- 1.14.x
|
||||||
|
- 1.x
|
||||||
|
arch:
|
||||||
|
- amd64
|
||||||
|
jobs:
|
||||||
|
include:
|
||||||
|
# include arch ppc, but only for latest go version - skip testing for race
|
||||||
|
- go: 1.x
|
||||||
|
arch: ppc64le
|
||||||
|
install: ~
|
||||||
|
script:
|
||||||
|
- go test -v
|
||||||
|
|
||||||
|
#- go: 1.x
|
||||||
|
# arch: arm
|
||||||
|
# install: ~
|
||||||
|
# script:
|
||||||
|
# - go test -v
|
||||||
|
|
||||||
|
# include linting job, but only for latest go version and amd64 arch
|
||||||
|
- go: 1.x
|
||||||
|
arch: amd64
|
||||||
|
install:
|
||||||
|
go get github.com/golangci/golangci-lint/cmd/golangci-lint
|
||||||
|
script:
|
||||||
|
- golangci-lint run --new-from-rev master
|
||||||
|
install:
|
||||||
|
- GO111MODULE=off go get -u gotest.tools/gotestsum
|
||||||
|
language: go
|
||||||
|
notifications:
|
||||||
|
slack:
|
||||||
|
secure: QUWvCkBBK09GF7YtEvHHVt70JOkdlNBG0nIKu/5qc4/nW5HP8I2w0SEf/XR2je0eED1Qe3L/AfMCWwrEj+IUZc3l4v+ju8X8R3Lomhme0Eb0jd1MTMCuPcBT47YCj0M7RON7vXtbFfm1hFJ/jLe5+9FXz0hpXsR24PJc5ZIi/ogNwkaPqG4BmndzecpSh0vc2FJPZUD9LT0I09REY/vXR0oQAalLkW0asGD5taHZTUZq/kBpsNxaAFrLM23i4mUcf33M5fjLpvx5LRICrX/57XpBrDh2TooBU6Qj3CgoY0uPRYUmSNxbVx1czNzl2JtEpb5yjoxfVPQeg0BvQM00G8LJINISR+ohrjhkZmAqchDupAX+yFrxTtORa78CtnIL6z/aTNlgwwVD8kvL/1pFA/JWYmKDmz93mV/+6wubGzNSQCstzjkFA4/iZEKewKUoRIAi/fxyscP6L/rCpmY/4llZZvrnyTqVbt6URWpopUpH4rwYqreXAtJxJsfBJIeSmUIiDIOMGkCTvyTEW3fWGmGoqWtSHLoaWDyAIGb7azb+KvfpWtEcoPFWfSWU+LGee0A/YsUhBl7ADB9A0CJEuR8q4BPpKpfLwPKSiKSAXL7zDkyjExyhtgqbSl2jS+rKIHOZNL8JkCcTP2MKMVd563C5rC5FMKqu3S9m2b6380E=
|
||||||
|
script:
|
||||||
|
- gotestsum -f short-verbose -- -race -coverprofile=coverage.txt -covermode=atomic ./...
|
74
vendor/github.com/go-openapi/swag/CODE_OF_CONDUCT.md
generated
vendored
Normal file
74
vendor/github.com/go-openapi/swag/CODE_OF_CONDUCT.md
generated
vendored
Normal file
@ -0,0 +1,74 @@
|
|||||||
|
# Contributor Covenant Code of Conduct
|
||||||
|
|
||||||
|
## Our Pledge
|
||||||
|
|
||||||
|
In the interest of fostering an open and welcoming environment, we as
|
||||||
|
contributors and maintainers pledge to making participation in our project and
|
||||||
|
our community a harassment-free experience for everyone, regardless of age, body
|
||||||
|
size, disability, ethnicity, gender identity and expression, level of experience,
|
||||||
|
nationality, personal appearance, race, religion, or sexual identity and
|
||||||
|
orientation.
|
||||||
|
|
||||||
|
## Our Standards
|
||||||
|
|
||||||
|
Examples of behavior that contributes to creating a positive environment
|
||||||
|
include:
|
||||||
|
|
||||||
|
* Using welcoming and inclusive language
|
||||||
|
* Being respectful of differing viewpoints and experiences
|
||||||
|
* Gracefully accepting constructive criticism
|
||||||
|
* Focusing on what is best for the community
|
||||||
|
* Showing empathy towards other community members
|
||||||
|
|
||||||
|
Examples of unacceptable behavior by participants include:
|
||||||
|
|
||||||
|
* The use of sexualized language or imagery and unwelcome sexual attention or
|
||||||
|
advances
|
||||||
|
* Trolling, insulting/derogatory comments, and personal or political attacks
|
||||||
|
* Public or private harassment
|
||||||
|
* Publishing others' private information, such as a physical or electronic
|
||||||
|
address, without explicit permission
|
||||||
|
* Other conduct which could reasonably be considered inappropriate in a
|
||||||
|
professional setting
|
||||||
|
|
||||||
|
## Our Responsibilities
|
||||||
|
|
||||||
|
Project maintainers are responsible for clarifying the standards of acceptable
|
||||||
|
behavior and are expected to take appropriate and fair corrective action in
|
||||||
|
response to any instances of unacceptable behavior.
|
||||||
|
|
||||||
|
Project maintainers have the right and responsibility to remove, edit, or
|
||||||
|
reject comments, commits, code, wiki edits, issues, and other contributions
|
||||||
|
that are not aligned to this Code of Conduct, or to ban temporarily or
|
||||||
|
permanently any contributor for other behaviors that they deem inappropriate,
|
||||||
|
threatening, offensive, or harmful.
|
||||||
|
|
||||||
|
## Scope
|
||||||
|
|
||||||
|
This Code of Conduct applies both within project spaces and in public spaces
|
||||||
|
when an individual is representing the project or its community. Examples of
|
||||||
|
representing a project or community include using an official project e-mail
|
||||||
|
address, posting via an official social media account, or acting as an appointed
|
||||||
|
representative at an online or offline event. Representation of a project may be
|
||||||
|
further defined and clarified by project maintainers.
|
||||||
|
|
||||||
|
## Enforcement
|
||||||
|
|
||||||
|
Instances of abusive, harassing, or otherwise unacceptable behavior may be
|
||||||
|
reported by contacting the project team at ivan+abuse@flanders.co.nz. All
|
||||||
|
complaints will be reviewed and investigated and will result in a response that
|
||||||
|
is deemed necessary and appropriate to the circumstances. The project team is
|
||||||
|
obligated to maintain confidentiality with regard to the reporter of an incident.
|
||||||
|
Further details of specific enforcement policies may be posted separately.
|
||||||
|
|
||||||
|
Project maintainers who do not follow or enforce the Code of Conduct in good
|
||||||
|
faith may face temporary or permanent repercussions as determined by other
|
||||||
|
members of the project's leadership.
|
||||||
|
|
||||||
|
## Attribution
|
||||||
|
|
||||||
|
This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4,
|
||||||
|
available at [http://contributor-covenant.org/version/1/4][version]
|
||||||
|
|
||||||
|
[homepage]: http://contributor-covenant.org
|
||||||
|
[version]: http://contributor-covenant.org/version/1/4/
|
202
vendor/github.com/go-openapi/swag/LICENSE
generated
vendored
Normal file
202
vendor/github.com/go-openapi/swag/LICENSE
generated
vendored
Normal file
@ -0,0 +1,202 @@
|
|||||||
|
|
||||||
|
Apache License
|
||||||
|
Version 2.0, January 2004
|
||||||
|
http://www.apache.org/licenses/
|
||||||
|
|
||||||
|
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
|
||||||
|
|
||||||
|
1. Definitions.
|
||||||
|
|
||||||
|
"License" shall mean the terms and conditions for use, reproduction,
|
||||||
|
and distribution as defined by Sections 1 through 9 of this document.
|
||||||
|
|
||||||
|
"Licensor" shall mean the copyright owner or entity authorized by
|
||||||
|
the copyright owner that is granting the License.
|
||||||
|
|
||||||
|
"Legal Entity" shall mean the union of the acting entity and all
|
||||||
|
other entities that control, are controlled by, or are under common
|
||||||
|
control with that entity. For the purposes of this definition,
|
||||||
|
"control" means (i) the power, direct or indirect, to cause the
|
||||||
|
direction or management of such entity, whether by contract or
|
||||||
|
otherwise, or (ii) ownership of fifty percent (50%) or more of the
|
||||||
|
outstanding shares, or (iii) beneficial ownership of such entity.
|
||||||
|
|
||||||
|
"You" (or "Your") shall mean an individual or Legal Entity
|
||||||
|
exercising permissions granted by this License.
|
||||||
|
|
||||||
|
"Source" form shall mean the preferred form for making modifications,
|
||||||
|
including but not limited to software source code, documentation
|
||||||
|
source, and configuration files.
|
||||||
|
|
||||||
|
"Object" form shall mean any form resulting from mechanical
|
||||||
|
transformation or translation of a Source form, including but
|
||||||
|
not limited to compiled object code, generated documentation,
|
||||||
|
and conversions to other media types.
|
||||||
|
|
||||||
|
"Work" shall mean the work of authorship, whether in Source or
|
||||||
|
Object form, made available under the License, as indicated by a
|
||||||
|
copyright notice that is included in or attached to the work
|
||||||
|
(an example is provided in the Appendix below).
|
||||||
|
|
||||||
|
"Derivative Works" shall mean any work, whether in Source or Object
|
||||||
|
form, that is based on (or derived from) the Work and for which the
|
||||||
|
editorial revisions, annotations, elaborations, or other modifications
|
||||||
|
represent, as a whole, an original work of authorship. For the purposes
|
||||||
|
of this License, Derivative Works shall not include works that remain
|
||||||
|
separable from, or merely link (or bind by name) to the interfaces of,
|
||||||
|
the Work and Derivative Works thereof.
|
||||||
|
|
||||||
|
"Contribution" shall mean any work of authorship, including
|
||||||
|
the original version of the Work and any modifications or additions
|
||||||
|
to that Work or Derivative Works thereof, that is intentionally
|
||||||
|
submitted to Licensor for inclusion in the Work by the copyright owner
|
||||||
|
or by an individual or Legal Entity authorized to submit on behalf of
|
||||||
|
the copyright owner. For the purposes of this definition, "submitted"
|
||||||
|
means any form of electronic, verbal, or written communication sent
|
||||||
|
to the Licensor or its representatives, including but not limited to
|
||||||
|
communication on electronic mailing lists, source code control systems,
|
||||||
|
and issue tracking systems that are managed by, or on behalf of, the
|
||||||
|
Licensor for the purpose of discussing and improving the Work, but
|
||||||
|
excluding communication that is conspicuously marked or otherwise
|
||||||
|
designated in writing by the copyright owner as "Not a Contribution."
|
||||||
|
|
||||||
|
"Contributor" shall mean Licensor and any individual or Legal Entity
|
||||||
|
on behalf of whom a Contribution has been received by Licensor and
|
||||||
|
subsequently incorporated within the Work.
|
||||||
|
|
||||||
|
2. Grant of Copyright License. Subject to the terms and conditions of
|
||||||
|
this License, each Contributor hereby grants to You a perpetual,
|
||||||
|
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||||
|
copyright license to reproduce, prepare Derivative Works of,
|
||||||
|
publicly display, publicly perform, sublicense, and distribute the
|
||||||
|
Work and such Derivative Works in Source or Object form.
|
||||||
|
|
||||||
|
3. Grant of Patent License. Subject to the terms and conditions of
|
||||||
|
this License, each Contributor hereby grants to You a perpetual,
|
||||||
|
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||||
|
(except as stated in this section) patent license to make, have made,
|
||||||
|
use, offer to sell, sell, import, and otherwise transfer the Work,
|
||||||
|
where such license applies only to those patent claims licensable
|
||||||
|
by such Contributor that are necessarily infringed by their
|
||||||
|
Contribution(s) alone or by combination of their Contribution(s)
|
||||||
|
with the Work to which such Contribution(s) was submitted. If You
|
||||||
|
institute patent litigation against any entity (including a
|
||||||
|
cross-claim or counterclaim in a lawsuit) alleging that the Work
|
||||||
|
or a Contribution incorporated within the Work constitutes direct
|
||||||
|
or contributory patent infringement, then any patent licenses
|
||||||
|
granted to You under this License for that Work shall terminate
|
||||||
|
as of the date such litigation is filed.
|
||||||
|
|
||||||
|
4. Redistribution. You may reproduce and distribute copies of the
|
||||||
|
Work or Derivative Works thereof in any medium, with or without
|
||||||
|
modifications, and in Source or Object form, provided that You
|
||||||
|
meet the following conditions:
|
||||||
|
|
||||||
|
(a) You must give any other recipients of the Work or
|
||||||
|
Derivative Works a copy of this License; and
|
||||||
|
|
||||||
|
(b) You must cause any modified files to carry prominent notices
|
||||||
|
stating that You changed the files; and
|
||||||
|
|
||||||
|
(c) You must retain, in the Source form of any Derivative Works
|
||||||
|
that You distribute, all copyright, patent, trademark, and
|
||||||
|
attribution notices from the Source form of the Work,
|
||||||
|
excluding those notices that do not pertain to any part of
|
||||||
|
the Derivative Works; and
|
||||||
|
|
||||||
|
(d) If the Work includes a "NOTICE" text file as part of its
|
||||||
|
distribution, then any Derivative Works that You distribute must
|
||||||
|
include a readable copy of the attribution notices contained
|
||||||
|
within such NOTICE file, excluding those notices that do not
|
||||||
|
pertain to any part of the Derivative Works, in at least one
|
||||||
|
of the following places: within a NOTICE text file distributed
|
||||||
|
as part of the Derivative Works; within the Source form or
|
||||||
|
documentation, if provided along with the Derivative Works; or,
|
||||||
|
within a display generated by the Derivative Works, if and
|
||||||
|
wherever such third-party notices normally appear. The contents
|
||||||
|
of the NOTICE file are for informational purposes only and
|
||||||
|
do not modify the License. You may add Your own attribution
|
||||||
|
notices within Derivative Works that You distribute, alongside
|
||||||
|
or as an addendum to the NOTICE text from the Work, provided
|
||||||
|
that such additional attribution notices cannot be construed
|
||||||
|
as modifying the License.
|
||||||
|
|
||||||
|
You may add Your own copyright statement to Your modifications and
|
||||||
|
may provide additional or different license terms and conditions
|
||||||
|
for use, reproduction, or distribution of Your modifications, or
|
||||||
|
for any such Derivative Works as a whole, provided Your use,
|
||||||
|
reproduction, and distribution of the Work otherwise complies with
|
||||||
|
the conditions stated in this License.
|
||||||
|
|
||||||
|
5. Submission of Contributions. Unless You explicitly state otherwise,
|
||||||
|
any Contribution intentionally submitted for inclusion in the Work
|
||||||
|
by You to the Licensor shall be under the terms and conditions of
|
||||||
|
this License, without any additional terms or conditions.
|
||||||
|
Notwithstanding the above, nothing herein shall supersede or modify
|
||||||
|
the terms of any separate license agreement you may have executed
|
||||||
|
with Licensor regarding such Contributions.
|
||||||
|
|
||||||
|
6. Trademarks. This License does not grant permission to use the trade
|
||||||
|
names, trademarks, service marks, or product names of the Licensor,
|
||||||
|
except as required for reasonable and customary use in describing the
|
||||||
|
origin of the Work and reproducing the content of the NOTICE file.
|
||||||
|
|
||||||
|
7. Disclaimer of Warranty. Unless required by applicable law or
|
||||||
|
agreed to in writing, Licensor provides the Work (and each
|
||||||
|
Contributor provides its Contributions) on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
||||||
|
implied, including, without limitation, any warranties or conditions
|
||||||
|
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
|
||||||
|
PARTICULAR PURPOSE. You are solely responsible for determining the
|
||||||
|
appropriateness of using or redistributing the Work and assume any
|
||||||
|
risks associated with Your exercise of permissions under this License.
|
||||||
|
|
||||||
|
8. Limitation of Liability. In no event and under no legal theory,
|
||||||
|
whether in tort (including negligence), contract, or otherwise,
|
||||||
|
unless required by applicable law (such as deliberate and grossly
|
||||||
|
negligent acts) or agreed to in writing, shall any Contributor be
|
||||||
|
liable to You for damages, including any direct, indirect, special,
|
||||||
|
incidental, or consequential damages of any character arising as a
|
||||||
|
result of this License or out of the use or inability to use the
|
||||||
|
Work (including but not limited to damages for loss of goodwill,
|
||||||
|
work stoppage, computer failure or malfunction, or any and all
|
||||||
|
other commercial damages or losses), even if such Contributor
|
||||||
|
has been advised of the possibility of such damages.
|
||||||
|
|
||||||
|
9. Accepting Warranty or Additional Liability. While redistributing
|
||||||
|
the Work or Derivative Works thereof, You may choose to offer,
|
||||||
|
and charge a fee for, acceptance of support, warranty, indemnity,
|
||||||
|
or other liability obligations and/or rights consistent with this
|
||||||
|
License. However, in accepting such obligations, You may act only
|
||||||
|
on Your own behalf and on Your sole responsibility, not on behalf
|
||||||
|
of any other Contributor, and only if You agree to indemnify,
|
||||||
|
defend, and hold each Contributor harmless for any liability
|
||||||
|
incurred by, or claims asserted against, such Contributor by reason
|
||||||
|
of your accepting any such warranty or additional liability.
|
||||||
|
|
||||||
|
END OF TERMS AND CONDITIONS
|
||||||
|
|
||||||
|
APPENDIX: How to apply the Apache License to your work.
|
||||||
|
|
||||||
|
To apply the Apache License to your work, attach the following
|
||||||
|
boilerplate notice, with the fields enclosed by brackets "[]"
|
||||||
|
replaced with your own identifying information. (Don't include
|
||||||
|
the brackets!) The text should be enclosed in the appropriate
|
||||||
|
comment syntax for the file format. We also recommend that a
|
||||||
|
file or class name and description of purpose be included on the
|
||||||
|
same "printed page" as the copyright notice for easier
|
||||||
|
identification within third-party archives.
|
||||||
|
|
||||||
|
Copyright [yyyy] [name of copyright owner]
|
||||||
|
|
||||||
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
you may not use this file except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
21
vendor/github.com/go-openapi/swag/README.md
generated
vendored
Normal file
21
vendor/github.com/go-openapi/swag/README.md
generated
vendored
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
# Swag [](https://travis-ci.org/go-openapi/swag) [](https://codecov.io/gh/go-openapi/swag) [](https://slackin.goswagger.io)
|
||||||
|
|
||||||
|
[](https://raw.githubusercontent.com/go-openapi/swag/master/LICENSE)
|
||||||
|
[](http://godoc.org/github.com/go-openapi/swag)
|
||||||
|
[](https://goreportcard.com/report/github.com/go-openapi/swag)
|
||||||
|
|
||||||
|
Contains a bunch of helper functions for go-openapi and go-swagger projects.
|
||||||
|
|
||||||
|
You may also use it standalone for your projects.
|
||||||
|
|
||||||
|
* convert between value and pointers for builtin types
|
||||||
|
* convert from string to builtin types (wraps strconv)
|
||||||
|
* fast json concatenation
|
||||||
|
* search in path
|
||||||
|
* load from file or http
|
||||||
|
* name mangling
|
||||||
|
|
||||||
|
|
||||||
|
This repo has only few dependencies outside of the standard library:
|
||||||
|
|
||||||
|
* YAML utilities depend on gopkg.in/yaml.v2
|
208
vendor/github.com/go-openapi/swag/convert.go
generated
vendored
Normal file
208
vendor/github.com/go-openapi/swag/convert.go
generated
vendored
Normal file
@ -0,0 +1,208 @@
|
|||||||
|
// Copyright 2015 go-swagger maintainers
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
|
||||||
|
package swag
|
||||||
|
|
||||||
|
import (
|
||||||
|
"math"
|
||||||
|
"strconv"
|
||||||
|
"strings"
|
||||||
|
)
|
||||||
|
|
||||||
|
// same as ECMA Number.MAX_SAFE_INTEGER and Number.MIN_SAFE_INTEGER
|
||||||
|
const (
|
||||||
|
maxJSONFloat = float64(1<<53 - 1) // 9007199254740991.0 2^53 - 1
|
||||||
|
minJSONFloat = -float64(1<<53 - 1) //-9007199254740991.0 -2^53 - 1
|
||||||
|
epsilon float64 = 1e-9
|
||||||
|
)
|
||||||
|
|
||||||
|
// IsFloat64AJSONInteger allow for integers [-2^53, 2^53-1] inclusive
|
||||||
|
func IsFloat64AJSONInteger(f float64) bool {
|
||||||
|
if math.IsNaN(f) || math.IsInf(f, 0) || f < minJSONFloat || f > maxJSONFloat {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
fa := math.Abs(f)
|
||||||
|
g := float64(uint64(f))
|
||||||
|
ga := math.Abs(g)
|
||||||
|
|
||||||
|
diff := math.Abs(f - g)
|
||||||
|
|
||||||
|
// more info: https://floating-point-gui.de/errors/comparison/#look-out-for-edge-cases
|
||||||
|
switch {
|
||||||
|
case f == g: // best case
|
||||||
|
return true
|
||||||
|
case f == float64(int64(f)) || f == float64(uint64(f)): // optimistic case
|
||||||
|
return true
|
||||||
|
case f == 0 || g == 0 || diff < math.SmallestNonzeroFloat64: // very close to 0 values
|
||||||
|
return diff < (epsilon * math.SmallestNonzeroFloat64)
|
||||||
|
}
|
||||||
|
// check the relative error
|
||||||
|
return diff/math.Min(fa+ga, math.MaxFloat64) < epsilon
|
||||||
|
}
|
||||||
|
|
||||||
|
var evaluatesAsTrue map[string]struct{}
|
||||||
|
|
||||||
|
func init() {
|
||||||
|
evaluatesAsTrue = map[string]struct{}{
|
||||||
|
"true": {},
|
||||||
|
"1": {},
|
||||||
|
"yes": {},
|
||||||
|
"ok": {},
|
||||||
|
"y": {},
|
||||||
|
"on": {},
|
||||||
|
"selected": {},
|
||||||
|
"checked": {},
|
||||||
|
"t": {},
|
||||||
|
"enabled": {},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ConvertBool turn a string into a boolean
|
||||||
|
func ConvertBool(str string) (bool, error) {
|
||||||
|
_, ok := evaluatesAsTrue[strings.ToLower(str)]
|
||||||
|
return ok, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// ConvertFloat32 turn a string into a float32
|
||||||
|
func ConvertFloat32(str string) (float32, error) {
|
||||||
|
f, err := strconv.ParseFloat(str, 32)
|
||||||
|
if err != nil {
|
||||||
|
return 0, err
|
||||||
|
}
|
||||||
|
return float32(f), nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// ConvertFloat64 turn a string into a float64
|
||||||
|
func ConvertFloat64(str string) (float64, error) {
|
||||||
|
return strconv.ParseFloat(str, 64)
|
||||||
|
}
|
||||||
|
|
||||||
|
// ConvertInt8 turn a string into an int8
|
||||||
|
func ConvertInt8(str string) (int8, error) {
|
||||||
|
i, err := strconv.ParseInt(str, 10, 8)
|
||||||
|
if err != nil {
|
||||||
|
return 0, err
|
||||||
|
}
|
||||||
|
return int8(i), nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// ConvertInt16 turn a string into an int16
|
||||||
|
func ConvertInt16(str string) (int16, error) {
|
||||||
|
i, err := strconv.ParseInt(str, 10, 16)
|
||||||
|
if err != nil {
|
||||||
|
return 0, err
|
||||||
|
}
|
||||||
|
return int16(i), nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// ConvertInt32 turn a string into an int32
|
||||||
|
func ConvertInt32(str string) (int32, error) {
|
||||||
|
i, err := strconv.ParseInt(str, 10, 32)
|
||||||
|
if err != nil {
|
||||||
|
return 0, err
|
||||||
|
}
|
||||||
|
return int32(i), nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// ConvertInt64 turn a string into an int64
|
||||||
|
func ConvertInt64(str string) (int64, error) {
|
||||||
|
return strconv.ParseInt(str, 10, 64)
|
||||||
|
}
|
||||||
|
|
||||||
|
// ConvertUint8 turn a string into an uint8
|
||||||
|
func ConvertUint8(str string) (uint8, error) {
|
||||||
|
i, err := strconv.ParseUint(str, 10, 8)
|
||||||
|
if err != nil {
|
||||||
|
return 0, err
|
||||||
|
}
|
||||||
|
return uint8(i), nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// ConvertUint16 turn a string into an uint16
|
||||||
|
func ConvertUint16(str string) (uint16, error) {
|
||||||
|
i, err := strconv.ParseUint(str, 10, 16)
|
||||||
|
if err != nil {
|
||||||
|
return 0, err
|
||||||
|
}
|
||||||
|
return uint16(i), nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// ConvertUint32 turn a string into an uint32
|
||||||
|
func ConvertUint32(str string) (uint32, error) {
|
||||||
|
i, err := strconv.ParseUint(str, 10, 32)
|
||||||
|
if err != nil {
|
||||||
|
return 0, err
|
||||||
|
}
|
||||||
|
return uint32(i), nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// ConvertUint64 turn a string into an uint64
|
||||||
|
func ConvertUint64(str string) (uint64, error) {
|
||||||
|
return strconv.ParseUint(str, 10, 64)
|
||||||
|
}
|
||||||
|
|
||||||
|
// FormatBool turns a boolean into a string
|
||||||
|
func FormatBool(value bool) string {
|
||||||
|
return strconv.FormatBool(value)
|
||||||
|
}
|
||||||
|
|
||||||
|
// FormatFloat32 turns a float32 into a string
|
||||||
|
func FormatFloat32(value float32) string {
|
||||||
|
return strconv.FormatFloat(float64(value), 'f', -1, 32)
|
||||||
|
}
|
||||||
|
|
||||||
|
// FormatFloat64 turns a float64 into a string
|
||||||
|
func FormatFloat64(value float64) string {
|
||||||
|
return strconv.FormatFloat(value, 'f', -1, 64)
|
||||||
|
}
|
||||||
|
|
||||||
|
// FormatInt8 turns an int8 into a string
|
||||||
|
func FormatInt8(value int8) string {
|
||||||
|
return strconv.FormatInt(int64(value), 10)
|
||||||
|
}
|
||||||
|
|
||||||
|
// FormatInt16 turns an int16 into a string
|
||||||
|
func FormatInt16(value int16) string {
|
||||||
|
return strconv.FormatInt(int64(value), 10)
|
||||||
|
}
|
||||||
|
|
||||||
|
// FormatInt32 turns an int32 into a string
|
||||||
|
func FormatInt32(value int32) string {
|
||||||
|
return strconv.Itoa(int(value))
|
||||||
|
}
|
||||||
|
|
||||||
|
// FormatInt64 turns an int64 into a string
|
||||||
|
func FormatInt64(value int64) string {
|
||||||
|
return strconv.FormatInt(value, 10)
|
||||||
|
}
|
||||||
|
|
||||||
|
// FormatUint8 turns an uint8 into a string
|
||||||
|
func FormatUint8(value uint8) string {
|
||||||
|
return strconv.FormatUint(uint64(value), 10)
|
||||||
|
}
|
||||||
|
|
||||||
|
// FormatUint16 turns an uint16 into a string
|
||||||
|
func FormatUint16(value uint16) string {
|
||||||
|
return strconv.FormatUint(uint64(value), 10)
|
||||||
|
}
|
||||||
|
|
||||||
|
// FormatUint32 turns an uint32 into a string
|
||||||
|
func FormatUint32(value uint32) string {
|
||||||
|
return strconv.FormatUint(uint64(value), 10)
|
||||||
|
}
|
||||||
|
|
||||||
|
// FormatUint64 turns an uint64 into a string
|
||||||
|
func FormatUint64(value uint64) string {
|
||||||
|
return strconv.FormatUint(value, 10)
|
||||||
|
}
|
730
vendor/github.com/go-openapi/swag/convert_types.go
generated
vendored
Normal file
730
vendor/github.com/go-openapi/swag/convert_types.go
generated
vendored
Normal file
@ -0,0 +1,730 @@
|
|||||||
|
package swag
|
||||||
|
|
||||||
|
import "time"
|
||||||
|
|
||||||
|
// This file was taken from the aws go sdk
|
||||||
|
|
||||||
|
// String returns a pointer to of the string value passed in.
|
||||||
|
func String(v string) *string {
|
||||||
|
return &v
|
||||||
|
}
|
||||||
|
|
||||||
|
// StringValue returns the value of the string pointer passed in or
|
||||||
|
// "" if the pointer is nil.
|
||||||
|
func StringValue(v *string) string {
|
||||||
|
if v != nil {
|
||||||
|
return *v
|
||||||
|
}
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
|
||||||
|
// StringSlice converts a slice of string values into a slice of
|
||||||
|
// string pointers
|
||||||
|
func StringSlice(src []string) []*string {
|
||||||
|
dst := make([]*string, len(src))
|
||||||
|
for i := 0; i < len(src); i++ {
|
||||||
|
dst[i] = &(src[i])
|
||||||
|
}
|
||||||
|
return dst
|
||||||
|
}
|
||||||
|
|
||||||
|
// StringValueSlice converts a slice of string pointers into a slice of
|
||||||
|
// string values
|
||||||
|
func StringValueSlice(src []*string) []string {
|
||||||
|
dst := make([]string, len(src))
|
||||||
|
for i := 0; i < len(src); i++ {
|
||||||
|
if src[i] != nil {
|
||||||
|
dst[i] = *(src[i])
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return dst
|
||||||
|
}
|
||||||
|
|
||||||
|
// StringMap converts a string map of string values into a string
|
||||||
|
// map of string pointers
|
||||||
|
func StringMap(src map[string]string) map[string]*string {
|
||||||
|
dst := make(map[string]*string)
|
||||||
|
for k, val := range src {
|
||||||
|
v := val
|
||||||
|
dst[k] = &v
|
||||||
|
}
|
||||||
|
return dst
|
||||||
|
}
|
||||||
|
|
||||||
|
// StringValueMap converts a string map of string pointers into a string
|
||||||
|
// map of string values
|
||||||
|
func StringValueMap(src map[string]*string) map[string]string {
|
||||||
|
dst := make(map[string]string)
|
||||||
|
for k, val := range src {
|
||||||
|
if val != nil {
|
||||||
|
dst[k] = *val
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return dst
|
||||||
|
}
|
||||||
|
|
||||||
|
// Bool returns a pointer to of the bool value passed in.
|
||||||
|
func Bool(v bool) *bool {
|
||||||
|
return &v
|
||||||
|
}
|
||||||
|
|
||||||
|
// BoolValue returns the value of the bool pointer passed in or
|
||||||
|
// false if the pointer is nil.
|
||||||
|
func BoolValue(v *bool) bool {
|
||||||
|
if v != nil {
|
||||||
|
return *v
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
// BoolSlice converts a slice of bool values into a slice of
|
||||||
|
// bool pointers
|
||||||
|
func BoolSlice(src []bool) []*bool {
|
||||||
|
dst := make([]*bool, len(src))
|
||||||
|
for i := 0; i < len(src); i++ {
|
||||||
|
dst[i] = &(src[i])
|
||||||
|
}
|
||||||
|
return dst
|
||||||
|
}
|
||||||
|
|
||||||
|
// BoolValueSlice converts a slice of bool pointers into a slice of
|
||||||
|
// bool values
|
||||||
|
func BoolValueSlice(src []*bool) []bool {
|
||||||
|
dst := make([]bool, len(src))
|
||||||
|
for i := 0; i < len(src); i++ {
|
||||||
|
if src[i] != nil {
|
||||||
|
dst[i] = *(src[i])
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return dst
|
||||||
|
}
|
||||||
|
|
||||||
|
// BoolMap converts a string map of bool values into a string
|
||||||
|
// map of bool pointers
|
||||||
|
func BoolMap(src map[string]bool) map[string]*bool {
|
||||||
|
dst := make(map[string]*bool)
|
||||||
|
for k, val := range src {
|
||||||
|
v := val
|
||||||
|
dst[k] = &v
|
||||||
|
}
|
||||||
|
return dst
|
||||||
|
}
|
||||||
|
|
||||||
|
// BoolValueMap converts a string map of bool pointers into a string
|
||||||
|
// map of bool values
|
||||||
|
func BoolValueMap(src map[string]*bool) map[string]bool {
|
||||||
|
dst := make(map[string]bool)
|
||||||
|
for k, val := range src {
|
||||||
|
if val != nil {
|
||||||
|
dst[k] = *val
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return dst
|
||||||
|
}
|
||||||
|
|
||||||
|
// Int returns a pointer to of the int value passed in.
|
||||||
|
func Int(v int) *int {
|
||||||
|
return &v
|
||||||
|
}
|
||||||
|
|
||||||
|
// IntValue returns the value of the int pointer passed in or
|
||||||
|
// 0 if the pointer is nil.
|
||||||
|
func IntValue(v *int) int {
|
||||||
|
if v != nil {
|
||||||
|
return *v
|
||||||
|
}
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
// IntSlice converts a slice of int values into a slice of
|
||||||
|
// int pointers
|
||||||
|
func IntSlice(src []int) []*int {
|
||||||
|
dst := make([]*int, len(src))
|
||||||
|
for i := 0; i < len(src); i++ {
|
||||||
|
dst[i] = &(src[i])
|
||||||
|
}
|
||||||
|
return dst
|
||||||
|
}
|
||||||
|
|
||||||
|
// IntValueSlice converts a slice of int pointers into a slice of
|
||||||
|
// int values
|
||||||
|
func IntValueSlice(src []*int) []int {
|
||||||
|
dst := make([]int, len(src))
|
||||||
|
for i := 0; i < len(src); i++ {
|
||||||
|
if src[i] != nil {
|
||||||
|
dst[i] = *(src[i])
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return dst
|
||||||
|
}
|
||||||
|
|
||||||
|
// IntMap converts a string map of int values into a string
|
||||||
|
// map of int pointers
|
||||||
|
func IntMap(src map[string]int) map[string]*int {
|
||||||
|
dst := make(map[string]*int)
|
||||||
|
for k, val := range src {
|
||||||
|
v := val
|
||||||
|
dst[k] = &v
|
||||||
|
}
|
||||||
|
return dst
|
||||||
|
}
|
||||||
|
|
||||||
|
// IntValueMap converts a string map of int pointers into a string
|
||||||
|
// map of int values
|
||||||
|
func IntValueMap(src map[string]*int) map[string]int {
|
||||||
|
dst := make(map[string]int)
|
||||||
|
for k, val := range src {
|
||||||
|
if val != nil {
|
||||||
|
dst[k] = *val
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return dst
|
||||||
|
}
|
||||||
|
|
||||||
|
// Int32 returns a pointer to of the int32 value passed in.
|
||||||
|
func Int32(v int32) *int32 {
|
||||||
|
return &v
|
||||||
|
}
|
||||||
|
|
||||||
|
// Int32Value returns the value of the int32 pointer passed in or
|
||||||
|
// 0 if the pointer is nil.
|
||||||
|
func Int32Value(v *int32) int32 {
|
||||||
|
if v != nil {
|
||||||
|
return *v
|
||||||
|
}
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
// Int32Slice converts a slice of int32 values into a slice of
|
||||||
|
// int32 pointers
|
||||||
|
func Int32Slice(src []int32) []*int32 {
|
||||||
|
dst := make([]*int32, len(src))
|
||||||
|
for i := 0; i < len(src); i++ {
|
||||||
|
dst[i] = &(src[i])
|
||||||
|
}
|
||||||
|
return dst
|
||||||
|
}
|
||||||
|
|
||||||
|
// Int32ValueSlice converts a slice of int32 pointers into a slice of
|
||||||
|
// int32 values
|
||||||
|
func Int32ValueSlice(src []*int32) []int32 {
|
||||||
|
dst := make([]int32, len(src))
|
||||||
|
for i := 0; i < len(src); i++ {
|
||||||
|
if src[i] != nil {
|
||||||
|
dst[i] = *(src[i])
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return dst
|
||||||
|
}
|
||||||
|
|
||||||
|
// Int32Map converts a string map of int32 values into a string
|
||||||
|
// map of int32 pointers
|
||||||
|
func Int32Map(src map[string]int32) map[string]*int32 {
|
||||||
|
dst := make(map[string]*int32)
|
||||||
|
for k, val := range src {
|
||||||
|
v := val
|
||||||
|
dst[k] = &v
|
||||||
|
}
|
||||||
|
return dst
|
||||||
|
}
|
||||||
|
|
||||||
|
// Int32ValueMap converts a string map of int32 pointers into a string
|
||||||
|
// map of int32 values
|
||||||
|
func Int32ValueMap(src map[string]*int32) map[string]int32 {
|
||||||
|
dst := make(map[string]int32)
|
||||||
|
for k, val := range src {
|
||||||
|
if val != nil {
|
||||||
|
dst[k] = *val
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return dst
|
||||||
|
}
|
||||||
|
|
||||||
|
// Int64 returns a pointer to of the int64 value passed in.
|
||||||
|
func Int64(v int64) *int64 {
|
||||||
|
return &v
|
||||||
|
}
|
||||||
|
|
||||||
|
// Int64Value returns the value of the int64 pointer passed in or
|
||||||
|
// 0 if the pointer is nil.
|
||||||
|
func Int64Value(v *int64) int64 {
|
||||||
|
if v != nil {
|
||||||
|
return *v
|
||||||
|
}
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
// Int64Slice converts a slice of int64 values into a slice of
|
||||||
|
// int64 pointers
|
||||||
|
func Int64Slice(src []int64) []*int64 {
|
||||||
|
dst := make([]*int64, len(src))
|
||||||
|
for i := 0; i < len(src); i++ {
|
||||||
|
dst[i] = &(src[i])
|
||||||
|
}
|
||||||
|
return dst
|
||||||
|
}
|
||||||
|
|
||||||
|
// Int64ValueSlice converts a slice of int64 pointers into a slice of
|
||||||
|
// int64 values
|
||||||
|
func Int64ValueSlice(src []*int64) []int64 {
|
||||||
|
dst := make([]int64, len(src))
|
||||||
|
for i := 0; i < len(src); i++ {
|
||||||
|
if src[i] != nil {
|
||||||
|
dst[i] = *(src[i])
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return dst
|
||||||
|
}
|
||||||
|
|
||||||
|
// Int64Map converts a string map of int64 values into a string
|
||||||
|
// map of int64 pointers
|
||||||
|
func Int64Map(src map[string]int64) map[string]*int64 {
|
||||||
|
dst := make(map[string]*int64)
|
||||||
|
for k, val := range src {
|
||||||
|
v := val
|
||||||
|
dst[k] = &v
|
||||||
|
}
|
||||||
|
return dst
|
||||||
|
}
|
||||||
|
|
||||||
|
// Int64ValueMap converts a string map of int64 pointers into a string
|
||||||
|
// map of int64 values
|
||||||
|
func Int64ValueMap(src map[string]*int64) map[string]int64 {
|
||||||
|
dst := make(map[string]int64)
|
||||||
|
for k, val := range src {
|
||||||
|
if val != nil {
|
||||||
|
dst[k] = *val
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return dst
|
||||||
|
}
|
||||||
|
|
||||||
|
// Uint16 returns a pointer to of the uint16 value passed in.
|
||||||
|
func Uint16(v uint16) *uint16 {
|
||||||
|
return &v
|
||||||
|
}
|
||||||
|
|
||||||
|
// Uint16Value returns the value of the uint16 pointer passed in or
|
||||||
|
// 0 if the pointer is nil.
|
||||||
|
func Uint16Value(v *uint16) uint16 {
|
||||||
|
if v != nil {
|
||||||
|
return *v
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
// Uint16Slice converts a slice of uint16 values into a slice of
|
||||||
|
// uint16 pointers
|
||||||
|
func Uint16Slice(src []uint16) []*uint16 {
|
||||||
|
dst := make([]*uint16, len(src))
|
||||||
|
for i := 0; i < len(src); i++ {
|
||||||
|
dst[i] = &(src[i])
|
||||||
|
}
|
||||||
|
|
||||||
|
return dst
|
||||||
|
}
|
||||||
|
|
||||||
|
// Uint16ValueSlice converts a slice of uint16 pointers into a slice of
|
||||||
|
// uint16 values
|
||||||
|
func Uint16ValueSlice(src []*uint16) []uint16 {
|
||||||
|
dst := make([]uint16, len(src))
|
||||||
|
|
||||||
|
for i := 0; i < len(src); i++ {
|
||||||
|
if src[i] != nil {
|
||||||
|
dst[i] = *(src[i])
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return dst
|
||||||
|
}
|
||||||
|
|
||||||
|
// Uint16Map converts a string map of uint16 values into a string
|
||||||
|
// map of uint16 pointers
|
||||||
|
func Uint16Map(src map[string]uint16) map[string]*uint16 {
|
||||||
|
dst := make(map[string]*uint16)
|
||||||
|
|
||||||
|
for k, val := range src {
|
||||||
|
v := val
|
||||||
|
dst[k] = &v
|
||||||
|
}
|
||||||
|
|
||||||
|
return dst
|
||||||
|
}
|
||||||
|
|
||||||
|
// Uint16ValueMap converts a string map of uint16 pointers into a string
|
||||||
|
// map of uint16 values
|
||||||
|
func Uint16ValueMap(src map[string]*uint16) map[string]uint16 {
|
||||||
|
dst := make(map[string]uint16)
|
||||||
|
|
||||||
|
for k, val := range src {
|
||||||
|
if val != nil {
|
||||||
|
dst[k] = *val
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return dst
|
||||||
|
}
|
||||||
|
|
||||||
|
// Uint returns a pointer to of the uint value passed in.
|
||||||
|
func Uint(v uint) *uint {
|
||||||
|
return &v
|
||||||
|
}
|
||||||
|
|
||||||
|
// UintValue returns the value of the uint pointer passed in or
|
||||||
|
// 0 if the pointer is nil.
|
||||||
|
func UintValue(v *uint) uint {
|
||||||
|
if v != nil {
|
||||||
|
return *v
|
||||||
|
}
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
// UintSlice converts a slice of uint values into a slice of
|
||||||
|
// uint pointers
|
||||||
|
func UintSlice(src []uint) []*uint {
|
||||||
|
dst := make([]*uint, len(src))
|
||||||
|
for i := 0; i < len(src); i++ {
|
||||||
|
dst[i] = &(src[i])
|
||||||
|
}
|
||||||
|
return dst
|
||||||
|
}
|
||||||
|
|
||||||
|
// UintValueSlice converts a slice of uint pointers into a slice of
|
||||||
|
// uint values
|
||||||
|
func UintValueSlice(src []*uint) []uint {
|
||||||
|
dst := make([]uint, len(src))
|
||||||
|
for i := 0; i < len(src); i++ {
|
||||||
|
if src[i] != nil {
|
||||||
|
dst[i] = *(src[i])
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return dst
|
||||||
|
}
|
||||||
|
|
||||||
|
// UintMap converts a string map of uint values into a string
|
||||||
|
// map of uint pointers
|
||||||
|
func UintMap(src map[string]uint) map[string]*uint {
|
||||||
|
dst := make(map[string]*uint)
|
||||||
|
for k, val := range src {
|
||||||
|
v := val
|
||||||
|
dst[k] = &v
|
||||||
|
}
|
||||||
|
return dst
|
||||||
|
}
|
||||||
|
|
||||||
|
// UintValueMap converts a string map of uint pointers into a string
|
||||||
|
// map of uint values
|
||||||
|
func UintValueMap(src map[string]*uint) map[string]uint {
|
||||||
|
dst := make(map[string]uint)
|
||||||
|
for k, val := range src {
|
||||||
|
if val != nil {
|
||||||
|
dst[k] = *val
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return dst
|
||||||
|
}
|
||||||
|
|
||||||
|
// Uint32 returns a pointer to of the uint32 value passed in.
|
||||||
|
func Uint32(v uint32) *uint32 {
|
||||||
|
return &v
|
||||||
|
}
|
||||||
|
|
||||||
|
// Uint32Value returns the value of the uint32 pointer passed in or
|
||||||
|
// 0 if the pointer is nil.
|
||||||
|
func Uint32Value(v *uint32) uint32 {
|
||||||
|
if v != nil {
|
||||||
|
return *v
|
||||||
|
}
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
// Uint32Slice converts a slice of uint32 values into a slice of
|
||||||
|
// uint32 pointers
|
||||||
|
func Uint32Slice(src []uint32) []*uint32 {
|
||||||
|
dst := make([]*uint32, len(src))
|
||||||
|
for i := 0; i < len(src); i++ {
|
||||||
|
dst[i] = &(src[i])
|
||||||
|
}
|
||||||
|
return dst
|
||||||
|
}
|
||||||
|
|
||||||
|
// Uint32ValueSlice converts a slice of uint32 pointers into a slice of
|
||||||
|
// uint32 values
|
||||||
|
func Uint32ValueSlice(src []*uint32) []uint32 {
|
||||||
|
dst := make([]uint32, len(src))
|
||||||
|
for i := 0; i < len(src); i++ {
|
||||||
|
if src[i] != nil {
|
||||||
|
dst[i] = *(src[i])
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return dst
|
||||||
|
}
|
||||||
|
|
||||||
|
// Uint32Map converts a string map of uint32 values into a string
|
||||||
|
// map of uint32 pointers
|
||||||
|
func Uint32Map(src map[string]uint32) map[string]*uint32 {
|
||||||
|
dst := make(map[string]*uint32)
|
||||||
|
for k, val := range src {
|
||||||
|
v := val
|
||||||
|
dst[k] = &v
|
||||||
|
}
|
||||||
|
return dst
|
||||||
|
}
|
||||||
|
|
||||||
|
// Uint32ValueMap converts a string map of uint32 pointers into a string
|
||||||
|
// map of uint32 values
|
||||||
|
func Uint32ValueMap(src map[string]*uint32) map[string]uint32 {
|
||||||
|
dst := make(map[string]uint32)
|
||||||
|
for k, val := range src {
|
||||||
|
if val != nil {
|
||||||
|
dst[k] = *val
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return dst
|
||||||
|
}
|
||||||
|
|
||||||
|
// Uint64 returns a pointer to of the uint64 value passed in.
|
||||||
|
func Uint64(v uint64) *uint64 {
|
||||||
|
return &v
|
||||||
|
}
|
||||||
|
|
||||||
|
// Uint64Value returns the value of the uint64 pointer passed in or
|
||||||
|
// 0 if the pointer is nil.
|
||||||
|
func Uint64Value(v *uint64) uint64 {
|
||||||
|
if v != nil {
|
||||||
|
return *v
|
||||||
|
}
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
// Uint64Slice converts a slice of uint64 values into a slice of
|
||||||
|
// uint64 pointers
|
||||||
|
func Uint64Slice(src []uint64) []*uint64 {
|
||||||
|
dst := make([]*uint64, len(src))
|
||||||
|
for i := 0; i < len(src); i++ {
|
||||||
|
dst[i] = &(src[i])
|
||||||
|
}
|
||||||
|
return dst
|
||||||
|
}
|
||||||
|
|
||||||
|
// Uint64ValueSlice converts a slice of uint64 pointers into a slice of
|
||||||
|
// uint64 values
|
||||||
|
func Uint64ValueSlice(src []*uint64) []uint64 {
|
||||||
|
dst := make([]uint64, len(src))
|
||||||
|
for i := 0; i < len(src); i++ {
|
||||||
|
if src[i] != nil {
|
||||||
|
dst[i] = *(src[i])
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return dst
|
||||||
|
}
|
||||||
|
|
||||||
|
// Uint64Map converts a string map of uint64 values into a string
|
||||||
|
// map of uint64 pointers
|
||||||
|
func Uint64Map(src map[string]uint64) map[string]*uint64 {
|
||||||
|
dst := make(map[string]*uint64)
|
||||||
|
for k, val := range src {
|
||||||
|
v := val
|
||||||
|
dst[k] = &v
|
||||||
|
}
|
||||||
|
return dst
|
||||||
|
}
|
||||||
|
|
||||||
|
// Uint64ValueMap converts a string map of uint64 pointers into a string
|
||||||
|
// map of uint64 values
|
||||||
|
func Uint64ValueMap(src map[string]*uint64) map[string]uint64 {
|
||||||
|
dst := make(map[string]uint64)
|
||||||
|
for k, val := range src {
|
||||||
|
if val != nil {
|
||||||
|
dst[k] = *val
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return dst
|
||||||
|
}
|
||||||
|
|
||||||
|
// Float32 returns a pointer to of the float32 value passed in.
|
||||||
|
func Float32(v float32) *float32 {
|
||||||
|
return &v
|
||||||
|
}
|
||||||
|
|
||||||
|
// Float32Value returns the value of the float32 pointer passed in or
|
||||||
|
// 0 if the pointer is nil.
|
||||||
|
func Float32Value(v *float32) float32 {
|
||||||
|
if v != nil {
|
||||||
|
return *v
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
// Float32Slice converts a slice of float32 values into a slice of
|
||||||
|
// float32 pointers
|
||||||
|
func Float32Slice(src []float32) []*float32 {
|
||||||
|
dst := make([]*float32, len(src))
|
||||||
|
|
||||||
|
for i := 0; i < len(src); i++ {
|
||||||
|
dst[i] = &(src[i])
|
||||||
|
}
|
||||||
|
|
||||||
|
return dst
|
||||||
|
}
|
||||||
|
|
||||||
|
// Float32ValueSlice converts a slice of float32 pointers into a slice of
|
||||||
|
// float32 values
|
||||||
|
func Float32ValueSlice(src []*float32) []float32 {
|
||||||
|
dst := make([]float32, len(src))
|
||||||
|
|
||||||
|
for i := 0; i < len(src); i++ {
|
||||||
|
if src[i] != nil {
|
||||||
|
dst[i] = *(src[i])
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return dst
|
||||||
|
}
|
||||||
|
|
||||||
|
// Float32Map converts a string map of float32 values into a string
|
||||||
|
// map of float32 pointers
|
||||||
|
func Float32Map(src map[string]float32) map[string]*float32 {
|
||||||
|
dst := make(map[string]*float32)
|
||||||
|
|
||||||
|
for k, val := range src {
|
||||||
|
v := val
|
||||||
|
dst[k] = &v
|
||||||
|
}
|
||||||
|
|
||||||
|
return dst
|
||||||
|
}
|
||||||
|
|
||||||
|
// Float32ValueMap converts a string map of float32 pointers into a string
|
||||||
|
// map of float32 values
|
||||||
|
func Float32ValueMap(src map[string]*float32) map[string]float32 {
|
||||||
|
dst := make(map[string]float32)
|
||||||
|
|
||||||
|
for k, val := range src {
|
||||||
|
if val != nil {
|
||||||
|
dst[k] = *val
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return dst
|
||||||
|
}
|
||||||
|
|
||||||
|
// Float64 returns a pointer to of the float64 value passed in.
|
||||||
|
func Float64(v float64) *float64 {
|
||||||
|
return &v
|
||||||
|
}
|
||||||
|
|
||||||
|
// Float64Value returns the value of the float64 pointer passed in or
|
||||||
|
// 0 if the pointer is nil.
|
||||||
|
func Float64Value(v *float64) float64 {
|
||||||
|
if v != nil {
|
||||||
|
return *v
|
||||||
|
}
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
// Float64Slice converts a slice of float64 values into a slice of
|
||||||
|
// float64 pointers
|
||||||
|
func Float64Slice(src []float64) []*float64 {
|
||||||
|
dst := make([]*float64, len(src))
|
||||||
|
for i := 0; i < len(src); i++ {
|
||||||
|
dst[i] = &(src[i])
|
||||||
|
}
|
||||||
|
return dst
|
||||||
|
}
|
||||||
|
|
||||||
|
// Float64ValueSlice converts a slice of float64 pointers into a slice of
|
||||||
|
// float64 values
|
||||||
|
func Float64ValueSlice(src []*float64) []float64 {
|
||||||
|
dst := make([]float64, len(src))
|
||||||
|
for i := 0; i < len(src); i++ {
|
||||||
|
if src[i] != nil {
|
||||||
|
dst[i] = *(src[i])
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return dst
|
||||||
|
}
|
||||||
|
|
||||||
|
// Float64Map converts a string map of float64 values into a string
|
||||||
|
// map of float64 pointers
|
||||||
|
func Float64Map(src map[string]float64) map[string]*float64 {
|
||||||
|
dst := make(map[string]*float64)
|
||||||
|
for k, val := range src {
|
||||||
|
v := val
|
||||||
|
dst[k] = &v
|
||||||
|
}
|
||||||
|
return dst
|
||||||
|
}
|
||||||
|
|
||||||
|
// Float64ValueMap converts a string map of float64 pointers into a string
|
||||||
|
// map of float64 values
|
||||||
|
func Float64ValueMap(src map[string]*float64) map[string]float64 {
|
||||||
|
dst := make(map[string]float64)
|
||||||
|
for k, val := range src {
|
||||||
|
if val != nil {
|
||||||
|
dst[k] = *val
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return dst
|
||||||
|
}
|
||||||
|
|
||||||
|
// Time returns a pointer to of the time.Time value passed in.
|
||||||
|
func Time(v time.Time) *time.Time {
|
||||||
|
return &v
|
||||||
|
}
|
||||||
|
|
||||||
|
// TimeValue returns the value of the time.Time pointer passed in or
|
||||||
|
// time.Time{} if the pointer is nil.
|
||||||
|
func TimeValue(v *time.Time) time.Time {
|
||||||
|
if v != nil {
|
||||||
|
return *v
|
||||||
|
}
|
||||||
|
return time.Time{}
|
||||||
|
}
|
||||||
|
|
||||||
|
// TimeSlice converts a slice of time.Time values into a slice of
|
||||||
|
// time.Time pointers
|
||||||
|
func TimeSlice(src []time.Time) []*time.Time {
|
||||||
|
dst := make([]*time.Time, len(src))
|
||||||
|
for i := 0; i < len(src); i++ {
|
||||||
|
dst[i] = &(src[i])
|
||||||
|
}
|
||||||
|
return dst
|
||||||
|
}
|
||||||
|
|
||||||
|
// TimeValueSlice converts a slice of time.Time pointers into a slice of
|
||||||
|
// time.Time values
|
||||||
|
func TimeValueSlice(src []*time.Time) []time.Time {
|
||||||
|
dst := make([]time.Time, len(src))
|
||||||
|
for i := 0; i < len(src); i++ {
|
||||||
|
if src[i] != nil {
|
||||||
|
dst[i] = *(src[i])
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return dst
|
||||||
|
}
|
||||||
|
|
||||||
|
// TimeMap converts a string map of time.Time values into a string
|
||||||
|
// map of time.Time pointers
|
||||||
|
func TimeMap(src map[string]time.Time) map[string]*time.Time {
|
||||||
|
dst := make(map[string]*time.Time)
|
||||||
|
for k, val := range src {
|
||||||
|
v := val
|
||||||
|
dst[k] = &v
|
||||||
|
}
|
||||||
|
return dst
|
||||||
|
}
|
||||||
|
|
||||||
|
// TimeValueMap converts a string map of time.Time pointers into a string
|
||||||
|
// map of time.Time values
|
||||||
|
func TimeValueMap(src map[string]*time.Time) map[string]time.Time {
|
||||||
|
dst := make(map[string]time.Time)
|
||||||
|
for k, val := range src {
|
||||||
|
if val != nil {
|
||||||
|
dst[k] = *val
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return dst
|
||||||
|
}
|
32
vendor/github.com/go-openapi/swag/doc.go
generated
vendored
Normal file
32
vendor/github.com/go-openapi/swag/doc.go
generated
vendored
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
// Copyright 2015 go-swagger maintainers
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
|
||||||
|
/*
|
||||||
|
Package swag contains a bunch of helper functions for go-openapi and go-swagger projects.
|
||||||
|
|
||||||
|
You may also use it standalone for your projects.
|
||||||
|
|
||||||
|
* convert between value and pointers for builtin types
|
||||||
|
* convert from string to builtin types (wraps strconv)
|
||||||
|
* fast json concatenation
|
||||||
|
* search in path
|
||||||
|
* load from file or http
|
||||||
|
* name mangling
|
||||||
|
|
||||||
|
|
||||||
|
This repo has only few dependencies outside of the standard library:
|
||||||
|
|
||||||
|
* YAML utilities depend on gopkg.in/yaml.v2
|
||||||
|
*/
|
||||||
|
package swag
|
312
vendor/github.com/go-openapi/swag/json.go
generated
vendored
Normal file
312
vendor/github.com/go-openapi/swag/json.go
generated
vendored
Normal file
@ -0,0 +1,312 @@
|
|||||||
|
// Copyright 2015 go-swagger maintainers
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
|
||||||
|
package swag
|
||||||
|
|
||||||
|
import (
|
||||||
|
"bytes"
|
||||||
|
"encoding/json"
|
||||||
|
"log"
|
||||||
|
"reflect"
|
||||||
|
"strings"
|
||||||
|
"sync"
|
||||||
|
|
||||||
|
"github.com/mailru/easyjson/jlexer"
|
||||||
|
"github.com/mailru/easyjson/jwriter"
|
||||||
|
)
|
||||||
|
|
||||||
|
// nullJSON represents a JSON object with null type
|
||||||
|
var nullJSON = []byte("null")
|
||||||
|
|
||||||
|
// DefaultJSONNameProvider the default cache for types
|
||||||
|
var DefaultJSONNameProvider = NewNameProvider()
|
||||||
|
|
||||||
|
const comma = byte(',')
|
||||||
|
|
||||||
|
var closers map[byte]byte
|
||||||
|
|
||||||
|
func init() {
|
||||||
|
closers = map[byte]byte{
|
||||||
|
'{': '}',
|
||||||
|
'[': ']',
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
type ejMarshaler interface {
|
||||||
|
MarshalEasyJSON(w *jwriter.Writer)
|
||||||
|
}
|
||||||
|
|
||||||
|
type ejUnmarshaler interface {
|
||||||
|
UnmarshalEasyJSON(w *jlexer.Lexer)
|
||||||
|
}
|
||||||
|
|
||||||
|
// WriteJSON writes json data, prefers finding an appropriate interface to short-circuit the marshaler
|
||||||
|
// so it takes the fastest option available.
|
||||||
|
func WriteJSON(data interface{}) ([]byte, error) {
|
||||||
|
if d, ok := data.(ejMarshaler); ok {
|
||||||
|
jw := new(jwriter.Writer)
|
||||||
|
d.MarshalEasyJSON(jw)
|
||||||
|
return jw.BuildBytes()
|
||||||
|
}
|
||||||
|
if d, ok := data.(json.Marshaler); ok {
|
||||||
|
return d.MarshalJSON()
|
||||||
|
}
|
||||||
|
return json.Marshal(data)
|
||||||
|
}
|
||||||
|
|
||||||
|
// ReadJSON reads json data, prefers finding an appropriate interface to short-circuit the unmarshaler
|
||||||
|
// so it takes the fastest option available
|
||||||
|
func ReadJSON(data []byte, value interface{}) error {
|
||||||
|
trimmedData := bytes.Trim(data, "\x00")
|
||||||
|
if d, ok := value.(ejUnmarshaler); ok {
|
||||||
|
jl := &jlexer.Lexer{Data: trimmedData}
|
||||||
|
d.UnmarshalEasyJSON(jl)
|
||||||
|
return jl.Error()
|
||||||
|
}
|
||||||
|
if d, ok := value.(json.Unmarshaler); ok {
|
||||||
|
return d.UnmarshalJSON(trimmedData)
|
||||||
|
}
|
||||||
|
return json.Unmarshal(trimmedData, value)
|
||||||
|
}
|
||||||
|
|
||||||
|
// DynamicJSONToStruct converts an untyped json structure into a struct
|
||||||
|
func DynamicJSONToStruct(data interface{}, target interface{}) error {
|
||||||
|
// TODO: convert straight to a json typed map (mergo + iterate?)
|
||||||
|
b, err := WriteJSON(data)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
return ReadJSON(b, target)
|
||||||
|
}
|
||||||
|
|
||||||
|
// ConcatJSON concatenates multiple json objects efficiently
|
||||||
|
func ConcatJSON(blobs ...[]byte) []byte {
|
||||||
|
if len(blobs) == 0 {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
last := len(blobs) - 1
|
||||||
|
for blobs[last] == nil || bytes.Equal(blobs[last], nullJSON) {
|
||||||
|
// strips trailing null objects
|
||||||
|
last--
|
||||||
|
if last < 0 {
|
||||||
|
// there was nothing but "null"s or nil...
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if last == 0 {
|
||||||
|
return blobs[0]
|
||||||
|
}
|
||||||
|
|
||||||
|
var opening, closing byte
|
||||||
|
var idx, a int
|
||||||
|
buf := bytes.NewBuffer(nil)
|
||||||
|
|
||||||
|
for i, b := range blobs[:last+1] {
|
||||||
|
if b == nil || bytes.Equal(b, nullJSON) {
|
||||||
|
// a null object is in the list: skip it
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
if len(b) > 0 && opening == 0 { // is this an array or an object?
|
||||||
|
opening, closing = b[0], closers[b[0]]
|
||||||
|
}
|
||||||
|
|
||||||
|
if opening != '{' && opening != '[' {
|
||||||
|
continue // don't know how to concatenate non container objects
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(b) < 3 { // yep empty but also the last one, so closing this thing
|
||||||
|
if i == last && a > 0 {
|
||||||
|
if err := buf.WriteByte(closing); err != nil {
|
||||||
|
log.Println(err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
idx = 0
|
||||||
|
if a > 0 { // we need to join with a comma for everything beyond the first non-empty item
|
||||||
|
if err := buf.WriteByte(comma); err != nil {
|
||||||
|
log.Println(err)
|
||||||
|
}
|
||||||
|
idx = 1 // this is not the first or the last so we want to drop the leading bracket
|
||||||
|
}
|
||||||
|
|
||||||
|
if i != last { // not the last one, strip brackets
|
||||||
|
if _, err := buf.Write(b[idx : len(b)-1]); err != nil {
|
||||||
|
log.Println(err)
|
||||||
|
}
|
||||||
|
} else { // last one, strip only the leading bracket
|
||||||
|
if _, err := buf.Write(b[idx:]); err != nil {
|
||||||
|
log.Println(err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
a++
|
||||||
|
}
|
||||||
|
// somehow it ended up being empty, so provide a default value
|
||||||
|
if buf.Len() == 0 {
|
||||||
|
if err := buf.WriteByte(opening); err != nil {
|
||||||
|
log.Println(err)
|
||||||
|
}
|
||||||
|
if err := buf.WriteByte(closing); err != nil {
|
||||||
|
log.Println(err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return buf.Bytes()
|
||||||
|
}
|
||||||
|
|
||||||
|
// ToDynamicJSON turns an object into a properly JSON typed structure
|
||||||
|
func ToDynamicJSON(data interface{}) interface{} {
|
||||||
|
// TODO: convert straight to a json typed map (mergo + iterate?)
|
||||||
|
b, err := json.Marshal(data)
|
||||||
|
if err != nil {
|
||||||
|
log.Println(err)
|
||||||
|
}
|
||||||
|
var res interface{}
|
||||||
|
if err := json.Unmarshal(b, &res); err != nil {
|
||||||
|
log.Println(err)
|
||||||
|
}
|
||||||
|
return res
|
||||||
|
}
|
||||||
|
|
||||||
|
// FromDynamicJSON turns an object into a properly JSON typed structure
|
||||||
|
func FromDynamicJSON(data, target interface{}) error {
|
||||||
|
b, err := json.Marshal(data)
|
||||||
|
if err != nil {
|
||||||
|
log.Println(err)
|
||||||
|
}
|
||||||
|
return json.Unmarshal(b, target)
|
||||||
|
}
|
||||||
|
|
||||||
|
// NameProvider represents an object capable of translating from go property names
|
||||||
|
// to json property names
|
||||||
|
// This type is thread-safe.
|
||||||
|
type NameProvider struct {
|
||||||
|
lock *sync.Mutex
|
||||||
|
index map[reflect.Type]nameIndex
|
||||||
|
}
|
||||||
|
|
||||||
|
type nameIndex struct {
|
||||||
|
jsonNames map[string]string
|
||||||
|
goNames map[string]string
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewNameProvider creates a new name provider
|
||||||
|
func NewNameProvider() *NameProvider {
|
||||||
|
return &NameProvider{
|
||||||
|
lock: &sync.Mutex{},
|
||||||
|
index: make(map[reflect.Type]nameIndex),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func buildnameIndex(tpe reflect.Type, idx, reverseIdx map[string]string) {
|
||||||
|
for i := 0; i < tpe.NumField(); i++ {
|
||||||
|
targetDes := tpe.Field(i)
|
||||||
|
|
||||||
|
if targetDes.PkgPath != "" { // unexported
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
if targetDes.Anonymous { // walk embedded structures tree down first
|
||||||
|
buildnameIndex(targetDes.Type, idx, reverseIdx)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
if tag := targetDes.Tag.Get("json"); tag != "" {
|
||||||
|
|
||||||
|
parts := strings.Split(tag, ",")
|
||||||
|
if len(parts) == 0 {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
nm := parts[0]
|
||||||
|
if nm == "-" {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
if nm == "" { // empty string means we want to use the Go name
|
||||||
|
nm = targetDes.Name
|
||||||
|
}
|
||||||
|
|
||||||
|
idx[nm] = targetDes.Name
|
||||||
|
reverseIdx[targetDes.Name] = nm
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func newNameIndex(tpe reflect.Type) nameIndex {
|
||||||
|
var idx = make(map[string]string, tpe.NumField())
|
||||||
|
var reverseIdx = make(map[string]string, tpe.NumField())
|
||||||
|
|
||||||
|
buildnameIndex(tpe, idx, reverseIdx)
|
||||||
|
return nameIndex{jsonNames: idx, goNames: reverseIdx}
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetJSONNames gets all the json property names for a type
|
||||||
|
func (n *NameProvider) GetJSONNames(subject interface{}) []string {
|
||||||
|
n.lock.Lock()
|
||||||
|
defer n.lock.Unlock()
|
||||||
|
tpe := reflect.Indirect(reflect.ValueOf(subject)).Type()
|
||||||
|
names, ok := n.index[tpe]
|
||||||
|
if !ok {
|
||||||
|
names = n.makeNameIndex(tpe)
|
||||||
|
}
|
||||||
|
|
||||||
|
res := make([]string, 0, len(names.jsonNames))
|
||||||
|
for k := range names.jsonNames {
|
||||||
|
res = append(res, k)
|
||||||
|
}
|
||||||
|
return res
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetJSONName gets the json name for a go property name
|
||||||
|
func (n *NameProvider) GetJSONName(subject interface{}, name string) (string, bool) {
|
||||||
|
tpe := reflect.Indirect(reflect.ValueOf(subject)).Type()
|
||||||
|
return n.GetJSONNameForType(tpe, name)
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetJSONNameForType gets the json name for a go property name on a given type
|
||||||
|
func (n *NameProvider) GetJSONNameForType(tpe reflect.Type, name string) (string, bool) {
|
||||||
|
n.lock.Lock()
|
||||||
|
defer n.lock.Unlock()
|
||||||
|
names, ok := n.index[tpe]
|
||||||
|
if !ok {
|
||||||
|
names = n.makeNameIndex(tpe)
|
||||||
|
}
|
||||||
|
nme, ok := names.goNames[name]
|
||||||
|
return nme, ok
|
||||||
|
}
|
||||||
|
|
||||||
|
func (n *NameProvider) makeNameIndex(tpe reflect.Type) nameIndex {
|
||||||
|
names := newNameIndex(tpe)
|
||||||
|
n.index[tpe] = names
|
||||||
|
return names
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetGoName gets the go name for a json property name
|
||||||
|
func (n *NameProvider) GetGoName(subject interface{}, name string) (string, bool) {
|
||||||
|
tpe := reflect.Indirect(reflect.ValueOf(subject)).Type()
|
||||||
|
return n.GetGoNameForType(tpe, name)
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetGoNameForType gets the go name for a given type for a json property name
|
||||||
|
func (n *NameProvider) GetGoNameForType(tpe reflect.Type, name string) (string, bool) {
|
||||||
|
n.lock.Lock()
|
||||||
|
defer n.lock.Unlock()
|
||||||
|
names, ok := n.index[tpe]
|
||||||
|
if !ok {
|
||||||
|
names = n.makeNameIndex(tpe)
|
||||||
|
}
|
||||||
|
nme, ok := names.jsonNames[name]
|
||||||
|
return nme, ok
|
||||||
|
}
|
120
vendor/github.com/go-openapi/swag/loading.go
generated
vendored
Normal file
120
vendor/github.com/go-openapi/swag/loading.go
generated
vendored
Normal file
@ -0,0 +1,120 @@
|
|||||||
|
// Copyright 2015 go-swagger maintainers
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
|
||||||
|
package swag
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"io/ioutil"
|
||||||
|
"log"
|
||||||
|
"net/http"
|
||||||
|
"net/url"
|
||||||
|
"path/filepath"
|
||||||
|
"runtime"
|
||||||
|
"strings"
|
||||||
|
"time"
|
||||||
|
)
|
||||||
|
|
||||||
|
// LoadHTTPTimeout the default timeout for load requests
|
||||||
|
var LoadHTTPTimeout = 30 * time.Second
|
||||||
|
|
||||||
|
// LoadHTTPBasicAuthUsername the username to use when load requests require basic auth
|
||||||
|
var LoadHTTPBasicAuthUsername = ""
|
||||||
|
|
||||||
|
// LoadHTTPBasicAuthPassword the password to use when load requests require basic auth
|
||||||
|
var LoadHTTPBasicAuthPassword = ""
|
||||||
|
|
||||||
|
// LoadHTTPCustomHeaders an optional collection of custom HTTP headers for load requests
|
||||||
|
var LoadHTTPCustomHeaders = map[string]string{}
|
||||||
|
|
||||||
|
// LoadFromFileOrHTTP loads the bytes from a file or a remote http server based on the path passed in
|
||||||
|
func LoadFromFileOrHTTP(path string) ([]byte, error) {
|
||||||
|
return LoadStrategy(path, ioutil.ReadFile, loadHTTPBytes(LoadHTTPTimeout))(path)
|
||||||
|
}
|
||||||
|
|
||||||
|
// LoadFromFileOrHTTPWithTimeout loads the bytes from a file or a remote http server based on the path passed in
|
||||||
|
// timeout arg allows for per request overriding of the request timeout
|
||||||
|
func LoadFromFileOrHTTPWithTimeout(path string, timeout time.Duration) ([]byte, error) {
|
||||||
|
return LoadStrategy(path, ioutil.ReadFile, loadHTTPBytes(timeout))(path)
|
||||||
|
}
|
||||||
|
|
||||||
|
// LoadStrategy returns a loader function for a given path or uri
|
||||||
|
func LoadStrategy(path string, local, remote func(string) ([]byte, error)) func(string) ([]byte, error) {
|
||||||
|
if strings.HasPrefix(path, "http") {
|
||||||
|
return remote
|
||||||
|
}
|
||||||
|
return func(pth string) ([]byte, error) {
|
||||||
|
upth, err := pathUnescape(pth)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
if strings.HasPrefix(pth, `file://`) {
|
||||||
|
if runtime.GOOS == "windows" {
|
||||||
|
// support for canonical file URIs on windows.
|
||||||
|
// Zero tolerance here for dodgy URIs.
|
||||||
|
u, _ := url.Parse(upth)
|
||||||
|
if u.Host != "" {
|
||||||
|
// assume UNC name (volume share)
|
||||||
|
// file://host/share/folder\... ==> \\host\share\path\folder
|
||||||
|
// NOTE: UNC port not yet supported
|
||||||
|
upth = strings.Join([]string{`\`, u.Host, u.Path}, `\`)
|
||||||
|
} else {
|
||||||
|
// file:///c:/folder/... ==> just remove the leading slash
|
||||||
|
upth = strings.TrimPrefix(upth, `file:///`)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
upth = strings.TrimPrefix(upth, `file://`)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return local(filepath.FromSlash(upth))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func loadHTTPBytes(timeout time.Duration) func(path string) ([]byte, error) {
|
||||||
|
return func(path string) ([]byte, error) {
|
||||||
|
client := &http.Client{Timeout: timeout}
|
||||||
|
req, err := http.NewRequest("GET", path, nil) // nolint: noctx
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
if LoadHTTPBasicAuthUsername != "" && LoadHTTPBasicAuthPassword != "" {
|
||||||
|
req.SetBasicAuth(LoadHTTPBasicAuthUsername, LoadHTTPBasicAuthPassword)
|
||||||
|
}
|
||||||
|
|
||||||
|
for key, val := range LoadHTTPCustomHeaders {
|
||||||
|
req.Header.Set(key, val)
|
||||||
|
}
|
||||||
|
|
||||||
|
resp, err := client.Do(req)
|
||||||
|
defer func() {
|
||||||
|
if resp != nil {
|
||||||
|
if e := resp.Body.Close(); e != nil {
|
||||||
|
log.Println(e)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
if resp.StatusCode != http.StatusOK {
|
||||||
|
return nil, fmt.Errorf("could not access document at %q [%s] ", path, resp.Status)
|
||||||
|
}
|
||||||
|
|
||||||
|
return ioutil.ReadAll(resp.Body)
|
||||||
|
}
|
||||||
|
}
|
87
vendor/github.com/go-openapi/swag/name_lexem.go
generated
vendored
Normal file
87
vendor/github.com/go-openapi/swag/name_lexem.go
generated
vendored
Normal file
@ -0,0 +1,87 @@
|
|||||||
|
// Copyright 2015 go-swagger maintainers
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
|
||||||
|
package swag
|
||||||
|
|
||||||
|
import "unicode"
|
||||||
|
|
||||||
|
type (
|
||||||
|
nameLexem interface {
|
||||||
|
GetUnsafeGoName() string
|
||||||
|
GetOriginal() string
|
||||||
|
IsInitialism() bool
|
||||||
|
}
|
||||||
|
|
||||||
|
initialismNameLexem struct {
|
||||||
|
original string
|
||||||
|
matchedInitialism string
|
||||||
|
}
|
||||||
|
|
||||||
|
casualNameLexem struct {
|
||||||
|
original string
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
func newInitialismNameLexem(original, matchedInitialism string) *initialismNameLexem {
|
||||||
|
return &initialismNameLexem{
|
||||||
|
original: original,
|
||||||
|
matchedInitialism: matchedInitialism,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func newCasualNameLexem(original string) *casualNameLexem {
|
||||||
|
return &casualNameLexem{
|
||||||
|
original: original,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (l *initialismNameLexem) GetUnsafeGoName() string {
|
||||||
|
return l.matchedInitialism
|
||||||
|
}
|
||||||
|
|
||||||
|
func (l *casualNameLexem) GetUnsafeGoName() string {
|
||||||
|
var first rune
|
||||||
|
var rest string
|
||||||
|
for i, orig := range l.original {
|
||||||
|
if i == 0 {
|
||||||
|
first = orig
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
if i > 0 {
|
||||||
|
rest = l.original[i:]
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if len(l.original) > 1 {
|
||||||
|
return string(unicode.ToUpper(first)) + lower(rest)
|
||||||
|
}
|
||||||
|
|
||||||
|
return l.original
|
||||||
|
}
|
||||||
|
|
||||||
|
func (l *initialismNameLexem) GetOriginal() string {
|
||||||
|
return l.original
|
||||||
|
}
|
||||||
|
|
||||||
|
func (l *casualNameLexem) GetOriginal() string {
|
||||||
|
return l.original
|
||||||
|
}
|
||||||
|
|
||||||
|
func (l *initialismNameLexem) IsInitialism() bool {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
func (l *casualNameLexem) IsInitialism() bool {
|
||||||
|
return false
|
||||||
|
}
|
38
vendor/github.com/go-openapi/swag/net.go
generated
vendored
Normal file
38
vendor/github.com/go-openapi/swag/net.go
generated
vendored
Normal file
@ -0,0 +1,38 @@
|
|||||||
|
// Copyright 2015 go-swagger maintainers
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
|
||||||
|
package swag
|
||||||
|
|
||||||
|
import (
|
||||||
|
"net"
|
||||||
|
"strconv"
|
||||||
|
)
|
||||||
|
|
||||||
|
// SplitHostPort splits a network address into a host and a port.
|
||||||
|
// The port is -1 when there is no port to be found
|
||||||
|
func SplitHostPort(addr string) (host string, port int, err error) {
|
||||||
|
h, p, err := net.SplitHostPort(addr)
|
||||||
|
if err != nil {
|
||||||
|
return "", -1, err
|
||||||
|
}
|
||||||
|
if p == "" {
|
||||||
|
return "", -1, &net.AddrError{Err: "missing port in address", Addr: addr}
|
||||||
|
}
|
||||||
|
|
||||||
|
pi, err := strconv.Atoi(p)
|
||||||
|
if err != nil {
|
||||||
|
return "", -1, err
|
||||||
|
}
|
||||||
|
return h, pi, nil
|
||||||
|
}
|
59
vendor/github.com/go-openapi/swag/path.go
generated
vendored
Normal file
59
vendor/github.com/go-openapi/swag/path.go
generated
vendored
Normal file
@ -0,0 +1,59 @@
|
|||||||
|
// Copyright 2015 go-swagger maintainers
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
|
||||||
|
package swag
|
||||||
|
|
||||||
|
import (
|
||||||
|
"os"
|
||||||
|
"path/filepath"
|
||||||
|
"runtime"
|
||||||
|
"strings"
|
||||||
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
// GOPATHKey represents the env key for gopath
|
||||||
|
GOPATHKey = "GOPATH"
|
||||||
|
)
|
||||||
|
|
||||||
|
// FindInSearchPath finds a package in a provided lists of paths
|
||||||
|
func FindInSearchPath(searchPath, pkg string) string {
|
||||||
|
pathsList := filepath.SplitList(searchPath)
|
||||||
|
for _, path := range pathsList {
|
||||||
|
if evaluatedPath, err := filepath.EvalSymlinks(filepath.Join(path, "src", pkg)); err == nil {
|
||||||
|
if _, err := os.Stat(evaluatedPath); err == nil {
|
||||||
|
return evaluatedPath
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
|
||||||
|
// FindInGoSearchPath finds a package in the $GOPATH:$GOROOT
|
||||||
|
func FindInGoSearchPath(pkg string) string {
|
||||||
|
return FindInSearchPath(FullGoSearchPath(), pkg)
|
||||||
|
}
|
||||||
|
|
||||||
|
// FullGoSearchPath gets the search paths for finding packages
|
||||||
|
func FullGoSearchPath() string {
|
||||||
|
allPaths := os.Getenv(GOPATHKey)
|
||||||
|
if allPaths == "" {
|
||||||
|
allPaths = filepath.Join(os.Getenv("HOME"), "go")
|
||||||
|
}
|
||||||
|
if allPaths != "" {
|
||||||
|
allPaths = strings.Join([]string{allPaths, runtime.GOROOT()}, ":")
|
||||||
|
} else {
|
||||||
|
allPaths = runtime.GOROOT()
|
||||||
|
}
|
||||||
|
return allPaths
|
||||||
|
}
|
23
vendor/github.com/go-openapi/swag/post_go18.go
generated
vendored
Normal file
23
vendor/github.com/go-openapi/swag/post_go18.go
generated
vendored
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
// Copyright 2015 go-swagger maintainers
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
|
||||||
|
// +build go1.8
|
||||||
|
|
||||||
|
package swag
|
||||||
|
|
||||||
|
import "net/url"
|
||||||
|
|
||||||
|
func pathUnescape(path string) (string, error) {
|
||||||
|
return url.PathUnescape(path)
|
||||||
|
}
|
67
vendor/github.com/go-openapi/swag/post_go19.go
generated
vendored
Normal file
67
vendor/github.com/go-openapi/swag/post_go19.go
generated
vendored
Normal file
@ -0,0 +1,67 @@
|
|||||||
|
// Copyright 2015 go-swagger maintainers
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
|
||||||
|
// +build go1.9
|
||||||
|
|
||||||
|
package swag
|
||||||
|
|
||||||
|
import (
|
||||||
|
"sort"
|
||||||
|
"sync"
|
||||||
|
)
|
||||||
|
|
||||||
|
// indexOfInitialisms is a thread-safe implementation of the sorted index of initialisms.
|
||||||
|
// Since go1.9, this may be implemented with sync.Map.
|
||||||
|
type indexOfInitialisms struct {
|
||||||
|
sortMutex *sync.Mutex
|
||||||
|
index *sync.Map
|
||||||
|
}
|
||||||
|
|
||||||
|
func newIndexOfInitialisms() *indexOfInitialisms {
|
||||||
|
return &indexOfInitialisms{
|
||||||
|
sortMutex: new(sync.Mutex),
|
||||||
|
index: new(sync.Map),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *indexOfInitialisms) load(initial map[string]bool) *indexOfInitialisms {
|
||||||
|
m.sortMutex.Lock()
|
||||||
|
defer m.sortMutex.Unlock()
|
||||||
|
for k, v := range initial {
|
||||||
|
m.index.Store(k, v)
|
||||||
|
}
|
||||||
|
return m
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *indexOfInitialisms) isInitialism(key string) bool {
|
||||||
|
_, ok := m.index.Load(key)
|
||||||
|
return ok
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *indexOfInitialisms) add(key string) *indexOfInitialisms {
|
||||||
|
m.index.Store(key, true)
|
||||||
|
return m
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *indexOfInitialisms) sorted() (result []string) {
|
||||||
|
m.sortMutex.Lock()
|
||||||
|
defer m.sortMutex.Unlock()
|
||||||
|
m.index.Range(func(key, value interface{}) bool {
|
||||||
|
k := key.(string)
|
||||||
|
result = append(result, k)
|
||||||
|
return true
|
||||||
|
})
|
||||||
|
sort.Sort(sort.Reverse(byInitialism(result)))
|
||||||
|
return
|
||||||
|
}
|
23
vendor/github.com/go-openapi/swag/pre_go18.go
generated
vendored
Normal file
23
vendor/github.com/go-openapi/swag/pre_go18.go
generated
vendored
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
// Copyright 2015 go-swagger maintainers
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
|
||||||
|
// +build !go1.8
|
||||||
|
|
||||||
|
package swag
|
||||||
|
|
||||||
|
import "net/url"
|
||||||
|
|
||||||
|
func pathUnescape(path string) (string, error) {
|
||||||
|
return url.QueryUnescape(path)
|
||||||
|
}
|
69
vendor/github.com/go-openapi/swag/pre_go19.go
generated
vendored
Normal file
69
vendor/github.com/go-openapi/swag/pre_go19.go
generated
vendored
Normal file
@ -0,0 +1,69 @@
|
|||||||
|
// Copyright 2015 go-swagger maintainers
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
|
||||||
|
// +build !go1.9
|
||||||
|
|
||||||
|
package swag
|
||||||
|
|
||||||
|
import (
|
||||||
|
"sort"
|
||||||
|
"sync"
|
||||||
|
)
|
||||||
|
|
||||||
|
// indexOfInitialisms is a thread-safe implementation of the sorted index of initialisms.
|
||||||
|
// Before go1.9, this may be implemented with a mutex on the map.
|
||||||
|
type indexOfInitialisms struct {
|
||||||
|
getMutex *sync.Mutex
|
||||||
|
index map[string]bool
|
||||||
|
}
|
||||||
|
|
||||||
|
func newIndexOfInitialisms() *indexOfInitialisms {
|
||||||
|
return &indexOfInitialisms{
|
||||||
|
getMutex: new(sync.Mutex),
|
||||||
|
index: make(map[string]bool, 50),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *indexOfInitialisms) load(initial map[string]bool) *indexOfInitialisms {
|
||||||
|
m.getMutex.Lock()
|
||||||
|
defer m.getMutex.Unlock()
|
||||||
|
for k, v := range initial {
|
||||||
|
m.index[k] = v
|
||||||
|
}
|
||||||
|
return m
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *indexOfInitialisms) isInitialism(key string) bool {
|
||||||
|
m.getMutex.Lock()
|
||||||
|
defer m.getMutex.Unlock()
|
||||||
|
_, ok := m.index[key]
|
||||||
|
return ok
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *indexOfInitialisms) add(key string) *indexOfInitialisms {
|
||||||
|
m.getMutex.Lock()
|
||||||
|
defer m.getMutex.Unlock()
|
||||||
|
m.index[key] = true
|
||||||
|
return m
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *indexOfInitialisms) sorted() (result []string) {
|
||||||
|
m.getMutex.Lock()
|
||||||
|
defer m.getMutex.Unlock()
|
||||||
|
for k := range m.index {
|
||||||
|
result = append(result, k)
|
||||||
|
}
|
||||||
|
sort.Sort(sort.Reverse(byInitialism(result)))
|
||||||
|
return
|
||||||
|
}
|
262
vendor/github.com/go-openapi/swag/split.go
generated
vendored
Normal file
262
vendor/github.com/go-openapi/swag/split.go
generated
vendored
Normal file
@ -0,0 +1,262 @@
|
|||||||
|
// Copyright 2015 go-swagger maintainers
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
|
||||||
|
package swag
|
||||||
|
|
||||||
|
import (
|
||||||
|
"unicode"
|
||||||
|
)
|
||||||
|
|
||||||
|
var nameReplaceTable = map[rune]string{
|
||||||
|
'@': "At ",
|
||||||
|
'&': "And ",
|
||||||
|
'|': "Pipe ",
|
||||||
|
'$': "Dollar ",
|
||||||
|
'!': "Bang ",
|
||||||
|
'-': "",
|
||||||
|
'_': "",
|
||||||
|
}
|
||||||
|
|
||||||
|
type (
|
||||||
|
splitter struct {
|
||||||
|
postSplitInitialismCheck bool
|
||||||
|
initialisms []string
|
||||||
|
}
|
||||||
|
|
||||||
|
splitterOption func(*splitter) *splitter
|
||||||
|
)
|
||||||
|
|
||||||
|
// split calls the splitter; splitter provides more control and post options
|
||||||
|
func split(str string) []string {
|
||||||
|
lexems := newSplitter().split(str)
|
||||||
|
result := make([]string, 0, len(lexems))
|
||||||
|
|
||||||
|
for _, lexem := range lexems {
|
||||||
|
result = append(result, lexem.GetOriginal())
|
||||||
|
}
|
||||||
|
|
||||||
|
return result
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *splitter) split(str string) []nameLexem {
|
||||||
|
return s.toNameLexems(str)
|
||||||
|
}
|
||||||
|
|
||||||
|
func newSplitter(options ...splitterOption) *splitter {
|
||||||
|
splitter := &splitter{
|
||||||
|
postSplitInitialismCheck: false,
|
||||||
|
initialisms: initialisms,
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, option := range options {
|
||||||
|
splitter = option(splitter)
|
||||||
|
}
|
||||||
|
|
||||||
|
return splitter
|
||||||
|
}
|
||||||
|
|
||||||
|
// withPostSplitInitialismCheck allows to catch initialisms after main split process
|
||||||
|
func withPostSplitInitialismCheck(s *splitter) *splitter {
|
||||||
|
s.postSplitInitialismCheck = true
|
||||||
|
return s
|
||||||
|
}
|
||||||
|
|
||||||
|
type (
|
||||||
|
initialismMatch struct {
|
||||||
|
start, end int
|
||||||
|
body []rune
|
||||||
|
complete bool
|
||||||
|
}
|
||||||
|
initialismMatches []*initialismMatch
|
||||||
|
)
|
||||||
|
|
||||||
|
func (s *splitter) toNameLexems(name string) []nameLexem {
|
||||||
|
nameRunes := []rune(name)
|
||||||
|
matches := s.gatherInitialismMatches(nameRunes)
|
||||||
|
return s.mapMatchesToNameLexems(nameRunes, matches)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *splitter) gatherInitialismMatches(nameRunes []rune) initialismMatches {
|
||||||
|
matches := make(initialismMatches, 0)
|
||||||
|
|
||||||
|
for currentRunePosition, currentRune := range nameRunes {
|
||||||
|
newMatches := make(initialismMatches, 0, len(matches))
|
||||||
|
|
||||||
|
// check current initialism matches
|
||||||
|
for _, match := range matches {
|
||||||
|
if keepCompleteMatch := match.complete; keepCompleteMatch {
|
||||||
|
newMatches = append(newMatches, match)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
// drop failed match
|
||||||
|
currentMatchRune := match.body[currentRunePosition-match.start]
|
||||||
|
if !s.initialismRuneEqual(currentMatchRune, currentRune) {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
// try to complete ongoing match
|
||||||
|
if currentRunePosition-match.start == len(match.body)-1 {
|
||||||
|
// we are close; the next step is to check the symbol ahead
|
||||||
|
// if it is a small letter, then it is not the end of match
|
||||||
|
// but beginning of the next word
|
||||||
|
|
||||||
|
if currentRunePosition < len(nameRunes)-1 {
|
||||||
|
nextRune := nameRunes[currentRunePosition+1]
|
||||||
|
if newWord := unicode.IsLower(nextRune); newWord {
|
||||||
|
// oh ok, it was the start of a new word
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
match.complete = true
|
||||||
|
match.end = currentRunePosition
|
||||||
|
}
|
||||||
|
|
||||||
|
newMatches = append(newMatches, match)
|
||||||
|
}
|
||||||
|
|
||||||
|
// check for new initialism matches
|
||||||
|
for _, initialism := range s.initialisms {
|
||||||
|
initialismRunes := []rune(initialism)
|
||||||
|
if s.initialismRuneEqual(initialismRunes[0], currentRune) {
|
||||||
|
newMatches = append(newMatches, &initialismMatch{
|
||||||
|
start: currentRunePosition,
|
||||||
|
body: initialismRunes,
|
||||||
|
complete: false,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
matches = newMatches
|
||||||
|
}
|
||||||
|
|
||||||
|
return matches
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *splitter) mapMatchesToNameLexems(nameRunes []rune, matches initialismMatches) []nameLexem {
|
||||||
|
nameLexems := make([]nameLexem, 0)
|
||||||
|
|
||||||
|
var lastAcceptedMatch *initialismMatch
|
||||||
|
for _, match := range matches {
|
||||||
|
if !match.complete {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
if firstMatch := lastAcceptedMatch == nil; firstMatch {
|
||||||
|
nameLexems = append(nameLexems, s.breakCasualString(nameRunes[:match.start])...)
|
||||||
|
nameLexems = append(nameLexems, s.breakInitialism(string(match.body)))
|
||||||
|
|
||||||
|
lastAcceptedMatch = match
|
||||||
|
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
if overlappedMatch := match.start <= lastAcceptedMatch.end; overlappedMatch {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
middle := nameRunes[lastAcceptedMatch.end+1 : match.start]
|
||||||
|
nameLexems = append(nameLexems, s.breakCasualString(middle)...)
|
||||||
|
nameLexems = append(nameLexems, s.breakInitialism(string(match.body)))
|
||||||
|
|
||||||
|
lastAcceptedMatch = match
|
||||||
|
}
|
||||||
|
|
||||||
|
// we have not found any accepted matches
|
||||||
|
if lastAcceptedMatch == nil {
|
||||||
|
return s.breakCasualString(nameRunes)
|
||||||
|
}
|
||||||
|
|
||||||
|
if lastAcceptedMatch.end+1 != len(nameRunes) {
|
||||||
|
rest := nameRunes[lastAcceptedMatch.end+1:]
|
||||||
|
nameLexems = append(nameLexems, s.breakCasualString(rest)...)
|
||||||
|
}
|
||||||
|
|
||||||
|
return nameLexems
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *splitter) initialismRuneEqual(a, b rune) bool {
|
||||||
|
return a == b
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *splitter) breakInitialism(original string) nameLexem {
|
||||||
|
return newInitialismNameLexem(original, original)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *splitter) breakCasualString(str []rune) []nameLexem {
|
||||||
|
segments := make([]nameLexem, 0)
|
||||||
|
currentSegment := ""
|
||||||
|
|
||||||
|
addCasualNameLexem := func(original string) {
|
||||||
|
segments = append(segments, newCasualNameLexem(original))
|
||||||
|
}
|
||||||
|
|
||||||
|
addInitialismNameLexem := func(original, match string) {
|
||||||
|
segments = append(segments, newInitialismNameLexem(original, match))
|
||||||
|
}
|
||||||
|
|
||||||
|
addNameLexem := func(original string) {
|
||||||
|
if s.postSplitInitialismCheck {
|
||||||
|
for _, initialism := range s.initialisms {
|
||||||
|
if upper(initialism) == upper(original) {
|
||||||
|
addInitialismNameLexem(original, initialism)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
addCasualNameLexem(original)
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, rn := range string(str) {
|
||||||
|
if replace, found := nameReplaceTable[rn]; found {
|
||||||
|
if currentSegment != "" {
|
||||||
|
addNameLexem(currentSegment)
|
||||||
|
currentSegment = ""
|
||||||
|
}
|
||||||
|
|
||||||
|
if replace != "" {
|
||||||
|
addNameLexem(replace)
|
||||||
|
}
|
||||||
|
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
if !unicode.In(rn, unicode.L, unicode.M, unicode.N, unicode.Pc) {
|
||||||
|
if currentSegment != "" {
|
||||||
|
addNameLexem(currentSegment)
|
||||||
|
currentSegment = ""
|
||||||
|
}
|
||||||
|
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
if unicode.IsUpper(rn) {
|
||||||
|
if currentSegment != "" {
|
||||||
|
addNameLexem(currentSegment)
|
||||||
|
}
|
||||||
|
currentSegment = ""
|
||||||
|
}
|
||||||
|
|
||||||
|
currentSegment += string(rn)
|
||||||
|
}
|
||||||
|
|
||||||
|
if currentSegment != "" {
|
||||||
|
addNameLexem(currentSegment)
|
||||||
|
}
|
||||||
|
|
||||||
|
return segments
|
||||||
|
}
|
385
vendor/github.com/go-openapi/swag/util.go
generated
vendored
Normal file
385
vendor/github.com/go-openapi/swag/util.go
generated
vendored
Normal file
@ -0,0 +1,385 @@
|
|||||||
|
// Copyright 2015 go-swagger maintainers
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
|
||||||
|
package swag
|
||||||
|
|
||||||
|
import (
|
||||||
|
"reflect"
|
||||||
|
"strings"
|
||||||
|
"unicode"
|
||||||
|
)
|
||||||
|
|
||||||
|
// commonInitialisms are common acronyms that are kept as whole uppercased words.
|
||||||
|
var commonInitialisms *indexOfInitialisms
|
||||||
|
|
||||||
|
// initialisms is a slice of sorted initialisms
|
||||||
|
var initialisms []string
|
||||||
|
|
||||||
|
var isInitialism func(string) bool
|
||||||
|
|
||||||
|
// GoNamePrefixFunc sets an optional rule to prefix go names
|
||||||
|
// which do not start with a letter.
|
||||||
|
//
|
||||||
|
// e.g. to help convert "123" into "{prefix}123"
|
||||||
|
//
|
||||||
|
// The default is to prefix with "X"
|
||||||
|
var GoNamePrefixFunc func(string) string
|
||||||
|
|
||||||
|
func init() {
|
||||||
|
// Taken from https://github.com/golang/lint/blob/3390df4df2787994aea98de825b964ac7944b817/lint.go#L732-L769
|
||||||
|
var configuredInitialisms = map[string]bool{
|
||||||
|
"ACL": true,
|
||||||
|
"API": true,
|
||||||
|
"ASCII": true,
|
||||||
|
"CPU": true,
|
||||||
|
"CSS": true,
|
||||||
|
"DNS": true,
|
||||||
|
"EOF": true,
|
||||||
|
"GUID": true,
|
||||||
|
"HTML": true,
|
||||||
|
"HTTPS": true,
|
||||||
|
"HTTP": true,
|
||||||
|
"ID": true,
|
||||||
|
"IP": true,
|
||||||
|
"IPv4": true,
|
||||||
|
"IPv6": true,
|
||||||
|
"JSON": true,
|
||||||
|
"LHS": true,
|
||||||
|
"OAI": true,
|
||||||
|
"QPS": true,
|
||||||
|
"RAM": true,
|
||||||
|
"RHS": true,
|
||||||
|
"RPC": true,
|
||||||
|
"SLA": true,
|
||||||
|
"SMTP": true,
|
||||||
|
"SQL": true,
|
||||||
|
"SSH": true,
|
||||||
|
"TCP": true,
|
||||||
|
"TLS": true,
|
||||||
|
"TTL": true,
|
||||||
|
"UDP": true,
|
||||||
|
"UI": true,
|
||||||
|
"UID": true,
|
||||||
|
"UUID": true,
|
||||||
|
"URI": true,
|
||||||
|
"URL": true,
|
||||||
|
"UTF8": true,
|
||||||
|
"VM": true,
|
||||||
|
"XML": true,
|
||||||
|
"XMPP": true,
|
||||||
|
"XSRF": true,
|
||||||
|
"XSS": true,
|
||||||
|
}
|
||||||
|
|
||||||
|
// a thread-safe index of initialisms
|
||||||
|
commonInitialisms = newIndexOfInitialisms().load(configuredInitialisms)
|
||||||
|
initialisms = commonInitialisms.sorted()
|
||||||
|
|
||||||
|
// a test function
|
||||||
|
isInitialism = commonInitialisms.isInitialism
|
||||||
|
}
|
||||||
|
|
||||||
|
const (
|
||||||
|
// collectionFormatComma = "csv"
|
||||||
|
collectionFormatSpace = "ssv"
|
||||||
|
collectionFormatTab = "tsv"
|
||||||
|
collectionFormatPipe = "pipes"
|
||||||
|
collectionFormatMulti = "multi"
|
||||||
|
)
|
||||||
|
|
||||||
|
// JoinByFormat joins a string array by a known format (e.g. swagger's collectionFormat attribute):
|
||||||
|
// ssv: space separated value
|
||||||
|
// tsv: tab separated value
|
||||||
|
// pipes: pipe (|) separated value
|
||||||
|
// csv: comma separated value (default)
|
||||||
|
func JoinByFormat(data []string, format string) []string {
|
||||||
|
if len(data) == 0 {
|
||||||
|
return data
|
||||||
|
}
|
||||||
|
var sep string
|
||||||
|
switch format {
|
||||||
|
case collectionFormatSpace:
|
||||||
|
sep = " "
|
||||||
|
case collectionFormatTab:
|
||||||
|
sep = "\t"
|
||||||
|
case collectionFormatPipe:
|
||||||
|
sep = "|"
|
||||||
|
case collectionFormatMulti:
|
||||||
|
return data
|
||||||
|
default:
|
||||||
|
sep = ","
|
||||||
|
}
|
||||||
|
return []string{strings.Join(data, sep)}
|
||||||
|
}
|
||||||
|
|
||||||
|
// SplitByFormat splits a string by a known format:
|
||||||
|
// ssv: space separated value
|
||||||
|
// tsv: tab separated value
|
||||||
|
// pipes: pipe (|) separated value
|
||||||
|
// csv: comma separated value (default)
|
||||||
|
//
|
||||||
|
func SplitByFormat(data, format string) []string {
|
||||||
|
if data == "" {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
var sep string
|
||||||
|
switch format {
|
||||||
|
case collectionFormatSpace:
|
||||||
|
sep = " "
|
||||||
|
case collectionFormatTab:
|
||||||
|
sep = "\t"
|
||||||
|
case collectionFormatPipe:
|
||||||
|
sep = "|"
|
||||||
|
case collectionFormatMulti:
|
||||||
|
return nil
|
||||||
|
default:
|
||||||
|
sep = ","
|
||||||
|
}
|
||||||
|
var result []string
|
||||||
|
for _, s := range strings.Split(data, sep) {
|
||||||
|
if ts := strings.TrimSpace(s); ts != "" {
|
||||||
|
result = append(result, ts)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return result
|
||||||
|
}
|
||||||
|
|
||||||
|
type byInitialism []string
|
||||||
|
|
||||||
|
func (s byInitialism) Len() int {
|
||||||
|
return len(s)
|
||||||
|
}
|
||||||
|
func (s byInitialism) Swap(i, j int) {
|
||||||
|
s[i], s[j] = s[j], s[i]
|
||||||
|
}
|
||||||
|
func (s byInitialism) Less(i, j int) bool {
|
||||||
|
if len(s[i]) != len(s[j]) {
|
||||||
|
return len(s[i]) < len(s[j])
|
||||||
|
}
|
||||||
|
|
||||||
|
return strings.Compare(s[i], s[j]) > 0
|
||||||
|
}
|
||||||
|
|
||||||
|
// Removes leading whitespaces
|
||||||
|
func trim(str string) string {
|
||||||
|
return strings.Trim(str, " ")
|
||||||
|
}
|
||||||
|
|
||||||
|
// Shortcut to strings.ToUpper()
|
||||||
|
func upper(str string) string {
|
||||||
|
return strings.ToUpper(trim(str))
|
||||||
|
}
|
||||||
|
|
||||||
|
// Shortcut to strings.ToLower()
|
||||||
|
func lower(str string) string {
|
||||||
|
return strings.ToLower(trim(str))
|
||||||
|
}
|
||||||
|
|
||||||
|
// Camelize an uppercased word
|
||||||
|
func Camelize(word string) (camelized string) {
|
||||||
|
for pos, ru := range []rune(word) {
|
||||||
|
if pos > 0 {
|
||||||
|
camelized += string(unicode.ToLower(ru))
|
||||||
|
} else {
|
||||||
|
camelized += string(unicode.ToUpper(ru))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// ToFileName lowercases and underscores a go type name
|
||||||
|
func ToFileName(name string) string {
|
||||||
|
in := split(name)
|
||||||
|
out := make([]string, 0, len(in))
|
||||||
|
|
||||||
|
for _, w := range in {
|
||||||
|
out = append(out, lower(w))
|
||||||
|
}
|
||||||
|
|
||||||
|
return strings.Join(out, "_")
|
||||||
|
}
|
||||||
|
|
||||||
|
// ToCommandName lowercases and underscores a go type name
|
||||||
|
func ToCommandName(name string) string {
|
||||||
|
in := split(name)
|
||||||
|
out := make([]string, 0, len(in))
|
||||||
|
|
||||||
|
for _, w := range in {
|
||||||
|
out = append(out, lower(w))
|
||||||
|
}
|
||||||
|
return strings.Join(out, "-")
|
||||||
|
}
|
||||||
|
|
||||||
|
// ToHumanNameLower represents a code name as a human series of words
|
||||||
|
func ToHumanNameLower(name string) string {
|
||||||
|
in := newSplitter(withPostSplitInitialismCheck).split(name)
|
||||||
|
out := make([]string, 0, len(in))
|
||||||
|
|
||||||
|
for _, w := range in {
|
||||||
|
if !w.IsInitialism() {
|
||||||
|
out = append(out, lower(w.GetOriginal()))
|
||||||
|
} else {
|
||||||
|
out = append(out, w.GetOriginal())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return strings.Join(out, " ")
|
||||||
|
}
|
||||||
|
|
||||||
|
// ToHumanNameTitle represents a code name as a human series of words with the first letters titleized
|
||||||
|
func ToHumanNameTitle(name string) string {
|
||||||
|
in := newSplitter(withPostSplitInitialismCheck).split(name)
|
||||||
|
|
||||||
|
out := make([]string, 0, len(in))
|
||||||
|
for _, w := range in {
|
||||||
|
original := w.GetOriginal()
|
||||||
|
if !w.IsInitialism() {
|
||||||
|
out = append(out, Camelize(original))
|
||||||
|
} else {
|
||||||
|
out = append(out, original)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return strings.Join(out, " ")
|
||||||
|
}
|
||||||
|
|
||||||
|
// ToJSONName camelcases a name which can be underscored or pascal cased
|
||||||
|
func ToJSONName(name string) string {
|
||||||
|
in := split(name)
|
||||||
|
out := make([]string, 0, len(in))
|
||||||
|
|
||||||
|
for i, w := range in {
|
||||||
|
if i == 0 {
|
||||||
|
out = append(out, lower(w))
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
out = append(out, Camelize(w))
|
||||||
|
}
|
||||||
|
return strings.Join(out, "")
|
||||||
|
}
|
||||||
|
|
||||||
|
// ToVarName camelcases a name which can be underscored or pascal cased
|
||||||
|
func ToVarName(name string) string {
|
||||||
|
res := ToGoName(name)
|
||||||
|
if isInitialism(res) {
|
||||||
|
return lower(res)
|
||||||
|
}
|
||||||
|
if len(res) <= 1 {
|
||||||
|
return lower(res)
|
||||||
|
}
|
||||||
|
return lower(res[:1]) + res[1:]
|
||||||
|
}
|
||||||
|
|
||||||
|
// ToGoName translates a swagger name which can be underscored or camel cased to a name that golint likes
|
||||||
|
func ToGoName(name string) string {
|
||||||
|
lexems := newSplitter(withPostSplitInitialismCheck).split(name)
|
||||||
|
|
||||||
|
result := ""
|
||||||
|
for _, lexem := range lexems {
|
||||||
|
goName := lexem.GetUnsafeGoName()
|
||||||
|
|
||||||
|
// to support old behavior
|
||||||
|
if lexem.IsInitialism() {
|
||||||
|
goName = upper(goName)
|
||||||
|
}
|
||||||
|
result += goName
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(result) > 0 {
|
||||||
|
// Only prefix with X when the first character isn't an ascii letter
|
||||||
|
first := []rune(result)[0]
|
||||||
|
if !unicode.IsLetter(first) || (first > unicode.MaxASCII && !unicode.IsUpper(first)) {
|
||||||
|
if GoNamePrefixFunc == nil {
|
||||||
|
return "X" + result
|
||||||
|
}
|
||||||
|
result = GoNamePrefixFunc(name) + result
|
||||||
|
}
|
||||||
|
first = []rune(result)[0]
|
||||||
|
if unicode.IsLetter(first) && !unicode.IsUpper(first) {
|
||||||
|
result = string(append([]rune{unicode.ToUpper(first)}, []rune(result)[1:]...))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return result
|
||||||
|
}
|
||||||
|
|
||||||
|
// ContainsStrings searches a slice of strings for a case-sensitive match
|
||||||
|
func ContainsStrings(coll []string, item string) bool {
|
||||||
|
for _, a := range coll {
|
||||||
|
if a == item {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
// ContainsStringsCI searches a slice of strings for a case-insensitive match
|
||||||
|
func ContainsStringsCI(coll []string, item string) bool {
|
||||||
|
for _, a := range coll {
|
||||||
|
if strings.EqualFold(a, item) {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
type zeroable interface {
|
||||||
|
IsZero() bool
|
||||||
|
}
|
||||||
|
|
||||||
|
// IsZero returns true when the value passed into the function is a zero value.
|
||||||
|
// This allows for safer checking of interface values.
|
||||||
|
func IsZero(data interface{}) bool {
|
||||||
|
// check for things that have an IsZero method instead
|
||||||
|
if vv, ok := data.(zeroable); ok {
|
||||||
|
return vv.IsZero()
|
||||||
|
}
|
||||||
|
// continue with slightly more complex reflection
|
||||||
|
v := reflect.ValueOf(data)
|
||||||
|
switch v.Kind() {
|
||||||
|
case reflect.String:
|
||||||
|
return v.Len() == 0
|
||||||
|
case reflect.Bool:
|
||||||
|
return !v.Bool()
|
||||||
|
case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
|
||||||
|
return v.Int() == 0
|
||||||
|
case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr:
|
||||||
|
return v.Uint() == 0
|
||||||
|
case reflect.Float32, reflect.Float64:
|
||||||
|
return v.Float() == 0
|
||||||
|
case reflect.Interface, reflect.Map, reflect.Ptr, reflect.Slice:
|
||||||
|
return v.IsNil()
|
||||||
|
case reflect.Struct, reflect.Array:
|
||||||
|
return reflect.DeepEqual(data, reflect.Zero(v.Type()).Interface())
|
||||||
|
case reflect.Invalid:
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
// AddInitialisms add additional initialisms
|
||||||
|
func AddInitialisms(words ...string) {
|
||||||
|
for _, word := range words {
|
||||||
|
// commonInitialisms[upper(word)] = true
|
||||||
|
commonInitialisms.add(upper(word))
|
||||||
|
}
|
||||||
|
// sort again
|
||||||
|
initialisms = commonInitialisms.sorted()
|
||||||
|
}
|
||||||
|
|
||||||
|
// CommandLineOptionsGroup represents a group of user-defined command line options
|
||||||
|
type CommandLineOptionsGroup struct {
|
||||||
|
ShortDescription string
|
||||||
|
LongDescription string
|
||||||
|
Options interface{}
|
||||||
|
}
|
246
vendor/github.com/go-openapi/swag/yaml.go
generated
vendored
Normal file
246
vendor/github.com/go-openapi/swag/yaml.go
generated
vendored
Normal file
@ -0,0 +1,246 @@
|
|||||||
|
// Copyright 2015 go-swagger maintainers
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
|
||||||
|
package swag
|
||||||
|
|
||||||
|
import (
|
||||||
|
"encoding/json"
|
||||||
|
"fmt"
|
||||||
|
"path/filepath"
|
||||||
|
"strconv"
|
||||||
|
|
||||||
|
"github.com/mailru/easyjson/jlexer"
|
||||||
|
"github.com/mailru/easyjson/jwriter"
|
||||||
|
yaml "gopkg.in/yaml.v2"
|
||||||
|
)
|
||||||
|
|
||||||
|
// YAMLMatcher matches yaml
|
||||||
|
func YAMLMatcher(path string) bool {
|
||||||
|
ext := filepath.Ext(path)
|
||||||
|
return ext == ".yaml" || ext == ".yml"
|
||||||
|
}
|
||||||
|
|
||||||
|
// YAMLToJSON converts YAML unmarshaled data into json compatible data
|
||||||
|
func YAMLToJSON(data interface{}) (json.RawMessage, error) {
|
||||||
|
jm, err := transformData(data)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
b, err := WriteJSON(jm)
|
||||||
|
return json.RawMessage(b), err
|
||||||
|
}
|
||||||
|
|
||||||
|
// BytesToYAMLDoc converts a byte slice into a YAML document
|
||||||
|
func BytesToYAMLDoc(data []byte) (interface{}, error) {
|
||||||
|
var canary map[interface{}]interface{} // validate this is an object and not a different type
|
||||||
|
if err := yaml.Unmarshal(data, &canary); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
var document yaml.MapSlice // preserve order that is present in the document
|
||||||
|
if err := yaml.Unmarshal(data, &document); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return document, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// JSONMapSlice represent a JSON object, with the order of keys maintained
|
||||||
|
type JSONMapSlice []JSONMapItem
|
||||||
|
|
||||||
|
// MarshalJSON renders a JSONMapSlice as JSON
|
||||||
|
func (s JSONMapSlice) MarshalJSON() ([]byte, error) {
|
||||||
|
w := &jwriter.Writer{Flags: jwriter.NilMapAsEmpty | jwriter.NilSliceAsEmpty}
|
||||||
|
s.MarshalEasyJSON(w)
|
||||||
|
return w.BuildBytes()
|
||||||
|
}
|
||||||
|
|
||||||
|
// MarshalEasyJSON renders a JSONMapSlice as JSON, using easyJSON
|
||||||
|
func (s JSONMapSlice) MarshalEasyJSON(w *jwriter.Writer) {
|
||||||
|
w.RawByte('{')
|
||||||
|
|
||||||
|
ln := len(s)
|
||||||
|
last := ln - 1
|
||||||
|
for i := 0; i < ln; i++ {
|
||||||
|
s[i].MarshalEasyJSON(w)
|
||||||
|
if i != last { // last item
|
||||||
|
w.RawByte(',')
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
w.RawByte('}')
|
||||||
|
}
|
||||||
|
|
||||||
|
// UnmarshalJSON makes a JSONMapSlice from JSON
|
||||||
|
func (s *JSONMapSlice) UnmarshalJSON(data []byte) error {
|
||||||
|
l := jlexer.Lexer{Data: data}
|
||||||
|
s.UnmarshalEasyJSON(&l)
|
||||||
|
return l.Error()
|
||||||
|
}
|
||||||
|
|
||||||
|
// UnmarshalEasyJSON makes a JSONMapSlice from JSON, using easyJSON
|
||||||
|
func (s *JSONMapSlice) UnmarshalEasyJSON(in *jlexer.Lexer) {
|
||||||
|
if in.IsNull() {
|
||||||
|
in.Skip()
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
var result JSONMapSlice
|
||||||
|
in.Delim('{')
|
||||||
|
for !in.IsDelim('}') {
|
||||||
|
var mi JSONMapItem
|
||||||
|
mi.UnmarshalEasyJSON(in)
|
||||||
|
result = append(result, mi)
|
||||||
|
}
|
||||||
|
*s = result
|
||||||
|
}
|
||||||
|
|
||||||
|
// JSONMapItem represents the value of a key in a JSON object held by JSONMapSlice
|
||||||
|
type JSONMapItem struct {
|
||||||
|
Key string
|
||||||
|
Value interface{}
|
||||||
|
}
|
||||||
|
|
||||||
|
// MarshalJSON renders a JSONMapItem as JSON
|
||||||
|
func (s JSONMapItem) MarshalJSON() ([]byte, error) {
|
||||||
|
w := &jwriter.Writer{Flags: jwriter.NilMapAsEmpty | jwriter.NilSliceAsEmpty}
|
||||||
|
s.MarshalEasyJSON(w)
|
||||||
|
return w.BuildBytes()
|
||||||
|
}
|
||||||
|
|
||||||
|
// MarshalEasyJSON renders a JSONMapItem as JSON, using easyJSON
|
||||||
|
func (s JSONMapItem) MarshalEasyJSON(w *jwriter.Writer) {
|
||||||
|
w.String(s.Key)
|
||||||
|
w.RawByte(':')
|
||||||
|
w.Raw(WriteJSON(s.Value))
|
||||||
|
}
|
||||||
|
|
||||||
|
// UnmarshalJSON makes a JSONMapItem from JSON
|
||||||
|
func (s *JSONMapItem) UnmarshalJSON(data []byte) error {
|
||||||
|
l := jlexer.Lexer{Data: data}
|
||||||
|
s.UnmarshalEasyJSON(&l)
|
||||||
|
return l.Error()
|
||||||
|
}
|
||||||
|
|
||||||
|
// UnmarshalEasyJSON makes a JSONMapItem from JSON, using easyJSON
|
||||||
|
func (s *JSONMapItem) UnmarshalEasyJSON(in *jlexer.Lexer) {
|
||||||
|
key := in.UnsafeString()
|
||||||
|
in.WantColon()
|
||||||
|
value := in.Interface()
|
||||||
|
in.WantComma()
|
||||||
|
s.Key = key
|
||||||
|
s.Value = value
|
||||||
|
}
|
||||||
|
|
||||||
|
func transformData(input interface{}) (out interface{}, err error) {
|
||||||
|
format := func(t interface{}) (string, error) {
|
||||||
|
switch k := t.(type) {
|
||||||
|
case string:
|
||||||
|
return k, nil
|
||||||
|
case uint:
|
||||||
|
return strconv.FormatUint(uint64(k), 10), nil
|
||||||
|
case uint8:
|
||||||
|
return strconv.FormatUint(uint64(k), 10), nil
|
||||||
|
case uint16:
|
||||||
|
return strconv.FormatUint(uint64(k), 10), nil
|
||||||
|
case uint32:
|
||||||
|
return strconv.FormatUint(uint64(k), 10), nil
|
||||||
|
case uint64:
|
||||||
|
return strconv.FormatUint(k, 10), nil
|
||||||
|
case int:
|
||||||
|
return strconv.Itoa(k), nil
|
||||||
|
case int8:
|
||||||
|
return strconv.FormatInt(int64(k), 10), nil
|
||||||
|
case int16:
|
||||||
|
return strconv.FormatInt(int64(k), 10), nil
|
||||||
|
case int32:
|
||||||
|
return strconv.FormatInt(int64(k), 10), nil
|
||||||
|
case int64:
|
||||||
|
return strconv.FormatInt(k, 10), nil
|
||||||
|
default:
|
||||||
|
return "", fmt.Errorf("unexpected map key type, got: %T", k)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
switch in := input.(type) {
|
||||||
|
case yaml.MapSlice:
|
||||||
|
|
||||||
|
o := make(JSONMapSlice, len(in))
|
||||||
|
for i, mi := range in {
|
||||||
|
var nmi JSONMapItem
|
||||||
|
if nmi.Key, err = format(mi.Key); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
v, ert := transformData(mi.Value)
|
||||||
|
if ert != nil {
|
||||||
|
return nil, ert
|
||||||
|
}
|
||||||
|
nmi.Value = v
|
||||||
|
o[i] = nmi
|
||||||
|
}
|
||||||
|
return o, nil
|
||||||
|
case map[interface{}]interface{}:
|
||||||
|
o := make(JSONMapSlice, 0, len(in))
|
||||||
|
for ke, va := range in {
|
||||||
|
var nmi JSONMapItem
|
||||||
|
if nmi.Key, err = format(ke); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
v, ert := transformData(va)
|
||||||
|
if ert != nil {
|
||||||
|
return nil, ert
|
||||||
|
}
|
||||||
|
nmi.Value = v
|
||||||
|
o = append(o, nmi)
|
||||||
|
}
|
||||||
|
return o, nil
|
||||||
|
case []interface{}:
|
||||||
|
len1 := len(in)
|
||||||
|
o := make([]interface{}, len1)
|
||||||
|
for i := 0; i < len1; i++ {
|
||||||
|
o[i], err = transformData(in[i])
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return o, nil
|
||||||
|
}
|
||||||
|
return input, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// YAMLDoc loads a yaml document from either http or a file and converts it to json
|
||||||
|
func YAMLDoc(path string) (json.RawMessage, error) {
|
||||||
|
yamlDoc, err := YAMLData(path)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
data, err := YAMLToJSON(yamlDoc)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return data, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// YAMLData loads a yaml document from either http or a file
|
||||||
|
func YAMLData(path string) (interface{}, error) {
|
||||||
|
data, err := LoadFromFileOrHTTP(path)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return BytesToYAMLDoc(data)
|
||||||
|
}
|
@ -22,8 +22,9 @@ import (
|
|||||||
|
|
||||||
"github.com/golang/protobuf/proto"
|
"github.com/golang/protobuf/proto"
|
||||||
"github.com/golang/protobuf/ptypes/any"
|
"github.com/golang/protobuf/ptypes/any"
|
||||||
extensions "github.com/googleapis/gnostic/extensions"
|
|
||||||
yaml "gopkg.in/yaml.v3"
|
yaml "gopkg.in/yaml.v3"
|
||||||
|
|
||||||
|
extensions "github.com/google/gnostic/extensions"
|
||||||
)
|
)
|
||||||
|
|
||||||
// ExtensionHandler describes a binary that is called by the compiler to handle specification extensions.
|
// ExtensionHandler describes a binary that is called by the compiler to handle specification extensions.
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user