Merge pull request #3138 from devigned/autorest-update
chore: update azure go-autorest dependencies
This commit is contained in:
commit
677772e08d
509 changed files with 78876 additions and 112493 deletions
12
go.mod
12
go.mod
|
@ -3,8 +3,10 @@ module github.com/distribution/distribution/v3
|
||||||
go 1.15
|
go 1.15
|
||||||
|
|
||||||
require (
|
require (
|
||||||
github.com/Azure/azure-sdk-for-go v16.2.1+incompatible
|
github.com/Azure/azure-sdk-for-go v56.3.0+incompatible
|
||||||
github.com/Azure/go-autorest v10.8.1+incompatible // indirect
|
github.com/Azure/go-autorest/autorest v0.11.20 // indirect
|
||||||
|
github.com/Azure/go-autorest/autorest/adal v0.9.15 // indirect
|
||||||
|
github.com/Azure/go-autorest/autorest/to v0.4.0 // indirect
|
||||||
github.com/Shopify/logrus-bugsnag v0.0.0-20171204204709-577dee27f20d
|
github.com/Shopify/logrus-bugsnag v0.0.0-20171204204709-577dee27f20d
|
||||||
github.com/aws/aws-sdk-go v1.34.9
|
github.com/aws/aws-sdk-go v1.34.9
|
||||||
github.com/bitly/go-simplejson v0.5.0 // indirect
|
github.com/bitly/go-simplejson v0.5.0 // indirect
|
||||||
|
@ -14,30 +16,28 @@ require (
|
||||||
github.com/bugsnag/osext v0.0.0-20130617224835-0dd3f918b21b // indirect
|
github.com/bugsnag/osext v0.0.0-20130617224835-0dd3f918b21b // indirect
|
||||||
github.com/bugsnag/panicwrap v0.0.0-20151223152923-e2c28503fcd0 // indirect
|
github.com/bugsnag/panicwrap v0.0.0-20151223152923-e2c28503fcd0 // indirect
|
||||||
github.com/denverdino/aliyungo v0.0.0-20190125010748-a747050bb1ba
|
github.com/denverdino/aliyungo v0.0.0-20190125010748-a747050bb1ba
|
||||||
github.com/dgrijalva/jwt-go v0.0.0-20170104182250-a601269ab70c // indirect
|
|
||||||
github.com/dnaeon/go-vcr v1.0.1 // indirect
|
github.com/dnaeon/go-vcr v1.0.1 // indirect
|
||||||
github.com/docker/go-events v0.0.0-20190806004212-e31b211e4f1c
|
github.com/docker/go-events v0.0.0-20190806004212-e31b211e4f1c
|
||||||
github.com/docker/go-metrics v0.0.1
|
github.com/docker/go-metrics v0.0.1
|
||||||
github.com/docker/libtrust v0.0.0-20150114040149-fa567046d9b1
|
github.com/docker/libtrust v0.0.0-20150114040149-fa567046d9b1
|
||||||
|
github.com/gofrs/uuid v4.0.0+incompatible // indirect
|
||||||
github.com/gomodule/redigo v1.8.2
|
github.com/gomodule/redigo v1.8.2
|
||||||
github.com/gorilla/handlers v1.5.1
|
github.com/gorilla/handlers v1.5.1
|
||||||
github.com/gorilla/mux v1.8.0
|
github.com/gorilla/mux v1.8.0
|
||||||
github.com/inconshreveable/mousetrap v1.0.0 // indirect
|
github.com/inconshreveable/mousetrap v1.0.0 // indirect
|
||||||
github.com/kr/pretty v0.1.0 // indirect
|
github.com/kr/pretty v0.1.0 // indirect
|
||||||
github.com/marstr/guid v1.1.0 // indirect
|
|
||||||
github.com/mitchellh/mapstructure v1.1.2
|
github.com/mitchellh/mapstructure v1.1.2
|
||||||
github.com/mitchellh/osext v0.0.0-20151018003038-5e2d6d41470f // indirect
|
github.com/mitchellh/osext v0.0.0-20151018003038-5e2d6d41470f // indirect
|
||||||
github.com/ncw/swift v1.0.47
|
github.com/ncw/swift v1.0.47
|
||||||
github.com/opencontainers/go-digest v1.0.0
|
github.com/opencontainers/go-digest v1.0.0
|
||||||
github.com/opencontainers/image-spec v1.0.1
|
github.com/opencontainers/image-spec v1.0.1
|
||||||
github.com/satori/go.uuid v1.2.0 // indirect
|
|
||||||
github.com/sirupsen/logrus v1.8.1
|
github.com/sirupsen/logrus v1.8.1
|
||||||
github.com/spf13/cobra v0.0.3
|
github.com/spf13/cobra v0.0.3
|
||||||
github.com/spf13/pflag v1.0.3 // indirect
|
github.com/spf13/pflag v1.0.3 // indirect
|
||||||
github.com/yvasiyarov/go-metrics v0.0.0-20140926110328-57bccd1ccd43 // indirect
|
github.com/yvasiyarov/go-metrics v0.0.0-20140926110328-57bccd1ccd43 // indirect
|
||||||
github.com/yvasiyarov/gorelic v0.0.0-20141212073537-a9bba5b9ab50
|
github.com/yvasiyarov/gorelic v0.0.0-20141212073537-a9bba5b9ab50
|
||||||
github.com/yvasiyarov/newrelic_platform_go v0.0.0-20140908184405-b21fdbd4370f // indirect
|
github.com/yvasiyarov/newrelic_platform_go v0.0.0-20140908184405-b21fdbd4370f // indirect
|
||||||
golang.org/x/crypto v0.0.0-20200128174031-69ecbb4d6d5d
|
golang.org/x/crypto v0.0.0-20210817164053-32db794688a5
|
||||||
golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45
|
golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45
|
||||||
google.golang.org/api v0.0.0-20160322025152-9bf6e6e569ff
|
google.golang.org/api v0.0.0-20160322025152-9bf6e6e569ff
|
||||||
google.golang.org/cloud v0.0.0-20151119220103-975617b05ea8
|
google.golang.org/cloud v0.0.0-20151119220103-975617b05ea8
|
||||||
|
|
51
go.sum
51
go.sum
|
@ -1,9 +1,24 @@
|
||||||
cloud.google.com/go v0.34.0 h1:eOI3/cP2VTU6uZLDYAoic+eyzzB9YyGmJ7eIjl8rOPg=
|
cloud.google.com/go v0.34.0 h1:eOI3/cP2VTU6uZLDYAoic+eyzzB9YyGmJ7eIjl8rOPg=
|
||||||
cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
|
cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
|
||||||
github.com/Azure/azure-sdk-for-go v16.2.1+incompatible h1:KnPIugL51v3N3WwvaSmZbxukD1WuWXOiE9fRdu32f2I=
|
github.com/Azure/azure-sdk-for-go v56.3.0+incompatible h1:DmhwMrUIvpeoTDiWRDtNHqelNUd3Og8JCkrLHQK795c=
|
||||||
github.com/Azure/azure-sdk-for-go v16.2.1+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc=
|
github.com/Azure/azure-sdk-for-go v56.3.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc=
|
||||||
github.com/Azure/go-autorest v10.8.1+incompatible h1:u0jVQf+a6k6x8A+sT60l6EY9XZu+kHdnZVPAYqpVRo0=
|
github.com/Azure/go-autorest v14.2.0+incompatible h1:V5VMDjClD3GiElqLWO7mz2MxNAK/vTfRHdAubSIPRgs=
|
||||||
github.com/Azure/go-autorest v10.8.1+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.20 h1:s8H1PbCZSqg/DH7JMlOz6YMig6htWLNPsjDdlLqCx3M=
|
||||||
|
github.com/Azure/go-autorest/autorest v0.11.20/go.mod h1:o3tqFY+QR40VOlk+pV4d77mORO64jOXSgEnPQgLK6JY=
|
||||||
|
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.15 h1:X+p2GF0GWyOiSmqohIaEeuNFNDY4I4EOlVuUQvFdWMk=
|
||||||
|
github.com/Azure/go-autorest/autorest/adal v0.9.15/go.mod h1:tGMin8I49Yij6AQ+rvV+Xa/zwxYQB5hmsd6DkfAx2+A=
|
||||||
|
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/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/to v0.4.0 h1:oXVqrxakqqV1UZdSazDOPOLvOIz+XA683u8EctwboHk=
|
||||||
|
github.com/Azure/go-autorest/autorest/to v0.4.0/go.mod h1:fE8iZBn7LQR7zH/9XU2NcPR4o9jEImooCeWJcYV/zLE=
|
||||||
|
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/tracing v0.6.0 h1:TYi4+3m5t6K48TGI9AUdb+IzbnSxvnvUMfuitfgcfuo=
|
||||||
|
github.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBpUA79WCAKPPZVC2DeU=
|
||||||
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/Shopify/logrus-bugsnag v0.0.0-20171204204709-577dee27f20d/go.mod h1:HI8ITrYtUY+O+ZhtlqUnD8+KwNPOyugEhfP9fdUIaEQ=
|
github.com/Shopify/logrus-bugsnag v0.0.0-20171204204709-577dee27f20d/go.mod h1:HI8ITrYtUY+O+ZhtlqUnD8+KwNPOyugEhfP9fdUIaEQ=
|
||||||
github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
|
github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
|
||||||
|
@ -31,8 +46,6 @@ 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/denverdino/aliyungo v0.0.0-20190125010748-a747050bb1ba h1:p6poVbjHDkKa+wtC8frBMwQtT3BmqGYBjzMwJ63tuR4=
|
github.com/denverdino/aliyungo v0.0.0-20190125010748-a747050bb1ba h1:p6poVbjHDkKa+wtC8frBMwQtT3BmqGYBjzMwJ63tuR4=
|
||||||
github.com/denverdino/aliyungo v0.0.0-20190125010748-a747050bb1ba/go.mod h1:dV8lFg6daOBZbT6/BDGIz6Y3WFGn8juu6G+CQ6LHtl0=
|
github.com/denverdino/aliyungo v0.0.0-20190125010748-a747050bb1ba/go.mod h1:dV8lFg6daOBZbT6/BDGIz6Y3WFGn8juu6G+CQ6LHtl0=
|
||||||
github.com/dgrijalva/jwt-go v0.0.0-20170104182250-a601269ab70c h1:KJAnOBuY9cTKVqB5cfbynpvFgeHRTREkRk8C977oFu4=
|
|
||||||
github.com/dgrijalva/jwt-go v0.0.0-20170104182250-a601269ab70c/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ=
|
|
||||||
github.com/dnaeon/go-vcr v1.0.1 h1:r8L/HqC0Hje5AXMu1ooW8oyQyOFv4GxqpL0nRP7SLLY=
|
github.com/dnaeon/go-vcr v1.0.1 h1:r8L/HqC0Hje5AXMu1ooW8oyQyOFv4GxqpL0nRP7SLLY=
|
||||||
github.com/dnaeon/go-vcr v1.0.1/go.mod h1:aBB1+wY4s93YsC3HHjMBMrwTj2R9FHDzUr9KyGc8n1E=
|
github.com/dnaeon/go-vcr v1.0.1/go.mod h1:aBB1+wY4s93YsC3HHjMBMrwTj2R9FHDzUr9KyGc8n1E=
|
||||||
github.com/docker/go-events v0.0.0-20190806004212-e31b211e4f1c h1:+pKlWGMw7gf6bQ+oDZB4KHQFypsfjYlq/C4rfL7D3g8=
|
github.com/docker/go-events v0.0.0-20190806004212-e31b211e4f1c h1:+pKlWGMw7gf6bQ+oDZB4KHQFypsfjYlq/C4rfL7D3g8=
|
||||||
|
@ -43,12 +56,17 @@ github.com/docker/libtrust v0.0.0-20150114040149-fa567046d9b1 h1:ZClxb8laGDf5arX
|
||||||
github.com/docker/libtrust v0.0.0-20150114040149-fa567046d9b1/go.mod h1:cyGadeNEkKy96OOhEzfZl+yxihPEzKnqJwvfuSUqbZE=
|
github.com/docker/libtrust v0.0.0-20150114040149-fa567046d9b1/go.mod h1:cyGadeNEkKy96OOhEzfZl+yxihPEzKnqJwvfuSUqbZE=
|
||||||
github.com/felixge/httpsnoop v1.0.1 h1:lvB5Jl89CsZtGIWuTcDM1E/vkVs49/Ml7JJe07l8SPQ=
|
github.com/felixge/httpsnoop v1.0.1 h1:lvB5Jl89CsZtGIWuTcDM1E/vkVs49/Ml7JJe07l8SPQ=
|
||||||
github.com/felixge/httpsnoop v1.0.1/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U=
|
github.com/felixge/httpsnoop v1.0.1/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U=
|
||||||
|
github.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k=
|
||||||
github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
|
github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
|
||||||
github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE=
|
github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE=
|
||||||
github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk=
|
github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk=
|
||||||
github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg=
|
github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg=
|
||||||
github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
|
github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
|
||||||
|
github.com/gofrs/uuid v4.0.0+incompatible h1:1SD/1F5pU8p29ybwgQSwpQk+mwdRrXCYuPhW6m+TnJw=
|
||||||
|
github.com/gofrs/uuid v4.0.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM=
|
||||||
github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
|
github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
|
||||||
|
github.com/golang-jwt/jwt/v4 v4.0.0 h1:RAqyYixv1p7uEnocuy8P1nru5wprCh/MH2BIlW5z5/o=
|
||||||
|
github.com/golang-jwt/jwt/v4 v4.0.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg=
|
||||||
github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
|
github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
|
||||||
github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
|
github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
|
||||||
github.com/golang/protobuf v1.3.2 h1:6nsPYzhq5kReh6QImI3k5qWzO4PEbvbIW2cwSfR/6xs=
|
github.com/golang/protobuf v1.3.2 h1:6nsPYzhq5kReh6QImI3k5qWzO4PEbvbIW2cwSfR/6xs=
|
||||||
|
@ -75,8 +93,6 @@ github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORN
|
||||||
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
|
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
|
||||||
github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE=
|
github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE=
|
||||||
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
|
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
|
||||||
github.com/marstr/guid v1.1.0 h1:/M4H/1G4avsieL6BbUwCOBzulmoeKVP5ux/3mQNnbyI=
|
|
||||||
github.com/marstr/guid v1.1.0/go.mod h1:74gB1z2wpxxInTG6yaqA7KrtM0NZ+RbrcqDvYHefzho=
|
|
||||||
github.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU=
|
github.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU=
|
||||||
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/mitchellh/mapstructure v1.1.2 h1:fmNYVwqnSfB9mZU6OS2O6GsXM+wcskZDuKQzvN1EDeE=
|
github.com/mitchellh/mapstructure v1.1.2 h1:fmNYVwqnSfB9mZU6OS2O6GsXM+wcskZDuKQzvN1EDeE=
|
||||||
|
@ -112,8 +128,6 @@ github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R
|
||||||
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 h1:CTwfnzjQ+8dS6MhHHu4YswVAD99sL2wjPqP+VkURmKE=
|
github.com/prometheus/procfs v0.0.3 h1:CTwfnzjQ+8dS6MhHHu4YswVAD99sL2wjPqP+VkURmKE=
|
||||||
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/satori/go.uuid v1.2.0 h1:0uYX9dsZ2yD7q2RtLRtPSdGDWzjeM3TbMJP9utgA0ww=
|
|
||||||
github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0=
|
|
||||||
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.8.1 h1:dJKuHgqk1NNQlqoA6BTlM1Wf9DOH3NBjQyu0h9+AZZE=
|
github.com/sirupsen/logrus v1.8.1 h1:dJKuHgqk1NNQlqoA6BTlM1Wf9DOH3NBjQyu0h9+AZZE=
|
||||||
github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0=
|
github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0=
|
||||||
|
@ -135,15 +149,17 @@ github.com/yvasiyarov/newrelic_platform_go v0.0.0-20140908184405-b21fdbd4370f h1
|
||||||
github.com/yvasiyarov/newrelic_platform_go v0.0.0-20140908184405-b21fdbd4370f/go.mod h1:GlGEuHIJweS1mbCqG+7vt2nvWLzLLnRHbXz5JKd/Qbg=
|
github.com/yvasiyarov/newrelic_platform_go v0.0.0-20140908184405-b21fdbd4370f/go.mod h1:GlGEuHIJweS1mbCqG+7vt2nvWLzLLnRHbXz5JKd/Qbg=
|
||||||
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-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-20200128174031-69ecbb4d6d5d h1:9FCpayM9Egr1baVnV1SX0H87m+XB0B8S0hAMi99X/3U=
|
golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
|
||||||
golang.org/x/crypto v0.0.0-20200128174031-69ecbb4d6d5d/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
|
golang.org/x/crypto v0.0.0-20210817164053-32db794688a5 h1:HWj/xjIHfjYU5nVXpTM0s39J9CbLn7Cc5a7IC5rwsMQ=
|
||||||
|
golang.org/x/crypto v0.0.0-20210817164053-32db794688a5/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
|
||||||
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-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-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-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
||||||
golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||||
golang.org/x/net v0.0.0-20200202094626-16171245cfb2 h1:CCH4IOTTfewWjGOlSp+zGcjutRKlBEZQ6wTn8ozI/nI=
|
|
||||||
golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||||
|
golang.org/x/net v0.0.0-20210226172049-e18ecbb05110 h1:qWPm9rbaAMKs8Bq/9LRpbMqxWRVUAQwMI9fVrssnTfw=
|
||||||
|
golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
|
||||||
golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45 h1:SVwTIAaPC2U/AvvLNZ2a7OVsmBpC8L5BlwK1whH3hm0=
|
golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45 h1:SVwTIAaPC2U/AvvLNZ2a7OVsmBpC8L5BlwK1whH3hm0=
|
||||||
golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
|
golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
|
||||||
golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
|
@ -153,10 +169,15 @@ golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5h
|
||||||
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-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20190412213103-97732733099d/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-20191026070338-33540a1f6037 h1:YyJpGZS1sBuBCzLAR1VEpK193GlqGZbnPFnPV/5Rsb4=
|
|
||||||
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/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg=
|
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1 h1:SrN+KX8Art/Sf4HNj6Zcz06G7VEz+7w9tdXTPOZ7+l4=
|
||||||
|
golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
|
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
|
||||||
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
||||||
|
golang.org/x/text v0.3.3 h1:cokOdA+Jmi5PJGXLlLllQSgYigAEfHXJAERHVMaCc2k=
|
||||||
|
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
||||||
|
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
||||||
google.golang.org/api v0.0.0-20160322025152-9bf6e6e569ff h1:mk5zS3XLqVUzdF/CQCZ5ERujSF/8JFo+Wpkp/5I93NA=
|
google.golang.org/api v0.0.0-20160322025152-9bf6e6e569ff h1:mk5zS3XLqVUzdF/CQCZ5ERujSF/8JFo+Wpkp/5I93NA=
|
||||||
google.golang.org/api v0.0.0-20160322025152-9bf6e6e569ff/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0=
|
google.golang.org/api v0.0.0-20160322025152-9bf6e6e569ff/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0=
|
||||||
google.golang.org/appengine v1.4.0 h1:/wp5JvzpHIxhs/dumFmF7BXTf3Z+dd4uXta4kVyO508=
|
google.golang.org/appengine v1.4.0 h1:/wp5JvzpHIxhs/dumFmF7BXTf3Z+dd4uXta4kVyO508=
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
MIT License
|
The MIT License (MIT)
|
||||||
|
|
||||||
Copyright (c) 2016 Martin Strobel
|
Copyright (c) 2021 Microsoft
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
of this software and associated documentation files (the "Software"), to deal
|
5
vendor/github.com/Azure/azure-sdk-for-go/NOTICE
generated
vendored
5
vendor/github.com/Azure/azure-sdk-for-go/NOTICE
generated
vendored
|
@ -1,5 +0,0 @@
|
||||||
Microsoft Azure-SDK-for-Go
|
|
||||||
Copyright 2014-2017 Microsoft
|
|
||||||
|
|
||||||
This product includes software developed at
|
|
||||||
the Microsoft Corporation (https://www.microsoft.com).
|
|
29
vendor/github.com/Azure/azure-sdk-for-go/NOTICE.txt
generated
vendored
Normal file
29
vendor/github.com/Azure/azure-sdk-for-go/NOTICE.txt
generated
vendored
Normal file
|
@ -0,0 +1,29 @@
|
||||||
|
NOTICES AND INFORMATION
|
||||||
|
Do Not Translate or Localize
|
||||||
|
|
||||||
|
This software incorporates material from third parties. Microsoft makes certain
|
||||||
|
open source code available at https://3rdpartysource.microsoft.com, or you may
|
||||||
|
send a check or money order for US $5.00, including the product name, the open
|
||||||
|
source component name, and version number, to:
|
||||||
|
|
||||||
|
Source Code Compliance Team
|
||||||
|
Microsoft Corporation
|
||||||
|
One Microsoft Way
|
||||||
|
Redmond, WA 98052
|
||||||
|
USA
|
||||||
|
|
||||||
|
Notwithstanding any other terms, you may reverse engineer this software to the
|
||||||
|
extent required to debug changes to any libraries licensed under the GNU Lesser
|
||||||
|
General Public License.
|
||||||
|
|
||||||
|
------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
Azure SDK for Go uses third-party libraries or other resources that may be
|
||||||
|
distributed under licenses different than the Azure SDK for Go software.
|
||||||
|
|
||||||
|
In the event that we accidentally failed to list a required notice, please
|
||||||
|
bring it to our attention. Post an issue or email us:
|
||||||
|
|
||||||
|
azgosdkhelp@microsoft.com
|
||||||
|
|
||||||
|
The attached notices are provided for information only.
|
14
vendor/github.com/Azure/azure-sdk-for-go/storage/README.md
generated
vendored
14
vendor/github.com/Azure/azure-sdk-for-go/storage/README.md
generated
vendored
|
@ -1,16 +1,20 @@
|
||||||
# Azure Storage SDK for Go (Preview)
|
# Azure Storage SDK for Go (Preview)
|
||||||
|
|
||||||
:exclamation: IMPORTANT: This package is in maintenance only and will be deprecated in the
|
:exclamation: IMPORTANT: This package is in maintenance only and will be deprecated in the
|
||||||
future. Consider using the new package for blobs currently in preview at
|
future. Please use one of the following packages instead.
|
||||||
[github.com/Azure/azure-storage-blob-go](https://github.com/Azure/azure-storage-blob-go).
|
|
||||||
New Table, Queue and File packages are also in development.
|
| Service | Import Path/Repo |
|
||||||
|
|---------|------------------|
|
||||||
|
| Storage - Blobs | [github.com/Azure/azure-storage-blob-go](https://github.com/Azure/azure-storage-blob-go) |
|
||||||
|
| Storage - Files | [github.com/Azure/azure-storage-file-go](https://github.com/Azure/azure-storage-file-go) |
|
||||||
|
| Storage - Queues | [github.com/Azure/azure-storage-queue-go](https://github.com/Azure/azure-storage-queue-go) |
|
||||||
|
|
||||||
The `github.com/Azure/azure-sdk-for-go/storage` package is used to manage
|
The `github.com/Azure/azure-sdk-for-go/storage` package is used to manage
|
||||||
[Azure Storage](https://docs.microsoft.com/en-us/azure/storage/) data plane
|
[Azure Storage](https://docs.microsoft.com/azure/storage/) data plane
|
||||||
resources: containers, blobs, tables, and queues.
|
resources: containers, blobs, tables, and queues.
|
||||||
|
|
||||||
To manage storage *accounts* use Azure Resource Manager (ARM) via the packages
|
To manage storage *accounts* use Azure Resource Manager (ARM) via the packages
|
||||||
at [github.com/Azure/azure-sdk-for-go/services/storage](https://github.com/Azure/azure-sdk-for-go/tree/master/services/storage).
|
at [github.com/Azure/azure-sdk-for-go/services/storage](https://github.com/Azure/azure-sdk-for-go/tree/main/services/storage).
|
||||||
|
|
||||||
This package also supports the [Azure Storage
|
This package also supports the [Azure Storage
|
||||||
Emulator](https://azure.microsoft.com/documentation/articles/storage-use-emulator/)
|
Emulator](https://azure.microsoft.com/documentation/articles/storage-use-emulator/)
|
||||||
|
|
16
vendor/github.com/Azure/azure-sdk-for-go/storage/appendblob.go
generated
vendored
16
vendor/github.com/Azure/azure-sdk-for-go/storage/appendblob.go
generated
vendored
|
@ -1,18 +1,7 @@
|
||||||
package storage
|
package storage
|
||||||
|
|
||||||
// Copyright 2017 Microsoft Corporation
|
// Copyright (c) Microsoft Corporation. All rights reserved.
|
||||||
//
|
// Licensed under the MIT License. See License.txt in the project root for license information.
|
||||||
// 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.
|
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
|
@ -70,7 +59,6 @@ type AppendBlockOptions struct {
|
||||||
func (b *Blob) AppendBlock(chunk []byte, options *AppendBlockOptions) error {
|
func (b *Blob) AppendBlock(chunk []byte, options *AppendBlockOptions) error {
|
||||||
params := url.Values{"comp": {"appendblock"}}
|
params := url.Values{"comp": {"appendblock"}}
|
||||||
headers := b.Container.bsc.client.getStandardHeaders()
|
headers := b.Container.bsc.client.getStandardHeaders()
|
||||||
headers["x-ms-blob-type"] = string(BlobTypeAppend)
|
|
||||||
headers["Content-Length"] = fmt.Sprintf("%v", len(chunk))
|
headers["Content-Length"] = fmt.Sprintf("%v", len(chunk))
|
||||||
|
|
||||||
if options != nil {
|
if options != nil {
|
||||||
|
|
15
vendor/github.com/Azure/azure-sdk-for-go/storage/authorization.go
generated
vendored
15
vendor/github.com/Azure/azure-sdk-for-go/storage/authorization.go
generated
vendored
|
@ -1,19 +1,8 @@
|
||||||
// Package storage provides clients for Microsoft Azure Storage Services.
|
// Package storage provides clients for Microsoft Azure Storage Services.
|
||||||
package storage
|
package storage
|
||||||
|
|
||||||
// Copyright 2017 Microsoft Corporation
|
// Copyright (c) Microsoft Corporation. All rights reserved.
|
||||||
//
|
// Licensed under the MIT License. See License.txt in the project root for license information.
|
||||||
// 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.
|
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
|
|
17
vendor/github.com/Azure/azure-sdk-for-go/storage/blob.go
generated
vendored
17
vendor/github.com/Azure/azure-sdk-for-go/storage/blob.go
generated
vendored
|
@ -1,18 +1,7 @@
|
||||||
package storage
|
package storage
|
||||||
|
|
||||||
// Copyright 2017 Microsoft Corporation
|
// Copyright (c) Microsoft Corporation. All rights reserved.
|
||||||
//
|
// Licensed under the MIT License. See License.txt in the project root for license information.
|
||||||
// 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.
|
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"encoding/xml"
|
"encoding/xml"
|
||||||
|
@ -566,7 +555,7 @@ type DeleteBlobOptions struct {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Delete deletes the given blob from the specified container.
|
// Delete deletes the given blob from the specified container.
|
||||||
// If the blob does not exists at the time of the Delete Blob operation, it
|
// If the blob does not exist at the time of the Delete Blob operation, it
|
||||||
// returns error.
|
// returns error.
|
||||||
// See https://docs.microsoft.com/en-us/rest/api/storageservices/fileservices/Delete-Blob
|
// See https://docs.microsoft.com/en-us/rest/api/storageservices/fileservices/Delete-Blob
|
||||||
func (b *Blob) Delete(options *DeleteBlobOptions) error {
|
func (b *Blob) Delete(options *DeleteBlobOptions) error {
|
||||||
|
|
24
vendor/github.com/Azure/azure-sdk-for-go/storage/blobsasuri.go
generated
vendored
24
vendor/github.com/Azure/azure-sdk-for-go/storage/blobsasuri.go
generated
vendored
|
@ -1,18 +1,7 @@
|
||||||
package storage
|
package storage
|
||||||
|
|
||||||
// Copyright 2017 Microsoft Corporation
|
// Copyright (c) Microsoft Corporation. All rights reserved.
|
||||||
//
|
// Licensed under the MIT License. See License.txt in the project root for license information.
|
||||||
// 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.
|
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"errors"
|
"errors"
|
||||||
|
@ -107,7 +96,7 @@ func (c *Client) blobAndFileSASURI(options SASOptions, uri, permissions, canonic
|
||||||
if options.UseHTTPS {
|
if options.UseHTTPS {
|
||||||
protocols = "https"
|
protocols = "https"
|
||||||
}
|
}
|
||||||
stringToSign, err := blobSASStringToSign(permissions, start, expiry, canonicalizedResource, options.Identifier, options.IP, protocols, c.apiVersion, headers)
|
stringToSign, err := blobSASStringToSign(permissions, start, expiry, canonicalizedResource, options.Identifier, options.IP, protocols, c.apiVersion, signedResource, "", headers)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return "", err
|
return "", err
|
||||||
}
|
}
|
||||||
|
@ -149,7 +138,7 @@ func (c *Client) blobAndFileSASURI(options SASOptions, uri, permissions, canonic
|
||||||
return sasURL.String(), nil
|
return sasURL.String(), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func blobSASStringToSign(signedPermissions, signedStart, signedExpiry, canonicalizedResource, signedIdentifier, signedIP, protocols, signedVersion string, headers OverrideHeaders) (string, error) {
|
func blobSASStringToSign(signedPermissions, signedStart, signedExpiry, canonicalizedResource, signedIdentifier, signedIP, protocols, signedVersion, signedResource, signedSnapshotTime string, headers OverrideHeaders) (string, error) {
|
||||||
rscc := headers.CacheControl
|
rscc := headers.CacheControl
|
||||||
rscd := headers.ContentDisposition
|
rscd := headers.ContentDisposition
|
||||||
rsce := headers.ContentEncoding
|
rsce := headers.ContentEncoding
|
||||||
|
@ -160,6 +149,11 @@ func blobSASStringToSign(signedPermissions, signedStart, signedExpiry, canonical
|
||||||
canonicalizedResource = "/blob" + canonicalizedResource
|
canonicalizedResource = "/blob" + canonicalizedResource
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// https://docs.microsoft.com/en-us/rest/api/storageservices/constructing-a-service-sas
|
||||||
|
if signedVersion >= "2018-11-09" {
|
||||||
|
return fmt.Sprintf("%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s", signedPermissions, signedStart, signedExpiry, canonicalizedResource, signedIdentifier, signedIP, protocols, signedVersion, signedResource, signedSnapshotTime, rscc, rscd, rsce, rscl, rsct), nil
|
||||||
|
}
|
||||||
|
|
||||||
// https://msdn.microsoft.com/en-us/library/azure/dn140255.aspx#Anchor_12
|
// https://msdn.microsoft.com/en-us/library/azure/dn140255.aspx#Anchor_12
|
||||||
if signedVersion >= "2015-04-05" {
|
if signedVersion >= "2015-04-05" {
|
||||||
return fmt.Sprintf("%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s", signedPermissions, signedStart, signedExpiry, canonicalizedResource, signedIdentifier, signedIP, protocols, signedVersion, rscc, rscd, rsce, rscl, rsct), nil
|
return fmt.Sprintf("%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s", signedPermissions, signedStart, signedExpiry, canonicalizedResource, signedIdentifier, signedIP, protocols, signedVersion, rscc, rscd, rsce, rscl, rsct), nil
|
||||||
|
|
21
vendor/github.com/Azure/azure-sdk-for-go/storage/blobserviceclient.go
generated
vendored
21
vendor/github.com/Azure/azure-sdk-for-go/storage/blobserviceclient.go
generated
vendored
|
@ -1,18 +1,7 @@
|
||||||
package storage
|
package storage
|
||||||
|
|
||||||
// Copyright 2017 Microsoft Corporation
|
// Copyright (c) Microsoft Corporation. All rights reserved.
|
||||||
//
|
// Licensed under the MIT License. See License.txt in the project root for license information.
|
||||||
// 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.
|
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"encoding/xml"
|
"encoding/xml"
|
||||||
|
@ -69,7 +58,11 @@ func GetContainerReferenceFromSASURI(sasuri url.URL) (*Container, error) {
|
||||||
if len(path) <= 1 {
|
if len(path) <= 1 {
|
||||||
return nil, fmt.Errorf("could not find a container in URI: %s", sasuri.String())
|
return nil, fmt.Errorf("could not find a container in URI: %s", sasuri.String())
|
||||||
}
|
}
|
||||||
cli := newSASClient().GetBlobService()
|
c, err := newSASClientFromURL(&sasuri)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
cli := c.GetBlobService()
|
||||||
return &Container{
|
return &Container{
|
||||||
bsc: &cli,
|
bsc: &cli,
|
||||||
Name: path[1],
|
Name: path[1],
|
||||||
|
|
56
vendor/github.com/Azure/azure-sdk-for-go/storage/blockblob.go
generated
vendored
56
vendor/github.com/Azure/azure-sdk-for-go/storage/blockblob.go
generated
vendored
|
@ -1,18 +1,7 @@
|
||||||
package storage
|
package storage
|
||||||
|
|
||||||
// Copyright 2017 Microsoft Corporation
|
// Copyright (c) Microsoft Corporation. All rights reserved.
|
||||||
//
|
// Licensed under the MIT License. See License.txt in the project root for license information.
|
||||||
// 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.
|
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
|
@ -197,6 +186,47 @@ func (b *Blob) PutBlockWithLength(blockID string, size uint64, blob io.Reader, o
|
||||||
return b.respondCreation(resp, BlobTypeBlock)
|
return b.respondCreation(resp, BlobTypeBlock)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// PutBlockFromURLOptions includes the options for a put block from URL operation
|
||||||
|
type PutBlockFromURLOptions struct {
|
||||||
|
PutBlockOptions
|
||||||
|
|
||||||
|
SourceContentMD5 string `header:"x-ms-source-content-md5"`
|
||||||
|
SourceContentCRC64 string `header:"x-ms-source-content-crc64"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// PutBlockFromURL copy data of exactly specified size from specified URL to
|
||||||
|
// the block blob with given ID. It is an alternative to PutBlocks where data
|
||||||
|
// comes from a remote URL and the offset and length is known in advance.
|
||||||
|
//
|
||||||
|
// The API rejects requests with size > 100 MiB (but this limit is not
|
||||||
|
// checked by the SDK).
|
||||||
|
//
|
||||||
|
// See https://docs.microsoft.com/en-us/rest/api/storageservices/put-block-from-url
|
||||||
|
func (b *Blob) PutBlockFromURL(blockID string, blobURL string, offset int64, size uint64, options *PutBlockFromURLOptions) error {
|
||||||
|
query := url.Values{
|
||||||
|
"comp": {"block"},
|
||||||
|
"blockid": {blockID},
|
||||||
|
}
|
||||||
|
headers := b.Container.bsc.client.getStandardHeaders()
|
||||||
|
// The value of this header must be set to zero.
|
||||||
|
// When the length is not zero, the operation will fail with the status code 400 (Bad Request).
|
||||||
|
headers["Content-Length"] = "0"
|
||||||
|
headers["x-ms-copy-source"] = blobURL
|
||||||
|
headers["x-ms-source-range"] = fmt.Sprintf("bytes=%d-%d", offset, uint64(offset)+size-1)
|
||||||
|
|
||||||
|
if options != nil {
|
||||||
|
query = addTimeout(query, options.Timeout)
|
||||||
|
headers = mergeHeaders(headers, headersFromStruct(*options))
|
||||||
|
}
|
||||||
|
uri := b.Container.bsc.client.getEndpoint(blobServiceName, b.buildPath(), query)
|
||||||
|
|
||||||
|
resp, err := b.Container.bsc.client.exec(http.MethodPut, uri, headers, nil, b.Container.bsc.auth)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
return b.respondCreation(resp, BlobTypeBlock)
|
||||||
|
}
|
||||||
|
|
||||||
// PutBlockListOptions includes the options for a put block list operation
|
// PutBlockListOptions includes the options for a put block list operation
|
||||||
type PutBlockListOptions struct {
|
type PutBlockListOptions struct {
|
||||||
Timeout uint
|
Timeout uint
|
||||||
|
|
184
vendor/github.com/Azure/azure-sdk-for-go/storage/client.go
generated
vendored
184
vendor/github.com/Azure/azure-sdk-for-go/storage/client.go
generated
vendored
|
@ -1,19 +1,8 @@
|
||||||
// Package storage provides clients for Microsoft Azure Storage Services.
|
// Package storage provides clients for Microsoft Azure Storage Services.
|
||||||
package storage
|
package storage
|
||||||
|
|
||||||
// Copyright 2017 Microsoft Corporation
|
// Copyright (c) Microsoft Corporation. All rights reserved.
|
||||||
//
|
// Licensed under the MIT License. See License.txt in the project root for license information.
|
||||||
// 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.
|
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"bufio"
|
"bufio"
|
||||||
|
@ -46,7 +35,7 @@ const (
|
||||||
|
|
||||||
// DefaultAPIVersion is the Azure Storage API version string used when a
|
// DefaultAPIVersion is the Azure Storage API version string used when a
|
||||||
// basic client is created.
|
// basic client is created.
|
||||||
DefaultAPIVersion = "2016-05-31"
|
DefaultAPIVersion = "2018-03-28"
|
||||||
|
|
||||||
defaultUseHTTPS = true
|
defaultUseHTTPS = true
|
||||||
defaultRetryAttempts = 5
|
defaultRetryAttempts = 5
|
||||||
|
@ -85,6 +74,7 @@ const (
|
||||||
|
|
||||||
var (
|
var (
|
||||||
validStorageAccount = regexp.MustCompile("^[0-9a-z]{3,24}$")
|
validStorageAccount = regexp.MustCompile("^[0-9a-z]{3,24}$")
|
||||||
|
validCosmosAccount = regexp.MustCompile("^[0-9a-z-]{3,44}$")
|
||||||
defaultValidStatusCodes = []int{
|
defaultValidStatusCodes = []int{
|
||||||
http.StatusRequestTimeout, // 408
|
http.StatusRequestTimeout, // 408
|
||||||
http.StatusInternalServerError, // 500
|
http.StatusInternalServerError, // 500
|
||||||
|
@ -117,7 +107,7 @@ func (ds *DefaultSender) Send(c *Client, req *http.Request) (resp *http.Response
|
||||||
return resp, err
|
return resp, err
|
||||||
}
|
}
|
||||||
resp, err = c.HTTPClient.Do(rr.Request())
|
resp, err = c.HTTPClient.Do(rr.Request())
|
||||||
if err != nil || !autorest.ResponseHasStatusCode(resp, ds.ValidStatusCodes...) {
|
if err == nil && !autorest.ResponseHasStatusCode(resp, ds.ValidStatusCodes...) {
|
||||||
return resp, err
|
return resp, err
|
||||||
}
|
}
|
||||||
drainRespBody(resp)
|
drainRespBody(resp)
|
||||||
|
@ -150,6 +140,7 @@ type Client struct {
|
||||||
userAgent string
|
userAgent string
|
||||||
sasClient bool
|
sasClient bool
|
||||||
accountSASToken url.Values
|
accountSASToken url.Values
|
||||||
|
additionalHeaders map[string]string
|
||||||
}
|
}
|
||||||
|
|
||||||
type odataResponse struct {
|
type odataResponse struct {
|
||||||
|
@ -174,6 +165,23 @@ type AzureStorageServiceError struct {
|
||||||
APIVersion string
|
APIVersion string
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// AzureTablesServiceError contains fields of the error response from
|
||||||
|
// Azure Table Storage Service REST API in Atom format.
|
||||||
|
// See https://msdn.microsoft.com/en-us/library/azure/dd179382.aspx
|
||||||
|
type AzureTablesServiceError struct {
|
||||||
|
Code string `xml:"code"`
|
||||||
|
Message string `xml:"message"`
|
||||||
|
StatusCode int
|
||||||
|
RequestID string
|
||||||
|
Date string
|
||||||
|
APIVersion string
|
||||||
|
}
|
||||||
|
|
||||||
|
func (e AzureTablesServiceError) Error() string {
|
||||||
|
return fmt.Sprintf("storage: service returned error: StatusCode=%d, ErrorCode=%s, ErrorMessage=%s, RequestInitiated=%s, RequestId=%s, API Version=%s",
|
||||||
|
e.StatusCode, e.Code, e.Message, e.Date, e.RequestID, e.APIVersion)
|
||||||
|
}
|
||||||
|
|
||||||
type odataErrorMessage struct {
|
type odataErrorMessage struct {
|
||||||
Lang string `json:"lang"`
|
Lang string `json:"lang"`
|
||||||
Value string `json:"value"`
|
Value string `json:"value"`
|
||||||
|
@ -308,10 +316,36 @@ func NewClient(accountName, accountKey, serviceBaseURL, apiVersion string, useHT
|
||||||
return c, fmt.Errorf("azure: malformed storage account key: %v", err)
|
return c, fmt.Errorf("azure: malformed storage account key: %v", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
c = Client{
|
return newClient(accountName, key, serviceBaseURL, apiVersion, useHTTPS)
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewCosmosClient constructs a Client for Azure CosmosDB. This should be used if the caller wants
|
||||||
|
// to specify whether to use HTTPS, a specific REST API version or a custom
|
||||||
|
// cosmos endpoint than Azure Public Cloud.
|
||||||
|
func NewCosmosClient(accountName, accountKey, serviceBaseURL, apiVersion string, useHTTPS bool) (Client, error) {
|
||||||
|
var c Client
|
||||||
|
if !IsValidCosmosAccount(accountName) {
|
||||||
|
return c, fmt.Errorf("azure: account name is not valid: The name can contain only lowercase letters, numbers and the '-' character, and must be between 3 and 44 characters: %v", accountName)
|
||||||
|
} else if accountKey == "" {
|
||||||
|
return c, fmt.Errorf("azure: account key required")
|
||||||
|
} else if serviceBaseURL == "" {
|
||||||
|
return c, fmt.Errorf("azure: base storage service url required")
|
||||||
|
}
|
||||||
|
|
||||||
|
key, err := base64.StdEncoding.DecodeString(accountKey)
|
||||||
|
if err != nil {
|
||||||
|
return c, fmt.Errorf("azure: malformed cosmos account key: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
return newClient(accountName, key, serviceBaseURL, apiVersion, useHTTPS)
|
||||||
|
}
|
||||||
|
|
||||||
|
// newClient constructs a Client with given parameters.
|
||||||
|
func newClient(accountName string, accountKey []byte, serviceBaseURL, apiVersion string, useHTTPS bool) (Client, error) {
|
||||||
|
c := Client{
|
||||||
HTTPClient: http.DefaultClient,
|
HTTPClient: http.DefaultClient,
|
||||||
accountName: accountName,
|
accountName: accountName,
|
||||||
accountKey: key,
|
accountKey: accountKey,
|
||||||
useHTTPS: useHTTPS,
|
useHTTPS: useHTTPS,
|
||||||
baseURL: serviceBaseURL,
|
baseURL: serviceBaseURL,
|
||||||
apiVersion: apiVersion,
|
apiVersion: apiVersion,
|
||||||
|
@ -333,18 +367,16 @@ func IsValidStorageAccount(account string) bool {
|
||||||
return validStorageAccount.MatchString(account)
|
return validStorageAccount.MatchString(account)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// IsValidCosmosAccount checks if the Cosmos account name is valid.
|
||||||
|
// See https://docs.microsoft.com/en-us/azure/cosmos-db/how-to-manage-database-account
|
||||||
|
func IsValidCosmosAccount(account string) bool {
|
||||||
|
return validCosmosAccount.MatchString(account)
|
||||||
|
}
|
||||||
|
|
||||||
// NewAccountSASClient contructs a client that uses accountSAS authorization
|
// NewAccountSASClient contructs a client that uses accountSAS authorization
|
||||||
// for its operations.
|
// for its operations.
|
||||||
func NewAccountSASClient(account string, token url.Values, env azure.Environment) Client {
|
func NewAccountSASClient(account string, token url.Values, env azure.Environment) Client {
|
||||||
c := newSASClient()
|
return newSASClient(account, env.StorageEndpointSuffix, token)
|
||||||
c.accountSASToken = token
|
|
||||||
c.accountName = account
|
|
||||||
c.baseURL = env.StorageEndpointSuffix
|
|
||||||
|
|
||||||
// Get API version and protocol from token
|
|
||||||
c.apiVersion = token.Get("sv")
|
|
||||||
c.useHTTPS = token.Get("spr") == "https"
|
|
||||||
return c
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewAccountSASClientFromEndpointToken constructs a client that uses accountSAS authorization
|
// NewAccountSASClientFromEndpointToken constructs a client that uses accountSAS authorization
|
||||||
|
@ -354,12 +386,39 @@ func NewAccountSASClientFromEndpointToken(endpoint string, sasToken string) (Cli
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return Client{}, err
|
return Client{}, err
|
||||||
}
|
}
|
||||||
|
_, err = url.ParseQuery(sasToken)
|
||||||
token, err := url.ParseQuery(sasToken)
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return Client{}, err
|
return Client{}, err
|
||||||
}
|
}
|
||||||
|
u.RawQuery = sasToken
|
||||||
|
return newSASClientFromURL(u)
|
||||||
|
}
|
||||||
|
|
||||||
|
func newSASClient(accountName, baseURL string, sasToken url.Values) Client {
|
||||||
|
c := Client{
|
||||||
|
HTTPClient: http.DefaultClient,
|
||||||
|
apiVersion: DefaultAPIVersion,
|
||||||
|
sasClient: true,
|
||||||
|
Sender: &DefaultSender{
|
||||||
|
RetryAttempts: defaultRetryAttempts,
|
||||||
|
ValidStatusCodes: defaultValidStatusCodes,
|
||||||
|
RetryDuration: defaultRetryDuration,
|
||||||
|
},
|
||||||
|
accountName: accountName,
|
||||||
|
baseURL: baseURL,
|
||||||
|
accountSASToken: sasToken,
|
||||||
|
useHTTPS: defaultUseHTTPS,
|
||||||
|
}
|
||||||
|
c.userAgent = c.getDefaultUserAgent()
|
||||||
|
// Get API version and protocol from token
|
||||||
|
c.apiVersion = sasToken.Get("sv")
|
||||||
|
if spr := sasToken.Get("spr"); spr != "" {
|
||||||
|
c.useHTTPS = spr == "https"
|
||||||
|
}
|
||||||
|
return c
|
||||||
|
}
|
||||||
|
|
||||||
|
func newSASClientFromURL(u *url.URL) (Client, error) {
|
||||||
// the host name will look something like this
|
// the host name will look something like this
|
||||||
// - foo.blob.core.windows.net
|
// - foo.blob.core.windows.net
|
||||||
// "foo" is the account name
|
// "foo" is the account name
|
||||||
|
@ -377,32 +436,15 @@ func NewAccountSASClientFromEndpointToken(endpoint string, sasToken string) (Cli
|
||||||
return Client{}, fmt.Errorf("failed to find '.' in %s", u.Host[i1+1:])
|
return Client{}, fmt.Errorf("failed to find '.' in %s", u.Host[i1+1:])
|
||||||
}
|
}
|
||||||
|
|
||||||
c := newSASClient()
|
sasToken := u.Query()
|
||||||
c.accountSASToken = token
|
c := newSASClient(u.Host[:i1], u.Host[i1+i2+2:], sasToken)
|
||||||
c.accountName = u.Host[:i1]
|
if spr := sasToken.Get("spr"); spr == "" {
|
||||||
c.baseURL = u.Host[i1+i2+2:]
|
// infer from URL if not in the query params set
|
||||||
|
c.useHTTPS = u.Scheme == "https"
|
||||||
// Get API version and protocol from token
|
}
|
||||||
c.apiVersion = token.Get("sv")
|
|
||||||
c.useHTTPS = token.Get("spr") == "https"
|
|
||||||
return c, nil
|
return c, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func newSASClient() Client {
|
|
||||||
c := Client{
|
|
||||||
HTTPClient: http.DefaultClient,
|
|
||||||
apiVersion: DefaultAPIVersion,
|
|
||||||
sasClient: true,
|
|
||||||
Sender: &DefaultSender{
|
|
||||||
RetryAttempts: defaultRetryAttempts,
|
|
||||||
ValidStatusCodes: defaultValidStatusCodes,
|
|
||||||
RetryDuration: defaultRetryDuration,
|
|
||||||
},
|
|
||||||
}
|
|
||||||
c.userAgent = c.getDefaultUserAgent()
|
|
||||||
return c
|
|
||||||
}
|
|
||||||
|
|
||||||
func (c Client) isServiceSASClient() bool {
|
func (c Client) isServiceSASClient() bool {
|
||||||
return c.sasClient && c.accountSASToken == nil
|
return c.sasClient && c.accountSASToken == nil
|
||||||
}
|
}
|
||||||
|
@ -430,6 +472,16 @@ func (c *Client) AddToUserAgent(extension string) error {
|
||||||
return fmt.Errorf("Extension was empty, User Agent stayed as %s", c.userAgent)
|
return fmt.Errorf("Extension was empty, User Agent stayed as %s", c.userAgent)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// AddAdditionalHeaders adds additional standard headers
|
||||||
|
func (c *Client) AddAdditionalHeaders(headers map[string]string) {
|
||||||
|
if headers != nil {
|
||||||
|
c.additionalHeaders = map[string]string{}
|
||||||
|
for k, v := range headers {
|
||||||
|
c.additionalHeaders[k] = v
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// protectUserAgent is used in funcs that include extraheaders as a parameter.
|
// protectUserAgent is used in funcs that include extraheaders as a parameter.
|
||||||
// It prevents the User-Agent header to be overwritten, instead if it happens to
|
// It prevents the User-Agent header to be overwritten, instead if it happens to
|
||||||
// be present, it gets added to the current User-Agent. Use it before getStandardHeaders
|
// be present, it gets added to the current User-Agent. Use it before getStandardHeaders
|
||||||
|
@ -694,11 +746,16 @@ func (c Client) GetFileService() FileServiceClient {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c Client) getStandardHeaders() map[string]string {
|
func (c Client) getStandardHeaders() map[string]string {
|
||||||
return map[string]string{
|
headers := map[string]string{}
|
||||||
userAgentHeader: c.userAgent,
|
for k, v := range c.additionalHeaders {
|
||||||
"x-ms-version": c.apiVersion,
|
headers[k] = v
|
||||||
"x-ms-date": currentTimeRfc1123Formatted(),
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
headers[userAgentHeader] = c.userAgent
|
||||||
|
headers["x-ms-version"] = c.apiVersion
|
||||||
|
headers["x-ms-date"] = currentTimeRfc1123Formatted()
|
||||||
|
|
||||||
|
return headers
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c Client) exec(verb, url string, headers map[string]string, body io.Reader, auth authentication) (*http.Response, error) {
|
func (c Client) exec(verb, url string, headers map[string]string, body io.Reader, auth authentication) (*http.Response, error) {
|
||||||
|
@ -777,9 +834,22 @@ func (c Client) execInternalJSONCommon(verb, url string, headers map[string]stri
|
||||||
err = serviceErrFromStatusCode(resp.StatusCode, resp.Status, requestID, date, version)
|
err = serviceErrFromStatusCode(resp.StatusCode, resp.Status, requestID, date, version)
|
||||||
return respToRet, req, resp, err
|
return respToRet, req, resp, err
|
||||||
}
|
}
|
||||||
// try unmarshal as odata.error json
|
// response contains storage service error object, unmarshal
|
||||||
|
if resp.Header.Get("Content-Type") == "application/xml" {
|
||||||
|
storageErr := AzureTablesServiceError{
|
||||||
|
StatusCode: resp.StatusCode,
|
||||||
|
RequestID: requestID,
|
||||||
|
Date: date,
|
||||||
|
APIVersion: version,
|
||||||
|
}
|
||||||
|
if err := xml.Unmarshal(respBody, &storageErr); err != nil {
|
||||||
|
storageErr.Message = fmt.Sprintf("Response body could no be unmarshaled: %v. Body: %v.", err, string(respBody))
|
||||||
|
}
|
||||||
|
err = storageErr
|
||||||
|
} else {
|
||||||
err = json.Unmarshal(respBody, &respToRet.odata)
|
err = json.Unmarshal(respBody, &respToRet.odata)
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return respToRet, req, resp, err
|
return respToRet, req, resp, err
|
||||||
}
|
}
|
||||||
|
@ -883,9 +953,11 @@ func readAndCloseBody(body io.ReadCloser) ([]byte, error) {
|
||||||
|
|
||||||
// reads the response body then closes it
|
// reads the response body then closes it
|
||||||
func drainRespBody(resp *http.Response) {
|
func drainRespBody(resp *http.Response) {
|
||||||
|
if resp != nil {
|
||||||
io.Copy(ioutil.Discard, resp.Body)
|
io.Copy(ioutil.Discard, resp.Body)
|
||||||
resp.Body.Close()
|
resp.Body.Close()
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func serviceErrFromXML(body []byte, storageErr *AzureStorageServiceError) error {
|
func serviceErrFromXML(body []byte, storageErr *AzureStorageServiceError) error {
|
||||||
if err := xml.Unmarshal(body, storageErr); err != nil {
|
if err := xml.Unmarshal(body, storageErr); err != nil {
|
||||||
|
|
15
vendor/github.com/Azure/azure-sdk-for-go/storage/commonsasuri.go
generated
vendored
15
vendor/github.com/Azure/azure-sdk-for-go/storage/commonsasuri.go
generated
vendored
|
@ -1,18 +1,7 @@
|
||||||
package storage
|
package storage
|
||||||
|
|
||||||
// Copyright 2017 Microsoft Corporation
|
// Copyright (c) Microsoft Corporation. All rights reserved.
|
||||||
//
|
// Licensed under the MIT License. See License.txt in the project root for license information.
|
||||||
// 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.
|
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"net/url"
|
"net/url"
|
||||||
|
|
15
vendor/github.com/Azure/azure-sdk-for-go/storage/container.go
generated
vendored
15
vendor/github.com/Azure/azure-sdk-for-go/storage/container.go
generated
vendored
|
@ -1,18 +1,7 @@
|
||||||
package storage
|
package storage
|
||||||
|
|
||||||
// Copyright 2017 Microsoft Corporation
|
// Copyright (c) Microsoft Corporation. All rights reserved.
|
||||||
//
|
// Licensed under the MIT License. See License.txt in the project root for license information.
|
||||||
// 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.
|
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"encoding/xml"
|
"encoding/xml"
|
||||||
|
|
15
vendor/github.com/Azure/azure-sdk-for-go/storage/copyblob.go
generated
vendored
15
vendor/github.com/Azure/azure-sdk-for-go/storage/copyblob.go
generated
vendored
|
@ -1,18 +1,7 @@
|
||||||
package storage
|
package storage
|
||||||
|
|
||||||
// Copyright 2017 Microsoft Corporation
|
// Copyright (c) Microsoft Corporation. All rights reserved.
|
||||||
//
|
// Licensed under the MIT License. See License.txt in the project root for license information.
|
||||||
// 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.
|
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"errors"
|
"errors"
|
||||||
|
|
17
vendor/github.com/Azure/azure-sdk-for-go/storage/directory.go
generated
vendored
17
vendor/github.com/Azure/azure-sdk-for-go/storage/directory.go
generated
vendored
|
@ -1,18 +1,7 @@
|
||||||
package storage
|
package storage
|
||||||
|
|
||||||
// Copyright 2017 Microsoft Corporation
|
// Copyright (c) Microsoft Corporation. All rights reserved.
|
||||||
//
|
// Licensed under the MIT License. See License.txt in the project root for license information.
|
||||||
// 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.
|
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"encoding/xml"
|
"encoding/xml"
|
||||||
|
@ -94,7 +83,7 @@ func (d *Directory) Create(options *FileRequestOptions) error {
|
||||||
}
|
}
|
||||||
|
|
||||||
// CreateIfNotExists creates this directory under the associated share if the
|
// CreateIfNotExists creates this directory under the associated share if the
|
||||||
// directory does not exists. Returns true if the directory is newly created or
|
// directory does not exist. Returns true if the directory is newly created or
|
||||||
// false if the directory already exists.
|
// false if the directory already exists.
|
||||||
//
|
//
|
||||||
// See https://docs.microsoft.com/en-us/rest/api/storageservices/fileservices/Create-Directory
|
// See https://docs.microsoft.com/en-us/rest/api/storageservices/fileservices/Create-Directory
|
||||||
|
|
33
vendor/github.com/Azure/azure-sdk-for-go/storage/entity.go
generated
vendored
33
vendor/github.com/Azure/azure-sdk-for-go/storage/entity.go
generated
vendored
|
@ -1,18 +1,7 @@
|
||||||
package storage
|
package storage
|
||||||
|
|
||||||
// Copyright 2017 Microsoft Corporation
|
// Copyright (c) Microsoft Corporation. All rights reserved.
|
||||||
//
|
// Licensed under the MIT License. See License.txt in the project root for license information.
|
||||||
// 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.
|
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
|
@ -27,7 +16,7 @@ import (
|
||||||
"strings"
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/satori/go.uuid"
|
"github.com/gofrs/uuid"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Annotating as secure for gas scanning
|
// Annotating as secure for gas scanning
|
||||||
|
@ -207,7 +196,7 @@ func (e *Entity) Delete(force bool, options *EntityOptions) error {
|
||||||
uri := e.Table.tsc.client.getEndpoint(tableServiceName, e.buildPath(), query)
|
uri := e.Table.tsc.client.getEndpoint(tableServiceName, e.buildPath(), query)
|
||||||
resp, err := e.Table.tsc.client.exec(http.MethodDelete, uri, headers, nil, e.Table.tsc.auth)
|
resp, err := e.Table.tsc.client.exec(http.MethodDelete, uri, headers, nil, e.Table.tsc.auth)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
if resp.StatusCode == http.StatusPreconditionFailed {
|
if resp != nil && resp.StatusCode == http.StatusPreconditionFailed {
|
||||||
return fmt.Errorf(etagErrorTemplate, err)
|
return fmt.Errorf(etagErrorTemplate, err)
|
||||||
}
|
}
|
||||||
return err
|
return err
|
||||||
|
@ -257,6 +246,9 @@ func (e *Entity) MarshalJSON() ([]byte, error) {
|
||||||
case int64:
|
case int64:
|
||||||
completeMap[typeKey] = OdataInt64
|
completeMap[typeKey] = OdataInt64
|
||||||
completeMap[k] = fmt.Sprintf("%v", v)
|
completeMap[k] = fmt.Sprintf("%v", v)
|
||||||
|
case float32, float64:
|
||||||
|
completeMap[typeKey] = OdataDouble
|
||||||
|
completeMap[k] = fmt.Sprintf("%v", v)
|
||||||
default:
|
default:
|
||||||
completeMap[k] = v
|
completeMap[k] = v
|
||||||
}
|
}
|
||||||
|
@ -264,7 +256,8 @@ func (e *Entity) MarshalJSON() ([]byte, error) {
|
||||||
if !(completeMap[k] == OdataBinary ||
|
if !(completeMap[k] == OdataBinary ||
|
||||||
completeMap[k] == OdataDateTime ||
|
completeMap[k] == OdataDateTime ||
|
||||||
completeMap[k] == OdataGUID ||
|
completeMap[k] == OdataGUID ||
|
||||||
completeMap[k] == OdataInt64) {
|
completeMap[k] == OdataInt64 ||
|
||||||
|
completeMap[k] == OdataDouble) {
|
||||||
return nil, fmt.Errorf("Odata.type annotation %v value is not valid", k)
|
return nil, fmt.Errorf("Odata.type annotation %v value is not valid", k)
|
||||||
}
|
}
|
||||||
valueKey := strings.TrimSuffix(k, OdataTypeSuffix)
|
valueKey := strings.TrimSuffix(k, OdataTypeSuffix)
|
||||||
|
@ -339,6 +332,12 @@ func (e *Entity) UnmarshalJSON(data []byte) error {
|
||||||
return fmt.Errorf(errorTemplate, err)
|
return fmt.Errorf(errorTemplate, err)
|
||||||
}
|
}
|
||||||
props[valueKey] = i
|
props[valueKey] = i
|
||||||
|
case OdataDouble:
|
||||||
|
f, err := strconv.ParseFloat(str, 64)
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf(errorTemplate, err)
|
||||||
|
}
|
||||||
|
props[valueKey] = f
|
||||||
default:
|
default:
|
||||||
return fmt.Errorf(errorTemplate, fmt.Sprintf("%v is not supported", v))
|
return fmt.Errorf(errorTemplate, fmt.Sprintf("%v is not supported", v))
|
||||||
}
|
}
|
||||||
|
@ -423,7 +422,7 @@ func (e *Entity) updateMerge(force bool, verb string, options *EntityOptions) er
|
||||||
uri := e.Table.tsc.client.getEndpoint(tableServiceName, e.buildPath(), query)
|
uri := e.Table.tsc.client.getEndpoint(tableServiceName, e.buildPath(), query)
|
||||||
resp, err := e.Table.tsc.client.exec(verb, uri, headers, bytes.NewReader(body), e.Table.tsc.auth)
|
resp, err := e.Table.tsc.client.exec(verb, uri, headers, bytes.NewReader(body), e.Table.tsc.auth)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
if resp.StatusCode == http.StatusPreconditionFailed {
|
if resp != nil && resp.StatusCode == http.StatusPreconditionFailed {
|
||||||
return fmt.Errorf(etagErrorTemplate, err)
|
return fmt.Errorf(etagErrorTemplate, err)
|
||||||
}
|
}
|
||||||
return err
|
return err
|
||||||
|
|
19
vendor/github.com/Azure/azure-sdk-for-go/storage/file.go
generated
vendored
19
vendor/github.com/Azure/azure-sdk-for-go/storage/file.go
generated
vendored
|
@ -1,18 +1,7 @@
|
||||||
package storage
|
package storage
|
||||||
|
|
||||||
// Copyright 2017 Microsoft Corporation
|
// Copyright (c) Microsoft Corporation. All rights reserved.
|
||||||
//
|
// Licensed under the MIT License. See License.txt in the project root for license information.
|
||||||
// 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.
|
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"errors"
|
"errors"
|
||||||
|
@ -29,7 +18,11 @@ const fourMB = uint64(4194304)
|
||||||
const oneTB = uint64(1099511627776)
|
const oneTB = uint64(1099511627776)
|
||||||
|
|
||||||
// Export maximum range and file sizes
|
// Export maximum range and file sizes
|
||||||
|
|
||||||
|
// MaxRangeSize defines the maximum size in bytes for a file range.
|
||||||
const MaxRangeSize = fourMB
|
const MaxRangeSize = fourMB
|
||||||
|
|
||||||
|
// MaxFileSize defines the maximum size in bytes for a file.
|
||||||
const MaxFileSize = oneTB
|
const MaxFileSize = oneTB
|
||||||
|
|
||||||
// File represents a file on a share.
|
// File represents a file on a share.
|
||||||
|
|
15
vendor/github.com/Azure/azure-sdk-for-go/storage/fileserviceclient.go
generated
vendored
15
vendor/github.com/Azure/azure-sdk-for-go/storage/fileserviceclient.go
generated
vendored
|
@ -1,18 +1,7 @@
|
||||||
package storage
|
package storage
|
||||||
|
|
||||||
// Copyright 2017 Microsoft Corporation
|
// Copyright (c) Microsoft Corporation. All rights reserved.
|
||||||
//
|
// Licensed under the MIT License. See License.txt in the project root for license information.
|
||||||
// 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.
|
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"encoding/xml"
|
"encoding/xml"
|
||||||
|
|
15
vendor/github.com/Azure/azure-sdk-for-go/storage/leaseblob.go
generated
vendored
15
vendor/github.com/Azure/azure-sdk-for-go/storage/leaseblob.go
generated
vendored
|
@ -1,18 +1,7 @@
|
||||||
package storage
|
package storage
|
||||||
|
|
||||||
// Copyright 2017 Microsoft Corporation
|
// Copyright (c) Microsoft Corporation. All rights reserved.
|
||||||
//
|
// Licensed under the MIT License. See License.txt in the project root for license information.
|
||||||
// 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.
|
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"errors"
|
"errors"
|
||||||
|
|
18
vendor/github.com/Azure/azure-sdk-for-go/storage/message.go
generated
vendored
18
vendor/github.com/Azure/azure-sdk-for-go/storage/message.go
generated
vendored
|
@ -1,18 +1,7 @@
|
||||||
package storage
|
package storage
|
||||||
|
|
||||||
// Copyright 2017 Microsoft Corporation
|
// Copyright (c) Microsoft Corporation. All rights reserved.
|
||||||
//
|
// Licensed under the MIT License. See License.txt in the project root for license information.
|
||||||
// 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.
|
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"encoding/xml"
|
"encoding/xml"
|
||||||
|
@ -114,7 +103,8 @@ func (m *Message) Update(options *UpdateMessageOptions) error {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
headers["Content-Length"] = strconv.Itoa(nn)
|
headers["Content-Length"] = strconv.Itoa(nn)
|
||||||
|
// visibilitytimeout is required for Update (zero or greater) so set the default here
|
||||||
|
query.Set("visibilitytimeout", "0")
|
||||||
if options != nil {
|
if options != nil {
|
||||||
if options.VisibilityTimeout != 0 {
|
if options.VisibilityTimeout != 0 {
|
||||||
query.Set("visibilitytimeout", strconv.Itoa(options.VisibilityTimeout))
|
query.Set("visibilitytimeout", strconv.Itoa(options.VisibilityTimeout))
|
||||||
|
|
16
vendor/github.com/Azure/azure-sdk-for-go/storage/odata.go
generated
vendored
16
vendor/github.com/Azure/azure-sdk-for-go/storage/odata.go
generated
vendored
|
@ -1,18 +1,7 @@
|
||||||
package storage
|
package storage
|
||||||
|
|
||||||
// Copyright 2017 Microsoft Corporation
|
// Copyright (c) Microsoft Corporation. All rights reserved.
|
||||||
//
|
// Licensed under the MIT License. See License.txt in the project root for license information.
|
||||||
// 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.
|
|
||||||
|
|
||||||
// MetadataLevel determines if operations should return a paylod,
|
// MetadataLevel determines if operations should return a paylod,
|
||||||
// and it level of detail.
|
// and it level of detail.
|
||||||
|
@ -26,6 +15,7 @@ const (
|
||||||
|
|
||||||
OdataBinary = "Edm.Binary"
|
OdataBinary = "Edm.Binary"
|
||||||
OdataDateTime = "Edm.DateTime"
|
OdataDateTime = "Edm.DateTime"
|
||||||
|
OdataDouble = "Edm.Double"
|
||||||
OdataGUID = "Edm.Guid"
|
OdataGUID = "Edm.Guid"
|
||||||
OdataInt64 = "Edm.Int64"
|
OdataInt64 = "Edm.Int64"
|
||||||
|
|
||||||
|
|
15
vendor/github.com/Azure/azure-sdk-for-go/storage/pageblob.go
generated
vendored
15
vendor/github.com/Azure/azure-sdk-for-go/storage/pageblob.go
generated
vendored
|
@ -1,18 +1,7 @@
|
||||||
package storage
|
package storage
|
||||||
|
|
||||||
// Copyright 2017 Microsoft Corporation
|
// Copyright (c) Microsoft Corporation. All rights reserved.
|
||||||
//
|
// Licensed under the MIT License. See License.txt in the project root for license information.
|
||||||
// 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.
|
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"encoding/xml"
|
"encoding/xml"
|
||||||
|
|
17
vendor/github.com/Azure/azure-sdk-for-go/storage/queue.go
generated
vendored
17
vendor/github.com/Azure/azure-sdk-for-go/storage/queue.go
generated
vendored
|
@ -1,18 +1,7 @@
|
||||||
package storage
|
package storage
|
||||||
|
|
||||||
// Copyright 2017 Microsoft Corporation
|
// Copyright (c) Microsoft Corporation. All rights reserved.
|
||||||
//
|
// Licensed under the MIT License. See License.txt in the project root for license information.
|
||||||
// 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.
|
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"encoding/xml"
|
"encoding/xml"
|
||||||
|
@ -169,7 +158,7 @@ func (q *Queue) GetMetadata(options *QueueServiceOptions) error {
|
||||||
params = addTimeout(params, options.Timeout)
|
params = addTimeout(params, options.Timeout)
|
||||||
headers = mergeHeaders(headers, headersFromStruct(*options))
|
headers = mergeHeaders(headers, headersFromStruct(*options))
|
||||||
}
|
}
|
||||||
uri := q.qsc.client.getEndpoint(queueServiceName, q.buildPath(), url.Values{"comp": {"metadata"}})
|
uri := q.qsc.client.getEndpoint(queueServiceName, q.buildPath(), params)
|
||||||
|
|
||||||
resp, err := q.qsc.client.exec(http.MethodGet, uri, headers, nil, q.qsc.auth)
|
resp, err := q.qsc.client.exec(http.MethodGet, uri, headers, nil, q.qsc.auth)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|
15
vendor/github.com/Azure/azure-sdk-for-go/storage/queuesasuri.go
generated
vendored
15
vendor/github.com/Azure/azure-sdk-for-go/storage/queuesasuri.go
generated
vendored
|
@ -1,18 +1,7 @@
|
||||||
package storage
|
package storage
|
||||||
|
|
||||||
// Copyright 2017 Microsoft Corporation
|
// Copyright (c) Microsoft Corporation. All rights reserved.
|
||||||
//
|
// Licensed under the MIT License. See License.txt in the project root for license information.
|
||||||
// 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.
|
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"errors"
|
"errors"
|
||||||
|
|
15
vendor/github.com/Azure/azure-sdk-for-go/storage/queueserviceclient.go
generated
vendored
15
vendor/github.com/Azure/azure-sdk-for-go/storage/queueserviceclient.go
generated
vendored
|
@ -1,18 +1,7 @@
|
||||||
package storage
|
package storage
|
||||||
|
|
||||||
// Copyright 2017 Microsoft Corporation
|
// Copyright (c) Microsoft Corporation. All rights reserved.
|
||||||
//
|
// Licensed under the MIT License. See License.txt in the project root for license information.
|
||||||
// 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.
|
|
||||||
|
|
||||||
// QueueServiceClient contains operations for Microsoft Azure Queue Storage
|
// QueueServiceClient contains operations for Microsoft Azure Queue Storage
|
||||||
// Service.
|
// Service.
|
||||||
|
|
15
vendor/github.com/Azure/azure-sdk-for-go/storage/share.go
generated
vendored
15
vendor/github.com/Azure/azure-sdk-for-go/storage/share.go
generated
vendored
|
@ -1,18 +1,7 @@
|
||||||
package storage
|
package storage
|
||||||
|
|
||||||
// Copyright 2017 Microsoft Corporation
|
// Copyright (c) Microsoft Corporation. All rights reserved.
|
||||||
//
|
// Licensed under the MIT License. See License.txt in the project root for license information.
|
||||||
// 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.
|
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
|
|
15
vendor/github.com/Azure/azure-sdk-for-go/storage/storagepolicy.go
generated
vendored
15
vendor/github.com/Azure/azure-sdk-for-go/storage/storagepolicy.go
generated
vendored
|
@ -1,18 +1,7 @@
|
||||||
package storage
|
package storage
|
||||||
|
|
||||||
// Copyright 2017 Microsoft Corporation
|
// Copyright (c) Microsoft Corporation. All rights reserved.
|
||||||
//
|
// Licensed under the MIT License. See License.txt in the project root for license information.
|
||||||
// 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.
|
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"strings"
|
"strings"
|
||||||
|
|
34
vendor/github.com/Azure/azure-sdk-for-go/storage/storageservice.go
generated
vendored
34
vendor/github.com/Azure/azure-sdk-for-go/storage/storageservice.go
generated
vendored
|
@ -1,18 +1,7 @@
|
||||||
package storage
|
package storage
|
||||||
|
|
||||||
// Copyright 2017 Microsoft Corporation
|
// Copyright (c) Microsoft Corporation. All rights reserved.
|
||||||
//
|
// Licensed under the MIT License. See License.txt in the project root for license information.
|
||||||
// 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.
|
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"net/http"
|
"net/http"
|
||||||
|
@ -26,6 +15,8 @@ type ServiceProperties struct {
|
||||||
HourMetrics *Metrics
|
HourMetrics *Metrics
|
||||||
MinuteMetrics *Metrics
|
MinuteMetrics *Metrics
|
||||||
Cors *Cors
|
Cors *Cors
|
||||||
|
DeleteRetentionPolicy *RetentionPolicy // blob storage only
|
||||||
|
StaticWebsite *StaticWebsite // blob storage only
|
||||||
}
|
}
|
||||||
|
|
||||||
// Logging represents the Azure Analytics Logging settings
|
// Logging represents the Azure Analytics Logging settings
|
||||||
|
@ -65,6 +56,16 @@ type CorsRule struct {
|
||||||
AllowedHeaders string
|
AllowedHeaders string
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// StaticWebsite - The properties that enable an account to host a static website
|
||||||
|
type StaticWebsite struct {
|
||||||
|
// Enabled - Indicates whether this account is hosting a static website
|
||||||
|
Enabled bool
|
||||||
|
// IndexDocument - The default name of the index page under each directory
|
||||||
|
IndexDocument *string
|
||||||
|
// ErrorDocument404Path - The absolute path of the custom 404 page
|
||||||
|
ErrorDocument404Path *string
|
||||||
|
}
|
||||||
|
|
||||||
func (c Client) getServiceProperties(service string, auth authentication) (*ServiceProperties, error) {
|
func (c Client) getServiceProperties(service string, auth authentication) (*ServiceProperties, error) {
|
||||||
query := url.Values{
|
query := url.Values{
|
||||||
"restype": {"service"},
|
"restype": {"service"},
|
||||||
|
@ -106,6 +107,8 @@ func (c Client) setServiceProperties(props ServiceProperties, service string, au
|
||||||
HourMetrics *Metrics
|
HourMetrics *Metrics
|
||||||
MinuteMetrics *Metrics
|
MinuteMetrics *Metrics
|
||||||
Cors *Cors
|
Cors *Cors
|
||||||
|
DeleteRetentionPolicy *RetentionPolicy
|
||||||
|
StaticWebsite *StaticWebsite
|
||||||
}
|
}
|
||||||
input := StorageServiceProperties{
|
input := StorageServiceProperties{
|
||||||
Logging: props.Logging,
|
Logging: props.Logging,
|
||||||
|
@ -113,6 +116,11 @@ func (c Client) setServiceProperties(props ServiceProperties, service string, au
|
||||||
MinuteMetrics: props.MinuteMetrics,
|
MinuteMetrics: props.MinuteMetrics,
|
||||||
Cors: props.Cors,
|
Cors: props.Cors,
|
||||||
}
|
}
|
||||||
|
// only set these fields for blob storage else it's invalid XML
|
||||||
|
if service == blobServiceName {
|
||||||
|
input.DeleteRetentionPolicy = props.DeleteRetentionPolicy
|
||||||
|
input.StaticWebsite = props.StaticWebsite
|
||||||
|
}
|
||||||
|
|
||||||
body, length, err := xmlMarshal(input)
|
body, length, err := xmlMarshal(input)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|
21
vendor/github.com/Azure/azure-sdk-for-go/storage/table.go
generated
vendored
21
vendor/github.com/Azure/azure-sdk-for-go/storage/table.go
generated
vendored
|
@ -1,18 +1,7 @@
|
||||||
package storage
|
package storage
|
||||||
|
|
||||||
// Copyright 2017 Microsoft Corporation
|
// Copyright (c) Microsoft Corporation. All rights reserved.
|
||||||
//
|
// Licensed under the MIT License. See License.txt in the project root for license information.
|
||||||
// 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.
|
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
|
@ -355,8 +344,12 @@ func (t *Table) queryEntities(uri string, headers map[string]string, ml Metadata
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
v := originalURI.Query()
|
v := originalURI.Query()
|
||||||
|
if contToken.NextPartitionKey != "" {
|
||||||
v.Set(nextPartitionKeyQueryParameter, contToken.NextPartitionKey)
|
v.Set(nextPartitionKeyQueryParameter, contToken.NextPartitionKey)
|
||||||
|
}
|
||||||
|
if contToken.NextRowKey != "" {
|
||||||
v.Set(nextRowKeyQueryParameter, contToken.NextRowKey)
|
v.Set(nextRowKeyQueryParameter, contToken.NextRowKey)
|
||||||
|
}
|
||||||
newURI := t.tsc.client.getEndpoint(tableServiceName, t.buildPath(), v)
|
newURI := t.tsc.client.getEndpoint(tableServiceName, t.buildPath(), v)
|
||||||
entities.NextLink = &newURI
|
entities.NextLink = &newURI
|
||||||
entities.ml = ml
|
entities.ml = ml
|
||||||
|
@ -371,7 +364,7 @@ func extractContinuationTokenFromHeaders(h http.Header) *continuationToken {
|
||||||
NextRowKey: h.Get(headerNextRowKey),
|
NextRowKey: h.Get(headerNextRowKey),
|
||||||
}
|
}
|
||||||
|
|
||||||
if ct.NextPartitionKey != "" && ct.NextRowKey != "" {
|
if ct.NextPartitionKey != "" || ct.NextRowKey != "" {
|
||||||
return &ct
|
return &ct
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
|
|
22
vendor/github.com/Azure/azure-sdk-for-go/storage/table_batch.go
generated
vendored
22
vendor/github.com/Azure/azure-sdk-for-go/storage/table_batch.go
generated
vendored
|
@ -1,18 +1,7 @@
|
||||||
package storage
|
package storage
|
||||||
|
|
||||||
// Copyright 2017 Microsoft Corporation
|
// Copyright (c) Microsoft Corporation. All rights reserved.
|
||||||
//
|
// Licensed under the MIT License. See License.txt in the project root for license information.
|
||||||
// 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.
|
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
|
@ -25,8 +14,6 @@ import (
|
||||||
"net/textproto"
|
"net/textproto"
|
||||||
"sort"
|
"sort"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"github.com/marstr/guid"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
// Operation type. Insert, Delete, Replace etc.
|
// Operation type. Insert, Delete, Replace etc.
|
||||||
|
@ -132,8 +119,7 @@ func (t *TableBatch) MergeEntity(entity *Entity) {
|
||||||
// As per document https://docs.microsoft.com/en-us/rest/api/storageservices/fileservices/performing-entity-group-transactions
|
// As per document https://docs.microsoft.com/en-us/rest/api/storageservices/fileservices/performing-entity-group-transactions
|
||||||
func (t *TableBatch) ExecuteBatch() error {
|
func (t *TableBatch) ExecuteBatch() error {
|
||||||
|
|
||||||
// Using `github.com/marstr/guid` is in response to issue #947 (https://github.com/Azure/azure-sdk-for-go/issues/947).
|
id, err := newUUID()
|
||||||
id, err := guid.NewGUIDs(guid.CreationStrategyVersion1)
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
@ -145,7 +131,7 @@ func (t *TableBatch) ExecuteBatch() error {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
id, err = guid.NewGUIDs(guid.CreationStrategyVersion1)
|
id, err = newUUID()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
15
vendor/github.com/Azure/azure-sdk-for-go/storage/tableserviceclient.go
generated
vendored
15
vendor/github.com/Azure/azure-sdk-for-go/storage/tableserviceclient.go
generated
vendored
|
@ -1,18 +1,7 @@
|
||||||
package storage
|
package storage
|
||||||
|
|
||||||
// Copyright 2017 Microsoft Corporation
|
// Copyright (c) Microsoft Corporation. All rights reserved.
|
||||||
//
|
// Licensed under the MIT License. See License.txt in the project root for license information.
|
||||||
// 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.
|
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
|
|
31
vendor/github.com/Azure/azure-sdk-for-go/storage/util.go
generated
vendored
31
vendor/github.com/Azure/azure-sdk-for-go/storage/util.go
generated
vendored
|
@ -1,22 +1,12 @@
|
||||||
package storage
|
package storage
|
||||||
|
|
||||||
// Copyright 2017 Microsoft Corporation
|
// Copyright (c) Microsoft Corporation. All rights reserved.
|
||||||
//
|
// Licensed under the MIT License. See License.txt in the project root for license information.
|
||||||
// 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.
|
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
"crypto/hmac"
|
"crypto/hmac"
|
||||||
|
"crypto/rand"
|
||||||
"crypto/sha256"
|
"crypto/sha256"
|
||||||
"encoding/base64"
|
"encoding/base64"
|
||||||
"encoding/xml"
|
"encoding/xml"
|
||||||
|
@ -29,6 +19,8 @@ import (
|
||||||
"strconv"
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
"github.com/gofrs/uuid"
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
|
@ -242,3 +234,16 @@ func getMetadataFromHeaders(header http.Header) map[string]string {
|
||||||
|
|
||||||
return metadata
|
return metadata
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// newUUID returns a new uuid using RFC 4122 algorithm.
|
||||||
|
func newUUID() (uuid.UUID, error) {
|
||||||
|
u := [16]byte{}
|
||||||
|
// Set all bits to randomly (or pseudo-randomly) chosen values.
|
||||||
|
_, err := rand.Read(u[:])
|
||||||
|
if err != nil {
|
||||||
|
return uuid.UUID{}, err
|
||||||
|
}
|
||||||
|
u[8] = (u[8]&(0xff>>2) | (0x02 << 6)) // u.setVariant(ReservedRFC4122)
|
||||||
|
u[6] = (u[6] & 0xF) | (uuid.V4 << 4) // u.setVersion(V4)
|
||||||
|
return uuid.FromBytes(u[:])
|
||||||
|
}
|
||||||
|
|
20
vendor/github.com/Azure/azure-sdk-for-go/version/version.go
generated
vendored
20
vendor/github.com/Azure/azure-sdk-for-go/version/version.go
generated
vendored
|
@ -1,21 +1,7 @@
|
||||||
package version
|
package version
|
||||||
|
|
||||||
// Copyright (c) Microsoft and contributors. All rights reserved.
|
// Copyright (c) Microsoft Corporation. All rights reserved.
|
||||||
//
|
// Licensed under the MIT License. See License.txt in the project root for license information.
|
||||||
// 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.
|
|
||||||
//
|
|
||||||
// Code generated by Microsoft (R) AutoRest Code Generator.
|
|
||||||
// Changes may cause incorrect behavior and will be lost if the code is regenerated.
|
|
||||||
|
|
||||||
// Number contains the semantic version of this SDK.
|
// Number contains the semantic version of this SDK.
|
||||||
const Number = "v16.2.1"
|
const Number = "v56.3.0"
|
||||||
|
|
32
vendor/github.com/Azure/go-autorest/.gitignore
generated
vendored
Normal file
32
vendor/github.com/Azure/go-autorest/.gitignore
generated
vendored
Normal file
|
@ -0,0 +1,32 @@
|
||||||
|
# The standard Go .gitignore file follows. (Sourced from: github.com/github/gitignore/master/Go.gitignore)
|
||||||
|
# Compiled Object files, Static and Dynamic libs (Shared Objects)
|
||||||
|
*.o
|
||||||
|
*.a
|
||||||
|
*.so
|
||||||
|
|
||||||
|
# Folders
|
||||||
|
_obj
|
||||||
|
_test
|
||||||
|
.DS_Store
|
||||||
|
.idea/
|
||||||
|
.vscode/
|
||||||
|
|
||||||
|
# Architecture specific extensions/prefixes
|
||||||
|
*.[568vq]
|
||||||
|
[568vq].out
|
||||||
|
|
||||||
|
*.cgo1.go
|
||||||
|
*.cgo2.c
|
||||||
|
_cgo_defun.c
|
||||||
|
_cgo_gotypes.go
|
||||||
|
_cgo_export.*
|
||||||
|
|
||||||
|
_testmain.go
|
||||||
|
|
||||||
|
*.exe
|
||||||
|
*.test
|
||||||
|
*.prof
|
||||||
|
|
||||||
|
# go-autorest specific
|
||||||
|
vendor/
|
||||||
|
autorest/azure/example/example
|
1004
vendor/github.com/Azure/go-autorest/CHANGELOG.md
generated
vendored
Normal file
1004
vendor/github.com/Azure/go-autorest/CHANGELOG.md
generated
vendored
Normal file
File diff suppressed because it is too large
Load diff
23
vendor/github.com/Azure/go-autorest/GNUmakefile
generated
vendored
Normal file
23
vendor/github.com/Azure/go-autorest/GNUmakefile
generated
vendored
Normal file
|
@ -0,0 +1,23 @@
|
||||||
|
DIR?=./autorest/
|
||||||
|
|
||||||
|
default: build
|
||||||
|
|
||||||
|
build: fmt
|
||||||
|
go install $(DIR)
|
||||||
|
|
||||||
|
test:
|
||||||
|
go test $(DIR) || exit 1
|
||||||
|
|
||||||
|
vet:
|
||||||
|
@echo "go vet ."
|
||||||
|
@go vet $(DIR)... ; if [ $$? -eq 1 ]; then \
|
||||||
|
echo ""; \
|
||||||
|
echo "Vet found suspicious constructs. Please check the reported constructs"; \
|
||||||
|
echo "and fix them if necessary before submitting the code for review."; \
|
||||||
|
exit 1; \
|
||||||
|
fi
|
||||||
|
|
||||||
|
fmt:
|
||||||
|
gofmt -w $(DIR)
|
||||||
|
|
||||||
|
.PHONY: build test vet fmt
|
324
vendor/github.com/Azure/go-autorest/Gopkg.lock
generated
vendored
Normal file
324
vendor/github.com/Azure/go-autorest/Gopkg.lock
generated
vendored
Normal file
|
@ -0,0 +1,324 @@
|
||||||
|
# This file is autogenerated, do not edit; changes may be undone by the next 'dep ensure'.
|
||||||
|
|
||||||
|
|
||||||
|
[[projects]]
|
||||||
|
digest = "1:892e39e5c083d0943f1e80ab8351690f183c6a5ab24e1d280adcad424c26255e"
|
||||||
|
name = "contrib.go.opencensus.io/exporter/ocagent"
|
||||||
|
packages = ["."]
|
||||||
|
pruneopts = "UT"
|
||||||
|
revision = "a8a6f458bbc1d5042322ad1f9b65eeb0b69be9ea"
|
||||||
|
version = "v0.6.0"
|
||||||
|
|
||||||
|
[[projects]]
|
||||||
|
digest = "1:8f5acd4d4462b5136af644d25101f0968a7a94ee90fcb2059cec5b7cc42e0b20"
|
||||||
|
name = "github.com/census-instrumentation/opencensus-proto"
|
||||||
|
packages = [
|
||||||
|
"gen-go/agent/common/v1",
|
||||||
|
"gen-go/agent/metrics/v1",
|
||||||
|
"gen-go/agent/trace/v1",
|
||||||
|
"gen-go/metrics/v1",
|
||||||
|
"gen-go/resource/v1",
|
||||||
|
"gen-go/trace/v1",
|
||||||
|
]
|
||||||
|
pruneopts = "UT"
|
||||||
|
revision = "d89fa54de508111353cb0b06403c00569be780d8"
|
||||||
|
version = "v0.2.1"
|
||||||
|
|
||||||
|
[[projects]]
|
||||||
|
digest = "1:ffe9824d294da03b391f44e1ae8281281b4afc1bdaa9588c9097785e3af10cec"
|
||||||
|
name = "github.com/davecgh/go-spew"
|
||||||
|
packages = ["spew"]
|
||||||
|
pruneopts = "UT"
|
||||||
|
revision = "8991bc29aa16c548c550c7ff78260e27b9ab7c73"
|
||||||
|
version = "v1.1.1"
|
||||||
|
|
||||||
|
[[projects]]
|
||||||
|
digest = "1:76dc72490af7174349349838f2fe118996381b31ea83243812a97e5a0fd5ed55"
|
||||||
|
name = "github.com/dgrijalva/jwt-go"
|
||||||
|
packages = ["."]
|
||||||
|
pruneopts = "UT"
|
||||||
|
revision = "06ea1031745cb8b3dab3f6a236daf2b0aa468b7e"
|
||||||
|
version = "v3.2.0"
|
||||||
|
|
||||||
|
[[projects]]
|
||||||
|
digest = "1:cf0d2e435fd4ce45b789e93ef24b5f08e86be0e9807a16beb3694e2d8c9af965"
|
||||||
|
name = "github.com/dimchansky/utfbom"
|
||||||
|
packages = ["."]
|
||||||
|
pruneopts = "UT"
|
||||||
|
revision = "d2133a1ce379ef6fa992b0514a77146c60db9d1c"
|
||||||
|
version = "v1.1.0"
|
||||||
|
|
||||||
|
[[projects]]
|
||||||
|
branch = "master"
|
||||||
|
digest = "1:b7cb6054d3dff43b38ad2e92492f220f57ae6087ee797dca298139776749ace8"
|
||||||
|
name = "github.com/golang/groupcache"
|
||||||
|
packages = ["lru"]
|
||||||
|
pruneopts = "UT"
|
||||||
|
revision = "611e8accdfc92c4187d399e95ce826046d4c8d73"
|
||||||
|
|
||||||
|
[[projects]]
|
||||||
|
digest = "1:e3839df32927e8d3403cd5aa7253d966e8ff80fc8f10e2e35d146461cd83fcfa"
|
||||||
|
name = "github.com/golang/protobuf"
|
||||||
|
packages = [
|
||||||
|
"descriptor",
|
||||||
|
"jsonpb",
|
||||||
|
"proto",
|
||||||
|
"protoc-gen-go/descriptor",
|
||||||
|
"ptypes",
|
||||||
|
"ptypes/any",
|
||||||
|
"ptypes/duration",
|
||||||
|
"ptypes/struct",
|
||||||
|
"ptypes/timestamp",
|
||||||
|
"ptypes/wrappers",
|
||||||
|
]
|
||||||
|
pruneopts = "UT"
|
||||||
|
revision = "6c65a5562fc06764971b7c5d05c76c75e84bdbf7"
|
||||||
|
version = "v1.3.2"
|
||||||
|
|
||||||
|
[[projects]]
|
||||||
|
digest = "1:c560cd79300fac84f124b96225181a637a70b60155919a3c36db50b7cca6b806"
|
||||||
|
name = "github.com/grpc-ecosystem/grpc-gateway"
|
||||||
|
packages = [
|
||||||
|
"internal",
|
||||||
|
"runtime",
|
||||||
|
"utilities",
|
||||||
|
]
|
||||||
|
pruneopts = "UT"
|
||||||
|
revision = "f7120437bb4f6c71f7f5076ad65a45310de2c009"
|
||||||
|
version = "v1.12.1"
|
||||||
|
|
||||||
|
[[projects]]
|
||||||
|
digest = "1:5d231480e1c64a726869bc4142d270184c419749d34f167646baa21008eb0a79"
|
||||||
|
name = "github.com/mitchellh/go-homedir"
|
||||||
|
packages = ["."]
|
||||||
|
pruneopts = "UT"
|
||||||
|
revision = "af06845cf3004701891bf4fdb884bfe4920b3727"
|
||||||
|
version = "v1.1.0"
|
||||||
|
|
||||||
|
[[projects]]
|
||||||
|
digest = "1:0028cb19b2e4c3112225cd871870f2d9cf49b9b4276531f03438a88e94be86fe"
|
||||||
|
name = "github.com/pmezard/go-difflib"
|
||||||
|
packages = ["difflib"]
|
||||||
|
pruneopts = "UT"
|
||||||
|
revision = "792786c7400a136282c1664665ae0a8db921c6c2"
|
||||||
|
version = "v1.0.0"
|
||||||
|
|
||||||
|
[[projects]]
|
||||||
|
digest = "1:99d32780e5238c2621fff621123997c3e3cca96db8be13179013aea77dfab551"
|
||||||
|
name = "github.com/stretchr/testify"
|
||||||
|
packages = [
|
||||||
|
"assert",
|
||||||
|
"require",
|
||||||
|
]
|
||||||
|
pruneopts = "UT"
|
||||||
|
revision = "221dbe5ed46703ee255b1da0dec05086f5035f62"
|
||||||
|
version = "v1.4.0"
|
||||||
|
|
||||||
|
[[projects]]
|
||||||
|
digest = "1:7c5e00383399fe13de0b4b65c9fdde16275407ce8ac02d867eafeaa916edcc71"
|
||||||
|
name = "go.opencensus.io"
|
||||||
|
packages = [
|
||||||
|
".",
|
||||||
|
"internal",
|
||||||
|
"internal/tagencoding",
|
||||||
|
"metric/metricdata",
|
||||||
|
"metric/metricproducer",
|
||||||
|
"plugin/ocgrpc",
|
||||||
|
"plugin/ochttp",
|
||||||
|
"plugin/ochttp/propagation/b3",
|
||||||
|
"plugin/ochttp/propagation/tracecontext",
|
||||||
|
"resource",
|
||||||
|
"stats",
|
||||||
|
"stats/internal",
|
||||||
|
"stats/view",
|
||||||
|
"tag",
|
||||||
|
"trace",
|
||||||
|
"trace/internal",
|
||||||
|
"trace/propagation",
|
||||||
|
"trace/tracestate",
|
||||||
|
]
|
||||||
|
pruneopts = "UT"
|
||||||
|
revision = "aad2c527c5defcf89b5afab7f37274304195a6b2"
|
||||||
|
version = "v0.22.2"
|
||||||
|
|
||||||
|
[[projects]]
|
||||||
|
branch = "master"
|
||||||
|
digest = "1:f604f5e2ee721b6757d962dfe7bab4f28aae50c456e39cfb2f3819762a44a6ae"
|
||||||
|
name = "golang.org/x/crypto"
|
||||||
|
packages = [
|
||||||
|
"pkcs12",
|
||||||
|
"pkcs12/internal/rc2",
|
||||||
|
]
|
||||||
|
pruneopts = "UT"
|
||||||
|
revision = "e9b2fee46413994441b28dfca259d911d963dfed"
|
||||||
|
|
||||||
|
[[projects]]
|
||||||
|
branch = "master"
|
||||||
|
digest = "1:334b27eac455cb6567ea28cd424230b07b1a64334a2f861a8075ac26ce10af43"
|
||||||
|
name = "golang.org/x/lint"
|
||||||
|
packages = [
|
||||||
|
".",
|
||||||
|
"golint",
|
||||||
|
]
|
||||||
|
pruneopts = "UT"
|
||||||
|
revision = "fdd1cda4f05fd1fd86124f0ef9ce31a0b72c8448"
|
||||||
|
|
||||||
|
[[projects]]
|
||||||
|
branch = "master"
|
||||||
|
digest = "1:257a75d024975428ab9192bfc334c3490882f8cb21322ea5784ca8eca000a910"
|
||||||
|
name = "golang.org/x/net"
|
||||||
|
packages = [
|
||||||
|
"http/httpguts",
|
||||||
|
"http2",
|
||||||
|
"http2/hpack",
|
||||||
|
"idna",
|
||||||
|
"internal/timeseries",
|
||||||
|
"trace",
|
||||||
|
]
|
||||||
|
pruneopts = "UT"
|
||||||
|
revision = "1ddd1de85cb0337b623b740a609d35817d516a8d"
|
||||||
|
|
||||||
|
[[projects]]
|
||||||
|
branch = "master"
|
||||||
|
digest = "1:382bb5a7fb4034db3b6a2d19e5a4a6bcf52f4750530603c01ca18a172fa3089b"
|
||||||
|
name = "golang.org/x/sync"
|
||||||
|
packages = ["semaphore"]
|
||||||
|
pruneopts = "UT"
|
||||||
|
revision = "cd5d95a43a6e21273425c7ae415d3df9ea832eeb"
|
||||||
|
|
||||||
|
[[projects]]
|
||||||
|
branch = "master"
|
||||||
|
digest = "1:4da420ceda5f68e8d748aa2169d0ed44ffadb1bbd6537cf778a49563104189b8"
|
||||||
|
name = "golang.org/x/sys"
|
||||||
|
packages = ["unix"]
|
||||||
|
pruneopts = "UT"
|
||||||
|
revision = "ce4227a45e2eb77e5c847278dcc6a626742e2945"
|
||||||
|
|
||||||
|
[[projects]]
|
||||||
|
digest = "1:8d8faad6b12a3a4c819a3f9618cb6ee1fa1cfc33253abeeea8b55336721e3405"
|
||||||
|
name = "golang.org/x/text"
|
||||||
|
packages = [
|
||||||
|
"collate",
|
||||||
|
"collate/build",
|
||||||
|
"internal/colltab",
|
||||||
|
"internal/gen",
|
||||||
|
"internal/language",
|
||||||
|
"internal/language/compact",
|
||||||
|
"internal/tag",
|
||||||
|
"internal/triegen",
|
||||||
|
"internal/ucd",
|
||||||
|
"language",
|
||||||
|
"secure/bidirule",
|
||||||
|
"transform",
|
||||||
|
"unicode/bidi",
|
||||||
|
"unicode/cldr",
|
||||||
|
"unicode/norm",
|
||||||
|
"unicode/rangetable",
|
||||||
|
]
|
||||||
|
pruneopts = "UT"
|
||||||
|
revision = "342b2e1fbaa52c93f31447ad2c6abc048c63e475"
|
||||||
|
version = "v0.3.2"
|
||||||
|
|
||||||
|
[[projects]]
|
||||||
|
branch = "master"
|
||||||
|
digest = "1:4eb5ea8395fb60212dd58b92c9db80bab59d5e99c7435f9a6a0a528c373b60e7"
|
||||||
|
name = "golang.org/x/tools"
|
||||||
|
packages = [
|
||||||
|
"go/ast/astutil",
|
||||||
|
"go/gcexportdata",
|
||||||
|
"go/internal/gcimporter",
|
||||||
|
"go/types/typeutil",
|
||||||
|
]
|
||||||
|
pruneopts = "UT"
|
||||||
|
revision = "259af5ff87bdcd4abf2ecda8edc3f13f04f26a42"
|
||||||
|
|
||||||
|
[[projects]]
|
||||||
|
digest = "1:964bb30febc27fabfbec4759fa530c6ec35e77a7c85fed90b9317ea39a054877"
|
||||||
|
name = "google.golang.org/api"
|
||||||
|
packages = ["support/bundler"]
|
||||||
|
pruneopts = "UT"
|
||||||
|
revision = "8a410c21381766a810817fd6200fce8838ecb277"
|
||||||
|
version = "v0.14.0"
|
||||||
|
|
||||||
|
[[projects]]
|
||||||
|
branch = "master"
|
||||||
|
digest = "1:a8d5c2c6e746b3485e36908ab2a9e3d77b86b81f8156d88403c7d2b462431dfd"
|
||||||
|
name = "google.golang.org/genproto"
|
||||||
|
packages = [
|
||||||
|
"googleapis/api/httpbody",
|
||||||
|
"googleapis/rpc/status",
|
||||||
|
"protobuf/field_mask",
|
||||||
|
]
|
||||||
|
pruneopts = "UT"
|
||||||
|
revision = "51378566eb590fa106d1025ea12835a4416dda84"
|
||||||
|
|
||||||
|
[[projects]]
|
||||||
|
digest = "1:b59ce3ddb11daeeccccc9cb3183b58ebf8e9a779f1c853308cd91612e817a301"
|
||||||
|
name = "google.golang.org/grpc"
|
||||||
|
packages = [
|
||||||
|
".",
|
||||||
|
"backoff",
|
||||||
|
"balancer",
|
||||||
|
"balancer/base",
|
||||||
|
"balancer/roundrobin",
|
||||||
|
"binarylog/grpc_binarylog_v1",
|
||||||
|
"codes",
|
||||||
|
"connectivity",
|
||||||
|
"credentials",
|
||||||
|
"credentials/internal",
|
||||||
|
"encoding",
|
||||||
|
"encoding/proto",
|
||||||
|
"grpclog",
|
||||||
|
"internal",
|
||||||
|
"internal/backoff",
|
||||||
|
"internal/balancerload",
|
||||||
|
"internal/binarylog",
|
||||||
|
"internal/buffer",
|
||||||
|
"internal/channelz",
|
||||||
|
"internal/envconfig",
|
||||||
|
"internal/grpcrand",
|
||||||
|
"internal/grpcsync",
|
||||||
|
"internal/resolver/dns",
|
||||||
|
"internal/resolver/passthrough",
|
||||||
|
"internal/syscall",
|
||||||
|
"internal/transport",
|
||||||
|
"keepalive",
|
||||||
|
"metadata",
|
||||||
|
"naming",
|
||||||
|
"peer",
|
||||||
|
"resolver",
|
||||||
|
"serviceconfig",
|
||||||
|
"stats",
|
||||||
|
"status",
|
||||||
|
"tap",
|
||||||
|
]
|
||||||
|
pruneopts = "UT"
|
||||||
|
revision = "1a3960e4bd028ac0cec0a2afd27d7d8e67c11514"
|
||||||
|
version = "v1.25.1"
|
||||||
|
|
||||||
|
[[projects]]
|
||||||
|
digest = "1:b75b3deb2bce8bc079e16bb2aecfe01eb80098f5650f9e93e5643ca8b7b73737"
|
||||||
|
name = "gopkg.in/yaml.v2"
|
||||||
|
packages = ["."]
|
||||||
|
pruneopts = "UT"
|
||||||
|
revision = "1f64d6156d11335c3f22d9330b0ad14fc1e789ce"
|
||||||
|
version = "v2.2.7"
|
||||||
|
|
||||||
|
[solve-meta]
|
||||||
|
analyzer-name = "dep"
|
||||||
|
analyzer-version = 1
|
||||||
|
input-imports = [
|
||||||
|
"contrib.go.opencensus.io/exporter/ocagent",
|
||||||
|
"github.com/dgrijalva/jwt-go",
|
||||||
|
"github.com/dimchansky/utfbom",
|
||||||
|
"github.com/mitchellh/go-homedir",
|
||||||
|
"github.com/stretchr/testify/require",
|
||||||
|
"go.opencensus.io/plugin/ochttp",
|
||||||
|
"go.opencensus.io/plugin/ochttp/propagation/tracecontext",
|
||||||
|
"go.opencensus.io/stats/view",
|
||||||
|
"go.opencensus.io/trace",
|
||||||
|
"golang.org/x/crypto/pkcs12",
|
||||||
|
"golang.org/x/lint/golint",
|
||||||
|
]
|
||||||
|
solver-name = "gps-cdcl"
|
||||||
|
solver-version = 1
|
59
vendor/github.com/Azure/go-autorest/Gopkg.toml
generated
vendored
Normal file
59
vendor/github.com/Azure/go-autorest/Gopkg.toml
generated
vendored
Normal file
|
@ -0,0 +1,59 @@
|
||||||
|
# Gopkg.toml example
|
||||||
|
#
|
||||||
|
# Refer to https://golang.github.io/dep/docs/Gopkg.toml.html
|
||||||
|
# for detailed Gopkg.toml documentation.
|
||||||
|
#
|
||||||
|
# required = ["github.com/user/thing/cmd/thing"]
|
||||||
|
# ignored = ["github.com/user/project/pkgX", "bitbucket.org/user/project/pkgA/pkgY"]
|
||||||
|
#
|
||||||
|
# [[constraint]]
|
||||||
|
# name = "github.com/user/project"
|
||||||
|
# version = "1.0.0"
|
||||||
|
#
|
||||||
|
# [[constraint]]
|
||||||
|
# name = "github.com/user/project2"
|
||||||
|
# branch = "dev"
|
||||||
|
# source = "github.com/myfork/project2"
|
||||||
|
#
|
||||||
|
# [[override]]
|
||||||
|
# name = "github.com/x/y"
|
||||||
|
# version = "2.4.0"
|
||||||
|
#
|
||||||
|
# [prune]
|
||||||
|
# non-go = false
|
||||||
|
# go-tests = true
|
||||||
|
# unused-packages = true
|
||||||
|
|
||||||
|
required = ["golang.org/x/lint/golint"]
|
||||||
|
|
||||||
|
[prune]
|
||||||
|
go-tests = true
|
||||||
|
unused-packages = true
|
||||||
|
|
||||||
|
[[constraint]]
|
||||||
|
name = "contrib.go.opencensus.io/exporter/ocagent"
|
||||||
|
version = "0.6.0"
|
||||||
|
|
||||||
|
[[constraint]]
|
||||||
|
name = "github.com/dgrijalva/jwt-go"
|
||||||
|
version = "3.2.0"
|
||||||
|
|
||||||
|
[[constraint]]
|
||||||
|
name = "github.com/dimchansky/utfbom"
|
||||||
|
version = "1.1.0"
|
||||||
|
|
||||||
|
[[constraint]]
|
||||||
|
name = "github.com/mitchellh/go-homedir"
|
||||||
|
version = "1.1.0"
|
||||||
|
|
||||||
|
[[constraint]]
|
||||||
|
name = "github.com/stretchr/testify"
|
||||||
|
version = "1.3.0"
|
||||||
|
|
||||||
|
[[constraint]]
|
||||||
|
name = "go.opencensus.io"
|
||||||
|
version = "0.22.0"
|
||||||
|
|
||||||
|
[[constraint]]
|
||||||
|
branch = "master"
|
||||||
|
name = "golang.org/x/crypto"
|
165
vendor/github.com/Azure/go-autorest/README.md
generated
vendored
Normal file
165
vendor/github.com/Azure/go-autorest/README.md
generated
vendored
Normal file
|
@ -0,0 +1,165 @@
|
||||||
|
# go-autorest
|
||||||
|
|
||||||
|
[![GoDoc](https://godoc.org/github.com/Azure/go-autorest/autorest?status.png)](https://godoc.org/github.com/Azure/go-autorest/autorest)
|
||||||
|
[![Build Status](https://dev.azure.com/azure-sdk/public/_apis/build/status/go/Azure.go-autorest?branchName=master)](https://dev.azure.com/azure-sdk/public/_build/latest?definitionId=625&branchName=master)
|
||||||
|
[![Go Report Card](https://goreportcard.com/badge/Azure/go-autorest)](https://goreportcard.com/report/Azure/go-autorest)
|
||||||
|
|
||||||
|
Package go-autorest provides an HTTP request client for use with [Autorest](https://github.com/Azure/autorest.go)-generated API client packages.
|
||||||
|
|
||||||
|
An authentication client tested with Azure Active Directory (AAD) is also
|
||||||
|
provided in this repo in the package
|
||||||
|
`github.com/Azure/go-autorest/autorest/adal`. Despite its name, this package
|
||||||
|
is maintained only as part of the Azure Go SDK and is not related to other
|
||||||
|
"ADAL" libraries in [github.com/AzureAD](https://github.com/AzureAD).
|
||||||
|
|
||||||
|
## Overview
|
||||||
|
|
||||||
|
Package go-autorest implements an HTTP request pipeline suitable for use across
|
||||||
|
multiple goroutines and provides the shared routines used by packages generated
|
||||||
|
by [Autorest](https://github.com/Azure/autorest.go).
|
||||||
|
|
||||||
|
The package breaks sending and responding to HTTP requests into three phases: Preparing, Sending,
|
||||||
|
and Responding. A typical pattern is:
|
||||||
|
|
||||||
|
```go
|
||||||
|
req, err := Prepare(&http.Request{},
|
||||||
|
token.WithAuthorization())
|
||||||
|
|
||||||
|
resp, err := Send(req,
|
||||||
|
WithLogging(logger),
|
||||||
|
DoErrorIfStatusCode(http.StatusInternalServerError),
|
||||||
|
DoCloseIfError(),
|
||||||
|
DoRetryForAttempts(5, time.Second))
|
||||||
|
|
||||||
|
err = Respond(resp,
|
||||||
|
ByDiscardingBody(),
|
||||||
|
ByClosing())
|
||||||
|
```
|
||||||
|
|
||||||
|
Each phase relies on decorators to modify and / or manage processing. Decorators may first modify
|
||||||
|
and then pass the data along, pass the data first and then modify the result, or wrap themselves
|
||||||
|
around passing the data (such as a logger might do). Decorators run in the order provided. For
|
||||||
|
example, the following:
|
||||||
|
|
||||||
|
```go
|
||||||
|
req, err := Prepare(&http.Request{},
|
||||||
|
WithBaseURL("https://microsoft.com/"),
|
||||||
|
WithPath("a"),
|
||||||
|
WithPath("b"),
|
||||||
|
WithPath("c"))
|
||||||
|
```
|
||||||
|
|
||||||
|
will set the URL to:
|
||||||
|
|
||||||
|
```
|
||||||
|
https://microsoft.com/a/b/c
|
||||||
|
```
|
||||||
|
|
||||||
|
Preparers and Responders may be shared and re-used (assuming the underlying decorators support
|
||||||
|
sharing and re-use). Performant use is obtained by creating one or more Preparers and Responders
|
||||||
|
shared among multiple go-routines, and a single Sender shared among multiple sending go-routines,
|
||||||
|
all bound together by means of input / output channels.
|
||||||
|
|
||||||
|
Decorators hold their passed state within a closure (such as the path components in the example
|
||||||
|
above). Be careful to share Preparers and Responders only in a context where such held state
|
||||||
|
applies. For example, it may not make sense to share a Preparer that applies a query string from a
|
||||||
|
fixed set of values. Similarly, sharing a Responder that reads the response body into a passed
|
||||||
|
struct (e.g., `ByUnmarshallingJson`) is likely incorrect.
|
||||||
|
|
||||||
|
Errors raised by autorest objects and methods will conform to the `autorest.Error` interface.
|
||||||
|
|
||||||
|
See the included examples for more detail. For details on the suggested use of this package by
|
||||||
|
generated clients, see the Client described below.
|
||||||
|
|
||||||
|
## Helpers
|
||||||
|
|
||||||
|
### Handling Swagger Dates
|
||||||
|
|
||||||
|
The Swagger specification (https://swagger.io) that drives AutoRest
|
||||||
|
(https://github.com/Azure/autorest/) precisely defines two date forms: date and date-time. The
|
||||||
|
github.com/Azure/go-autorest/autorest/date package provides time.Time derivations to ensure correct
|
||||||
|
parsing and formatting.
|
||||||
|
|
||||||
|
### Handling Empty Values
|
||||||
|
|
||||||
|
In JSON, missing values have different semantics than empty values. This is especially true for
|
||||||
|
services using the HTTP PATCH verb. The JSON submitted with a PATCH request generally contains
|
||||||
|
only those values to modify. Missing values are to be left unchanged. Developers, then, require a
|
||||||
|
means to both specify an empty value and to leave the value out of the submitted JSON.
|
||||||
|
|
||||||
|
The Go JSON package (`encoding/json`) supports the `omitempty` tag. When specified, it omits
|
||||||
|
empty values from the rendered JSON. Since Go defines default values for all base types (such as ""
|
||||||
|
for string and 0 for int) and provides no means to mark a value as actually empty, the JSON package
|
||||||
|
treats default values as meaning empty, omitting them from the rendered JSON. This means that, using
|
||||||
|
the Go base types encoded through the default JSON package, it is not possible to create JSON to
|
||||||
|
clear a value at the server.
|
||||||
|
|
||||||
|
The workaround within the Go community is to use pointers to base types in lieu of base types within
|
||||||
|
structures that map to JSON. For example, instead of a value of type `string`, the workaround uses
|
||||||
|
`*string`. While this enables distinguishing empty values from those to be unchanged, creating
|
||||||
|
pointers to a base type (notably constant, in-line values) requires additional variables. This, for
|
||||||
|
example,
|
||||||
|
|
||||||
|
```go
|
||||||
|
s := struct {
|
||||||
|
S *string
|
||||||
|
}{ S: &"foo" }
|
||||||
|
```
|
||||||
|
fails, while, this
|
||||||
|
|
||||||
|
```go
|
||||||
|
v := "foo"
|
||||||
|
s := struct {
|
||||||
|
S *string
|
||||||
|
}{ S: &v }
|
||||||
|
```
|
||||||
|
succeeds.
|
||||||
|
|
||||||
|
To ease using pointers, the subpackage `to` contains helpers that convert to and from pointers for
|
||||||
|
Go base types which have Swagger analogs. It also provides a helper that converts between
|
||||||
|
`map[string]string` and `map[string]*string`, enabling the JSON to specify that the value
|
||||||
|
associated with a key should be cleared. With the helpers, the previous example becomes
|
||||||
|
|
||||||
|
```go
|
||||||
|
s := struct {
|
||||||
|
S *string
|
||||||
|
}{ S: to.StringPtr("foo") }
|
||||||
|
```
|
||||||
|
|
||||||
|
## Install
|
||||||
|
|
||||||
|
```bash
|
||||||
|
go get github.com/Azure/go-autorest/autorest
|
||||||
|
go get github.com/Azure/go-autorest/autorest/azure
|
||||||
|
go get github.com/Azure/go-autorest/autorest/date
|
||||||
|
go get github.com/Azure/go-autorest/autorest/to
|
||||||
|
```
|
||||||
|
|
||||||
|
### Using with Go Modules
|
||||||
|
In [v12.0.1](https://github.com/Azure/go-autorest/pull/386), this repository introduced the following modules.
|
||||||
|
|
||||||
|
- autorest/adal
|
||||||
|
- autorest/azure/auth
|
||||||
|
- autorest/azure/cli
|
||||||
|
- autorest/date
|
||||||
|
- autorest/mocks
|
||||||
|
- autorest/to
|
||||||
|
- autorest/validation
|
||||||
|
- autorest
|
||||||
|
- logger
|
||||||
|
- tracing
|
||||||
|
|
||||||
|
Tagging cumulative SDK releases as a whole (e.g. `v12.3.0`) is still enabled to support consumers of this repo that have not yet migrated to modules.
|
||||||
|
|
||||||
|
## License
|
||||||
|
|
||||||
|
See LICENSE file.
|
||||||
|
|
||||||
|
-----
|
||||||
|
|
||||||
|
This project has adopted the [Microsoft Open Source Code of
|
||||||
|
Conduct](https://opensource.microsoft.com/codeofconduct/). For more information
|
||||||
|
see the [Code of Conduct
|
||||||
|
FAQ](https://opensource.microsoft.com/codeofconduct/faq/) or contact
|
||||||
|
[opencode@microsoft.com](mailto:opencode@microsoft.com) with any additional
|
||||||
|
questions or comments.
|
|
@ -176,18 +176,7 @@
|
||||||
|
|
||||||
END OF TERMS AND CONDITIONS
|
END OF TERMS AND CONDITIONS
|
||||||
|
|
||||||
APPENDIX: How to apply the Apache License to your work.
|
Copyright 2015 Microsoft Corporation
|
||||||
|
|
||||||
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 2016 Microsoft Corporation
|
|
||||||
|
|
||||||
Licensed under the Apache License, Version 2.0 (the "License");
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
you may not use this file except in compliance with the License.
|
you may not use this file except in compliance with the License.
|
191
vendor/github.com/Azure/go-autorest/autorest/adal/LICENSE
generated
vendored
Normal file
191
vendor/github.com/Azure/go-autorest/autorest/adal/LICENSE
generated
vendored
Normal file
|
@ -0,0 +1,191 @@
|
||||||
|
|
||||||
|
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
|
||||||
|
|
||||||
|
Copyright 2015 Microsoft Corporation
|
||||||
|
|
||||||
|
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.
|
12
vendor/github.com/Azure/go-autorest/autorest/adal/README.md
generated
vendored
12
vendor/github.com/Azure/go-autorest/autorest/adal/README.md
generated
vendored
|
@ -135,7 +135,7 @@ resource := "https://management.core.windows.net/"
|
||||||
applicationSecret := "APPLICATION_SECRET"
|
applicationSecret := "APPLICATION_SECRET"
|
||||||
|
|
||||||
spt, err := adal.NewServicePrincipalToken(
|
spt, err := adal.NewServicePrincipalToken(
|
||||||
oauthConfig,
|
*oauthConfig,
|
||||||
appliationID,
|
appliationID,
|
||||||
applicationSecret,
|
applicationSecret,
|
||||||
resource,
|
resource,
|
||||||
|
@ -170,7 +170,7 @@ if err != nil {
|
||||||
}
|
}
|
||||||
|
|
||||||
spt, err := adal.NewServicePrincipalTokenFromCertificate(
|
spt, err := adal.NewServicePrincipalTokenFromCertificate(
|
||||||
oauthConfig,
|
*oauthConfig,
|
||||||
applicationID,
|
applicationID,
|
||||||
certificate,
|
certificate,
|
||||||
rsaPrivateKey,
|
rsaPrivateKey,
|
||||||
|
@ -195,7 +195,7 @@ oauthClient := &http.Client{}
|
||||||
// Acquire the device code
|
// Acquire the device code
|
||||||
deviceCode, err := adal.InitiateDeviceAuth(
|
deviceCode, err := adal.InitiateDeviceAuth(
|
||||||
oauthClient,
|
oauthClient,
|
||||||
oauthConfig,
|
*oauthConfig,
|
||||||
applicationID,
|
applicationID,
|
||||||
resource)
|
resource)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -212,7 +212,7 @@ if err != nil {
|
||||||
}
|
}
|
||||||
|
|
||||||
spt, err := adal.NewServicePrincipalTokenFromManualToken(
|
spt, err := adal.NewServicePrincipalTokenFromManualToken(
|
||||||
oauthConfig,
|
*oauthConfig,
|
||||||
applicationID,
|
applicationID,
|
||||||
resource,
|
resource,
|
||||||
*token,
|
*token,
|
||||||
|
@ -227,7 +227,7 @@ if (err == nil) {
|
||||||
|
|
||||||
```Go
|
```Go
|
||||||
spt, err := adal.NewServicePrincipalTokenFromUsernamePassword(
|
spt, err := adal.NewServicePrincipalTokenFromUsernamePassword(
|
||||||
oauthConfig,
|
*oauthConfig,
|
||||||
applicationID,
|
applicationID,
|
||||||
username,
|
username,
|
||||||
password,
|
password,
|
||||||
|
@ -243,7 +243,7 @@ if (err == nil) {
|
||||||
|
|
||||||
``` Go
|
``` Go
|
||||||
spt, err := adal.NewServicePrincipalTokenFromAuthorizationCode(
|
spt, err := adal.NewServicePrincipalTokenFromAuthorizationCode(
|
||||||
oauthConfig,
|
*oauthConfig,
|
||||||
applicationID,
|
applicationID,
|
||||||
clientSecret,
|
clientSecret,
|
||||||
authorizationCode,
|
authorizationCode,
|
||||||
|
|
88
vendor/github.com/Azure/go-autorest/autorest/adal/config.go
generated
vendored
88
vendor/github.com/Azure/go-autorest/autorest/adal/config.go
generated
vendored
|
@ -15,21 +15,22 @@ package adal
|
||||||
// limitations under the License.
|
// limitations under the License.
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"net/url"
|
"net/url"
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
activeDirectoryAPIVersion = "1.0"
|
activeDirectoryEndpointTemplate = "%s/oauth2/%s%s"
|
||||||
)
|
)
|
||||||
|
|
||||||
// OAuthConfig represents the endpoints needed
|
// OAuthConfig represents the endpoints needed
|
||||||
// in OAuth operations
|
// in OAuth operations
|
||||||
type OAuthConfig struct {
|
type OAuthConfig struct {
|
||||||
AuthorityEndpoint url.URL
|
AuthorityEndpoint url.URL `json:"authorityEndpoint"`
|
||||||
AuthorizeEndpoint url.URL
|
AuthorizeEndpoint url.URL `json:"authorizeEndpoint"`
|
||||||
TokenEndpoint url.URL
|
TokenEndpoint url.URL `json:"tokenEndpoint"`
|
||||||
DeviceCodeEndpoint url.URL
|
DeviceCodeEndpoint url.URL `json:"deviceCodeEndpoint"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// IsZero returns true if the OAuthConfig object is zero-initialized.
|
// IsZero returns true if the OAuthConfig object is zero-initialized.
|
||||||
|
@ -46,11 +47,24 @@ func validateStringParam(param, name string) error {
|
||||||
|
|
||||||
// NewOAuthConfig returns an OAuthConfig with tenant specific urls
|
// NewOAuthConfig returns an OAuthConfig with tenant specific urls
|
||||||
func NewOAuthConfig(activeDirectoryEndpoint, tenantID string) (*OAuthConfig, error) {
|
func NewOAuthConfig(activeDirectoryEndpoint, tenantID string) (*OAuthConfig, error) {
|
||||||
|
apiVer := "1.0"
|
||||||
|
return NewOAuthConfigWithAPIVersion(activeDirectoryEndpoint, tenantID, &apiVer)
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewOAuthConfigWithAPIVersion returns an OAuthConfig with tenant specific urls.
|
||||||
|
// If apiVersion is not nil the "api-version" query parameter will be appended to the endpoint URLs with the specified value.
|
||||||
|
func NewOAuthConfigWithAPIVersion(activeDirectoryEndpoint, tenantID string, apiVersion *string) (*OAuthConfig, error) {
|
||||||
if err := validateStringParam(activeDirectoryEndpoint, "activeDirectoryEndpoint"); err != nil {
|
if err := validateStringParam(activeDirectoryEndpoint, "activeDirectoryEndpoint"); err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
api := ""
|
||||||
// it's legal for tenantID to be empty so don't validate it
|
// it's legal for tenantID to be empty so don't validate it
|
||||||
const activeDirectoryEndpointTemplate = "%s/oauth2/%s?api-version=%s"
|
if apiVersion != nil {
|
||||||
|
if err := validateStringParam(*apiVersion, "apiVersion"); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
api = fmt.Sprintf("?api-version=%s", *apiVersion)
|
||||||
|
}
|
||||||
u, err := url.Parse(activeDirectoryEndpoint)
|
u, err := url.Parse(activeDirectoryEndpoint)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
|
@ -59,15 +73,15 @@ func NewOAuthConfig(activeDirectoryEndpoint, tenantID string) (*OAuthConfig, err
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
authorizeURL, err := u.Parse(fmt.Sprintf(activeDirectoryEndpointTemplate, tenantID, "authorize", activeDirectoryAPIVersion))
|
authorizeURL, err := u.Parse(fmt.Sprintf(activeDirectoryEndpointTemplate, tenantID, "authorize", api))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
tokenURL, err := u.Parse(fmt.Sprintf(activeDirectoryEndpointTemplate, tenantID, "token", activeDirectoryAPIVersion))
|
tokenURL, err := u.Parse(fmt.Sprintf(activeDirectoryEndpointTemplate, tenantID, "token", api))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
deviceCodeURL, err := u.Parse(fmt.Sprintf(activeDirectoryEndpointTemplate, tenantID, "devicecode", activeDirectoryAPIVersion))
|
deviceCodeURL, err := u.Parse(fmt.Sprintf(activeDirectoryEndpointTemplate, tenantID, "devicecode", api))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
@ -79,3 +93,59 @@ func NewOAuthConfig(activeDirectoryEndpoint, tenantID string) (*OAuthConfig, err
|
||||||
DeviceCodeEndpoint: *deviceCodeURL,
|
DeviceCodeEndpoint: *deviceCodeURL,
|
||||||
}, nil
|
}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// MultiTenantOAuthConfig provides endpoints for primary and aulixiary tenant IDs.
|
||||||
|
type MultiTenantOAuthConfig interface {
|
||||||
|
PrimaryTenant() *OAuthConfig
|
||||||
|
AuxiliaryTenants() []*OAuthConfig
|
||||||
|
}
|
||||||
|
|
||||||
|
// OAuthOptions contains optional OAuthConfig creation arguments.
|
||||||
|
type OAuthOptions struct {
|
||||||
|
APIVersion string
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c OAuthOptions) apiVersion() string {
|
||||||
|
if c.APIVersion != "" {
|
||||||
|
return fmt.Sprintf("?api-version=%s", c.APIVersion)
|
||||||
|
}
|
||||||
|
return "1.0"
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewMultiTenantOAuthConfig creates an object that support multitenant OAuth configuration.
|
||||||
|
// See https://docs.microsoft.com/en-us/azure/azure-resource-manager/authenticate-multi-tenant for more information.
|
||||||
|
func NewMultiTenantOAuthConfig(activeDirectoryEndpoint, primaryTenantID string, auxiliaryTenantIDs []string, options OAuthOptions) (MultiTenantOAuthConfig, error) {
|
||||||
|
if len(auxiliaryTenantIDs) == 0 || len(auxiliaryTenantIDs) > 3 {
|
||||||
|
return nil, errors.New("must specify one to three auxiliary tenants")
|
||||||
|
}
|
||||||
|
mtCfg := multiTenantOAuthConfig{
|
||||||
|
cfgs: make([]*OAuthConfig, len(auxiliaryTenantIDs)+1),
|
||||||
|
}
|
||||||
|
apiVer := options.apiVersion()
|
||||||
|
pri, err := NewOAuthConfigWithAPIVersion(activeDirectoryEndpoint, primaryTenantID, &apiVer)
|
||||||
|
if err != nil {
|
||||||
|
return nil, fmt.Errorf("failed to create OAuthConfig for primary tenant: %v", err)
|
||||||
|
}
|
||||||
|
mtCfg.cfgs[0] = pri
|
||||||
|
for i := range auxiliaryTenantIDs {
|
||||||
|
aux, err := NewOAuthConfig(activeDirectoryEndpoint, auxiliaryTenantIDs[i])
|
||||||
|
if err != nil {
|
||||||
|
return nil, fmt.Errorf("failed to create OAuthConfig for tenant '%s': %v", auxiliaryTenantIDs[i], err)
|
||||||
|
}
|
||||||
|
mtCfg.cfgs[i+1] = aux
|
||||||
|
}
|
||||||
|
return mtCfg, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
type multiTenantOAuthConfig struct {
|
||||||
|
// first config in the slice is the primary tenant
|
||||||
|
cfgs []*OAuthConfig
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m multiTenantOAuthConfig) PrimaryTenant() *OAuthConfig {
|
||||||
|
return m.cfgs[0]
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m multiTenantOAuthConfig) AuxiliaryTenants() []*OAuthConfig {
|
||||||
|
return m.cfgs[1:]
|
||||||
|
}
|
||||||
|
|
39
vendor/github.com/Azure/go-autorest/autorest/adal/devicetoken.go
generated
vendored
39
vendor/github.com/Azure/go-autorest/autorest/adal/devicetoken.go
generated
vendored
|
@ -24,6 +24,7 @@ package adal
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"context"
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"fmt"
|
"fmt"
|
||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
|
@ -101,7 +102,14 @@ type deviceToken struct {
|
||||||
|
|
||||||
// InitiateDeviceAuth initiates a device auth flow. It returns a DeviceCode
|
// InitiateDeviceAuth initiates a device auth flow. It returns a DeviceCode
|
||||||
// that can be used with CheckForUserCompletion or WaitForUserCompletion.
|
// that can be used with CheckForUserCompletion or WaitForUserCompletion.
|
||||||
|
// Deprecated: use InitiateDeviceAuthWithContext() instead.
|
||||||
func InitiateDeviceAuth(sender Sender, oauthConfig OAuthConfig, clientID, resource string) (*DeviceCode, error) {
|
func InitiateDeviceAuth(sender Sender, oauthConfig OAuthConfig, clientID, resource string) (*DeviceCode, error) {
|
||||||
|
return InitiateDeviceAuthWithContext(context.Background(), sender, oauthConfig, clientID, resource)
|
||||||
|
}
|
||||||
|
|
||||||
|
// InitiateDeviceAuthWithContext initiates a device auth flow. It returns a DeviceCode
|
||||||
|
// that can be used with CheckForUserCompletion or WaitForUserCompletion.
|
||||||
|
func InitiateDeviceAuthWithContext(ctx context.Context, sender Sender, oauthConfig OAuthConfig, clientID, resource string) (*DeviceCode, error) {
|
||||||
v := url.Values{
|
v := url.Values{
|
||||||
"client_id": []string{clientID},
|
"client_id": []string{clientID},
|
||||||
"resource": []string{resource},
|
"resource": []string{resource},
|
||||||
|
@ -117,7 +125,7 @@ func InitiateDeviceAuth(sender Sender, oauthConfig OAuthConfig, clientID, resour
|
||||||
|
|
||||||
req.ContentLength = int64(len(s))
|
req.ContentLength = int64(len(s))
|
||||||
req.Header.Set(contentType, mimeTypeFormPost)
|
req.Header.Set(contentType, mimeTypeFormPost)
|
||||||
resp, err := sender.Do(req)
|
resp, err := sender.Do(req.WithContext(ctx))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("%s %s: %s", logPrefix, errCodeSendingFails, err.Error())
|
return nil, fmt.Errorf("%s %s: %s", logPrefix, errCodeSendingFails, err.Error())
|
||||||
}
|
}
|
||||||
|
@ -151,7 +159,14 @@ func InitiateDeviceAuth(sender Sender, oauthConfig OAuthConfig, clientID, resour
|
||||||
|
|
||||||
// CheckForUserCompletion takes a DeviceCode and checks with the Azure AD OAuth endpoint
|
// CheckForUserCompletion takes a DeviceCode and checks with the Azure AD OAuth endpoint
|
||||||
// to see if the device flow has: been completed, timed out, or otherwise failed
|
// to see if the device flow has: been completed, timed out, or otherwise failed
|
||||||
|
// Deprecated: use CheckForUserCompletionWithContext() instead.
|
||||||
func CheckForUserCompletion(sender Sender, code *DeviceCode) (*Token, error) {
|
func CheckForUserCompletion(sender Sender, code *DeviceCode) (*Token, error) {
|
||||||
|
return CheckForUserCompletionWithContext(context.Background(), sender, code)
|
||||||
|
}
|
||||||
|
|
||||||
|
// CheckForUserCompletionWithContext takes a DeviceCode and checks with the Azure AD OAuth endpoint
|
||||||
|
// to see if the device flow has: been completed, timed out, or otherwise failed
|
||||||
|
func CheckForUserCompletionWithContext(ctx context.Context, sender Sender, code *DeviceCode) (*Token, error) {
|
||||||
v := url.Values{
|
v := url.Values{
|
||||||
"client_id": []string{code.ClientID},
|
"client_id": []string{code.ClientID},
|
||||||
"code": []string{*code.DeviceCode},
|
"code": []string{*code.DeviceCode},
|
||||||
|
@ -169,7 +184,7 @@ func CheckForUserCompletion(sender Sender, code *DeviceCode) (*Token, error) {
|
||||||
|
|
||||||
req.ContentLength = int64(len(s))
|
req.ContentLength = int64(len(s))
|
||||||
req.Header.Set(contentType, mimeTypeFormPost)
|
req.Header.Set(contentType, mimeTypeFormPost)
|
||||||
resp, err := sender.Do(req)
|
resp, err := sender.Do(req.WithContext(ctx))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("%s %s: %s", logPrefix, errTokenSendingFails, err.Error())
|
return nil, fmt.Errorf("%s %s: %s", logPrefix, errTokenSendingFails, err.Error())
|
||||||
}
|
}
|
||||||
|
@ -207,18 +222,29 @@ func CheckForUserCompletion(sender Sender, code *DeviceCode) (*Token, error) {
|
||||||
case "code_expired":
|
case "code_expired":
|
||||||
return nil, ErrDeviceCodeExpired
|
return nil, ErrDeviceCodeExpired
|
||||||
default:
|
default:
|
||||||
|
// return a more meaningful error message if available
|
||||||
|
if token.ErrorDescription != nil {
|
||||||
|
return nil, fmt.Errorf("%s %s: %s", logPrefix, *token.Error, *token.ErrorDescription)
|
||||||
|
}
|
||||||
return nil, ErrDeviceGeneric
|
return nil, ErrDeviceGeneric
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// WaitForUserCompletion calls CheckForUserCompletion repeatedly until a token is granted or an error state occurs.
|
// WaitForUserCompletion calls CheckForUserCompletion repeatedly until a token is granted or an error state occurs.
|
||||||
// This prevents the user from looping and checking against 'ErrDeviceAuthorizationPending'.
|
// This prevents the user from looping and checking against 'ErrDeviceAuthorizationPending'.
|
||||||
|
// Deprecated: use WaitForUserCompletionWithContext() instead.
|
||||||
func WaitForUserCompletion(sender Sender, code *DeviceCode) (*Token, error) {
|
func WaitForUserCompletion(sender Sender, code *DeviceCode) (*Token, error) {
|
||||||
|
return WaitForUserCompletionWithContext(context.Background(), sender, code)
|
||||||
|
}
|
||||||
|
|
||||||
|
// WaitForUserCompletionWithContext calls CheckForUserCompletion repeatedly until a token is granted or an error
|
||||||
|
// state occurs. This prevents the user from looping and checking against 'ErrDeviceAuthorizationPending'.
|
||||||
|
func WaitForUserCompletionWithContext(ctx context.Context, sender Sender, code *DeviceCode) (*Token, error) {
|
||||||
intervalDuration := time.Duration(*code.Interval) * time.Second
|
intervalDuration := time.Duration(*code.Interval) * time.Second
|
||||||
waitDuration := intervalDuration
|
waitDuration := intervalDuration
|
||||||
|
|
||||||
for {
|
for {
|
||||||
token, err := CheckForUserCompletion(sender, code)
|
token, err := CheckForUserCompletionWithContext(ctx, sender, code)
|
||||||
|
|
||||||
if err == nil {
|
if err == nil {
|
||||||
return token, nil
|
return token, nil
|
||||||
|
@ -237,6 +263,11 @@ func WaitForUserCompletion(sender Sender, code *DeviceCode) (*Token, error) {
|
||||||
return nil, fmt.Errorf("%s Error waiting for user to complete device flow. Server told us to slow_down too much", logPrefix)
|
return nil, fmt.Errorf("%s Error waiting for user to complete device flow. Server told us to slow_down too much", logPrefix)
|
||||||
}
|
}
|
||||||
|
|
||||||
time.Sleep(waitDuration)
|
select {
|
||||||
|
case <-time.After(waitDuration):
|
||||||
|
// noop
|
||||||
|
case <-ctx.Done():
|
||||||
|
return nil, ctx.Err()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
13
vendor/github.com/Azure/go-autorest/autorest/adal/go.mod
generated
vendored
Normal file
13
vendor/github.com/Azure/go-autorest/autorest/adal/go.mod
generated
vendored
Normal file
|
@ -0,0 +1,13 @@
|
||||||
|
module github.com/Azure/go-autorest/autorest/adal
|
||||||
|
|
||||||
|
go 1.15
|
||||||
|
|
||||||
|
require (
|
||||||
|
github.com/Azure/go-autorest v14.2.0+incompatible
|
||||||
|
github.com/Azure/go-autorest/autorest/date v0.3.0
|
||||||
|
github.com/Azure/go-autorest/autorest/mocks v0.4.1
|
||||||
|
github.com/Azure/go-autorest/logger v0.2.1
|
||||||
|
github.com/Azure/go-autorest/tracing v0.6.0
|
||||||
|
github.com/golang-jwt/jwt/v4 v4.0.0
|
||||||
|
golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0
|
||||||
|
)
|
19
vendor/github.com/Azure/go-autorest/autorest/adal/go.sum
generated
vendored
Normal file
19
vendor/github.com/Azure/go-autorest/autorest/adal/go.sum
generated
vendored
Normal file
|
@ -0,0 +1,19 @@
|
||||||
|
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/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/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/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/tracing v0.6.0 h1:TYi4+3m5t6K48TGI9AUdb+IzbnSxvnvUMfuitfgcfuo=
|
||||||
|
github.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBpUA79WCAKPPZVC2DeU=
|
||||||
|
github.com/golang-jwt/jwt/v4 v4.0.0 h1:RAqyYixv1p7uEnocuy8P1nru5wprCh/MH2BIlW5z5/o=
|
||||||
|
github.com/golang-jwt/jwt/v4 v4.0.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg=
|
||||||
|
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
|
||||||
|
golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0 h1:hb9wdF1z5waM+dSIICn1l0DkLVDT3hqhhQsDNUmHPRE=
|
||||||
|
golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
|
||||||
|
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
||||||
|
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||||
|
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
25
vendor/github.com/Azure/go-autorest/autorest/adal/go_mod_tidy_hack.go
generated
vendored
Normal file
25
vendor/github.com/Azure/go-autorest/autorest/adal/go_mod_tidy_hack.go
generated
vendored
Normal file
|
@ -0,0 +1,25 @@
|
||||||
|
//go:build modhack
|
||||||
|
// +build modhack
|
||||||
|
|
||||||
|
package adal
|
||||||
|
|
||||||
|
// Copyright 2017 Microsoft Corporation
|
||||||
|
//
|
||||||
|
// 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.
|
||||||
|
|
||||||
|
// This file, and the github.com/Azure/go-autorest import, won't actually become part of
|
||||||
|
// the resultant binary.
|
||||||
|
|
||||||
|
// Necessary for safely adding multi-module repo.
|
||||||
|
// See: https://github.com/golang/go/wiki/Modules#is-it-possible-to-add-a-module-to-a-multi-module-repository
|
||||||
|
import _ "github.com/Azure/go-autorest"
|
62
vendor/github.com/Azure/go-autorest/autorest/adal/persist.go
generated
vendored
62
vendor/github.com/Azure/go-autorest/autorest/adal/persist.go
generated
vendored
|
@ -15,11 +15,24 @@ package adal
|
||||||
// limitations under the License.
|
// limitations under the License.
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"crypto/rsa"
|
||||||
|
"crypto/x509"
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
"os"
|
"os"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
|
|
||||||
|
"golang.org/x/crypto/pkcs12"
|
||||||
|
)
|
||||||
|
|
||||||
|
var (
|
||||||
|
// ErrMissingCertificate is returned when no local certificate is found in the provided PFX data.
|
||||||
|
ErrMissingCertificate = errors.New("adal: certificate missing")
|
||||||
|
|
||||||
|
// ErrMissingPrivateKey is returned when no private key is found in the provided PFX data.
|
||||||
|
ErrMissingPrivateKey = errors.New("adal: private key missing")
|
||||||
)
|
)
|
||||||
|
|
||||||
// LoadToken restores a Token object from a file located at 'path'.
|
// LoadToken restores a Token object from a file located at 'path'.
|
||||||
|
@ -71,3 +84,52 @@ func SaveToken(path string, mode os.FileMode, token Token) error {
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// DecodePfxCertificateData extracts the x509 certificate and RSA private key from the provided PFX data.
|
||||||
|
// The PFX data must contain a private key along with a certificate whose public key matches that of the
|
||||||
|
// private key or an error is returned.
|
||||||
|
// If the private key is not password protected pass the empty string for password.
|
||||||
|
func DecodePfxCertificateData(pfxData []byte, password string) (*x509.Certificate, *rsa.PrivateKey, error) {
|
||||||
|
blocks, err := pkcs12.ToPEM(pfxData, password)
|
||||||
|
if err != nil {
|
||||||
|
return nil, nil, err
|
||||||
|
}
|
||||||
|
// first extract the private key
|
||||||
|
var priv *rsa.PrivateKey
|
||||||
|
for _, block := range blocks {
|
||||||
|
if block.Type == "PRIVATE KEY" {
|
||||||
|
priv, err = x509.ParsePKCS1PrivateKey(block.Bytes)
|
||||||
|
if err != nil {
|
||||||
|
return nil, nil, err
|
||||||
|
}
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if priv == nil {
|
||||||
|
return nil, nil, ErrMissingPrivateKey
|
||||||
|
}
|
||||||
|
// now find the certificate with the matching public key of our private key
|
||||||
|
var cert *x509.Certificate
|
||||||
|
for _, block := range blocks {
|
||||||
|
if block.Type == "CERTIFICATE" {
|
||||||
|
pcert, err := x509.ParseCertificate(block.Bytes)
|
||||||
|
if err != nil {
|
||||||
|
return nil, nil, err
|
||||||
|
}
|
||||||
|
certKey, ok := pcert.PublicKey.(*rsa.PublicKey)
|
||||||
|
if !ok {
|
||||||
|
// keep looking
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
if priv.E == certKey.E && priv.N.Cmp(certKey.N) == 0 {
|
||||||
|
// found a match
|
||||||
|
cert = pcert
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if cert == nil {
|
||||||
|
return nil, nil, ErrMissingCertificate
|
||||||
|
}
|
||||||
|
return cert, priv, nil
|
||||||
|
}
|
||||||
|
|
40
vendor/github.com/Azure/go-autorest/autorest/adal/sender.go
generated
vendored
40
vendor/github.com/Azure/go-autorest/autorest/adal/sender.go
generated
vendored
|
@ -15,7 +15,12 @@ package adal
|
||||||
// limitations under the License.
|
// limitations under the License.
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"crypto/tls"
|
||||||
"net/http"
|
"net/http"
|
||||||
|
"net/http/cookiejar"
|
||||||
|
"sync"
|
||||||
|
|
||||||
|
"github.com/Azure/go-autorest/tracing"
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
|
@ -23,6 +28,10 @@ const (
|
||||||
mimeTypeFormPost = "application/x-www-form-urlencoded"
|
mimeTypeFormPost = "application/x-www-form-urlencoded"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
// DO NOT ACCESS THIS DIRECTLY. go through sender()
|
||||||
|
var defaultSender Sender
|
||||||
|
var defaultSenderInit = &sync.Once{}
|
||||||
|
|
||||||
// Sender is the interface that wraps the Do method to send HTTP requests.
|
// Sender is the interface that wraps the Do method to send HTTP requests.
|
||||||
//
|
//
|
||||||
// The standard http.Client conforms to this interface.
|
// The standard http.Client conforms to this interface.
|
||||||
|
@ -38,14 +47,14 @@ func (sf SenderFunc) Do(r *http.Request) (*http.Response, error) {
|
||||||
return sf(r)
|
return sf(r)
|
||||||
}
|
}
|
||||||
|
|
||||||
// SendDecorator takes and possibily decorates, by wrapping, a Sender. Decorators may affect the
|
// SendDecorator takes and possibly decorates, by wrapping, a Sender. Decorators may affect the
|
||||||
// http.Request and pass it along or, first, pass the http.Request along then react to the
|
// http.Request and pass it along or, first, pass the http.Request along then react to the
|
||||||
// http.Response result.
|
// http.Response result.
|
||||||
type SendDecorator func(Sender) Sender
|
type SendDecorator func(Sender) Sender
|
||||||
|
|
||||||
// CreateSender creates, decorates, and returns, as a Sender, the default http.Client.
|
// CreateSender creates, decorates, and returns, as a Sender, the default http.Client.
|
||||||
func CreateSender(decorators ...SendDecorator) Sender {
|
func CreateSender(decorators ...SendDecorator) Sender {
|
||||||
return DecorateSender(&http.Client{}, decorators...)
|
return DecorateSender(sender(), decorators...)
|
||||||
}
|
}
|
||||||
|
|
||||||
// DecorateSender accepts a Sender and a, possibly empty, set of SendDecorators, which is applies to
|
// DecorateSender accepts a Sender and a, possibly empty, set of SendDecorators, which is applies to
|
||||||
|
@ -58,3 +67,30 @@ func DecorateSender(s Sender, decorators ...SendDecorator) Sender {
|
||||||
}
|
}
|
||||||
return s
|
return s
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func sender() Sender {
|
||||||
|
// note that we can't init defaultSender in init() since it will
|
||||||
|
// execute before calling code has had a chance to enable tracing
|
||||||
|
defaultSenderInit.Do(func() {
|
||||||
|
// Use behaviour compatible with DefaultTransport, but require TLS minimum version.
|
||||||
|
defaultTransport := http.DefaultTransport.(*http.Transport)
|
||||||
|
transport := &http.Transport{
|
||||||
|
Proxy: defaultTransport.Proxy,
|
||||||
|
DialContext: defaultTransport.DialContext,
|
||||||
|
MaxIdleConns: defaultTransport.MaxIdleConns,
|
||||||
|
IdleConnTimeout: defaultTransport.IdleConnTimeout,
|
||||||
|
TLSHandshakeTimeout: defaultTransport.TLSHandshakeTimeout,
|
||||||
|
ExpectContinueTimeout: defaultTransport.ExpectContinueTimeout,
|
||||||
|
TLSClientConfig: &tls.Config{
|
||||||
|
MinVersion: tls.VersionTLS12,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
var roundTripper http.RoundTripper = transport
|
||||||
|
if tracing.IsEnabled() {
|
||||||
|
roundTripper = tracing.NewTransport(transport)
|
||||||
|
}
|
||||||
|
j, _ := cookiejar.New(nil)
|
||||||
|
defaultSender = &http.Client{Jar: j, Transport: roundTripper}
|
||||||
|
})
|
||||||
|
return defaultSender
|
||||||
|
}
|
||||||
|
|
903
vendor/github.com/Azure/go-autorest/autorest/adal/token.go
generated
vendored
903
vendor/github.com/Azure/go-autorest/autorest/adal/token.go
generated
vendored
File diff suppressed because it is too large
Load diff
76
vendor/github.com/Azure/go-autorest/autorest/adal/token_1.13.go
generated
vendored
Normal file
76
vendor/github.com/Azure/go-autorest/autorest/adal/token_1.13.go
generated
vendored
Normal file
|
@ -0,0 +1,76 @@
|
||||||
|
//go:build go1.13
|
||||||
|
// +build go1.13
|
||||||
|
|
||||||
|
// Copyright 2017 Microsoft Corporation
|
||||||
|
//
|
||||||
|
// 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 adal
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"fmt"
|
||||||
|
"net/http"
|
||||||
|
"time"
|
||||||
|
)
|
||||||
|
|
||||||
|
func getMSIEndpoint(ctx context.Context, sender Sender) (*http.Response, error) {
|
||||||
|
tempCtx, cancel := context.WithTimeout(ctx, 500*time.Millisecond)
|
||||||
|
defer cancel()
|
||||||
|
// http.NewRequestWithContext() was added in Go 1.13
|
||||||
|
req, _ := http.NewRequestWithContext(tempCtx, http.MethodGet, msiEndpoint, nil)
|
||||||
|
q := req.URL.Query()
|
||||||
|
q.Add("api-version", msiAPIVersion)
|
||||||
|
req.URL.RawQuery = q.Encode()
|
||||||
|
return sender.Do(req)
|
||||||
|
}
|
||||||
|
|
||||||
|
// EnsureFreshWithContext will refresh the token if it will expire within the refresh window (as set by
|
||||||
|
// RefreshWithin) and autoRefresh flag is on. This method is safe for concurrent use.
|
||||||
|
func (mt *MultiTenantServicePrincipalToken) EnsureFreshWithContext(ctx context.Context) error {
|
||||||
|
if err := mt.PrimaryToken.EnsureFreshWithContext(ctx); err != nil {
|
||||||
|
return fmt.Errorf("failed to refresh primary token: %w", err)
|
||||||
|
}
|
||||||
|
for _, aux := range mt.AuxiliaryTokens {
|
||||||
|
if err := aux.EnsureFreshWithContext(ctx); err != nil {
|
||||||
|
return fmt.Errorf("failed to refresh auxiliary token: %w", err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// RefreshWithContext obtains a fresh token for the Service Principal.
|
||||||
|
func (mt *MultiTenantServicePrincipalToken) RefreshWithContext(ctx context.Context) error {
|
||||||
|
if err := mt.PrimaryToken.RefreshWithContext(ctx); err != nil {
|
||||||
|
return fmt.Errorf("failed to refresh primary token: %w", err)
|
||||||
|
}
|
||||||
|
for _, aux := range mt.AuxiliaryTokens {
|
||||||
|
if err := aux.RefreshWithContext(ctx); err != nil {
|
||||||
|
return fmt.Errorf("failed to refresh auxiliary token: %w", err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// RefreshExchangeWithContext refreshes the token, but for a different resource.
|
||||||
|
func (mt *MultiTenantServicePrincipalToken) RefreshExchangeWithContext(ctx context.Context, resource string) error {
|
||||||
|
if err := mt.PrimaryToken.RefreshExchangeWithContext(ctx, resource); err != nil {
|
||||||
|
return fmt.Errorf("failed to refresh primary token: %w", err)
|
||||||
|
}
|
||||||
|
for _, aux := range mt.AuxiliaryTokens {
|
||||||
|
if err := aux.RefreshExchangeWithContext(ctx, resource); err != nil {
|
||||||
|
return fmt.Errorf("failed to refresh auxiliary token: %w", err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
75
vendor/github.com/Azure/go-autorest/autorest/adal/token_legacy.go
generated
vendored
Normal file
75
vendor/github.com/Azure/go-autorest/autorest/adal/token_legacy.go
generated
vendored
Normal file
|
@ -0,0 +1,75 @@
|
||||||
|
//go:build !go1.13
|
||||||
|
// +build !go1.13
|
||||||
|
|
||||||
|
// Copyright 2017 Microsoft Corporation
|
||||||
|
//
|
||||||
|
// 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 adal
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"net/http"
|
||||||
|
"time"
|
||||||
|
)
|
||||||
|
|
||||||
|
func getMSIEndpoint(ctx context.Context, sender Sender) (*http.Response, error) {
|
||||||
|
tempCtx, cancel := context.WithTimeout(ctx, 500*time.Millisecond)
|
||||||
|
defer cancel()
|
||||||
|
req, _ := http.NewRequest(http.MethodGet, msiEndpoint, nil)
|
||||||
|
req = req.WithContext(tempCtx)
|
||||||
|
q := req.URL.Query()
|
||||||
|
q.Add("api-version", msiAPIVersion)
|
||||||
|
req.URL.RawQuery = q.Encode()
|
||||||
|
return sender.Do(req)
|
||||||
|
}
|
||||||
|
|
||||||
|
// EnsureFreshWithContext will refresh the token if it will expire within the refresh window (as set by
|
||||||
|
// RefreshWithin) and autoRefresh flag is on. This method is safe for concurrent use.
|
||||||
|
func (mt *MultiTenantServicePrincipalToken) EnsureFreshWithContext(ctx context.Context) error {
|
||||||
|
if err := mt.PrimaryToken.EnsureFreshWithContext(ctx); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
for _, aux := range mt.AuxiliaryTokens {
|
||||||
|
if err := aux.EnsureFreshWithContext(ctx); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// RefreshWithContext obtains a fresh token for the Service Principal.
|
||||||
|
func (mt *MultiTenantServicePrincipalToken) RefreshWithContext(ctx context.Context) error {
|
||||||
|
if err := mt.PrimaryToken.RefreshWithContext(ctx); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
for _, aux := range mt.AuxiliaryTokens {
|
||||||
|
if err := aux.RefreshWithContext(ctx); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// RefreshExchangeWithContext refreshes the token, but for a different resource.
|
||||||
|
func (mt *MultiTenantServicePrincipalToken) RefreshExchangeWithContext(ctx context.Context, resource string) error {
|
||||||
|
if err := mt.PrimaryToken.RefreshExchangeWithContext(ctx, resource); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
for _, aux := range mt.AuxiliaryTokens {
|
||||||
|
if err := aux.RefreshExchangeWithContext(ctx, resource); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
45
vendor/github.com/Azure/go-autorest/autorest/adal/version.go
generated
vendored
Normal file
45
vendor/github.com/Azure/go-autorest/autorest/adal/version.go
generated
vendored
Normal file
|
@ -0,0 +1,45 @@
|
||||||
|
package adal
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"runtime"
|
||||||
|
)
|
||||||
|
|
||||||
|
// Copyright 2017 Microsoft Corporation
|
||||||
|
//
|
||||||
|
// 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.
|
||||||
|
|
||||||
|
const number = "v1.0.0"
|
||||||
|
|
||||||
|
var (
|
||||||
|
ua = fmt.Sprintf("Go/%s (%s-%s) go-autorest/adal/%s",
|
||||||
|
runtime.Version(),
|
||||||
|
runtime.GOARCH,
|
||||||
|
runtime.GOOS,
|
||||||
|
number,
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
// UserAgent returns a string containing the Go version, system architecture and OS, and the adal version.
|
||||||
|
func UserAgent() string {
|
||||||
|
return ua
|
||||||
|
}
|
||||||
|
|
||||||
|
// AddToUserAgent adds an extension to the current user agent
|
||||||
|
func AddToUserAgent(extension string) error {
|
||||||
|
if extension != "" {
|
||||||
|
ua = fmt.Sprintf("%s %s", ua, extension)
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
return fmt.Errorf("Extension was empty, User Agent remained as '%s'", ua)
|
||||||
|
}
|
122
vendor/github.com/Azure/go-autorest/autorest/authorization.go
generated
vendored
122
vendor/github.com/Azure/go-autorest/autorest/authorization.go
generated
vendored
|
@ -15,6 +15,8 @@ package autorest
|
||||||
// limitations under the License.
|
// limitations under the License.
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"crypto/tls"
|
||||||
|
"encoding/base64"
|
||||||
"fmt"
|
"fmt"
|
||||||
"net/http"
|
"net/http"
|
||||||
"net/url"
|
"net/url"
|
||||||
|
@ -30,6 +32,8 @@ const (
|
||||||
apiKeyAuthorizerHeader = "Ocp-Apim-Subscription-Key"
|
apiKeyAuthorizerHeader = "Ocp-Apim-Subscription-Key"
|
||||||
bingAPISdkHeader = "X-BingApis-SDK-Client"
|
bingAPISdkHeader = "X-BingApis-SDK-Client"
|
||||||
golangBingAPISdkHeaderValue = "Go-SDK"
|
golangBingAPISdkHeaderValue = "Go-SDK"
|
||||||
|
authorization = "Authorization"
|
||||||
|
basic = "Basic"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Authorizer is the interface that provides a PrepareDecorator used to supply request
|
// Authorizer is the interface that provides a PrepareDecorator used to supply request
|
||||||
|
@ -68,7 +72,7 @@ func NewAPIKeyAuthorizer(headers map[string]interface{}, queryParameters map[str
|
||||||
return &APIKeyAuthorizer{headers: headers, queryParameters: queryParameters}
|
return &APIKeyAuthorizer{headers: headers, queryParameters: queryParameters}
|
||||||
}
|
}
|
||||||
|
|
||||||
// WithAuthorization returns a PrepareDecorator that adds an HTTP headers and Query Paramaters
|
// WithAuthorization returns a PrepareDecorator that adds an HTTP headers and Query Parameters.
|
||||||
func (aka *APIKeyAuthorizer) WithAuthorization() PrepareDecorator {
|
func (aka *APIKeyAuthorizer) WithAuthorization() PrepareDecorator {
|
||||||
return func(p Preparer) Preparer {
|
return func(p Preparer) Preparer {
|
||||||
return DecoratePreparer(p, WithHeaders(aka.headers), WithQueryParameters(aka.queryParameters))
|
return DecoratePreparer(p, WithHeaders(aka.headers), WithQueryParameters(aka.queryParameters))
|
||||||
|
@ -134,6 +138,11 @@ func (ba *BearerAuthorizer) WithAuthorization() PrepareDecorator {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TokenProvider returns OAuthTokenProvider so that it can be used for authorization outside the REST.
|
||||||
|
func (ba *BearerAuthorizer) TokenProvider() adal.OAuthTokenProvider {
|
||||||
|
return ba.tokenProvider
|
||||||
|
}
|
||||||
|
|
||||||
// BearerAuthorizerCallbackFunc is the authentication callback signature.
|
// BearerAuthorizerCallbackFunc is the authentication callback signature.
|
||||||
type BearerAuthorizerCallbackFunc func(tenantID, resource string) (*BearerAuthorizer, error)
|
type BearerAuthorizerCallbackFunc func(tenantID, resource string) (*BearerAuthorizer, error)
|
||||||
|
|
||||||
|
@ -145,11 +154,11 @@ type BearerAuthorizerCallback struct {
|
||||||
|
|
||||||
// NewBearerAuthorizerCallback creates a bearer authorization callback. The callback
|
// NewBearerAuthorizerCallback creates a bearer authorization callback. The callback
|
||||||
// is invoked when the HTTP request is submitted.
|
// is invoked when the HTTP request is submitted.
|
||||||
func NewBearerAuthorizerCallback(sender Sender, callback BearerAuthorizerCallbackFunc) *BearerAuthorizerCallback {
|
func NewBearerAuthorizerCallback(s Sender, callback BearerAuthorizerCallbackFunc) *BearerAuthorizerCallback {
|
||||||
if sender == nil {
|
if s == nil {
|
||||||
sender = &http.Client{}
|
s = sender(tls.RenegotiateNever)
|
||||||
}
|
}
|
||||||
return &BearerAuthorizerCallback{sender: sender, callback: callback}
|
return &BearerAuthorizerCallback{sender: s, callback: callback}
|
||||||
}
|
}
|
||||||
|
|
||||||
// WithAuthorization returns a PrepareDecorator that adds an HTTP Authorization header whose value
|
// WithAuthorization returns a PrepareDecorator that adds an HTTP Authorization header whose value
|
||||||
|
@ -167,10 +176,12 @@ func (bacb *BearerAuthorizerCallback) WithAuthorization() PrepareDecorator {
|
||||||
removeRequestBody(&rCopy)
|
removeRequestBody(&rCopy)
|
||||||
|
|
||||||
resp, err := bacb.sender.Do(&rCopy)
|
resp, err := bacb.sender.Do(&rCopy)
|
||||||
if err == nil && resp.StatusCode == 401 {
|
if err != nil {
|
||||||
defer resp.Body.Close()
|
return r, err
|
||||||
if hasBearerChallenge(resp) {
|
}
|
||||||
bc, err := newBearerChallenge(resp)
|
DrainResponseBody(resp)
|
||||||
|
if resp.StatusCode == 401 && hasBearerChallenge(resp.Header) {
|
||||||
|
bc, err := newBearerChallenge(resp.Header)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return r, err
|
return r, err
|
||||||
}
|
}
|
||||||
|
@ -183,15 +194,14 @@ func (bacb *BearerAuthorizerCallback) WithAuthorization() PrepareDecorator {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
return r, err
|
return r, err
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// returns true if the HTTP response contains a bearer challenge
|
// returns true if the HTTP response contains a bearer challenge
|
||||||
func hasBearerChallenge(resp *http.Response) bool {
|
func hasBearerChallenge(header http.Header) bool {
|
||||||
authHeader := resp.Header.Get(bearerChallengeHeader)
|
authHeader := header.Get(bearerChallengeHeader)
|
||||||
if len(authHeader) == 0 || strings.Index(authHeader, bearer) < 0 {
|
if len(authHeader) == 0 || strings.Index(authHeader, bearer) < 0 {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
@ -202,8 +212,8 @@ type bearerChallenge struct {
|
||||||
values map[string]string
|
values map[string]string
|
||||||
}
|
}
|
||||||
|
|
||||||
func newBearerChallenge(resp *http.Response) (bc bearerChallenge, err error) {
|
func newBearerChallenge(header http.Header) (bc bearerChallenge, err error) {
|
||||||
challenge := strings.TrimSpace(resp.Header.Get(bearerChallengeHeader))
|
challenge := strings.TrimSpace(header.Get(bearerChallengeHeader))
|
||||||
trimmedChallenge := challenge[len(bearer)+1:]
|
trimmedChallenge := challenge[len(bearer)+1:]
|
||||||
|
|
||||||
// challenge is a set of key=value pairs that are comma delimited
|
// challenge is a set of key=value pairs that are comma delimited
|
||||||
|
@ -257,3 +267,87 @@ func (egta EventGridKeyAuthorizer) WithAuthorization() PrepareDecorator {
|
||||||
}
|
}
|
||||||
return NewAPIKeyAuthorizerWithHeaders(headers).WithAuthorization()
|
return NewAPIKeyAuthorizerWithHeaders(headers).WithAuthorization()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// BasicAuthorizer implements basic HTTP authorization by adding the Authorization HTTP header
|
||||||
|
// with the value "Basic <TOKEN>" where <TOKEN> is a base64-encoded username:password tuple.
|
||||||
|
type BasicAuthorizer struct {
|
||||||
|
userName string
|
||||||
|
password string
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewBasicAuthorizer creates a new BasicAuthorizer with the specified username and password.
|
||||||
|
func NewBasicAuthorizer(userName, password string) *BasicAuthorizer {
|
||||||
|
return &BasicAuthorizer{
|
||||||
|
userName: userName,
|
||||||
|
password: password,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// WithAuthorization returns a PrepareDecorator that adds an HTTP Authorization header whose
|
||||||
|
// value is "Basic " followed by the base64-encoded username:password tuple.
|
||||||
|
func (ba *BasicAuthorizer) WithAuthorization() PrepareDecorator {
|
||||||
|
headers := make(map[string]interface{})
|
||||||
|
headers[authorization] = basic + " " + base64.StdEncoding.EncodeToString([]byte(fmt.Sprintf("%s:%s", ba.userName, ba.password)))
|
||||||
|
|
||||||
|
return NewAPIKeyAuthorizerWithHeaders(headers).WithAuthorization()
|
||||||
|
}
|
||||||
|
|
||||||
|
// MultiTenantServicePrincipalTokenAuthorizer provides authentication across tenants.
|
||||||
|
type MultiTenantServicePrincipalTokenAuthorizer interface {
|
||||||
|
WithAuthorization() PrepareDecorator
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewMultiTenantServicePrincipalTokenAuthorizer crates a BearerAuthorizer using the given token provider
|
||||||
|
func NewMultiTenantServicePrincipalTokenAuthorizer(tp adal.MultitenantOAuthTokenProvider) MultiTenantServicePrincipalTokenAuthorizer {
|
||||||
|
return NewMultiTenantBearerAuthorizer(tp)
|
||||||
|
}
|
||||||
|
|
||||||
|
// MultiTenantBearerAuthorizer implements bearer authorization across multiple tenants.
|
||||||
|
type MultiTenantBearerAuthorizer struct {
|
||||||
|
tp adal.MultitenantOAuthTokenProvider
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewMultiTenantBearerAuthorizer creates a MultiTenantBearerAuthorizer using the given token provider.
|
||||||
|
func NewMultiTenantBearerAuthorizer(tp adal.MultitenantOAuthTokenProvider) *MultiTenantBearerAuthorizer {
|
||||||
|
return &MultiTenantBearerAuthorizer{tp: tp}
|
||||||
|
}
|
||||||
|
|
||||||
|
// WithAuthorization returns a PrepareDecorator that adds an HTTP Authorization header using the
|
||||||
|
// primary token along with the auxiliary authorization header using the auxiliary tokens.
|
||||||
|
//
|
||||||
|
// By default, the token will be automatically refreshed through the Refresher interface.
|
||||||
|
func (mt *MultiTenantBearerAuthorizer) WithAuthorization() PrepareDecorator {
|
||||||
|
return func(p Preparer) Preparer {
|
||||||
|
return PreparerFunc(func(r *http.Request) (*http.Request, error) {
|
||||||
|
r, err := p.Prepare(r)
|
||||||
|
if err != nil {
|
||||||
|
return r, err
|
||||||
|
}
|
||||||
|
if refresher, ok := mt.tp.(adal.RefresherWithContext); ok {
|
||||||
|
err = refresher.EnsureFreshWithContext(r.Context())
|
||||||
|
if err != nil {
|
||||||
|
var resp *http.Response
|
||||||
|
if tokError, ok := err.(adal.TokenRefreshError); ok {
|
||||||
|
resp = tokError.Response()
|
||||||
|
}
|
||||||
|
return r, NewErrorWithError(err, "azure.multiTenantSPTAuthorizer", "WithAuthorization", resp,
|
||||||
|
"Failed to refresh one or more Tokens for request to %s", r.URL)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
r, err = Prepare(r, WithHeader(headerAuthorization, fmt.Sprintf("Bearer %s", mt.tp.PrimaryOAuthToken())))
|
||||||
|
if err != nil {
|
||||||
|
return r, err
|
||||||
|
}
|
||||||
|
auxTokens := mt.tp.AuxiliaryOAuthTokens()
|
||||||
|
for i := range auxTokens {
|
||||||
|
auxTokens[i] = fmt.Sprintf("Bearer %s", auxTokens[i])
|
||||||
|
}
|
||||||
|
return Prepare(r, WithHeader(headerAuxAuthorization, strings.Join(auxTokens, ", ")))
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// TokenProvider returns the underlying MultitenantOAuthTokenProvider for this authorizer.
|
||||||
|
func (mt *MultiTenantBearerAuthorizer) TokenProvider() adal.MultitenantOAuthTokenProvider {
|
||||||
|
return mt.tp
|
||||||
|
}
|
||||||
|
|
66
vendor/github.com/Azure/go-autorest/autorest/authorization_sas.go
generated
vendored
Normal file
66
vendor/github.com/Azure/go-autorest/autorest/authorization_sas.go
generated
vendored
Normal file
|
@ -0,0 +1,66 @@
|
||||||
|
package autorest
|
||||||
|
|
||||||
|
// Copyright 2017 Microsoft Corporation
|
||||||
|
//
|
||||||
|
// 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.
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"net/http"
|
||||||
|
"strings"
|
||||||
|
)
|
||||||
|
|
||||||
|
// SASTokenAuthorizer implements an authorization for SAS Token Authentication
|
||||||
|
// this can be used for interaction with Blob Storage Endpoints
|
||||||
|
type SASTokenAuthorizer struct {
|
||||||
|
sasToken string
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewSASTokenAuthorizer creates a SASTokenAuthorizer using the given credentials
|
||||||
|
func NewSASTokenAuthorizer(sasToken string) (*SASTokenAuthorizer, error) {
|
||||||
|
if strings.TrimSpace(sasToken) == "" {
|
||||||
|
return nil, fmt.Errorf("sasToken cannot be empty")
|
||||||
|
}
|
||||||
|
|
||||||
|
token := sasToken
|
||||||
|
if strings.HasPrefix(sasToken, "?") {
|
||||||
|
token = strings.TrimPrefix(sasToken, "?")
|
||||||
|
}
|
||||||
|
|
||||||
|
return &SASTokenAuthorizer{
|
||||||
|
sasToken: token,
|
||||||
|
}, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// WithAuthorization returns a PrepareDecorator that adds a shared access signature token to the
|
||||||
|
// URI's query parameters. This can be used for the Blob, Queue, and File Services.
|
||||||
|
//
|
||||||
|
// See https://docs.microsoft.com/en-us/rest/api/storageservices/delegate-access-with-shared-access-signature
|
||||||
|
func (sas *SASTokenAuthorizer) WithAuthorization() PrepareDecorator {
|
||||||
|
return func(p Preparer) Preparer {
|
||||||
|
return PreparerFunc(func(r *http.Request) (*http.Request, error) {
|
||||||
|
r, err := p.Prepare(r)
|
||||||
|
if err != nil {
|
||||||
|
return r, err
|
||||||
|
}
|
||||||
|
|
||||||
|
if r.URL.RawQuery == "" {
|
||||||
|
r.URL.RawQuery = sas.sasToken
|
||||||
|
} else if !strings.Contains(r.URL.RawQuery, sas.sasToken) {
|
||||||
|
r.URL.RawQuery = fmt.Sprintf("%s&%s", r.URL.RawQuery, sas.sasToken)
|
||||||
|
}
|
||||||
|
|
||||||
|
return Prepare(r)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
307
vendor/github.com/Azure/go-autorest/autorest/authorization_storage.go
generated
vendored
Normal file
307
vendor/github.com/Azure/go-autorest/autorest/authorization_storage.go
generated
vendored
Normal file
|
@ -0,0 +1,307 @@
|
||||||
|
package autorest
|
||||||
|
|
||||||
|
// Copyright 2017 Microsoft Corporation
|
||||||
|
//
|
||||||
|
// 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.
|
||||||
|
|
||||||
|
import (
|
||||||
|
"bytes"
|
||||||
|
"crypto/hmac"
|
||||||
|
"crypto/sha256"
|
||||||
|
"encoding/base64"
|
||||||
|
"fmt"
|
||||||
|
"net/http"
|
||||||
|
"net/url"
|
||||||
|
"sort"
|
||||||
|
"strings"
|
||||||
|
"time"
|
||||||
|
)
|
||||||
|
|
||||||
|
// SharedKeyType defines the enumeration for the various shared key types.
|
||||||
|
// See https://docs.microsoft.com/en-us/rest/api/storageservices/authorize-with-shared-key for details on the shared key types.
|
||||||
|
type SharedKeyType string
|
||||||
|
|
||||||
|
const (
|
||||||
|
// SharedKey is used to authorize against blobs, files and queues services.
|
||||||
|
SharedKey SharedKeyType = "sharedKey"
|
||||||
|
|
||||||
|
// SharedKeyForTable is used to authorize against the table service.
|
||||||
|
SharedKeyForTable SharedKeyType = "sharedKeyTable"
|
||||||
|
|
||||||
|
// SharedKeyLite is used to authorize against blobs, files and queues services. It's provided for
|
||||||
|
// backwards compatibility with API versions before 2009-09-19. Prefer SharedKey instead.
|
||||||
|
SharedKeyLite SharedKeyType = "sharedKeyLite"
|
||||||
|
|
||||||
|
// SharedKeyLiteForTable is used to authorize against the table service. It's provided for
|
||||||
|
// backwards compatibility with older table API versions. Prefer SharedKeyForTable instead.
|
||||||
|
SharedKeyLiteForTable SharedKeyType = "sharedKeyLiteTable"
|
||||||
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
headerAccept = "Accept"
|
||||||
|
headerAcceptCharset = "Accept-Charset"
|
||||||
|
headerContentEncoding = "Content-Encoding"
|
||||||
|
headerContentLength = "Content-Length"
|
||||||
|
headerContentMD5 = "Content-MD5"
|
||||||
|
headerContentLanguage = "Content-Language"
|
||||||
|
headerIfModifiedSince = "If-Modified-Since"
|
||||||
|
headerIfMatch = "If-Match"
|
||||||
|
headerIfNoneMatch = "If-None-Match"
|
||||||
|
headerIfUnmodifiedSince = "If-Unmodified-Since"
|
||||||
|
headerDate = "Date"
|
||||||
|
headerXMSDate = "X-Ms-Date"
|
||||||
|
headerXMSVersion = "x-ms-version"
|
||||||
|
headerRange = "Range"
|
||||||
|
)
|
||||||
|
|
||||||
|
const storageEmulatorAccountName = "devstoreaccount1"
|
||||||
|
|
||||||
|
// SharedKeyAuthorizer implements an authorization for Shared Key
|
||||||
|
// this can be used for interaction with Blob, File and Queue Storage Endpoints
|
||||||
|
type SharedKeyAuthorizer struct {
|
||||||
|
accountName string
|
||||||
|
accountKey []byte
|
||||||
|
keyType SharedKeyType
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewSharedKeyAuthorizer creates a SharedKeyAuthorizer using the provided credentials and shared key type.
|
||||||
|
func NewSharedKeyAuthorizer(accountName, accountKey string, keyType SharedKeyType) (*SharedKeyAuthorizer, error) {
|
||||||
|
key, err := base64.StdEncoding.DecodeString(accountKey)
|
||||||
|
if err != nil {
|
||||||
|
return nil, fmt.Errorf("malformed storage account key: %v", err)
|
||||||
|
}
|
||||||
|
return &SharedKeyAuthorizer{
|
||||||
|
accountName: accountName,
|
||||||
|
accountKey: key,
|
||||||
|
keyType: keyType,
|
||||||
|
}, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// WithAuthorization returns a PrepareDecorator that adds an HTTP Authorization header whose
|
||||||
|
// value is "<SharedKeyType> " followed by the computed key.
|
||||||
|
// This can be used for the Blob, Queue, and File Services
|
||||||
|
//
|
||||||
|
// from: https://docs.microsoft.com/en-us/rest/api/storageservices/authorize-with-shared-key
|
||||||
|
// You may use Shared Key authorization to authorize a request made against the
|
||||||
|
// 2009-09-19 version and later of the Blob and Queue services,
|
||||||
|
// and version 2014-02-14 and later of the File services.
|
||||||
|
func (sk *SharedKeyAuthorizer) WithAuthorization() PrepareDecorator {
|
||||||
|
return func(p Preparer) Preparer {
|
||||||
|
return PreparerFunc(func(r *http.Request) (*http.Request, error) {
|
||||||
|
r, err := p.Prepare(r)
|
||||||
|
if err != nil {
|
||||||
|
return r, err
|
||||||
|
}
|
||||||
|
|
||||||
|
sk, err := buildSharedKey(sk.accountName, sk.accountKey, r, sk.keyType)
|
||||||
|
if err != nil {
|
||||||
|
return r, err
|
||||||
|
}
|
||||||
|
return Prepare(r, WithHeader(headerAuthorization, sk))
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func buildSharedKey(accName string, accKey []byte, req *http.Request, keyType SharedKeyType) (string, error) {
|
||||||
|
canRes, err := buildCanonicalizedResource(accName, req.URL.String(), keyType)
|
||||||
|
if err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
|
||||||
|
if req.Header == nil {
|
||||||
|
req.Header = http.Header{}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ensure date is set
|
||||||
|
if req.Header.Get(headerDate) == "" && req.Header.Get(headerXMSDate) == "" {
|
||||||
|
date := time.Now().UTC().Format(http.TimeFormat)
|
||||||
|
req.Header.Set(headerXMSDate, date)
|
||||||
|
}
|
||||||
|
canString, err := buildCanonicalizedString(req.Method, req.Header, canRes, keyType)
|
||||||
|
if err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
return createAuthorizationHeader(accName, accKey, canString, keyType), nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func buildCanonicalizedResource(accountName, uri string, keyType SharedKeyType) (string, error) {
|
||||||
|
errMsg := "buildCanonicalizedResource error: %s"
|
||||||
|
u, err := url.Parse(uri)
|
||||||
|
if err != nil {
|
||||||
|
return "", fmt.Errorf(errMsg, err.Error())
|
||||||
|
}
|
||||||
|
|
||||||
|
cr := bytes.NewBufferString("")
|
||||||
|
if accountName != storageEmulatorAccountName {
|
||||||
|
cr.WriteString("/")
|
||||||
|
cr.WriteString(getCanonicalizedAccountName(accountName))
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(u.Path) > 0 {
|
||||||
|
// Any portion of the CanonicalizedResource string that is derived from
|
||||||
|
// the resource's URI should be encoded exactly as it is in the URI.
|
||||||
|
// -- https://msdn.microsoft.com/en-gb/library/azure/dd179428.aspx
|
||||||
|
cr.WriteString(u.EscapedPath())
|
||||||
|
} else {
|
||||||
|
// a slash is required to indicate the root path
|
||||||
|
cr.WriteString("/")
|
||||||
|
}
|
||||||
|
|
||||||
|
params, err := url.ParseQuery(u.RawQuery)
|
||||||
|
if err != nil {
|
||||||
|
return "", fmt.Errorf(errMsg, err.Error())
|
||||||
|
}
|
||||||
|
|
||||||
|
// See https://github.com/Azure/azure-storage-net/blob/master/Lib/Common/Core/Util/AuthenticationUtility.cs#L277
|
||||||
|
if keyType == SharedKey {
|
||||||
|
if len(params) > 0 {
|
||||||
|
cr.WriteString("\n")
|
||||||
|
|
||||||
|
keys := []string{}
|
||||||
|
for key := range params {
|
||||||
|
keys = append(keys, key)
|
||||||
|
}
|
||||||
|
sort.Strings(keys)
|
||||||
|
|
||||||
|
completeParams := []string{}
|
||||||
|
for _, key := range keys {
|
||||||
|
if len(params[key]) > 1 {
|
||||||
|
sort.Strings(params[key])
|
||||||
|
}
|
||||||
|
|
||||||
|
completeParams = append(completeParams, fmt.Sprintf("%s:%s", key, strings.Join(params[key], ",")))
|
||||||
|
}
|
||||||
|
cr.WriteString(strings.Join(completeParams, "\n"))
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// search for "comp" parameter, if exists then add it to canonicalizedresource
|
||||||
|
if v, ok := params["comp"]; ok {
|
||||||
|
cr.WriteString("?comp=" + v[0])
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return string(cr.Bytes()), nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func getCanonicalizedAccountName(accountName string) string {
|
||||||
|
// since we may be trying to access a secondary storage account, we need to
|
||||||
|
// remove the -secondary part of the storage name
|
||||||
|
return strings.TrimSuffix(accountName, "-secondary")
|
||||||
|
}
|
||||||
|
|
||||||
|
func buildCanonicalizedString(verb string, headers http.Header, canonicalizedResource string, keyType SharedKeyType) (string, error) {
|
||||||
|
contentLength := headers.Get(headerContentLength)
|
||||||
|
if contentLength == "0" {
|
||||||
|
contentLength = ""
|
||||||
|
}
|
||||||
|
date := headers.Get(headerDate)
|
||||||
|
if v := headers.Get(headerXMSDate); v != "" {
|
||||||
|
if keyType == SharedKey || keyType == SharedKeyLite {
|
||||||
|
date = ""
|
||||||
|
} else {
|
||||||
|
date = v
|
||||||
|
}
|
||||||
|
}
|
||||||
|
var canString string
|
||||||
|
switch keyType {
|
||||||
|
case SharedKey:
|
||||||
|
canString = strings.Join([]string{
|
||||||
|
verb,
|
||||||
|
headers.Get(headerContentEncoding),
|
||||||
|
headers.Get(headerContentLanguage),
|
||||||
|
contentLength,
|
||||||
|
headers.Get(headerContentMD5),
|
||||||
|
headers.Get(headerContentType),
|
||||||
|
date,
|
||||||
|
headers.Get(headerIfModifiedSince),
|
||||||
|
headers.Get(headerIfMatch),
|
||||||
|
headers.Get(headerIfNoneMatch),
|
||||||
|
headers.Get(headerIfUnmodifiedSince),
|
||||||
|
headers.Get(headerRange),
|
||||||
|
buildCanonicalizedHeader(headers),
|
||||||
|
canonicalizedResource,
|
||||||
|
}, "\n")
|
||||||
|
case SharedKeyForTable:
|
||||||
|
canString = strings.Join([]string{
|
||||||
|
verb,
|
||||||
|
headers.Get(headerContentMD5),
|
||||||
|
headers.Get(headerContentType),
|
||||||
|
date,
|
||||||
|
canonicalizedResource,
|
||||||
|
}, "\n")
|
||||||
|
case SharedKeyLite:
|
||||||
|
canString = strings.Join([]string{
|
||||||
|
verb,
|
||||||
|
headers.Get(headerContentMD5),
|
||||||
|
headers.Get(headerContentType),
|
||||||
|
date,
|
||||||
|
buildCanonicalizedHeader(headers),
|
||||||
|
canonicalizedResource,
|
||||||
|
}, "\n")
|
||||||
|
case SharedKeyLiteForTable:
|
||||||
|
canString = strings.Join([]string{
|
||||||
|
date,
|
||||||
|
canonicalizedResource,
|
||||||
|
}, "\n")
|
||||||
|
default:
|
||||||
|
return "", fmt.Errorf("key type '%s' is not supported", keyType)
|
||||||
|
}
|
||||||
|
return canString, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func buildCanonicalizedHeader(headers http.Header) string {
|
||||||
|
cm := make(map[string]string)
|
||||||
|
|
||||||
|
for k := range headers {
|
||||||
|
headerName := strings.TrimSpace(strings.ToLower(k))
|
||||||
|
if strings.HasPrefix(headerName, "x-ms-") {
|
||||||
|
cm[headerName] = headers.Get(k)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(cm) == 0 {
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
|
||||||
|
keys := []string{}
|
||||||
|
for key := range cm {
|
||||||
|
keys = append(keys, key)
|
||||||
|
}
|
||||||
|
|
||||||
|
sort.Strings(keys)
|
||||||
|
|
||||||
|
ch := bytes.NewBufferString("")
|
||||||
|
|
||||||
|
for _, key := range keys {
|
||||||
|
ch.WriteString(key)
|
||||||
|
ch.WriteRune(':')
|
||||||
|
ch.WriteString(cm[key])
|
||||||
|
ch.WriteRune('\n')
|
||||||
|
}
|
||||||
|
|
||||||
|
return strings.TrimSuffix(string(ch.Bytes()), "\n")
|
||||||
|
}
|
||||||
|
|
||||||
|
func createAuthorizationHeader(accountName string, accountKey []byte, canonicalizedString string, keyType SharedKeyType) string {
|
||||||
|
h := hmac.New(sha256.New, accountKey)
|
||||||
|
h.Write([]byte(canonicalizedString))
|
||||||
|
signature := base64.StdEncoding.EncodeToString(h.Sum(nil))
|
||||||
|
var key string
|
||||||
|
switch keyType {
|
||||||
|
case SharedKey, SharedKeyForTable:
|
||||||
|
key = "SharedKey"
|
||||||
|
case SharedKeyLite, SharedKeyLiteForTable:
|
||||||
|
key = "SharedKeyLite"
|
||||||
|
}
|
||||||
|
return fmt.Sprintf("%s %s:%s", key, getCanonicalizedAccountName(accountName), signature)
|
||||||
|
}
|
1094
vendor/github.com/Azure/go-autorest/autorest/azure/async.go
generated
vendored
1094
vendor/github.com/Azure/go-autorest/autorest/azure/async.go
generated
vendored
File diff suppressed because it is too large
Load diff
169
vendor/github.com/Azure/go-autorest/autorest/azure/azure.go
generated
vendored
169
vendor/github.com/Azure/go-autorest/autorest/azure/azure.go
generated
vendored
|
@ -17,6 +17,7 @@ package azure
|
||||||
// limitations under the License.
|
// limitations under the License.
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"bytes"
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"fmt"
|
"fmt"
|
||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
|
@ -36,6 +37,9 @@ const (
|
||||||
// should be included in the response.
|
// should be included in the response.
|
||||||
HeaderReturnClientID = "x-ms-return-client-request-id"
|
HeaderReturnClientID = "x-ms-return-client-request-id"
|
||||||
|
|
||||||
|
// HeaderContentType is the type of the content in the HTTP response.
|
||||||
|
HeaderContentType = "Content-Type"
|
||||||
|
|
||||||
// HeaderRequestID is the Azure extension header of the service generated request ID returned
|
// HeaderRequestID is the Azure extension header of the service generated request ID returned
|
||||||
// in the response.
|
// in the response.
|
||||||
HeaderRequestID = "x-ms-request-id"
|
HeaderRequestID = "x-ms-request-id"
|
||||||
|
@ -49,6 +53,7 @@ type ServiceError struct {
|
||||||
Target *string `json:"target"`
|
Target *string `json:"target"`
|
||||||
Details []map[string]interface{} `json:"details"`
|
Details []map[string]interface{} `json:"details"`
|
||||||
InnerError map[string]interface{} `json:"innererror"`
|
InnerError map[string]interface{} `json:"innererror"`
|
||||||
|
AdditionalInfo []map[string]interface{} `json:"additionalInfo"`
|
||||||
}
|
}
|
||||||
|
|
||||||
func (se ServiceError) Error() string {
|
func (se ServiceError) Error() string {
|
||||||
|
@ -74,56 +79,98 @@ func (se ServiceError) Error() string {
|
||||||
result += fmt.Sprintf(" InnerError=%v", string(d))
|
result += fmt.Sprintf(" InnerError=%v", string(d))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if se.AdditionalInfo != nil {
|
||||||
|
d, err := json.Marshal(se.AdditionalInfo)
|
||||||
|
if err != nil {
|
||||||
|
result += fmt.Sprintf(" AdditionalInfo=%v", se.AdditionalInfo)
|
||||||
|
}
|
||||||
|
result += fmt.Sprintf(" AdditionalInfo=%v", string(d))
|
||||||
|
}
|
||||||
|
|
||||||
return result
|
return result
|
||||||
}
|
}
|
||||||
|
|
||||||
// UnmarshalJSON implements the json.Unmarshaler interface for the ServiceError type.
|
// UnmarshalJSON implements the json.Unmarshaler interface for the ServiceError type.
|
||||||
func (se *ServiceError) UnmarshalJSON(b []byte) error {
|
func (se *ServiceError) UnmarshalJSON(b []byte) error {
|
||||||
// per the OData v4 spec the details field must be an array of JSON objects.
|
|
||||||
// unfortunately not all services adhear to the spec and just return a single
|
|
||||||
// object instead of an array with one object. so we have to perform some
|
|
||||||
// shenanigans to accommodate both cases.
|
|
||||||
// http://docs.oasis-open.org/odata/odata-json-format/v4.0/os/odata-json-format-v4.0-os.html#_Toc372793091
|
// http://docs.oasis-open.org/odata/odata-json-format/v4.0/os/odata-json-format-v4.0-os.html#_Toc372793091
|
||||||
|
|
||||||
type serviceError1 struct {
|
type serviceErrorInternal struct {
|
||||||
Code string `json:"code"`
|
Code string `json:"code"`
|
||||||
Message string `json:"message"`
|
Message string `json:"message"`
|
||||||
Target *string `json:"target"`
|
Target *string `json:"target,omitempty"`
|
||||||
Details []map[string]interface{} `json:"details"`
|
AdditionalInfo []map[string]interface{} `json:"additionalInfo,omitempty"`
|
||||||
InnerError map[string]interface{} `json:"innererror"`
|
// not all services conform to the OData v4 spec.
|
||||||
|
// the following fields are where we've seen discrepancies
|
||||||
|
|
||||||
|
// spec calls for []map[string]interface{} but have seen map[string]interface{}
|
||||||
|
Details interface{} `json:"details,omitempty"`
|
||||||
|
|
||||||
|
// spec calls for map[string]interface{} but have seen []map[string]interface{} and string
|
||||||
|
InnerError interface{} `json:"innererror,omitempty"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type serviceError2 struct {
|
sei := serviceErrorInternal{}
|
||||||
Code string `json:"code"`
|
if err := json.Unmarshal(b, &sei); err != nil {
|
||||||
Message string `json:"message"`
|
|
||||||
Target *string `json:"target"`
|
|
||||||
Details map[string]interface{} `json:"details"`
|
|
||||||
InnerError map[string]interface{} `json:"innererror"`
|
|
||||||
}
|
|
||||||
|
|
||||||
se1 := serviceError1{}
|
|
||||||
err := json.Unmarshal(b, &se1)
|
|
||||||
if err == nil {
|
|
||||||
se.populate(se1.Code, se1.Message, se1.Target, se1.Details, se1.InnerError)
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
se2 := serviceError2{}
|
|
||||||
err = json.Unmarshal(b, &se2)
|
|
||||||
if err == nil {
|
|
||||||
se.populate(se2.Code, se2.Message, se2.Target, nil, se2.InnerError)
|
|
||||||
se.Details = append(se.Details, se2.Details)
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
func (se *ServiceError) populate(code, message string, target *string, details []map[string]interface{}, inner map[string]interface{}) {
|
// copy the fields we know to be correct
|
||||||
se.Code = code
|
se.AdditionalInfo = sei.AdditionalInfo
|
||||||
se.Message = message
|
se.Code = sei.Code
|
||||||
se.Target = target
|
se.Message = sei.Message
|
||||||
se.Details = details
|
se.Target = sei.Target
|
||||||
se.InnerError = inner
|
|
||||||
|
// converts an []interface{} to []map[string]interface{}
|
||||||
|
arrayOfObjs := func(v interface{}) ([]map[string]interface{}, bool) {
|
||||||
|
arrayOf, ok := v.([]interface{})
|
||||||
|
if !ok {
|
||||||
|
return nil, false
|
||||||
|
}
|
||||||
|
final := []map[string]interface{}{}
|
||||||
|
for _, item := range arrayOf {
|
||||||
|
as, ok := item.(map[string]interface{})
|
||||||
|
if !ok {
|
||||||
|
return nil, false
|
||||||
|
}
|
||||||
|
final = append(final, as)
|
||||||
|
}
|
||||||
|
return final, true
|
||||||
|
}
|
||||||
|
|
||||||
|
// convert the remaining fields, falling back to raw JSON if necessary
|
||||||
|
|
||||||
|
if c, ok := arrayOfObjs(sei.Details); ok {
|
||||||
|
se.Details = c
|
||||||
|
} else if c, ok := sei.Details.(map[string]interface{}); ok {
|
||||||
|
se.Details = []map[string]interface{}{c}
|
||||||
|
} else if sei.Details != nil {
|
||||||
|
// stuff into Details
|
||||||
|
se.Details = []map[string]interface{}{
|
||||||
|
{"raw": sei.Details},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if c, ok := sei.InnerError.(map[string]interface{}); ok {
|
||||||
|
se.InnerError = c
|
||||||
|
} else if c, ok := arrayOfObjs(sei.InnerError); ok {
|
||||||
|
// if there's only one error extract it
|
||||||
|
if len(c) == 1 {
|
||||||
|
se.InnerError = c[0]
|
||||||
|
} else {
|
||||||
|
// multiple errors, stuff them into the value
|
||||||
|
se.InnerError = map[string]interface{}{
|
||||||
|
"multi": c,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else if c, ok := sei.InnerError.(string); ok {
|
||||||
|
se.InnerError = map[string]interface{}{"error": c}
|
||||||
|
} else if sei.InnerError != nil {
|
||||||
|
// stuff into InnerError
|
||||||
|
se.InnerError = map[string]interface{}{
|
||||||
|
"raw": sei.InnerError,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// RequestError describes an error response returned by Azure service.
|
// RequestError describes an error response returned by Azure service.
|
||||||
|
@ -131,7 +178,7 @@ type RequestError struct {
|
||||||
autorest.DetailedError
|
autorest.DetailedError
|
||||||
|
|
||||||
// The error returned by the Azure service.
|
// The error returned by the Azure service.
|
||||||
ServiceError *ServiceError `json:"error"`
|
ServiceError *ServiceError `json:"error" xml:"Error"`
|
||||||
|
|
||||||
// The request id (from the x-ms-request-id-header) of the request.
|
// The request id (from the x-ms-request-id-header) of the request.
|
||||||
RequestID string
|
RequestID string
|
||||||
|
@ -158,8 +205,13 @@ type Resource struct {
|
||||||
ResourceName string
|
ResourceName string
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// String function returns a string in form of azureResourceID
|
||||||
|
func (r Resource) String() string {
|
||||||
|
return fmt.Sprintf("/subscriptions/%s/resourceGroups/%s/providers/%s/%s/%s", r.SubscriptionID, r.ResourceGroup, r.Provider, r.ResourceType, r.ResourceName)
|
||||||
|
}
|
||||||
|
|
||||||
// ParseResourceID parses a resource ID into a ResourceDetails struct.
|
// ParseResourceID parses a resource ID into a ResourceDetails struct.
|
||||||
// See https://docs.microsoft.com/en-us/azure/azure-resource-manager/resource-group-template-functions-resource#return-value-4.
|
// See https://docs.microsoft.com/en-us/azure/azure-resource-manager/templates/template-functions-resource?tabs=json#resourceid.
|
||||||
func ParseResourceID(resourceID string) (Resource, error) {
|
func ParseResourceID(resourceID string) (Resource, error) {
|
||||||
|
|
||||||
const resourceIDPatternText = `(?i)subscriptions/(.+)/resourceGroups/(.+)/providers/(.+?)/(.+?)/(.+)`
|
const resourceIDPatternText = `(?i)subscriptions/(.+)/resourceGroups/(.+)/providers/(.+?)/(.+?)/(.+)`
|
||||||
|
@ -273,22 +325,57 @@ func WithErrorUnlessStatusCode(codes ...int) autorest.RespondDecorator {
|
||||||
var e RequestError
|
var e RequestError
|
||||||
defer resp.Body.Close()
|
defer resp.Body.Close()
|
||||||
|
|
||||||
|
encodedAs := autorest.EncodedAsJSON
|
||||||
|
if strings.Contains(resp.Header.Get("Content-Type"), "xml") {
|
||||||
|
encodedAs = autorest.EncodedAsXML
|
||||||
|
}
|
||||||
|
|
||||||
// Copy and replace the Body in case it does not contain an error object.
|
// Copy and replace the Body in case it does not contain an error object.
|
||||||
// This will leave the Body available to the caller.
|
// This will leave the Body available to the caller.
|
||||||
b, decodeErr := autorest.CopyAndDecode(autorest.EncodedAsJSON, resp.Body, &e)
|
b, decodeErr := autorest.CopyAndDecode(encodedAs, resp.Body, &e)
|
||||||
resp.Body = ioutil.NopCloser(&b)
|
resp.Body = ioutil.NopCloser(&b)
|
||||||
if decodeErr != nil {
|
if decodeErr != nil {
|
||||||
return fmt.Errorf("autorest/azure: error response cannot be parsed: %q error: %v", b.String(), decodeErr)
|
return fmt.Errorf("autorest/azure: error response cannot be parsed: %q error: %v", b.String(), decodeErr)
|
||||||
} else if e.ServiceError == nil {
|
}
|
||||||
|
if e.ServiceError == nil {
|
||||||
// Check if error is unwrapped ServiceError
|
// Check if error is unwrapped ServiceError
|
||||||
if err := json.Unmarshal(b.Bytes(), &e.ServiceError); err != nil || e.ServiceError.Message == "" {
|
decoder := autorest.NewDecoder(encodedAs, bytes.NewReader(b.Bytes()))
|
||||||
|
if err := decoder.Decode(&e.ServiceError); err != nil {
|
||||||
|
return fmt.Errorf("autorest/azure: error response cannot be parsed: %q error: %v", b.String(), err)
|
||||||
|
}
|
||||||
|
|
||||||
|
// for example, should the API return the literal value `null` as the response
|
||||||
|
if e.ServiceError == nil {
|
||||||
e.ServiceError = &ServiceError{
|
e.ServiceError = &ServiceError{
|
||||||
Code: "Unknown",
|
Code: "Unknown",
|
||||||
Message: "Unknown service error",
|
Message: "Unknown service error",
|
||||||
|
Details: []map[string]interface{}{
|
||||||
|
{
|
||||||
|
"HttpResponse.Body": b.String(),
|
||||||
|
},
|
||||||
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if e.ServiceError != nil && e.ServiceError.Message == "" {
|
||||||
|
// if we're here it means the returned error wasn't OData v4 compliant.
|
||||||
|
// try to unmarshal the body in hopes of getting something.
|
||||||
|
rawBody := map[string]interface{}{}
|
||||||
|
decoder := autorest.NewDecoder(encodedAs, bytes.NewReader(b.Bytes()))
|
||||||
|
if err := decoder.Decode(&rawBody); err != nil {
|
||||||
|
return fmt.Errorf("autorest/azure: error response cannot be parsed: %q error: %v", b.String(), err)
|
||||||
|
}
|
||||||
|
|
||||||
|
e.ServiceError = &ServiceError{
|
||||||
|
Code: "Unknown",
|
||||||
|
Message: "Unknown service error",
|
||||||
|
}
|
||||||
|
if len(rawBody) > 0 {
|
||||||
|
e.ServiceError.Details = []map[string]interface{}{rawBody}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
e.Response = resp
|
||||||
e.RequestID = ExtractRequestID(resp)
|
e.RequestID = ExtractRequestID(resp)
|
||||||
if e.StatusCode == nil {
|
if e.StatusCode == nil {
|
||||||
e.StatusCode = resp.StatusCode
|
e.StatusCode = resp.StatusCode
|
||||||
|
|
110
vendor/github.com/Azure/go-autorest/autorest/azure/environments.go
generated
vendored
110
vendor/github.com/Azure/go-autorest/autorest/azure/environments.go
generated
vendored
|
@ -22,9 +22,14 @@ import (
|
||||||
"strings"
|
"strings"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
// EnvironmentFilepathName captures the name of the environment variable containing the path to the file
|
// EnvironmentFilepathName captures the name of the environment variable containing the path to the file
|
||||||
// to be used while populating the Azure Environment.
|
// to be used while populating the Azure Environment.
|
||||||
const EnvironmentFilepathName = "AZURE_ENVIRONMENT_FILEPATH"
|
EnvironmentFilepathName = "AZURE_ENVIRONMENT_FILEPATH"
|
||||||
|
|
||||||
|
// NotAvailable is used for endpoints and resource IDs that are not available for a given cloud.
|
||||||
|
NotAvailable = "N/A"
|
||||||
|
)
|
||||||
|
|
||||||
var environments = map[string]Environment{
|
var environments = map[string]Environment{
|
||||||
"AZURECHINACLOUD": ChinaCloud,
|
"AZURECHINACLOUD": ChinaCloud,
|
||||||
|
@ -33,6 +38,19 @@ var environments = map[string]Environment{
|
||||||
"AZUREUSGOVERNMENTCLOUD": USGovernmentCloud,
|
"AZUREUSGOVERNMENTCLOUD": USGovernmentCloud,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ResourceIdentifier contains a set of Azure resource IDs.
|
||||||
|
type ResourceIdentifier struct {
|
||||||
|
Graph string `json:"graph"`
|
||||||
|
KeyVault string `json:"keyVault"`
|
||||||
|
Datalake string `json:"datalake"`
|
||||||
|
Batch string `json:"batch"`
|
||||||
|
OperationalInsights string `json:"operationalInsights"`
|
||||||
|
OSSRDBMS string `json:"ossRDBMS"`
|
||||||
|
Storage string `json:"storage"`
|
||||||
|
Synapse string `json:"synapse"`
|
||||||
|
ServiceBus string `json:"serviceBus"`
|
||||||
|
}
|
||||||
|
|
||||||
// Environment represents a set of endpoints for each of Azure's Clouds.
|
// Environment represents a set of endpoints for each of Azure's Clouds.
|
||||||
type Environment struct {
|
type Environment struct {
|
||||||
Name string `json:"name"`
|
Name string `json:"name"`
|
||||||
|
@ -47,6 +65,10 @@ type Environment struct {
|
||||||
ServiceBusEndpoint string `json:"serviceBusEndpoint"`
|
ServiceBusEndpoint string `json:"serviceBusEndpoint"`
|
||||||
BatchManagementEndpoint string `json:"batchManagementEndpoint"`
|
BatchManagementEndpoint string `json:"batchManagementEndpoint"`
|
||||||
StorageEndpointSuffix string `json:"storageEndpointSuffix"`
|
StorageEndpointSuffix string `json:"storageEndpointSuffix"`
|
||||||
|
CosmosDBDNSSuffix string `json:"cosmosDBDNSSuffix"`
|
||||||
|
MariaDBDNSSuffix string `json:"mariaDBDNSSuffix"`
|
||||||
|
MySQLDatabaseDNSSuffix string `json:"mySqlDatabaseDNSSuffix"`
|
||||||
|
PostgresqlDatabaseDNSSuffix string `json:"postgresqlDatabaseDNSSuffix"`
|
||||||
SQLDatabaseDNSSuffix string `json:"sqlDatabaseDNSSuffix"`
|
SQLDatabaseDNSSuffix string `json:"sqlDatabaseDNSSuffix"`
|
||||||
TrafficManagerDNSSuffix string `json:"trafficManagerDNSSuffix"`
|
TrafficManagerDNSSuffix string `json:"trafficManagerDNSSuffix"`
|
||||||
KeyVaultDNSSuffix string `json:"keyVaultDNSSuffix"`
|
KeyVaultDNSSuffix string `json:"keyVaultDNSSuffix"`
|
||||||
|
@ -55,6 +77,9 @@ type Environment struct {
|
||||||
ResourceManagerVMDNSSuffix string `json:"resourceManagerVMDNSSuffix"`
|
ResourceManagerVMDNSSuffix string `json:"resourceManagerVMDNSSuffix"`
|
||||||
ContainerRegistryDNSSuffix string `json:"containerRegistryDNSSuffix"`
|
ContainerRegistryDNSSuffix string `json:"containerRegistryDNSSuffix"`
|
||||||
TokenAudience string `json:"tokenAudience"`
|
TokenAudience string `json:"tokenAudience"`
|
||||||
|
APIManagementHostNameSuffix string `json:"apiManagementHostNameSuffix"`
|
||||||
|
SynapseEndpointSuffix string `json:"synapseEndpointSuffix"`
|
||||||
|
ResourceIdentifiers ResourceIdentifier `json:"resourceIdentifiers"`
|
||||||
}
|
}
|
||||||
|
|
||||||
var (
|
var (
|
||||||
|
@ -72,6 +97,10 @@ var (
|
||||||
ServiceBusEndpoint: "https://servicebus.windows.net/",
|
ServiceBusEndpoint: "https://servicebus.windows.net/",
|
||||||
BatchManagementEndpoint: "https://batch.core.windows.net/",
|
BatchManagementEndpoint: "https://batch.core.windows.net/",
|
||||||
StorageEndpointSuffix: "core.windows.net",
|
StorageEndpointSuffix: "core.windows.net",
|
||||||
|
CosmosDBDNSSuffix: "documents.azure.com",
|
||||||
|
MariaDBDNSSuffix: "mariadb.database.azure.com",
|
||||||
|
MySQLDatabaseDNSSuffix: "mysql.database.azure.com",
|
||||||
|
PostgresqlDatabaseDNSSuffix: "postgres.database.azure.com",
|
||||||
SQLDatabaseDNSSuffix: "database.windows.net",
|
SQLDatabaseDNSSuffix: "database.windows.net",
|
||||||
TrafficManagerDNSSuffix: "trafficmanager.net",
|
TrafficManagerDNSSuffix: "trafficmanager.net",
|
||||||
KeyVaultDNSSuffix: "vault.azure.net",
|
KeyVaultDNSSuffix: "vault.azure.net",
|
||||||
|
@ -80,6 +109,19 @@ var (
|
||||||
ResourceManagerVMDNSSuffix: "cloudapp.azure.com",
|
ResourceManagerVMDNSSuffix: "cloudapp.azure.com",
|
||||||
ContainerRegistryDNSSuffix: "azurecr.io",
|
ContainerRegistryDNSSuffix: "azurecr.io",
|
||||||
TokenAudience: "https://management.azure.com/",
|
TokenAudience: "https://management.azure.com/",
|
||||||
|
APIManagementHostNameSuffix: "azure-api.net",
|
||||||
|
SynapseEndpointSuffix: "dev.azuresynapse.net",
|
||||||
|
ResourceIdentifiers: ResourceIdentifier{
|
||||||
|
Graph: "https://graph.windows.net/",
|
||||||
|
KeyVault: "https://vault.azure.net",
|
||||||
|
Datalake: "https://datalake.azure.net/",
|
||||||
|
Batch: "https://batch.core.windows.net/",
|
||||||
|
OperationalInsights: "https://api.loganalytics.io",
|
||||||
|
OSSRDBMS: "https://ossrdbms-aad.database.windows.net",
|
||||||
|
Storage: "https://storage.azure.com/",
|
||||||
|
Synapse: "https://dev.azuresynapse.net",
|
||||||
|
ServiceBus: "https://servicebus.azure.net/",
|
||||||
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
// USGovernmentCloud is the cloud environment for the US Government
|
// USGovernmentCloud is the cloud environment for the US Government
|
||||||
|
@ -96,14 +138,31 @@ var (
|
||||||
ServiceBusEndpoint: "https://servicebus.usgovcloudapi.net/",
|
ServiceBusEndpoint: "https://servicebus.usgovcloudapi.net/",
|
||||||
BatchManagementEndpoint: "https://batch.core.usgovcloudapi.net/",
|
BatchManagementEndpoint: "https://batch.core.usgovcloudapi.net/",
|
||||||
StorageEndpointSuffix: "core.usgovcloudapi.net",
|
StorageEndpointSuffix: "core.usgovcloudapi.net",
|
||||||
|
CosmosDBDNSSuffix: "documents.azure.us",
|
||||||
|
MariaDBDNSSuffix: "mariadb.database.usgovcloudapi.net",
|
||||||
|
MySQLDatabaseDNSSuffix: "mysql.database.usgovcloudapi.net",
|
||||||
|
PostgresqlDatabaseDNSSuffix: "postgres.database.usgovcloudapi.net",
|
||||||
SQLDatabaseDNSSuffix: "database.usgovcloudapi.net",
|
SQLDatabaseDNSSuffix: "database.usgovcloudapi.net",
|
||||||
TrafficManagerDNSSuffix: "usgovtrafficmanager.net",
|
TrafficManagerDNSSuffix: "usgovtrafficmanager.net",
|
||||||
KeyVaultDNSSuffix: "vault.usgovcloudapi.net",
|
KeyVaultDNSSuffix: "vault.usgovcloudapi.net",
|
||||||
ServiceBusEndpointSuffix: "servicebus.usgovcloudapi.net",
|
ServiceBusEndpointSuffix: "servicebus.usgovcloudapi.net",
|
||||||
ServiceManagementVMDNSSuffix: "usgovcloudapp.net",
|
ServiceManagementVMDNSSuffix: "usgovcloudapp.net",
|
||||||
ResourceManagerVMDNSSuffix: "cloudapp.windowsazure.us",
|
ResourceManagerVMDNSSuffix: "cloudapp.usgovcloudapi.net",
|
||||||
ContainerRegistryDNSSuffix: "azurecr.io",
|
ContainerRegistryDNSSuffix: "azurecr.us",
|
||||||
TokenAudience: "https://management.usgovcloudapi.net/",
|
TokenAudience: "https://management.usgovcloudapi.net/",
|
||||||
|
APIManagementHostNameSuffix: "azure-api.us",
|
||||||
|
SynapseEndpointSuffix: NotAvailable,
|
||||||
|
ResourceIdentifiers: ResourceIdentifier{
|
||||||
|
Graph: "https://graph.windows.net/",
|
||||||
|
KeyVault: "https://vault.usgovcloudapi.net",
|
||||||
|
Datalake: NotAvailable,
|
||||||
|
Batch: "https://batch.core.usgovcloudapi.net/",
|
||||||
|
OperationalInsights: "https://api.loganalytics.us",
|
||||||
|
OSSRDBMS: "https://ossrdbms-aad.database.usgovcloudapi.net",
|
||||||
|
Storage: "https://storage.azure.com/",
|
||||||
|
Synapse: NotAvailable,
|
||||||
|
ServiceBus: "https://servicebus.azure.net/",
|
||||||
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
// ChinaCloud is the cloud environment operated in China
|
// ChinaCloud is the cloud environment operated in China
|
||||||
|
@ -120,14 +179,31 @@ var (
|
||||||
ServiceBusEndpoint: "https://servicebus.chinacloudapi.cn/",
|
ServiceBusEndpoint: "https://servicebus.chinacloudapi.cn/",
|
||||||
BatchManagementEndpoint: "https://batch.chinacloudapi.cn/",
|
BatchManagementEndpoint: "https://batch.chinacloudapi.cn/",
|
||||||
StorageEndpointSuffix: "core.chinacloudapi.cn",
|
StorageEndpointSuffix: "core.chinacloudapi.cn",
|
||||||
|
CosmosDBDNSSuffix: "documents.azure.cn",
|
||||||
|
MariaDBDNSSuffix: "mariadb.database.chinacloudapi.cn",
|
||||||
|
MySQLDatabaseDNSSuffix: "mysql.database.chinacloudapi.cn",
|
||||||
|
PostgresqlDatabaseDNSSuffix: "postgres.database.chinacloudapi.cn",
|
||||||
SQLDatabaseDNSSuffix: "database.chinacloudapi.cn",
|
SQLDatabaseDNSSuffix: "database.chinacloudapi.cn",
|
||||||
TrafficManagerDNSSuffix: "trafficmanager.cn",
|
TrafficManagerDNSSuffix: "trafficmanager.cn",
|
||||||
KeyVaultDNSSuffix: "vault.azure.cn",
|
KeyVaultDNSSuffix: "vault.azure.cn",
|
||||||
ServiceBusEndpointSuffix: "servicebus.chinacloudapi.cn",
|
ServiceBusEndpointSuffix: "servicebus.chinacloudapi.cn",
|
||||||
ServiceManagementVMDNSSuffix: "chinacloudapp.cn",
|
ServiceManagementVMDNSSuffix: "chinacloudapp.cn",
|
||||||
ResourceManagerVMDNSSuffix: "cloudapp.azure.cn",
|
ResourceManagerVMDNSSuffix: "cloudapp.chinacloudapi.cn",
|
||||||
ContainerRegistryDNSSuffix: "azurecr.io",
|
ContainerRegistryDNSSuffix: "azurecr.cn",
|
||||||
TokenAudience: "https://management.chinacloudapi.cn/",
|
TokenAudience: "https://management.chinacloudapi.cn/",
|
||||||
|
APIManagementHostNameSuffix: "azure-api.cn",
|
||||||
|
SynapseEndpointSuffix: "dev.azuresynapse.azure.cn",
|
||||||
|
ResourceIdentifiers: ResourceIdentifier{
|
||||||
|
Graph: "https://graph.chinacloudapi.cn/",
|
||||||
|
KeyVault: "https://vault.azure.cn",
|
||||||
|
Datalake: NotAvailable,
|
||||||
|
Batch: "https://batch.chinacloudapi.cn/",
|
||||||
|
OperationalInsights: NotAvailable,
|
||||||
|
OSSRDBMS: "https://ossrdbms-aad.database.chinacloudapi.cn",
|
||||||
|
Storage: "https://storage.azure.com/",
|
||||||
|
Synapse: "https://dev.azuresynapse.net",
|
||||||
|
ServiceBus: "https://servicebus.azure.net/",
|
||||||
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
// GermanCloud is the cloud environment operated in Germany
|
// GermanCloud is the cloud environment operated in Germany
|
||||||
|
@ -144,14 +220,31 @@ var (
|
||||||
ServiceBusEndpoint: "https://servicebus.cloudapi.de/",
|
ServiceBusEndpoint: "https://servicebus.cloudapi.de/",
|
||||||
BatchManagementEndpoint: "https://batch.cloudapi.de/",
|
BatchManagementEndpoint: "https://batch.cloudapi.de/",
|
||||||
StorageEndpointSuffix: "core.cloudapi.de",
|
StorageEndpointSuffix: "core.cloudapi.de",
|
||||||
|
CosmosDBDNSSuffix: "documents.microsoftazure.de",
|
||||||
|
MariaDBDNSSuffix: "mariadb.database.cloudapi.de",
|
||||||
|
MySQLDatabaseDNSSuffix: "mysql.database.cloudapi.de",
|
||||||
|
PostgresqlDatabaseDNSSuffix: "postgres.database.cloudapi.de",
|
||||||
SQLDatabaseDNSSuffix: "database.cloudapi.de",
|
SQLDatabaseDNSSuffix: "database.cloudapi.de",
|
||||||
TrafficManagerDNSSuffix: "azuretrafficmanager.de",
|
TrafficManagerDNSSuffix: "azuretrafficmanager.de",
|
||||||
KeyVaultDNSSuffix: "vault.microsoftazure.de",
|
KeyVaultDNSSuffix: "vault.microsoftazure.de",
|
||||||
ServiceBusEndpointSuffix: "servicebus.cloudapi.de",
|
ServiceBusEndpointSuffix: "servicebus.cloudapi.de",
|
||||||
ServiceManagementVMDNSSuffix: "azurecloudapp.de",
|
ServiceManagementVMDNSSuffix: "azurecloudapp.de",
|
||||||
ResourceManagerVMDNSSuffix: "cloudapp.microsoftazure.de",
|
ResourceManagerVMDNSSuffix: "cloudapp.microsoftazure.de",
|
||||||
ContainerRegistryDNSSuffix: "azurecr.io",
|
ContainerRegistryDNSSuffix: NotAvailable,
|
||||||
TokenAudience: "https://management.microsoftazure.de/",
|
TokenAudience: "https://management.microsoftazure.de/",
|
||||||
|
APIManagementHostNameSuffix: NotAvailable,
|
||||||
|
SynapseEndpointSuffix: NotAvailable,
|
||||||
|
ResourceIdentifiers: ResourceIdentifier{
|
||||||
|
Graph: "https://graph.cloudapi.de/",
|
||||||
|
KeyVault: "https://vault.microsoftazure.de",
|
||||||
|
Datalake: NotAvailable,
|
||||||
|
Batch: "https://batch.cloudapi.de/",
|
||||||
|
OperationalInsights: NotAvailable,
|
||||||
|
OSSRDBMS: "https://ossrdbms-aad.database.cloudapi.de",
|
||||||
|
Storage: "https://storage.azure.com/",
|
||||||
|
Synapse: NotAvailable,
|
||||||
|
ServiceBus: "https://servicebus.azure.net/",
|
||||||
|
},
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -189,3 +282,8 @@ func EnvironmentFromFile(location string) (unmarshaled Environment, err error) {
|
||||||
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// SetEnvironment updates the environment map with the specified values.
|
||||||
|
func SetEnvironment(name string, env Environment) {
|
||||||
|
environments[strings.ToUpper(name)] = env
|
||||||
|
}
|
||||||
|
|
20
vendor/github.com/Azure/go-autorest/autorest/azure/rp.go
generated
vendored
20
vendor/github.com/Azure/go-autorest/autorest/azure/rp.go
generated
vendored
|
@ -47,11 +47,15 @@ func DoRetryWithRegistration(client autorest.Client) autorest.SendDecorator {
|
||||||
if resp.StatusCode != http.StatusConflict || client.SkipResourceProviderRegistration {
|
if resp.StatusCode != http.StatusConflict || client.SkipResourceProviderRegistration {
|
||||||
return resp, err
|
return resp, err
|
||||||
}
|
}
|
||||||
|
|
||||||
var re RequestError
|
var re RequestError
|
||||||
err = autorest.Respond(
|
if strings.Contains(r.Header.Get("Content-Type"), "xml") {
|
||||||
resp,
|
// XML errors (e.g. Storage Data Plane) only return the inner object
|
||||||
autorest.ByUnmarshallingJSON(&re),
|
err = autorest.Respond(resp, autorest.ByUnmarshallingXML(&re.ServiceError))
|
||||||
)
|
} else {
|
||||||
|
err = autorest.Respond(resp, autorest.ByUnmarshallingJSON(&re))
|
||||||
|
}
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return resp, err
|
return resp, err
|
||||||
}
|
}
|
||||||
|
@ -64,7 +68,7 @@ func DoRetryWithRegistration(client autorest.Client) autorest.SendDecorator {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return resp, fmt.Errorf("failed request: %s", err)
|
return resp, err
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -140,8 +144,8 @@ func register(client autorest.Client, originalReq *http.Request, re RequestError
|
||||||
}
|
}
|
||||||
|
|
||||||
// poll for registered provisioning state
|
// poll for registered provisioning state
|
||||||
now := time.Now()
|
registrationStartTime := time.Now()
|
||||||
for err == nil && time.Since(now) < client.PollingDuration {
|
for err == nil && (client.PollingDuration == 0 || (client.PollingDuration != 0 && time.Since(registrationStartTime) < client.PollingDuration)) {
|
||||||
// taken from the resources SDK
|
// taken from the resources SDK
|
||||||
// https://github.com/Azure/azure-sdk-for-go/blob/9f366792afa3e0ddaecdc860e793ba9d75e76c27/arm/resources/resources/providers.go#L45
|
// https://github.com/Azure/azure-sdk-for-go/blob/9f366792afa3e0ddaecdc860e793ba9d75e76c27/arm/resources/resources/providers.go#L45
|
||||||
preparer := autorest.CreatePreparer(
|
preparer := autorest.CreatePreparer(
|
||||||
|
@ -183,7 +187,7 @@ func register(client autorest.Client, originalReq *http.Request, re RequestError
|
||||||
return originalReq.Context().Err()
|
return originalReq.Context().Err()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if !(time.Since(now) < client.PollingDuration) {
|
if client.PollingDuration != 0 && !(time.Since(registrationStartTime) < client.PollingDuration) {
|
||||||
return errors.New("polling for resource provider registration has exceeded the polling duration")
|
return errors.New("polling for resource provider registration has exceeded the polling duration")
|
||||||
}
|
}
|
||||||
return err
|
return err
|
||||||
|
|
104
vendor/github.com/Azure/go-autorest/autorest/client.go
generated
vendored
104
vendor/github.com/Azure/go-autorest/autorest/client.go
generated
vendored
|
@ -16,19 +16,22 @@ package autorest
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
|
"crypto/tls"
|
||||||
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"io"
|
"io"
|
||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
"log"
|
"log"
|
||||||
"net/http"
|
"net/http"
|
||||||
"net/http/cookiejar"
|
"strings"
|
||||||
"runtime"
|
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
"github.com/Azure/go-autorest/logger"
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
// DefaultPollingDelay is a reasonable delay between polling requests.
|
// DefaultPollingDelay is a reasonable delay between polling requests.
|
||||||
DefaultPollingDelay = 60 * time.Second
|
DefaultPollingDelay = 30 * time.Second
|
||||||
|
|
||||||
// DefaultPollingDuration is a reasonable total polling duration.
|
// DefaultPollingDuration is a reasonable total polling duration.
|
||||||
DefaultPollingDuration = 15 * time.Minute
|
DefaultPollingDuration = 15 * time.Minute
|
||||||
|
@ -41,15 +44,6 @@ const (
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
// defaultUserAgent builds a string containing the Go version, system archityecture and OS,
|
|
||||||
// and the go-autorest version.
|
|
||||||
defaultUserAgent = fmt.Sprintf("Go/%s (%s-%s) go-autorest/%s",
|
|
||||||
runtime.Version(),
|
|
||||||
runtime.GOARCH,
|
|
||||||
runtime.GOOS,
|
|
||||||
Version(),
|
|
||||||
)
|
|
||||||
|
|
||||||
// StatusCodesForRetry are a defined group of status code for which the client will retry
|
// StatusCodesForRetry are a defined group of status code for which the client will retry
|
||||||
StatusCodesForRetry = []int{
|
StatusCodesForRetry = []int{
|
||||||
http.StatusRequestTimeout, // 408
|
http.StatusRequestTimeout, // 408
|
||||||
|
@ -78,6 +72,22 @@ type Response struct {
|
||||||
*http.Response `json:"-"`
|
*http.Response `json:"-"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// IsHTTPStatus returns true if the returned HTTP status code matches the provided status code.
|
||||||
|
// If there was no response (i.e. the underlying http.Response is nil) the return value is false.
|
||||||
|
func (r Response) IsHTTPStatus(statusCode int) bool {
|
||||||
|
if r.Response == nil {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
return r.Response.StatusCode == statusCode
|
||||||
|
}
|
||||||
|
|
||||||
|
// HasHTTPStatus returns true if the returned HTTP status code matches one of the provided status codes.
|
||||||
|
// If there was no response (i.e. the underlying http.Response is nil) or not status codes are provided
|
||||||
|
// the return value is false.
|
||||||
|
func (r Response) HasHTTPStatus(statusCodes ...int) bool {
|
||||||
|
return ResponseHasStatusCode(r.Response, statusCodes...)
|
||||||
|
}
|
||||||
|
|
||||||
// LoggingInspector implements request and response inspectors that log the full request and
|
// LoggingInspector implements request and response inspectors that log the full request and
|
||||||
// response to a supplied log.
|
// response to a supplied log.
|
||||||
type LoggingInspector struct {
|
type LoggingInspector struct {
|
||||||
|
@ -153,9 +163,11 @@ type Client struct {
|
||||||
PollingDelay time.Duration
|
PollingDelay time.Duration
|
||||||
|
|
||||||
// PollingDuration sets the maximum polling time after which an error is returned.
|
// PollingDuration sets the maximum polling time after which an error is returned.
|
||||||
|
// Setting this to zero will use the provided context to control the duration.
|
||||||
PollingDuration time.Duration
|
PollingDuration time.Duration
|
||||||
|
|
||||||
// RetryAttempts sets the default number of retry attempts for client.
|
// RetryAttempts sets the total number of times the client will attempt to make an HTTP request.
|
||||||
|
// Set the value to 1 to disable retries. DO NOT set the value to less than 1.
|
||||||
RetryAttempts int
|
RetryAttempts int
|
||||||
|
|
||||||
// RetryDuration sets the delay duration for retries.
|
// RetryDuration sets the delay duration for retries.
|
||||||
|
@ -169,19 +181,42 @@ type Client struct {
|
||||||
|
|
||||||
// Set to true to skip attempted registration of resource providers (false by default).
|
// Set to true to skip attempted registration of resource providers (false by default).
|
||||||
SkipResourceProviderRegistration bool
|
SkipResourceProviderRegistration bool
|
||||||
|
|
||||||
|
// SendDecorators can be used to override the default chain of SendDecorators.
|
||||||
|
// This can be used to specify things like a custom retry SendDecorator.
|
||||||
|
// Set this to an empty slice to use no SendDecorators.
|
||||||
|
SendDecorators []SendDecorator
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewClientWithUserAgent returns an instance of a Client with the UserAgent set to the passed
|
// NewClientWithUserAgent returns an instance of a Client with the UserAgent set to the passed
|
||||||
// string.
|
// string.
|
||||||
func NewClientWithUserAgent(ua string) Client {
|
func NewClientWithUserAgent(ua string) Client {
|
||||||
|
return newClient(ua, tls.RenegotiateNever)
|
||||||
|
}
|
||||||
|
|
||||||
|
// ClientOptions contains various Client configuration options.
|
||||||
|
type ClientOptions struct {
|
||||||
|
// UserAgent is an optional user-agent string to append to the default user agent.
|
||||||
|
UserAgent string
|
||||||
|
|
||||||
|
// Renegotiation is an optional setting to control client-side TLS renegotiation.
|
||||||
|
Renegotiation tls.RenegotiationSupport
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewClientWithOptions returns an instance of a Client with the specified values.
|
||||||
|
func NewClientWithOptions(options ClientOptions) Client {
|
||||||
|
return newClient(options.UserAgent, options.Renegotiation)
|
||||||
|
}
|
||||||
|
|
||||||
|
func newClient(ua string, renegotiation tls.RenegotiationSupport) Client {
|
||||||
c := Client{
|
c := Client{
|
||||||
PollingDelay: DefaultPollingDelay,
|
PollingDelay: DefaultPollingDelay,
|
||||||
PollingDuration: DefaultPollingDuration,
|
PollingDuration: DefaultPollingDuration,
|
||||||
RetryAttempts: DefaultRetryAttempts,
|
RetryAttempts: DefaultRetryAttempts,
|
||||||
RetryDuration: DefaultRetryDuration,
|
RetryDuration: DefaultRetryDuration,
|
||||||
UserAgent: defaultUserAgent,
|
UserAgent: UserAgent(),
|
||||||
}
|
}
|
||||||
c.Sender = c.sender()
|
c.Sender = c.sender(renegotiation)
|
||||||
c.AddToUserAgent(ua)
|
c.AddToUserAgent(ua)
|
||||||
return c
|
return c
|
||||||
}
|
}
|
||||||
|
@ -216,17 +251,28 @@ func (c Client) Do(r *http.Request) (*http.Response, error) {
|
||||||
}
|
}
|
||||||
return resp, NewErrorWithError(err, "autorest/Client", "Do", nil, "Preparing request failed")
|
return resp, NewErrorWithError(err, "autorest/Client", "Do", nil, "Preparing request failed")
|
||||||
}
|
}
|
||||||
|
logger.Instance.WriteRequest(r, logger.Filter{
|
||||||
resp, err := SendWithSender(c.sender(), r)
|
Header: func(k string, v []string) (bool, []string) {
|
||||||
|
// remove the auth token from the log
|
||||||
|
if strings.EqualFold(k, "Authorization") || strings.EqualFold(k, "Ocp-Apim-Subscription-Key") {
|
||||||
|
v = []string{"**REDACTED**"}
|
||||||
|
}
|
||||||
|
return true, v
|
||||||
|
},
|
||||||
|
})
|
||||||
|
resp, err := SendWithSender(c.sender(tls.RenegotiateNever), r)
|
||||||
|
if resp == nil && err == nil {
|
||||||
|
err = errors.New("autorest: received nil response and error")
|
||||||
|
}
|
||||||
|
logger.Instance.WriteResponse(resp, logger.Filter{})
|
||||||
Respond(resp, c.ByInspecting())
|
Respond(resp, c.ByInspecting())
|
||||||
return resp, err
|
return resp, err
|
||||||
}
|
}
|
||||||
|
|
||||||
// sender returns the Sender to which to send requests.
|
// sender returns the Sender to which to send requests.
|
||||||
func (c Client) sender() Sender {
|
func (c Client) sender(renengotiation tls.RenegotiationSupport) Sender {
|
||||||
if c.Sender == nil {
|
if c.Sender == nil {
|
||||||
j, _ := cookiejar.New(nil)
|
return sender(renengotiation)
|
||||||
return &http.Client{Jar: j}
|
|
||||||
}
|
}
|
||||||
return c.Sender
|
return c.Sender
|
||||||
}
|
}
|
||||||
|
@ -262,3 +308,21 @@ func (c Client) ByInspecting() RespondDecorator {
|
||||||
}
|
}
|
||||||
return c.ResponseInspector
|
return c.ResponseInspector
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Send sends the provided http.Request using the client's Sender or the default sender.
|
||||||
|
// It returns the http.Response and possible error. It also accepts a, possibly empty,
|
||||||
|
// default set of SendDecorators used when sending the request.
|
||||||
|
// SendDecorators have the following precedence:
|
||||||
|
// 1. In a request's context via WithSendDecorators()
|
||||||
|
// 2. Specified on the client in SendDecorators
|
||||||
|
// 3. The default values specified in this method
|
||||||
|
func (c Client) Send(req *http.Request, decorators ...SendDecorator) (*http.Response, error) {
|
||||||
|
if c.SendDecorators != nil {
|
||||||
|
decorators = c.SendDecorators
|
||||||
|
}
|
||||||
|
inCtx := req.Context().Value(ctxSendDecorators{})
|
||||||
|
if sd, ok := inCtx.([]SendDecorator); ok {
|
||||||
|
decorators = sd
|
||||||
|
}
|
||||||
|
return SendWithSender(c, req, decorators...)
|
||||||
|
}
|
||||||
|
|
191
vendor/github.com/Azure/go-autorest/autorest/date/LICENSE
generated
vendored
Normal file
191
vendor/github.com/Azure/go-autorest/autorest/date/LICENSE
generated
vendored
Normal file
|
@ -0,0 +1,191 @@
|
||||||
|
|
||||||
|
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
|
||||||
|
|
||||||
|
Copyright 2015 Microsoft Corporation
|
||||||
|
|
||||||
|
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.
|
5
vendor/github.com/Azure/go-autorest/autorest/date/go.mod
generated
vendored
Normal file
5
vendor/github.com/Azure/go-autorest/autorest/date/go.mod
generated
vendored
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
module github.com/Azure/go-autorest/autorest/date
|
||||||
|
|
||||||
|
go 1.12
|
||||||
|
|
||||||
|
require github.com/Azure/go-autorest v14.2.0+incompatible
|
2
vendor/github.com/Azure/go-autorest/autorest/date/go.sum
generated
vendored
Normal file
2
vendor/github.com/Azure/go-autorest/autorest/date/go.sum
generated
vendored
Normal file
|
@ -0,0 +1,2 @@
|
||||||
|
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=
|
24
vendor/github.com/Azure/go-autorest/autorest/date/go_mod_tidy_hack.go
generated
vendored
Normal file
24
vendor/github.com/Azure/go-autorest/autorest/date/go_mod_tidy_hack.go
generated
vendored
Normal file
|
@ -0,0 +1,24 @@
|
||||||
|
// +build modhack
|
||||||
|
|
||||||
|
package date
|
||||||
|
|
||||||
|
// Copyright 2017 Microsoft Corporation
|
||||||
|
//
|
||||||
|
// 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.
|
||||||
|
|
||||||
|
// This file, and the github.com/Azure/go-autorest import, won't actually become part of
|
||||||
|
// the resultant binary.
|
||||||
|
|
||||||
|
// Necessary for safely adding multi-module repo.
|
||||||
|
// See: https://github.com/golang/go/wiki/Modules#is-it-possible-to-add-a-module-to-a-multi-module-repository
|
||||||
|
import _ "github.com/Azure/go-autorest"
|
5
vendor/github.com/Azure/go-autorest/autorest/error.go
generated
vendored
5
vendor/github.com/Azure/go-autorest/autorest/error.go
generated
vendored
|
@ -96,3 +96,8 @@ func (e DetailedError) Error() string {
|
||||||
}
|
}
|
||||||
return fmt.Sprintf("%s#%s: %s: StatusCode=%d -- Original Error: %v", e.PackageType, e.Method, e.Message, e.StatusCode, e.Original)
|
return fmt.Sprintf("%s#%s: %s: StatusCode=%d -- Original Error: %v", e.PackageType, e.Method, e.Message, e.StatusCode, e.Original)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Unwrap returns the original error.
|
||||||
|
func (e DetailedError) Unwrap() error {
|
||||||
|
return e.Original
|
||||||
|
}
|
||||||
|
|
12
vendor/github.com/Azure/go-autorest/autorest/go.mod
generated
vendored
Normal file
12
vendor/github.com/Azure/go-autorest/autorest/go.mod
generated
vendored
Normal file
|
@ -0,0 +1,12 @@
|
||||||
|
module github.com/Azure/go-autorest/autorest
|
||||||
|
|
||||||
|
go 1.15
|
||||||
|
|
||||||
|
require (
|
||||||
|
github.com/Azure/go-autorest v14.2.0+incompatible
|
||||||
|
github.com/Azure/go-autorest/autorest/adal v0.9.13
|
||||||
|
github.com/Azure/go-autorest/autorest/mocks v0.4.1
|
||||||
|
github.com/Azure/go-autorest/logger v0.2.1
|
||||||
|
github.com/Azure/go-autorest/tracing v0.6.0
|
||||||
|
golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0
|
||||||
|
)
|
23
vendor/github.com/Azure/go-autorest/autorest/go.sum
generated
vendored
Normal file
23
vendor/github.com/Azure/go-autorest/autorest/go.sum
generated
vendored
Normal file
|
@ -0,0 +1,23 @@
|
||||||
|
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/autorest/adal v0.9.13 h1:Mp5hbtOePIzM8pJVRa3YLrWWmZtoxRXqUEzCfJt3+/Q=
|
||||||
|
github.com/Azure/go-autorest/autorest/adal v0.9.13/go.mod h1:W/MM4U6nLxnIskrw4UwWzlHfGjwUS50aOsc/I3yuU8M=
|
||||||
|
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/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/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/tracing v0.6.0 h1:TYi4+3m5t6K48TGI9AUdb+IzbnSxvnvUMfuitfgcfuo=
|
||||||
|
github.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBpUA79WCAKPPZVC2DeU=
|
||||||
|
github.com/form3tech-oss/jwt-go v3.2.2+incompatible h1:TcekIExNqud5crz4xD2pavyTgWiPvpYe4Xau31I0PRk=
|
||||||
|
github.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k=
|
||||||
|
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2 h1:VklqNMn3ovrHsnt90PveolxSbWFaJdECFbxSq0Mqo2M=
|
||||||
|
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
|
||||||
|
golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0 h1:hb9wdF1z5waM+dSIICn1l0DkLVDT3hqhhQsDNUmHPRE=
|
||||||
|
golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
|
||||||
|
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
||||||
|
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a h1:1BGLXjeY4akVXGgbC9HugT3Jv3hCI0z56oJR5vAMgBU=
|
||||||
|
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||||
|
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
25
vendor/github.com/Azure/go-autorest/autorest/go_mod_tidy_hack.go
generated
vendored
Normal file
25
vendor/github.com/Azure/go-autorest/autorest/go_mod_tidy_hack.go
generated
vendored
Normal file
|
@ -0,0 +1,25 @@
|
||||||
|
//go:build modhack
|
||||||
|
// +build modhack
|
||||||
|
|
||||||
|
package autorest
|
||||||
|
|
||||||
|
// Copyright 2017 Microsoft Corporation
|
||||||
|
//
|
||||||
|
// 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.
|
||||||
|
|
||||||
|
// This file, and the github.com/Azure/go-autorest import, won't actually become part of
|
||||||
|
// the resultant binary.
|
||||||
|
|
||||||
|
// Necessary for safely adding multi-module repo.
|
||||||
|
// See: https://github.com/golang/go/wiki/Modules#is-it-possible-to-add-a-module-to-a-multi-module-repository
|
||||||
|
import _ "github.com/Azure/go-autorest"
|
105
vendor/github.com/Azure/go-autorest/autorest/preparer.go
generated
vendored
105
vendor/github.com/Azure/go-autorest/autorest/preparer.go
generated
vendored
|
@ -16,7 +16,9 @@ package autorest
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
|
"context"
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
|
"encoding/xml"
|
||||||
"fmt"
|
"fmt"
|
||||||
"io"
|
"io"
|
||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
|
@ -32,10 +34,32 @@ const (
|
||||||
mimeTypeFormPost = "application/x-www-form-urlencoded"
|
mimeTypeFormPost = "application/x-www-form-urlencoded"
|
||||||
|
|
||||||
headerAuthorization = "Authorization"
|
headerAuthorization = "Authorization"
|
||||||
|
headerAuxAuthorization = "x-ms-authorization-auxiliary"
|
||||||
headerContentType = "Content-Type"
|
headerContentType = "Content-Type"
|
||||||
headerUserAgent = "User-Agent"
|
headerUserAgent = "User-Agent"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
// used as a key type in context.WithValue()
|
||||||
|
type ctxPrepareDecorators struct{}
|
||||||
|
|
||||||
|
// WithPrepareDecorators adds the specified PrepareDecorators to the provided context.
|
||||||
|
// If no PrepareDecorators are provided the context is unchanged.
|
||||||
|
func WithPrepareDecorators(ctx context.Context, prepareDecorator []PrepareDecorator) context.Context {
|
||||||
|
if len(prepareDecorator) == 0 {
|
||||||
|
return ctx
|
||||||
|
}
|
||||||
|
return context.WithValue(ctx, ctxPrepareDecorators{}, prepareDecorator)
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetPrepareDecorators returns the PrepareDecorators in the provided context or the provided default PrepareDecorators.
|
||||||
|
func GetPrepareDecorators(ctx context.Context, defaultPrepareDecorators ...PrepareDecorator) []PrepareDecorator {
|
||||||
|
inCtx := ctx.Value(ctxPrepareDecorators{})
|
||||||
|
if pd, ok := inCtx.([]PrepareDecorator); ok {
|
||||||
|
return pd
|
||||||
|
}
|
||||||
|
return defaultPrepareDecorators
|
||||||
|
}
|
||||||
|
|
||||||
// Preparer is the interface that wraps the Prepare method.
|
// Preparer is the interface that wraps the Prepare method.
|
||||||
//
|
//
|
||||||
// Prepare accepts and possibly modifies an http.Request (e.g., adding Headers). Implementations
|
// Prepare accepts and possibly modifies an http.Request (e.g., adding Headers). Implementations
|
||||||
|
@ -103,10 +127,7 @@ func WithHeader(header string, value string) PrepareDecorator {
|
||||||
return PreparerFunc(func(r *http.Request) (*http.Request, error) {
|
return PreparerFunc(func(r *http.Request) (*http.Request, error) {
|
||||||
r, err := p.Prepare(r)
|
r, err := p.Prepare(r)
|
||||||
if err == nil {
|
if err == nil {
|
||||||
if r.Header == nil {
|
setHeader(r, http.CanonicalHeaderKey(header), value)
|
||||||
r.Header = make(http.Header)
|
|
||||||
}
|
|
||||||
r.Header.Set(http.CanonicalHeaderKey(header), value)
|
|
||||||
}
|
}
|
||||||
return r, err
|
return r, err
|
||||||
})
|
})
|
||||||
|
@ -190,6 +211,9 @@ func AsGet() PrepareDecorator { return WithMethod("GET") }
|
||||||
// AsHead returns a PrepareDecorator that sets the HTTP method to HEAD.
|
// AsHead returns a PrepareDecorator that sets the HTTP method to HEAD.
|
||||||
func AsHead() PrepareDecorator { return WithMethod("HEAD") }
|
func AsHead() PrepareDecorator { return WithMethod("HEAD") }
|
||||||
|
|
||||||
|
// AsMerge returns a PrepareDecorator that sets the HTTP method to MERGE.
|
||||||
|
func AsMerge() PrepareDecorator { return WithMethod("MERGE") }
|
||||||
|
|
||||||
// AsOptions returns a PrepareDecorator that sets the HTTP method to OPTIONS.
|
// AsOptions returns a PrepareDecorator that sets the HTTP method to OPTIONS.
|
||||||
func AsOptions() PrepareDecorator { return WithMethod("OPTIONS") }
|
func AsOptions() PrepareDecorator { return WithMethod("OPTIONS") }
|
||||||
|
|
||||||
|
@ -203,7 +227,7 @@ func AsPost() PrepareDecorator { return WithMethod("POST") }
|
||||||
func AsPut() PrepareDecorator { return WithMethod("PUT") }
|
func AsPut() PrepareDecorator { return WithMethod("PUT") }
|
||||||
|
|
||||||
// WithBaseURL returns a PrepareDecorator that populates the http.Request with a url.URL constructed
|
// WithBaseURL returns a PrepareDecorator that populates the http.Request with a url.URL constructed
|
||||||
// from the supplied baseUrl.
|
// from the supplied baseUrl. Query parameters will be encoded as required.
|
||||||
func WithBaseURL(baseURL string) PrepareDecorator {
|
func WithBaseURL(baseURL string) PrepareDecorator {
|
||||||
return func(p Preparer) Preparer {
|
return func(p Preparer) Preparer {
|
||||||
return PreparerFunc(func(r *http.Request) (*http.Request, error) {
|
return PreparerFunc(func(r *http.Request) (*http.Request, error) {
|
||||||
|
@ -214,11 +238,35 @@ func WithBaseURL(baseURL string) PrepareDecorator {
|
||||||
return r, err
|
return r, err
|
||||||
}
|
}
|
||||||
if u.Scheme == "" {
|
if u.Scheme == "" {
|
||||||
err = fmt.Errorf("autorest: No scheme detected in URL %s", baseURL)
|
return r, fmt.Errorf("autorest: No scheme detected in URL %s", baseURL)
|
||||||
|
}
|
||||||
|
if u.RawQuery != "" {
|
||||||
|
q, err := url.ParseQuery(u.RawQuery)
|
||||||
|
if err != nil {
|
||||||
|
return r, err
|
||||||
|
}
|
||||||
|
u.RawQuery = q.Encode()
|
||||||
}
|
}
|
||||||
if err == nil {
|
|
||||||
r.URL = u
|
r.URL = u
|
||||||
}
|
}
|
||||||
|
return r, err
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// WithBytes returns a PrepareDecorator that takes a list of bytes
|
||||||
|
// which passes the bytes directly to the body
|
||||||
|
func WithBytes(input *[]byte) PrepareDecorator {
|
||||||
|
return func(p Preparer) Preparer {
|
||||||
|
return PreparerFunc(func(r *http.Request) (*http.Request, error) {
|
||||||
|
r, err := p.Prepare(r)
|
||||||
|
if err == nil {
|
||||||
|
if input == nil {
|
||||||
|
return r, fmt.Errorf("Input Bytes was nil")
|
||||||
|
}
|
||||||
|
|
||||||
|
r.ContentLength = int64(len(*input))
|
||||||
|
r.Body = ioutil.NopCloser(bytes.NewReader(*input))
|
||||||
}
|
}
|
||||||
return r, err
|
return r, err
|
||||||
})
|
})
|
||||||
|
@ -244,10 +292,7 @@ func WithFormData(v url.Values) PrepareDecorator {
|
||||||
if err == nil {
|
if err == nil {
|
||||||
s := v.Encode()
|
s := v.Encode()
|
||||||
|
|
||||||
if r.Header == nil {
|
setHeader(r, http.CanonicalHeaderKey(headerContentType), mimeTypeFormPost)
|
||||||
r.Header = make(http.Header)
|
|
||||||
}
|
|
||||||
r.Header.Set(http.CanonicalHeaderKey(headerContentType), mimeTypeFormPost)
|
|
||||||
r.ContentLength = int64(len(s))
|
r.ContentLength = int64(len(s))
|
||||||
r.Body = ioutil.NopCloser(strings.NewReader(s))
|
r.Body = ioutil.NopCloser(strings.NewReader(s))
|
||||||
}
|
}
|
||||||
|
@ -283,10 +328,7 @@ func WithMultiPartFormData(formDataParameters map[string]interface{}) PrepareDec
|
||||||
if err = writer.Close(); err != nil {
|
if err = writer.Close(); err != nil {
|
||||||
return r, err
|
return r, err
|
||||||
}
|
}
|
||||||
if r.Header == nil {
|
setHeader(r, http.CanonicalHeaderKey(headerContentType), writer.FormDataContentType())
|
||||||
r.Header = make(http.Header)
|
|
||||||
}
|
|
||||||
r.Header.Set(http.CanonicalHeaderKey(headerContentType), writer.FormDataContentType())
|
|
||||||
r.Body = ioutil.NopCloser(bytes.NewReader(body.Bytes()))
|
r.Body = ioutil.NopCloser(bytes.NewReader(body.Bytes()))
|
||||||
r.ContentLength = int64(body.Len())
|
r.ContentLength = int64(body.Len())
|
||||||
return r, err
|
return r, err
|
||||||
|
@ -377,6 +419,29 @@ func WithJSON(v interface{}) PrepareDecorator {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// WithXML returns a PrepareDecorator that encodes the data passed as XML into the body of the
|
||||||
|
// request and sets the Content-Length header.
|
||||||
|
func WithXML(v interface{}) PrepareDecorator {
|
||||||
|
return func(p Preparer) Preparer {
|
||||||
|
return PreparerFunc(func(r *http.Request) (*http.Request, error) {
|
||||||
|
r, err := p.Prepare(r)
|
||||||
|
if err == nil {
|
||||||
|
b, err := xml.Marshal(v)
|
||||||
|
if err == nil {
|
||||||
|
// we have to tack on an XML header
|
||||||
|
withHeader := xml.Header + string(b)
|
||||||
|
bytesWithHeader := []byte(withHeader)
|
||||||
|
|
||||||
|
r.ContentLength = int64(len(bytesWithHeader))
|
||||||
|
setHeader(r, headerContentLength, fmt.Sprintf("%d", len(bytesWithHeader)))
|
||||||
|
r.Body = ioutil.NopCloser(bytes.NewReader(bytesWithHeader))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return r, err
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// WithPath returns a PrepareDecorator that adds the supplied path to the request URL. If the path
|
// WithPath returns a PrepareDecorator that adds the supplied path to the request URL. If the path
|
||||||
// is absolute (that is, it begins with a "/"), it replaces the existing path.
|
// is absolute (that is, it begins with a "/"), it replaces the existing path.
|
||||||
func WithPath(path string) PrepareDecorator {
|
func WithPath(path string) PrepareDecorator {
|
||||||
|
@ -455,7 +520,7 @@ func parseURL(u *url.URL, path string) (*url.URL, error) {
|
||||||
// WithQueryParameters returns a PrepareDecorators that encodes and applies the query parameters
|
// WithQueryParameters returns a PrepareDecorators that encodes and applies the query parameters
|
||||||
// given in the supplied map (i.e., key=value).
|
// given in the supplied map (i.e., key=value).
|
||||||
func WithQueryParameters(queryParameters map[string]interface{}) PrepareDecorator {
|
func WithQueryParameters(queryParameters map[string]interface{}) PrepareDecorator {
|
||||||
parameters := ensureValueStrings(queryParameters)
|
parameters := MapToValues(queryParameters)
|
||||||
return func(p Preparer) Preparer {
|
return func(p Preparer) Preparer {
|
||||||
return PreparerFunc(func(r *http.Request) (*http.Request, error) {
|
return PreparerFunc(func(r *http.Request) (*http.Request, error) {
|
||||||
r, err := p.Prepare(r)
|
r, err := p.Prepare(r)
|
||||||
|
@ -463,14 +528,16 @@ func WithQueryParameters(queryParameters map[string]interface{}) PrepareDecorato
|
||||||
if r.URL == nil {
|
if r.URL == nil {
|
||||||
return r, NewError("autorest", "WithQueryParameters", "Invoked with a nil URL")
|
return r, NewError("autorest", "WithQueryParameters", "Invoked with a nil URL")
|
||||||
}
|
}
|
||||||
|
|
||||||
v := r.URL.Query()
|
v := r.URL.Query()
|
||||||
for key, value := range parameters {
|
for key, value := range parameters {
|
||||||
d, err := url.QueryUnescape(value)
|
for i := range value {
|
||||||
|
d, err := url.QueryUnescape(value[i])
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return r, err
|
return r, err
|
||||||
}
|
}
|
||||||
v.Add(key, d)
|
value[i] = d
|
||||||
|
}
|
||||||
|
v[key] = value
|
||||||
}
|
}
|
||||||
r.URL.RawQuery = v.Encode()
|
r.URL.RawQuery = v.Encode()
|
||||||
}
|
}
|
||||||
|
|
19
vendor/github.com/Azure/go-autorest/autorest/responder.go
generated
vendored
19
vendor/github.com/Azure/go-autorest/autorest/responder.go
generated
vendored
|
@ -153,6 +153,25 @@ func ByClosingIfError() RespondDecorator {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ByUnmarshallingBytes returns a RespondDecorator that copies the Bytes returned in the
|
||||||
|
// response Body into the value pointed to by v.
|
||||||
|
func ByUnmarshallingBytes(v *[]byte) RespondDecorator {
|
||||||
|
return func(r Responder) Responder {
|
||||||
|
return ResponderFunc(func(resp *http.Response) error {
|
||||||
|
err := r.Respond(resp)
|
||||||
|
if err == nil {
|
||||||
|
bytes, errInner := ioutil.ReadAll(resp.Body)
|
||||||
|
if errInner != nil {
|
||||||
|
err = fmt.Errorf("Error occurred reading http.Response#Body - Error = '%v'", errInner)
|
||||||
|
} else {
|
||||||
|
*v = bytes
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return err
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// ByUnmarshallingJSON returns a RespondDecorator that decodes a JSON document returned in the
|
// ByUnmarshallingJSON returns a RespondDecorator that decodes a JSON document returned in the
|
||||||
// response Body into the value pointed to by v.
|
// response Body into the value pointed to by v.
|
||||||
func ByUnmarshallingJSON(v interface{}) RespondDecorator {
|
func ByUnmarshallingJSON(v interface{}) RespondDecorator {
|
||||||
|
|
1
vendor/github.com/Azure/go-autorest/autorest/retriablerequest_1.7.go
generated
vendored
1
vendor/github.com/Azure/go-autorest/autorest/retriablerequest_1.7.go
generated
vendored
|
@ -1,3 +1,4 @@
|
||||||
|
//go:build !go1.8
|
||||||
// +build !go1.8
|
// +build !go1.8
|
||||||
|
|
||||||
// Copyright 2017 Microsoft Corporation
|
// Copyright 2017 Microsoft Corporation
|
||||||
|
|
1
vendor/github.com/Azure/go-autorest/autorest/retriablerequest_1.8.go
generated
vendored
1
vendor/github.com/Azure/go-autorest/autorest/retriablerequest_1.8.go
generated
vendored
|
@ -1,3 +1,4 @@
|
||||||
|
//go:build go1.8
|
||||||
// +build go1.8
|
// +build go1.8
|
||||||
|
|
||||||
// Copyright 2017 Microsoft Corporation
|
// Copyright 2017 Microsoft Corporation
|
||||||
|
|
183
vendor/github.com/Azure/go-autorest/autorest/sender.go
generated
vendored
183
vendor/github.com/Azure/go-autorest/autorest/sender.go
generated
vendored
|
@ -15,14 +15,59 @@ package autorest
|
||||||
// limitations under the License.
|
// limitations under the License.
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"context"
|
||||||
|
"crypto/tls"
|
||||||
"fmt"
|
"fmt"
|
||||||
"log"
|
"log"
|
||||||
"math"
|
"math"
|
||||||
"net/http"
|
"net/http"
|
||||||
|
"net/http/cookiejar"
|
||||||
"strconv"
|
"strconv"
|
||||||
|
"sync"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
"github.com/Azure/go-autorest/logger"
|
||||||
|
"github.com/Azure/go-autorest/tracing"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
// there is one sender per TLS renegotiation type, i.e. count of tls.RenegotiationSupport enums
|
||||||
|
const defaultSendersCount = 3
|
||||||
|
|
||||||
|
type defaultSender struct {
|
||||||
|
sender Sender
|
||||||
|
init *sync.Once
|
||||||
|
}
|
||||||
|
|
||||||
|
// each type of sender will be created on demand in sender()
|
||||||
|
var defaultSenders [defaultSendersCount]defaultSender
|
||||||
|
|
||||||
|
func init() {
|
||||||
|
for i := 0; i < defaultSendersCount; i++ {
|
||||||
|
defaultSenders[i].init = &sync.Once{}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// used as a key type in context.WithValue()
|
||||||
|
type ctxSendDecorators struct{}
|
||||||
|
|
||||||
|
// WithSendDecorators adds the specified SendDecorators to the provided context.
|
||||||
|
// If no SendDecorators are provided the context is unchanged.
|
||||||
|
func WithSendDecorators(ctx context.Context, sendDecorator []SendDecorator) context.Context {
|
||||||
|
if len(sendDecorator) == 0 {
|
||||||
|
return ctx
|
||||||
|
}
|
||||||
|
return context.WithValue(ctx, ctxSendDecorators{}, sendDecorator)
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetSendDecorators returns the SendDecorators in the provided context or the provided default SendDecorators.
|
||||||
|
func GetSendDecorators(ctx context.Context, defaultSendDecorators ...SendDecorator) []SendDecorator {
|
||||||
|
inCtx := ctx.Value(ctxSendDecorators{})
|
||||||
|
if sd, ok := inCtx.([]SendDecorator); ok {
|
||||||
|
return sd
|
||||||
|
}
|
||||||
|
return defaultSendDecorators
|
||||||
|
}
|
||||||
|
|
||||||
// Sender is the interface that wraps the Do method to send HTTP requests.
|
// Sender is the interface that wraps the Do method to send HTTP requests.
|
||||||
//
|
//
|
||||||
// The standard http.Client conforms to this interface.
|
// The standard http.Client conforms to this interface.
|
||||||
|
@ -38,14 +83,14 @@ func (sf SenderFunc) Do(r *http.Request) (*http.Response, error) {
|
||||||
return sf(r)
|
return sf(r)
|
||||||
}
|
}
|
||||||
|
|
||||||
// SendDecorator takes and possibily decorates, by wrapping, a Sender. Decorators may affect the
|
// SendDecorator takes and possibly decorates, by wrapping, a Sender. Decorators may affect the
|
||||||
// http.Request and pass it along or, first, pass the http.Request along then react to the
|
// http.Request and pass it along or, first, pass the http.Request along then react to the
|
||||||
// http.Response result.
|
// http.Response result.
|
||||||
type SendDecorator func(Sender) Sender
|
type SendDecorator func(Sender) Sender
|
||||||
|
|
||||||
// CreateSender creates, decorates, and returns, as a Sender, the default http.Client.
|
// CreateSender creates, decorates, and returns, as a Sender, the default http.Client.
|
||||||
func CreateSender(decorators ...SendDecorator) Sender {
|
func CreateSender(decorators ...SendDecorator) Sender {
|
||||||
return DecorateSender(&http.Client{}, decorators...)
|
return DecorateSender(sender(tls.RenegotiateNever), decorators...)
|
||||||
}
|
}
|
||||||
|
|
||||||
// DecorateSender accepts a Sender and a, possibly empty, set of SendDecorators, which is applies to
|
// DecorateSender accepts a Sender and a, possibly empty, set of SendDecorators, which is applies to
|
||||||
|
@ -68,7 +113,7 @@ func DecorateSender(s Sender, decorators ...SendDecorator) Sender {
|
||||||
//
|
//
|
||||||
// Send will not poll or retry requests.
|
// Send will not poll or retry requests.
|
||||||
func Send(r *http.Request, decorators ...SendDecorator) (*http.Response, error) {
|
func Send(r *http.Request, decorators ...SendDecorator) (*http.Response, error) {
|
||||||
return SendWithSender(&http.Client{}, r, decorators...)
|
return SendWithSender(sender(tls.RenegotiateNever), r, decorators...)
|
||||||
}
|
}
|
||||||
|
|
||||||
// SendWithSender sends the passed http.Request, through the provided Sender, returning the
|
// SendWithSender sends the passed http.Request, through the provided Sender, returning the
|
||||||
|
@ -80,6 +125,34 @@ func SendWithSender(s Sender, r *http.Request, decorators ...SendDecorator) (*ht
|
||||||
return DecorateSender(s, decorators...).Do(r)
|
return DecorateSender(s, decorators...).Do(r)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func sender(renengotiation tls.RenegotiationSupport) Sender {
|
||||||
|
// note that we can't init defaultSenders in init() since it will
|
||||||
|
// execute before calling code has had a chance to enable tracing
|
||||||
|
defaultSenders[renengotiation].init.Do(func() {
|
||||||
|
// Use behaviour compatible with DefaultTransport, but require TLS minimum version.
|
||||||
|
defaultTransport := http.DefaultTransport.(*http.Transport)
|
||||||
|
transport := &http.Transport{
|
||||||
|
Proxy: defaultTransport.Proxy,
|
||||||
|
DialContext: defaultTransport.DialContext,
|
||||||
|
MaxIdleConns: defaultTransport.MaxIdleConns,
|
||||||
|
IdleConnTimeout: defaultTransport.IdleConnTimeout,
|
||||||
|
TLSHandshakeTimeout: defaultTransport.TLSHandshakeTimeout,
|
||||||
|
ExpectContinueTimeout: defaultTransport.ExpectContinueTimeout,
|
||||||
|
TLSClientConfig: &tls.Config{
|
||||||
|
MinVersion: tls.VersionTLS12,
|
||||||
|
Renegotiation: renengotiation,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
var roundTripper http.RoundTripper = transport
|
||||||
|
if tracing.IsEnabled() {
|
||||||
|
roundTripper = tracing.NewTransport(transport)
|
||||||
|
}
|
||||||
|
j, _ := cookiejar.New(nil)
|
||||||
|
defaultSenders[renengotiation].sender = &http.Client{Jar: j, Transport: roundTripper}
|
||||||
|
})
|
||||||
|
return defaultSenders[renengotiation].sender
|
||||||
|
}
|
||||||
|
|
||||||
// AfterDelay returns a SendDecorator that delays for the passed time.Duration before
|
// AfterDelay returns a SendDecorator that delays for the passed time.Duration before
|
||||||
// invoking the Sender. The delay may be terminated by closing the optional channel on the
|
// invoking the Sender. The delay may be terminated by closing the optional channel on the
|
||||||
// http.Request. If canceled, no further Senders are invoked.
|
// http.Request. If canceled, no further Senders are invoked.
|
||||||
|
@ -194,10 +267,12 @@ func DoRetryForAttempts(attempts int, backoff time.Duration) SendDecorator {
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return resp, err
|
return resp, err
|
||||||
}
|
}
|
||||||
|
DrainResponseBody(resp)
|
||||||
resp, err = s.Do(rr.Request())
|
resp, err = s.Do(rr.Request())
|
||||||
if err == nil {
|
if err == nil {
|
||||||
return resp, err
|
return resp, err
|
||||||
}
|
}
|
||||||
|
logger.Instance.Writef(logger.LogError, "DoRetryForAttempts: received error for attempt %d: %v\n", attempt+1, err)
|
||||||
if !DelayForBackoff(backoff, attempt, r.Context().Done()) {
|
if !DelayForBackoff(backoff, attempt, r.Context().Done()) {
|
||||||
return nil, r.Context().Err()
|
return nil, r.Context().Err()
|
||||||
}
|
}
|
||||||
|
@ -207,56 +282,93 @@ func DoRetryForAttempts(attempts int, backoff time.Duration) SendDecorator {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Count429AsRetry indicates that a 429 response should be included as a retry attempt.
|
||||||
|
var Count429AsRetry = true
|
||||||
|
|
||||||
|
// Max429Delay is the maximum duration to wait between retries on a 429 if no Retry-After header was received.
|
||||||
|
var Max429Delay time.Duration
|
||||||
|
|
||||||
// DoRetryForStatusCodes returns a SendDecorator that retries for specified statusCodes for up to the specified
|
// DoRetryForStatusCodes returns a SendDecorator that retries for specified statusCodes for up to the specified
|
||||||
// number of attempts, exponentially backing off between requests using the supplied backoff
|
// number of attempts, exponentially backing off between requests using the supplied backoff
|
||||||
// time.Duration (which may be zero). Retrying may be canceled by closing the optional channel on
|
// time.Duration (which may be zero). Retrying may be canceled by cancelling the context on the http.Request.
|
||||||
// the http.Request.
|
// NOTE: Code http.StatusTooManyRequests (429) will *not* be counted against the number of attempts.
|
||||||
func DoRetryForStatusCodes(attempts int, backoff time.Duration, codes ...int) SendDecorator {
|
func DoRetryForStatusCodes(attempts int, backoff time.Duration, codes ...int) SendDecorator {
|
||||||
return func(s Sender) Sender {
|
return func(s Sender) Sender {
|
||||||
return SenderFunc(func(r *http.Request) (resp *http.Response, err error) {
|
return SenderFunc(func(r *http.Request) (*http.Response, error) {
|
||||||
|
return doRetryForStatusCodesImpl(s, r, Count429AsRetry, attempts, backoff, 0, codes...)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// DoRetryForStatusCodesWithCap returns a SendDecorator that retries for specified statusCodes for up to the
|
||||||
|
// specified number of attempts, exponentially backing off between requests using the supplied backoff
|
||||||
|
// time.Duration (which may be zero). To cap the maximum possible delay between iterations specify a value greater
|
||||||
|
// than zero for cap. Retrying may be canceled by cancelling the context on the http.Request.
|
||||||
|
func DoRetryForStatusCodesWithCap(attempts int, backoff, cap time.Duration, codes ...int) SendDecorator {
|
||||||
|
return func(s Sender) Sender {
|
||||||
|
return SenderFunc(func(r *http.Request) (*http.Response, error) {
|
||||||
|
return doRetryForStatusCodesImpl(s, r, Count429AsRetry, attempts, backoff, cap, codes...)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func doRetryForStatusCodesImpl(s Sender, r *http.Request, count429 bool, attempts int, backoff, cap time.Duration, codes ...int) (resp *http.Response, err error) {
|
||||||
rr := NewRetriableRequest(r)
|
rr := NewRetriableRequest(r)
|
||||||
// Increment to add the first call (attempts denotes number of retries)
|
// Increment to add the first call (attempts denotes number of retries)
|
||||||
attempts++
|
for attempt, delayCount := 0, 0; attempt < attempts+1; {
|
||||||
for attempt := 0; attempt < attempts; {
|
|
||||||
err = rr.Prepare()
|
err = rr.Prepare()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return resp, err
|
return
|
||||||
}
|
}
|
||||||
|
DrainResponseBody(resp)
|
||||||
resp, err = s.Do(rr.Request())
|
resp, err = s.Do(rr.Request())
|
||||||
// if the error isn't temporary don't bother retrying
|
|
||||||
if err != nil && !IsTemporaryNetworkError(err) {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
// we want to retry if err is not nil (e.g. transient network failure). note that for failed authentication
|
// we want to retry if err is not nil (e.g. transient network failure). note that for failed authentication
|
||||||
// resp and err will both have a value, so in this case we don't want to retry as it will never succeed.
|
// resp and err will both have a value, so in this case we don't want to retry as it will never succeed.
|
||||||
if err == nil && !ResponseHasStatusCode(resp, codes...) || IsTokenRefreshError(err) {
|
if err == nil && !ResponseHasStatusCode(resp, codes...) || IsTokenRefreshError(err) {
|
||||||
return resp, err
|
return resp, err
|
||||||
}
|
}
|
||||||
delayed := DelayWithRetryAfter(resp, r.Context().Done())
|
if err != nil {
|
||||||
if !delayed && !DelayForBackoff(backoff, attempt, r.Context().Done()) {
|
logger.Instance.Writef(logger.LogError, "DoRetryForStatusCodes: received error for attempt %d: %v\n", attempt+1, err)
|
||||||
return nil, r.Context().Err()
|
|
||||||
}
|
}
|
||||||
// don't count a 429 against the number of attempts
|
delayed := DelayWithRetryAfter(resp, r.Context().Done())
|
||||||
// so that we continue to retry until it succeeds
|
// if this was a 429 set the delay cap as specified.
|
||||||
if resp == nil || resp.StatusCode != http.StatusTooManyRequests {
|
// applicable only in the absence of a retry-after header.
|
||||||
|
if resp != nil && resp.StatusCode == http.StatusTooManyRequests {
|
||||||
|
cap = Max429Delay
|
||||||
|
}
|
||||||
|
if !delayed && !DelayForBackoffWithCap(backoff, cap, delayCount, r.Context().Done()) {
|
||||||
|
return resp, r.Context().Err()
|
||||||
|
}
|
||||||
|
// when count429 == false don't count a 429 against the number
|
||||||
|
// of attempts so that we continue to retry until it succeeds
|
||||||
|
if count429 || (resp == nil || resp.StatusCode != http.StatusTooManyRequests) {
|
||||||
attempt++
|
attempt++
|
||||||
}
|
}
|
||||||
|
// delay count is tracked separately from attempts to
|
||||||
|
// ensure that 429 participates in exponential back-off
|
||||||
|
delayCount++
|
||||||
}
|
}
|
||||||
return resp, err
|
return resp, err
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// DelayWithRetryAfter invokes time.After for the duration specified in the "Retry-After" header in
|
// DelayWithRetryAfter invokes time.After for the duration specified in the "Retry-After" header.
|
||||||
// responses with status code 429
|
// The value of Retry-After can be either the number of seconds or a date in RFC1123 format.
|
||||||
|
// The function returns true after successfully waiting for the specified duration. If there is
|
||||||
|
// no Retry-After header or the wait is cancelled the return value is false.
|
||||||
func DelayWithRetryAfter(resp *http.Response, cancel <-chan struct{}) bool {
|
func DelayWithRetryAfter(resp *http.Response, cancel <-chan struct{}) bool {
|
||||||
if resp == nil {
|
if resp == nil {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
retryAfter, _ := strconv.Atoi(resp.Header.Get("Retry-After"))
|
var dur time.Duration
|
||||||
if resp.StatusCode == http.StatusTooManyRequests && retryAfter > 0 {
|
ra := resp.Header.Get("Retry-After")
|
||||||
|
if retryAfter, _ := strconv.Atoi(ra); retryAfter > 0 {
|
||||||
|
dur = time.Duration(retryAfter) * time.Second
|
||||||
|
} else if t, err := time.Parse(time.RFC1123, ra); err == nil {
|
||||||
|
dur = t.Sub(time.Now())
|
||||||
|
}
|
||||||
|
if dur > 0 {
|
||||||
select {
|
select {
|
||||||
case <-time.After(time.Duration(retryAfter) * time.Second):
|
case <-time.After(dur):
|
||||||
return true
|
return true
|
||||||
case <-cancel:
|
case <-cancel:
|
||||||
return false
|
return false
|
||||||
|
@ -279,10 +391,12 @@ func DoRetryForDuration(d time.Duration, backoff time.Duration) SendDecorator {
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return resp, err
|
return resp, err
|
||||||
}
|
}
|
||||||
|
DrainResponseBody(resp)
|
||||||
resp, err = s.Do(rr.Request())
|
resp, err = s.Do(rr.Request())
|
||||||
if err == nil {
|
if err == nil {
|
||||||
return resp, err
|
return resp, err
|
||||||
}
|
}
|
||||||
|
logger.Instance.Writef(logger.LogError, "DoRetryForDuration: received error for attempt %d: %v\n", attempt+1, err)
|
||||||
if !DelayForBackoff(backoff, attempt, r.Context().Done()) {
|
if !DelayForBackoff(backoff, attempt, r.Context().Done()) {
|
||||||
return nil, r.Context().Err()
|
return nil, r.Context().Err()
|
||||||
}
|
}
|
||||||
|
@ -316,8 +430,23 @@ func WithLogging(logger *log.Logger) SendDecorator {
|
||||||
// Note: Passing attempt 1 will result in doubling "backoff" duration. Treat this as a zero-based attempt
|
// Note: Passing attempt 1 will result in doubling "backoff" duration. Treat this as a zero-based attempt
|
||||||
// count.
|
// count.
|
||||||
func DelayForBackoff(backoff time.Duration, attempt int, cancel <-chan struct{}) bool {
|
func DelayForBackoff(backoff time.Duration, attempt int, cancel <-chan struct{}) bool {
|
||||||
|
return DelayForBackoffWithCap(backoff, 0, attempt, cancel)
|
||||||
|
}
|
||||||
|
|
||||||
|
// DelayForBackoffWithCap invokes time.After for the supplied backoff duration raised to the power of
|
||||||
|
// passed attempt (i.e., an exponential backoff delay). Backoff duration is in seconds and can set
|
||||||
|
// to zero for no delay. To cap the maximum possible delay specify a value greater than zero for cap.
|
||||||
|
// The delay may be canceled by closing the passed channel. If terminated early, returns false.
|
||||||
|
// Note: Passing attempt 1 will result in doubling "backoff" duration. Treat this as a zero-based attempt
|
||||||
|
// count.
|
||||||
|
func DelayForBackoffWithCap(backoff, cap time.Duration, attempt int, cancel <-chan struct{}) bool {
|
||||||
|
d := time.Duration(backoff.Seconds()*math.Pow(2, float64(attempt))) * time.Second
|
||||||
|
if cap > 0 && d > cap {
|
||||||
|
d = cap
|
||||||
|
}
|
||||||
|
logger.Instance.Writef(logger.LogInfo, "DelayForBackoffWithCap: sleeping for %s\n", d)
|
||||||
select {
|
select {
|
||||||
case <-time.After(time.Duration(backoff.Seconds()*math.Pow(2, float64(attempt))) * time.Second):
|
case <-time.After(d):
|
||||||
return true
|
return true
|
||||||
case <-cancel:
|
case <-cancel:
|
||||||
return false
|
return false
|
||||||
|
|
45
vendor/github.com/Azure/go-autorest/autorest/utility.go
generated
vendored
45
vendor/github.com/Azure/go-autorest/autorest/utility.go
generated
vendored
|
@ -20,13 +20,12 @@ import (
|
||||||
"encoding/xml"
|
"encoding/xml"
|
||||||
"fmt"
|
"fmt"
|
||||||
"io"
|
"io"
|
||||||
|
"io/ioutil"
|
||||||
"net"
|
"net"
|
||||||
"net/http"
|
"net/http"
|
||||||
"net/url"
|
"net/url"
|
||||||
"reflect"
|
"reflect"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"github.com/Azure/go-autorest/autorest/adal"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
// EncodedAs is a series of constants specifying various data encodings
|
// EncodedAs is a series of constants specifying various data encodings
|
||||||
|
@ -140,24 +139,24 @@ func MapToValues(m map[string]interface{}) url.Values {
|
||||||
return v
|
return v
|
||||||
}
|
}
|
||||||
|
|
||||||
// AsStringSlice method converts interface{} to []string. This expects a
|
// AsStringSlice method converts interface{} to []string.
|
||||||
//that the parameter passed to be a slice or array of a type that has the underlying
|
// s must be of type slice or array or an error is returned.
|
||||||
//type a string.
|
// Each element of s will be converted to its string representation.
|
||||||
func AsStringSlice(s interface{}) ([]string, error) {
|
func AsStringSlice(s interface{}) ([]string, error) {
|
||||||
v := reflect.ValueOf(s)
|
v := reflect.ValueOf(s)
|
||||||
if v.Kind() != reflect.Slice && v.Kind() != reflect.Array {
|
if v.Kind() != reflect.Slice && v.Kind() != reflect.Array {
|
||||||
return nil, NewError("autorest", "AsStringSlice", "the value's type is not an array.")
|
return nil, NewError("autorest", "AsStringSlice", "the value's type is not a slice or array.")
|
||||||
}
|
}
|
||||||
stringSlice := make([]string, 0, v.Len())
|
stringSlice := make([]string, 0, v.Len())
|
||||||
|
|
||||||
for i := 0; i < v.Len(); i++ {
|
for i := 0; i < v.Len(); i++ {
|
||||||
stringSlice = append(stringSlice, v.Index(i).String())
|
stringSlice = append(stringSlice, fmt.Sprintf("%v", v.Index(i)))
|
||||||
}
|
}
|
||||||
return stringSlice, nil
|
return stringSlice, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// String method converts interface v to string. If interface is a list, it
|
// String method converts interface v to string. If interface is a list, it
|
||||||
// joins list elements using the seperator. Note that only sep[0] will be used for
|
// joins list elements using the separator. Note that only sep[0] will be used for
|
||||||
// joining if any separator is specified.
|
// joining if any separator is specified.
|
||||||
func String(v interface{}, sep ...string) string {
|
func String(v interface{}, sep ...string) string {
|
||||||
if len(sep) == 0 {
|
if len(sep) == 0 {
|
||||||
|
@ -206,22 +205,28 @@ func ChangeToGet(req *http.Request) *http.Request {
|
||||||
return req
|
return req
|
||||||
}
|
}
|
||||||
|
|
||||||
// IsTokenRefreshError returns true if the specified error implements the TokenRefreshError
|
// IsTemporaryNetworkError returns true if the specified error is a temporary network error or false
|
||||||
// interface. If err is a DetailedError it will walk the chain of Original errors.
|
// if it's not. If the error doesn't implement the net.Error interface the return value is true.
|
||||||
func IsTokenRefreshError(err error) bool {
|
func IsTemporaryNetworkError(err error) bool {
|
||||||
if _, ok := err.(adal.TokenRefreshError); ok {
|
if netErr, ok := err.(net.Error); !ok || (ok && netErr.Temporary()) {
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
if de, ok := err.(DetailedError); ok {
|
|
||||||
return IsTokenRefreshError(de.Original)
|
|
||||||
}
|
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
// IsTemporaryNetworkError returns true if the specified error is a temporary network error.
|
// DrainResponseBody reads the response body then closes it.
|
||||||
func IsTemporaryNetworkError(err error) bool {
|
func DrainResponseBody(resp *http.Response) error {
|
||||||
if netErr, ok := err.(net.Error); ok && netErr.Temporary() {
|
if resp != nil && resp.Body != nil {
|
||||||
return true
|
_, err := io.Copy(ioutil.Discard, resp.Body)
|
||||||
|
resp.Body.Close()
|
||||||
|
return err
|
||||||
}
|
}
|
||||||
return false
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func setHeader(r *http.Request, key, value string) {
|
||||||
|
if r.Header == nil {
|
||||||
|
r.Header = make(http.Header)
|
||||||
|
}
|
||||||
|
r.Header.Set(key, value)
|
||||||
}
|
}
|
||||||
|
|
30
vendor/github.com/Azure/go-autorest/autorest/utility_1.13.go
generated
vendored
Normal file
30
vendor/github.com/Azure/go-autorest/autorest/utility_1.13.go
generated
vendored
Normal file
|
@ -0,0 +1,30 @@
|
||||||
|
//go:build go1.13
|
||||||
|
// +build go1.13
|
||||||
|
|
||||||
|
// Copyright 2017 Microsoft Corporation
|
||||||
|
//
|
||||||
|
// 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 autorest
|
||||||
|
|
||||||
|
import (
|
||||||
|
"errors"
|
||||||
|
|
||||||
|
"github.com/Azure/go-autorest/autorest/adal"
|
||||||
|
)
|
||||||
|
|
||||||
|
// IsTokenRefreshError returns true if the specified error implements the TokenRefreshError interface.
|
||||||
|
func IsTokenRefreshError(err error) bool {
|
||||||
|
var tre adal.TokenRefreshError
|
||||||
|
return errors.As(err, &tre)
|
||||||
|
}
|
32
vendor/github.com/Azure/go-autorest/autorest/utility_legacy.go
generated
vendored
Normal file
32
vendor/github.com/Azure/go-autorest/autorest/utility_legacy.go
generated
vendored
Normal file
|
@ -0,0 +1,32 @@
|
||||||
|
//go:build !go1.13
|
||||||
|
// +build !go1.13
|
||||||
|
|
||||||
|
// Copyright 2017 Microsoft Corporation
|
||||||
|
//
|
||||||
|
// 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 autorest
|
||||||
|
|
||||||
|
import "github.com/Azure/go-autorest/autorest/adal"
|
||||||
|
|
||||||
|
// IsTokenRefreshError returns true if the specified error implements the TokenRefreshError
|
||||||
|
// interface. If err is a DetailedError it will walk the chain of Original errors.
|
||||||
|
func IsTokenRefreshError(err error) bool {
|
||||||
|
if _, ok := err.(adal.TokenRefreshError); ok {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
if de, ok := err.(DetailedError); ok {
|
||||||
|
return IsTokenRefreshError(de.Original)
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
23
vendor/github.com/Azure/go-autorest/autorest/version.go
generated
vendored
23
vendor/github.com/Azure/go-autorest/autorest/version.go
generated
vendored
|
@ -14,7 +14,28 @@ package autorest
|
||||||
// See the License for the specific language governing permissions and
|
// See the License for the specific language governing permissions and
|
||||||
// limitations under the License.
|
// limitations under the License.
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"runtime"
|
||||||
|
)
|
||||||
|
|
||||||
|
const number = "v14.2.1"
|
||||||
|
|
||||||
|
var (
|
||||||
|
userAgent = fmt.Sprintf("Go/%s (%s-%s) go-autorest/%s",
|
||||||
|
runtime.Version(),
|
||||||
|
runtime.GOARCH,
|
||||||
|
runtime.GOOS,
|
||||||
|
number,
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
// UserAgent returns a string containing the Go version, system architecture and OS, and the go-autorest version.
|
||||||
|
func UserAgent() string {
|
||||||
|
return userAgent
|
||||||
|
}
|
||||||
|
|
||||||
// Version returns the semantic version (see http://semver.org).
|
// Version returns the semantic version (see http://semver.org).
|
||||||
func Version() string {
|
func Version() string {
|
||||||
return "v10.8.1"
|
return number
|
||||||
}
|
}
|
||||||
|
|
105
vendor/github.com/Azure/go-autorest/azure-pipelines.yml
generated
vendored
Normal file
105
vendor/github.com/Azure/go-autorest/azure-pipelines.yml
generated
vendored
Normal file
|
@ -0,0 +1,105 @@
|
||||||
|
variables:
|
||||||
|
GOPATH: '$(system.defaultWorkingDirectory)/work'
|
||||||
|
sdkPath: '$(GOPATH)/src/github.com/$(build.repository.name)'
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
- job: 'goautorest'
|
||||||
|
displayName: 'Run go-autorest CI Checks'
|
||||||
|
|
||||||
|
strategy:
|
||||||
|
matrix:
|
||||||
|
Linux_Go113:
|
||||||
|
vm.image: 'ubuntu-18.04'
|
||||||
|
go.version: '1.13'
|
||||||
|
Linux_Go114:
|
||||||
|
vm.image: 'ubuntu-18.04'
|
||||||
|
go.version: '1.14'
|
||||||
|
|
||||||
|
pool:
|
||||||
|
vmImage: '$(vm.image)'
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- task: GoTool@0
|
||||||
|
inputs:
|
||||||
|
version: '$(go.version)'
|
||||||
|
displayName: "Select Go Version"
|
||||||
|
|
||||||
|
- script: |
|
||||||
|
set -e
|
||||||
|
mkdir -p '$(GOPATH)/bin'
|
||||||
|
mkdir -p '$(sdkPath)'
|
||||||
|
shopt -s extglob
|
||||||
|
mv !(work) '$(sdkPath)'
|
||||||
|
echo '##vso[task.prependpath]$(GOPATH)/bin'
|
||||||
|
displayName: 'Create Go Workspace'
|
||||||
|
|
||||||
|
- script: |
|
||||||
|
set -e
|
||||||
|
curl -sSL https://raw.githubusercontent.com/golang/dep/master/install.sh | sh
|
||||||
|
dep ensure -v
|
||||||
|
go install ./vendor/golang.org/x/lint/golint
|
||||||
|
go get github.com/jstemmer/go-junit-report
|
||||||
|
go get github.com/axw/gocov/gocov
|
||||||
|
go get github.com/AlekSi/gocov-xml
|
||||||
|
go get -u github.com/matm/gocov-html
|
||||||
|
workingDirectory: '$(sdkPath)'
|
||||||
|
displayName: 'Install Dependencies'
|
||||||
|
|
||||||
|
- script: |
|
||||||
|
go vet ./autorest/...
|
||||||
|
go vet ./logger/...
|
||||||
|
go vet ./tracing/...
|
||||||
|
workingDirectory: '$(sdkPath)'
|
||||||
|
displayName: 'Vet'
|
||||||
|
|
||||||
|
- script: |
|
||||||
|
go build -v ./autorest/...
|
||||||
|
go build -v ./logger/...
|
||||||
|
go build -v ./tracing/...
|
||||||
|
workingDirectory: '$(sdkPath)'
|
||||||
|
displayName: 'Build'
|
||||||
|
|
||||||
|
- script: |
|
||||||
|
set -e
|
||||||
|
go test -race -v -coverprofile=coverage.txt -covermode atomic ./autorest/... ./logger/... ./tracing/... 2>&1 | go-junit-report > report.xml
|
||||||
|
gocov convert coverage.txt > coverage.json
|
||||||
|
gocov-xml < coverage.json > coverage.xml
|
||||||
|
gocov-html < coverage.json > coverage.html
|
||||||
|
workingDirectory: '$(sdkPath)'
|
||||||
|
displayName: 'Run Tests'
|
||||||
|
|
||||||
|
- script: grep -L -r --include *.go --exclude-dir vendor -P "Copyright (\d{4}|\(c\)) Microsoft" ./ | tee >&2
|
||||||
|
workingDirectory: '$(sdkPath)'
|
||||||
|
displayName: 'Copyright Header Check'
|
||||||
|
failOnStderr: true
|
||||||
|
condition: succeededOrFailed()
|
||||||
|
|
||||||
|
- script: |
|
||||||
|
gofmt -s -l -w ./autorest/. >&2
|
||||||
|
gofmt -s -l -w ./logger/. >&2
|
||||||
|
gofmt -s -l -w ./tracing/. >&2
|
||||||
|
workingDirectory: '$(sdkPath)'
|
||||||
|
displayName: 'Format Check'
|
||||||
|
failOnStderr: true
|
||||||
|
condition: succeededOrFailed()
|
||||||
|
|
||||||
|
- script: |
|
||||||
|
golint ./autorest/... >&2
|
||||||
|
golint ./logger/... >&2
|
||||||
|
golint ./tracing/... >&2
|
||||||
|
workingDirectory: '$(sdkPath)'
|
||||||
|
displayName: 'Linter Check'
|
||||||
|
failOnStderr: true
|
||||||
|
condition: succeededOrFailed()
|
||||||
|
|
||||||
|
- task: PublishTestResults@2
|
||||||
|
inputs:
|
||||||
|
testRunner: JUnit
|
||||||
|
testResultsFiles: $(sdkPath)/report.xml
|
||||||
|
failTaskOnFailedTests: true
|
||||||
|
|
||||||
|
- task: PublishCodeCoverageResults@1
|
||||||
|
inputs:
|
||||||
|
codeCoverageTool: Cobertura
|
||||||
|
summaryFileLocation: $(sdkPath)/coverage.xml
|
||||||
|
additionalCodeCoverageFiles: $(sdkPath)/coverage.html
|
18
vendor/github.com/Azure/go-autorest/doc.go
generated
vendored
Normal file
18
vendor/github.com/Azure/go-autorest/doc.go
generated
vendored
Normal file
|
@ -0,0 +1,18 @@
|
||||||
|
/*
|
||||||
|
Package go-autorest provides an HTTP request client for use with Autorest-generated API client packages.
|
||||||
|
*/
|
||||||
|
package go_autorest
|
||||||
|
|
||||||
|
// Copyright 2017 Microsoft Corporation
|
||||||
|
//
|
||||||
|
// 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.
|
191
vendor/github.com/Azure/go-autorest/logger/LICENSE
generated
vendored
Normal file
191
vendor/github.com/Azure/go-autorest/logger/LICENSE
generated
vendored
Normal file
|
@ -0,0 +1,191 @@
|
||||||
|
|
||||||
|
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
|
||||||
|
|
||||||
|
Copyright 2015 Microsoft Corporation
|
||||||
|
|
||||||
|
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.
|
5
vendor/github.com/Azure/go-autorest/logger/go.mod
generated
vendored
Normal file
5
vendor/github.com/Azure/go-autorest/logger/go.mod
generated
vendored
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
module github.com/Azure/go-autorest/logger
|
||||||
|
|
||||||
|
go 1.12
|
||||||
|
|
||||||
|
require github.com/Azure/go-autorest v14.2.0+incompatible
|
2
vendor/github.com/Azure/go-autorest/logger/go.sum
generated
vendored
Normal file
2
vendor/github.com/Azure/go-autorest/logger/go.sum
generated
vendored
Normal file
|
@ -0,0 +1,2 @@
|
||||||
|
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=
|
24
vendor/github.com/Azure/go-autorest/logger/go_mod_tidy_hack.go
generated
vendored
Normal file
24
vendor/github.com/Azure/go-autorest/logger/go_mod_tidy_hack.go
generated
vendored
Normal file
|
@ -0,0 +1,24 @@
|
||||||
|
// +build modhack
|
||||||
|
|
||||||
|
package logger
|
||||||
|
|
||||||
|
// Copyright 2017 Microsoft Corporation
|
||||||
|
//
|
||||||
|
// 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.
|
||||||
|
|
||||||
|
// This file, and the github.com/Azure/go-autorest import, won't actually become part of
|
||||||
|
// the resultant binary.
|
||||||
|
|
||||||
|
// Necessary for safely adding multi-module repo.
|
||||||
|
// See: https://github.com/golang/go/wiki/Modules#is-it-possible-to-add-a-module-to-a-multi-module-repository
|
||||||
|
import _ "github.com/Azure/go-autorest"
|
337
vendor/github.com/Azure/go-autorest/logger/logger.go
generated
vendored
Normal file
337
vendor/github.com/Azure/go-autorest/logger/logger.go
generated
vendored
Normal file
|
@ -0,0 +1,337 @@
|
||||||
|
package logger
|
||||||
|
|
||||||
|
// Copyright 2017 Microsoft Corporation
|
||||||
|
//
|
||||||
|
// 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.
|
||||||
|
|
||||||
|
import (
|
||||||
|
"bytes"
|
||||||
|
"fmt"
|
||||||
|
"io"
|
||||||
|
"io/ioutil"
|
||||||
|
"net/http"
|
||||||
|
"net/url"
|
||||||
|
"os"
|
||||||
|
"strings"
|
||||||
|
"sync"
|
||||||
|
"time"
|
||||||
|
)
|
||||||
|
|
||||||
|
// LevelType tells a logger the minimum level to log. When code reports a log entry,
|
||||||
|
// the LogLevel indicates the level of the log entry. The logger only records entries
|
||||||
|
// whose level is at least the level it was told to log. See the Log* constants.
|
||||||
|
// For example, if a logger is configured with LogError, then LogError, LogPanic,
|
||||||
|
// and LogFatal entries will be logged; lower level entries are ignored.
|
||||||
|
type LevelType uint32
|
||||||
|
|
||||||
|
const (
|
||||||
|
// LogNone tells a logger not to log any entries passed to it.
|
||||||
|
LogNone LevelType = iota
|
||||||
|
|
||||||
|
// LogFatal tells a logger to log all LogFatal entries passed to it.
|
||||||
|
LogFatal
|
||||||
|
|
||||||
|
// LogPanic tells a logger to log all LogPanic and LogFatal entries passed to it.
|
||||||
|
LogPanic
|
||||||
|
|
||||||
|
// LogError tells a logger to log all LogError, LogPanic and LogFatal entries passed to it.
|
||||||
|
LogError
|
||||||
|
|
||||||
|
// LogWarning tells a logger to log all LogWarning, LogError, LogPanic and LogFatal entries passed to it.
|
||||||
|
LogWarning
|
||||||
|
|
||||||
|
// LogInfo tells a logger to log all LogInfo, LogWarning, LogError, LogPanic and LogFatal entries passed to it.
|
||||||
|
LogInfo
|
||||||
|
|
||||||
|
// LogDebug tells a logger to log all LogDebug, LogInfo, LogWarning, LogError, LogPanic and LogFatal entries passed to it.
|
||||||
|
LogDebug
|
||||||
|
|
||||||
|
// LogAuth is a special case of LogDebug, it tells a logger to also log the body of an authentication request and response.
|
||||||
|
// NOTE: this can disclose sensitive information, use with care.
|
||||||
|
LogAuth
|
||||||
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
logNone = "NONE"
|
||||||
|
logFatal = "FATAL"
|
||||||
|
logPanic = "PANIC"
|
||||||
|
logError = "ERROR"
|
||||||
|
logWarning = "WARNING"
|
||||||
|
logInfo = "INFO"
|
||||||
|
logDebug = "DEBUG"
|
||||||
|
logAuth = "AUTH"
|
||||||
|
logUnknown = "UNKNOWN"
|
||||||
|
)
|
||||||
|
|
||||||
|
// ParseLevel converts the specified string into the corresponding LevelType.
|
||||||
|
func ParseLevel(s string) (lt LevelType, err error) {
|
||||||
|
switch strings.ToUpper(s) {
|
||||||
|
case logFatal:
|
||||||
|
lt = LogFatal
|
||||||
|
case logPanic:
|
||||||
|
lt = LogPanic
|
||||||
|
case logError:
|
||||||
|
lt = LogError
|
||||||
|
case logWarning:
|
||||||
|
lt = LogWarning
|
||||||
|
case logInfo:
|
||||||
|
lt = LogInfo
|
||||||
|
case logDebug:
|
||||||
|
lt = LogDebug
|
||||||
|
case logAuth:
|
||||||
|
lt = LogAuth
|
||||||
|
default:
|
||||||
|
err = fmt.Errorf("bad log level '%s'", s)
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// String implements the stringer interface for LevelType.
|
||||||
|
func (lt LevelType) String() string {
|
||||||
|
switch lt {
|
||||||
|
case LogNone:
|
||||||
|
return logNone
|
||||||
|
case LogFatal:
|
||||||
|
return logFatal
|
||||||
|
case LogPanic:
|
||||||
|
return logPanic
|
||||||
|
case LogError:
|
||||||
|
return logError
|
||||||
|
case LogWarning:
|
||||||
|
return logWarning
|
||||||
|
case LogInfo:
|
||||||
|
return logInfo
|
||||||
|
case LogDebug:
|
||||||
|
return logDebug
|
||||||
|
case LogAuth:
|
||||||
|
return logAuth
|
||||||
|
default:
|
||||||
|
return logUnknown
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Filter defines functions for filtering HTTP request/response content.
|
||||||
|
type Filter struct {
|
||||||
|
// URL returns a potentially modified string representation of a request URL.
|
||||||
|
URL func(u *url.URL) string
|
||||||
|
|
||||||
|
// Header returns a potentially modified set of values for the specified key.
|
||||||
|
// To completely exclude the header key/values return false.
|
||||||
|
Header func(key string, val []string) (bool, []string)
|
||||||
|
|
||||||
|
// Body returns a potentially modified request/response body.
|
||||||
|
Body func(b []byte) []byte
|
||||||
|
}
|
||||||
|
|
||||||
|
func (f Filter) processURL(u *url.URL) string {
|
||||||
|
if f.URL == nil {
|
||||||
|
return u.String()
|
||||||
|
}
|
||||||
|
return f.URL(u)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (f Filter) processHeader(k string, val []string) (bool, []string) {
|
||||||
|
if f.Header == nil {
|
||||||
|
return true, val
|
||||||
|
}
|
||||||
|
return f.Header(k, val)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (f Filter) processBody(b []byte) []byte {
|
||||||
|
if f.Body == nil {
|
||||||
|
return b
|
||||||
|
}
|
||||||
|
return f.Body(b)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Writer defines methods for writing to a logging facility.
|
||||||
|
type Writer interface {
|
||||||
|
// Writeln writes the specified message with the standard log entry header and new-line character.
|
||||||
|
Writeln(level LevelType, message string)
|
||||||
|
|
||||||
|
// Writef writes the specified format specifier with the standard log entry header and no new-line character.
|
||||||
|
Writef(level LevelType, format string, a ...interface{})
|
||||||
|
|
||||||
|
// WriteRequest writes the specified HTTP request to the logger if the log level is greater than
|
||||||
|
// or equal to LogInfo. The request body, if set, is logged at level LogDebug or higher.
|
||||||
|
// Custom filters can be specified to exclude URL, header, and/or body content from the log.
|
||||||
|
// By default no request content is excluded.
|
||||||
|
WriteRequest(req *http.Request, filter Filter)
|
||||||
|
|
||||||
|
// WriteResponse writes the specified HTTP response to the logger if the log level is greater than
|
||||||
|
// or equal to LogInfo. The response body, if set, is logged at level LogDebug or higher.
|
||||||
|
// Custom filters can be specified to exclude URL, header, and/or body content from the log.
|
||||||
|
// By default no response content is excluded.
|
||||||
|
WriteResponse(resp *http.Response, filter Filter)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Instance is the default log writer initialized during package init.
|
||||||
|
// This can be replaced with a custom implementation as required.
|
||||||
|
var Instance Writer
|
||||||
|
|
||||||
|
// default log level
|
||||||
|
var logLevel = LogNone
|
||||||
|
|
||||||
|
// Level returns the value specified in AZURE_GO_AUTOREST_LOG_LEVEL.
|
||||||
|
// If no value was specified the default value is LogNone.
|
||||||
|
// Custom loggers can call this to retrieve the configured log level.
|
||||||
|
func Level() LevelType {
|
||||||
|
return logLevel
|
||||||
|
}
|
||||||
|
|
||||||
|
func init() {
|
||||||
|
// separated for testing purposes
|
||||||
|
initDefaultLogger()
|
||||||
|
}
|
||||||
|
|
||||||
|
func initDefaultLogger() {
|
||||||
|
// init with nilLogger so callers don't have to do a nil check on Default
|
||||||
|
Instance = nilLogger{}
|
||||||
|
llStr := strings.ToLower(os.Getenv("AZURE_GO_SDK_LOG_LEVEL"))
|
||||||
|
if llStr == "" {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
var err error
|
||||||
|
logLevel, err = ParseLevel(llStr)
|
||||||
|
if err != nil {
|
||||||
|
fmt.Fprintf(os.Stderr, "go-autorest: failed to parse log level: %s\n", err.Error())
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if logLevel == LogNone {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
// default to stderr
|
||||||
|
dest := os.Stderr
|
||||||
|
lfStr := os.Getenv("AZURE_GO_SDK_LOG_FILE")
|
||||||
|
if strings.EqualFold(lfStr, "stdout") {
|
||||||
|
dest = os.Stdout
|
||||||
|
} else if lfStr != "" {
|
||||||
|
lf, err := os.Create(lfStr)
|
||||||
|
if err == nil {
|
||||||
|
dest = lf
|
||||||
|
} else {
|
||||||
|
fmt.Fprintf(os.Stderr, "go-autorest: failed to create log file, using stderr: %s\n", err.Error())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Instance = fileLogger{
|
||||||
|
logLevel: logLevel,
|
||||||
|
mu: &sync.Mutex{},
|
||||||
|
logFile: dest,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// the nil logger does nothing
|
||||||
|
type nilLogger struct{}
|
||||||
|
|
||||||
|
func (nilLogger) Writeln(LevelType, string) {}
|
||||||
|
|
||||||
|
func (nilLogger) Writef(LevelType, string, ...interface{}) {}
|
||||||
|
|
||||||
|
func (nilLogger) WriteRequest(*http.Request, Filter) {}
|
||||||
|
|
||||||
|
func (nilLogger) WriteResponse(*http.Response, Filter) {}
|
||||||
|
|
||||||
|
// A File is used instead of a Logger so the stream can be flushed after every write.
|
||||||
|
type fileLogger struct {
|
||||||
|
logLevel LevelType
|
||||||
|
mu *sync.Mutex // for synchronizing writes to logFile
|
||||||
|
logFile *os.File
|
||||||
|
}
|
||||||
|
|
||||||
|
func (fl fileLogger) Writeln(level LevelType, message string) {
|
||||||
|
fl.Writef(level, "%s\n", message)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (fl fileLogger) Writef(level LevelType, format string, a ...interface{}) {
|
||||||
|
if fl.logLevel >= level {
|
||||||
|
fl.mu.Lock()
|
||||||
|
defer fl.mu.Unlock()
|
||||||
|
fmt.Fprintf(fl.logFile, "%s %s", entryHeader(level), fmt.Sprintf(format, a...))
|
||||||
|
fl.logFile.Sync()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (fl fileLogger) WriteRequest(req *http.Request, filter Filter) {
|
||||||
|
if req == nil || fl.logLevel < LogInfo {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
b := &bytes.Buffer{}
|
||||||
|
fmt.Fprintf(b, "%s REQUEST: %s %s\n", entryHeader(LogInfo), req.Method, filter.processURL(req.URL))
|
||||||
|
// dump headers
|
||||||
|
for k, v := range req.Header {
|
||||||
|
if ok, mv := filter.processHeader(k, v); ok {
|
||||||
|
fmt.Fprintf(b, "%s: %s\n", k, strings.Join(mv, ","))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if fl.shouldLogBody(req.Header, req.Body) {
|
||||||
|
// dump body
|
||||||
|
body, err := ioutil.ReadAll(req.Body)
|
||||||
|
if err == nil {
|
||||||
|
fmt.Fprintln(b, string(filter.processBody(body)))
|
||||||
|
if nc, ok := req.Body.(io.Seeker); ok {
|
||||||
|
// rewind to the beginning
|
||||||
|
nc.Seek(0, io.SeekStart)
|
||||||
|
} else {
|
||||||
|
// recreate the body
|
||||||
|
req.Body = ioutil.NopCloser(bytes.NewReader(body))
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
fmt.Fprintf(b, "failed to read body: %v\n", err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
fl.mu.Lock()
|
||||||
|
defer fl.mu.Unlock()
|
||||||
|
fmt.Fprint(fl.logFile, b.String())
|
||||||
|
fl.logFile.Sync()
|
||||||
|
}
|
||||||
|
|
||||||
|
func (fl fileLogger) WriteResponse(resp *http.Response, filter Filter) {
|
||||||
|
if resp == nil || fl.logLevel < LogInfo {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
b := &bytes.Buffer{}
|
||||||
|
fmt.Fprintf(b, "%s RESPONSE: %d %s\n", entryHeader(LogInfo), resp.StatusCode, filter.processURL(resp.Request.URL))
|
||||||
|
// dump headers
|
||||||
|
for k, v := range resp.Header {
|
||||||
|
if ok, mv := filter.processHeader(k, v); ok {
|
||||||
|
fmt.Fprintf(b, "%s: %s\n", k, strings.Join(mv, ","))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if fl.shouldLogBody(resp.Header, resp.Body) {
|
||||||
|
// dump body
|
||||||
|
defer resp.Body.Close()
|
||||||
|
body, err := ioutil.ReadAll(resp.Body)
|
||||||
|
if err == nil {
|
||||||
|
fmt.Fprintln(b, string(filter.processBody(body)))
|
||||||
|
resp.Body = ioutil.NopCloser(bytes.NewReader(body))
|
||||||
|
} else {
|
||||||
|
fmt.Fprintf(b, "failed to read body: %v\n", err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
fl.mu.Lock()
|
||||||
|
defer fl.mu.Unlock()
|
||||||
|
fmt.Fprint(fl.logFile, b.String())
|
||||||
|
fl.logFile.Sync()
|
||||||
|
}
|
||||||
|
|
||||||
|
// returns true if the provided body should be included in the log
|
||||||
|
func (fl fileLogger) shouldLogBody(header http.Header, body io.ReadCloser) bool {
|
||||||
|
ct := header.Get("Content-Type")
|
||||||
|
return fl.logLevel >= LogDebug && body != nil && !strings.Contains(ct, "application/octet-stream")
|
||||||
|
}
|
||||||
|
|
||||||
|
// creates standard header for log entries, it contains a timestamp and the log level
|
||||||
|
func entryHeader(level LevelType) string {
|
||||||
|
// this format provides a fixed number of digits so the size of the timestamp is constant
|
||||||
|
return fmt.Sprintf("(%s) %s:", time.Now().Format("2006-01-02T15:04:05.0000000Z07:00"), level.String())
|
||||||
|
}
|
191
vendor/github.com/Azure/go-autorest/tracing/LICENSE
generated
vendored
Normal file
191
vendor/github.com/Azure/go-autorest/tracing/LICENSE
generated
vendored
Normal file
|
@ -0,0 +1,191 @@
|
||||||
|
|
||||||
|
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
|
||||||
|
|
||||||
|
Copyright 2015 Microsoft Corporation
|
||||||
|
|
||||||
|
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.
|
5
vendor/github.com/Azure/go-autorest/tracing/go.mod
generated
vendored
Normal file
5
vendor/github.com/Azure/go-autorest/tracing/go.mod
generated
vendored
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
module github.com/Azure/go-autorest/tracing
|
||||||
|
|
||||||
|
go 1.12
|
||||||
|
|
||||||
|
require github.com/Azure/go-autorest v14.2.0+incompatible
|
2
vendor/github.com/Azure/go-autorest/tracing/go.sum
generated
vendored
Normal file
2
vendor/github.com/Azure/go-autorest/tracing/go.sum
generated
vendored
Normal file
|
@ -0,0 +1,2 @@
|
||||||
|
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=
|
24
vendor/github.com/Azure/go-autorest/tracing/go_mod_tidy_hack.go
generated
vendored
Normal file
24
vendor/github.com/Azure/go-autorest/tracing/go_mod_tidy_hack.go
generated
vendored
Normal file
|
@ -0,0 +1,24 @@
|
||||||
|
// +build modhack
|
||||||
|
|
||||||
|
package tracing
|
||||||
|
|
||||||
|
// Copyright 2017 Microsoft Corporation
|
||||||
|
//
|
||||||
|
// 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.
|
||||||
|
|
||||||
|
// This file, and the github.com/Azure/go-autorest import, won't actually become part of
|
||||||
|
// the resultant binary.
|
||||||
|
|
||||||
|
// Necessary for safely adding multi-module repo.
|
||||||
|
// See: https://github.com/golang/go/wiki/Modules#is-it-possible-to-add-a-module-to-a-multi-module-repository
|
||||||
|
import _ "github.com/Azure/go-autorest"
|
67
vendor/github.com/Azure/go-autorest/tracing/tracing.go
generated
vendored
Normal file
67
vendor/github.com/Azure/go-autorest/tracing/tracing.go
generated
vendored
Normal file
|
@ -0,0 +1,67 @@
|
||||||
|
package tracing
|
||||||
|
|
||||||
|
// Copyright 2018 Microsoft Corporation
|
||||||
|
//
|
||||||
|
// 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.
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"net/http"
|
||||||
|
)
|
||||||
|
|
||||||
|
// Tracer represents an HTTP tracing facility.
|
||||||
|
type Tracer interface {
|
||||||
|
NewTransport(base *http.Transport) http.RoundTripper
|
||||||
|
StartSpan(ctx context.Context, name string) context.Context
|
||||||
|
EndSpan(ctx context.Context, httpStatusCode int, err error)
|
||||||
|
}
|
||||||
|
|
||||||
|
var (
|
||||||
|
tracer Tracer
|
||||||
|
)
|
||||||
|
|
||||||
|
// Register will register the provided Tracer. Pass nil to unregister a Tracer.
|
||||||
|
func Register(t Tracer) {
|
||||||
|
tracer = t
|
||||||
|
}
|
||||||
|
|
||||||
|
// IsEnabled returns true if a Tracer has been registered.
|
||||||
|
func IsEnabled() bool {
|
||||||
|
return tracer != nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewTransport creates a new instrumenting http.RoundTripper for the
|
||||||
|
// registered Tracer. If no Tracer has been registered it returns nil.
|
||||||
|
func NewTransport(base *http.Transport) http.RoundTripper {
|
||||||
|
if tracer != nil {
|
||||||
|
return tracer.NewTransport(base)
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// StartSpan starts a trace span with the specified name, associating it with the
|
||||||
|
// provided context. Has no effect if a Tracer has not been registered.
|
||||||
|
func StartSpan(ctx context.Context, name string) context.Context {
|
||||||
|
if tracer != nil {
|
||||||
|
return tracer.StartSpan(ctx, name)
|
||||||
|
}
|
||||||
|
return ctx
|
||||||
|
}
|
||||||
|
|
||||||
|
// EndSpan ends a previously started span stored in the context.
|
||||||
|
// Has no effect if a Tracer has not been registered.
|
||||||
|
func EndSpan(ctx context.Context, httpStatusCode int, err error) {
|
||||||
|
if tracer != nil {
|
||||||
|
tracer.EndSpan(ctx, httpStatusCode, err)
|
||||||
|
}
|
||||||
|
}
|
13
vendor/github.com/dgrijalva/jwt-go/.travis.yml
generated
vendored
13
vendor/github.com/dgrijalva/jwt-go/.travis.yml
generated
vendored
|
@ -1,13 +0,0 @@
|
||||||
language: go
|
|
||||||
|
|
||||||
script:
|
|
||||||
- go vet ./...
|
|
||||||
- go test -v ./...
|
|
||||||
|
|
||||||
go:
|
|
||||||
- 1.3
|
|
||||||
- 1.4
|
|
||||||
- 1.5
|
|
||||||
- 1.6
|
|
||||||
- 1.7
|
|
||||||
- tip
|
|
97
vendor/github.com/dgrijalva/jwt-go/MIGRATION_GUIDE.md
generated
vendored
97
vendor/github.com/dgrijalva/jwt-go/MIGRATION_GUIDE.md
generated
vendored
|
@ -1,97 +0,0 @@
|
||||||
## Migration Guide from v2 -> v3
|
|
||||||
|
|
||||||
Version 3 adds several new, frequently requested features. To do so, it introduces a few breaking changes. We've worked to keep these as minimal as possible. This guide explains the breaking changes and how you can quickly update your code.
|
|
||||||
|
|
||||||
### `Token.Claims` is now an interface type
|
|
||||||
|
|
||||||
The most requested feature from the 2.0 verison of this library was the ability to provide a custom type to the JSON parser for claims. This was implemented by introducing a new interface, `Claims`, to replace `map[string]interface{}`. We also included two concrete implementations of `Claims`: `MapClaims` and `StandardClaims`.
|
|
||||||
|
|
||||||
`MapClaims` is an alias for `map[string]interface{}` with built in validation behavior. It is the default claims type when using `Parse`. The usage is unchanged except you must type cast the claims property.
|
|
||||||
|
|
||||||
The old example for parsing a token looked like this..
|
|
||||||
|
|
||||||
```go
|
|
||||||
if token, err := jwt.Parse(tokenString, keyLookupFunc); err == nil {
|
|
||||||
fmt.Printf("Token for user %v expires %v", token.Claims["user"], token.Claims["exp"])
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
is now directly mapped to...
|
|
||||||
|
|
||||||
```go
|
|
||||||
if token, err := jwt.Parse(tokenString, keyLookupFunc); err == nil {
|
|
||||||
claims := token.Claims.(jwt.MapClaims)
|
|
||||||
fmt.Printf("Token for user %v expires %v", claims["user"], claims["exp"])
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
`StandardClaims` is designed to be embedded in your custom type. You can supply a custom claims type with the new `ParseWithClaims` function. Here's an example of using a custom claims type.
|
|
||||||
|
|
||||||
```go
|
|
||||||
type MyCustomClaims struct {
|
|
||||||
User string
|
|
||||||
*StandardClaims
|
|
||||||
}
|
|
||||||
|
|
||||||
if token, err := jwt.ParseWithClaims(tokenString, &MyCustomClaims{}, keyLookupFunc); err == nil {
|
|
||||||
claims := token.Claims.(*MyCustomClaims)
|
|
||||||
fmt.Printf("Token for user %v expires %v", claims.User, claims.StandardClaims.ExpiresAt)
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
### `ParseFromRequest` has been moved
|
|
||||||
|
|
||||||
To keep this library focused on the tokens without becoming overburdened with complex request processing logic, `ParseFromRequest` and its new companion `ParseFromRequestWithClaims` have been moved to a subpackage, `request`. The method signatues have also been augmented to receive a new argument: `Extractor`.
|
|
||||||
|
|
||||||
`Extractors` do the work of picking the token string out of a request. The interface is simple and composable.
|
|
||||||
|
|
||||||
This simple parsing example:
|
|
||||||
|
|
||||||
```go
|
|
||||||
if token, err := jwt.ParseFromRequest(tokenString, req, keyLookupFunc); err == nil {
|
|
||||||
fmt.Printf("Token for user %v expires %v", token.Claims["user"], token.Claims["exp"])
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
is directly mapped to:
|
|
||||||
|
|
||||||
```go
|
|
||||||
if token, err := request.ParseFromRequest(req, request.OAuth2Extractor, keyLookupFunc); err == nil {
|
|
||||||
claims := token.Claims.(jwt.MapClaims)
|
|
||||||
fmt.Printf("Token for user %v expires %v", claims["user"], claims["exp"])
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
There are several concrete `Extractor` types provided for your convenience:
|
|
||||||
|
|
||||||
* `HeaderExtractor` will search a list of headers until one contains content.
|
|
||||||
* `ArgumentExtractor` will search a list of keys in request query and form arguments until one contains content.
|
|
||||||
* `MultiExtractor` will try a list of `Extractors` in order until one returns content.
|
|
||||||
* `AuthorizationHeaderExtractor` will look in the `Authorization` header for a `Bearer` token.
|
|
||||||
* `OAuth2Extractor` searches the places an OAuth2 token would be specified (per the spec): `Authorization` header and `access_token` argument
|
|
||||||
* `PostExtractionFilter` wraps an `Extractor`, allowing you to process the content before it's parsed. A simple example is stripping the `Bearer ` text from a header
|
|
||||||
|
|
||||||
|
|
||||||
### RSA signing methods no longer accept `[]byte` keys
|
|
||||||
|
|
||||||
Due to a [critical vulnerability](https://auth0.com/blog/2015/03/31/critical-vulnerabilities-in-json-web-token-libraries/), we've decided the convenience of accepting `[]byte` instead of `rsa.PublicKey` or `rsa.PrivateKey` isn't worth the risk of misuse.
|
|
||||||
|
|
||||||
To replace this behavior, we've added two helper methods: `ParseRSAPrivateKeyFromPEM(key []byte) (*rsa.PrivateKey, error)` and `ParseRSAPublicKeyFromPEM(key []byte) (*rsa.PublicKey, error)`. These are just simple helpers for unpacking PEM encoded PKCS1 and PKCS8 keys. If your keys are encoded any other way, all you need to do is convert them to the `crypto/rsa` package's types.
|
|
||||||
|
|
||||||
```go
|
|
||||||
func keyLookupFunc(*Token) (interface{}, error) {
|
|
||||||
// Don't forget to validate the alg is what you expect:
|
|
||||||
if _, ok := token.Method.(*jwt.SigningMethodRSA); !ok {
|
|
||||||
return nil, fmt.Errorf("Unexpected signing method: %v", token.Header["alg"])
|
|
||||||
}
|
|
||||||
|
|
||||||
// Look up key
|
|
||||||
key, err := lookupPublicKey(token.Header["kid"])
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
// Unpack key from PEM encoded PKCS8
|
|
||||||
return jwt.ParseRSAPublicKeyFromPEM(key)
|
|
||||||
}
|
|
||||||
```
|
|
85
vendor/github.com/dgrijalva/jwt-go/README.md
generated
vendored
85
vendor/github.com/dgrijalva/jwt-go/README.md
generated
vendored
|
@ -1,85 +0,0 @@
|
||||||
A [go](http://www.golang.org) (or 'golang' for search engine friendliness) implementation of [JSON Web Tokens](http://self-issued.info/docs/draft-ietf-oauth-json-web-token.html)
|
|
||||||
|
|
||||||
[![Build Status](https://travis-ci.org/dgrijalva/jwt-go.svg?branch=master)](https://travis-ci.org/dgrijalva/jwt-go)
|
|
||||||
|
|
||||||
**BREAKING CHANGES:*** Version 3.0.0 is here. It includes _a lot_ of changes including a few that break the API. We've tried to break as few things as possible, so there should just be a few type signature changes. A full list of breaking changes is available in `VERSION_HISTORY.md`. See `MIGRATION_GUIDE.md` for more information on updating your code.
|
|
||||||
|
|
||||||
**NOTICE:** A vulnerability in JWT was [recently published](https://auth0.com/blog/2015/03/31/critical-vulnerabilities-in-json-web-token-libraries/). As this library doesn't force users to validate the `alg` is what they expected, it's possible your usage is effected. There will be an update soon to remedy this, and it will likey require backwards-incompatible changes to the API. In the short term, please make sure your implementation verifies the `alg` is what you expect.
|
|
||||||
|
|
||||||
|
|
||||||
## What the heck is a JWT?
|
|
||||||
|
|
||||||
JWT.io has [a great introduction](https://jwt.io/introduction) to JSON Web Tokens.
|
|
||||||
|
|
||||||
In short, it's a signed JSON object that does something useful (for example, authentication). It's commonly used for `Bearer` tokens in Oauth 2. A token is made of three parts, separated by `.`'s. The first two parts are JSON objects, that have been [base64url](http://tools.ietf.org/html/rfc4648) encoded. The last part is the signature, encoded the same way.
|
|
||||||
|
|
||||||
The first part is called the header. It contains the necessary information for verifying the last part, the signature. For example, which encryption method was used for signing and what key was used.
|
|
||||||
|
|
||||||
The part in the middle is the interesting bit. It's called the Claims and contains the actual stuff you care about. Refer to [the RFC](http://self-issued.info/docs/draft-jones-json-web-token.html) for information about reserved keys and the proper way to add your own.
|
|
||||||
|
|
||||||
## What's in the box?
|
|
||||||
|
|
||||||
This library supports the parsing and verification as well as the generation and signing of JWTs. Current supported signing algorithms are HMAC SHA, RSA, RSA-PSS, and ECDSA, though hooks are present for adding your own.
|
|
||||||
|
|
||||||
## Examples
|
|
||||||
|
|
||||||
See [the project documentation](https://godoc.org/github.com/dgrijalva/jwt-go) for examples of usage:
|
|
||||||
|
|
||||||
* [Simple example of parsing and validating a token](https://godoc.org/github.com/dgrijalva/jwt-go#example-Parse--Hmac)
|
|
||||||
* [Simple example of building and signing a token](https://godoc.org/github.com/dgrijalva/jwt-go#example-New--Hmac)
|
|
||||||
* [Directory of Examples](https://godoc.org/github.com/dgrijalva/jwt-go#pkg-examples)
|
|
||||||
|
|
||||||
## Extensions
|
|
||||||
|
|
||||||
This library publishes all the necessary components for adding your own signing methods. Simply implement the `SigningMethod` interface and register a factory method using `RegisterSigningMethod`.
|
|
||||||
|
|
||||||
Here's an example of an extension that integrates with the Google App Engine signing tools: https://github.com/someone1/gcp-jwt-go
|
|
||||||
|
|
||||||
## Compliance
|
|
||||||
|
|
||||||
This library was last reviewed to comply with [RTF 7519](http://www.rfc-editor.org/info/rfc7519) dated May 2015 with a few notable differences:
|
|
||||||
|
|
||||||
* In order to protect against accidental use of [Unsecured JWTs](http://self-issued.info/docs/draft-ietf-oauth-json-web-token.html#UnsecuredJWT), tokens using `alg=none` will only be accepted if the constant `jwt.UnsafeAllowNoneSignatureType` is provided as the key.
|
|
||||||
|
|
||||||
## Project Status & Versioning
|
|
||||||
|
|
||||||
This library is considered production ready. Feedback and feature requests are appreciated. The API should be considered stable. There should be very few backwards-incompatible changes outside of major version updates (and only with good reason).
|
|
||||||
|
|
||||||
This project uses [Semantic Versioning 2.0.0](http://semver.org). Accepted pull requests will land on `master`. Periodically, versions will be tagged from `master`. You can find all the releases on [the project releases page](https://github.com/dgrijalva/jwt-go/releases).
|
|
||||||
|
|
||||||
While we try to make it obvious when we make breaking changes, there isn't a great mechanism for pushing announcements out to users. You may want to use this alternative package include: `gopkg.in/dgrijalva/jwt-go.v2`. It will do the right thing WRT semantic versioning.
|
|
||||||
|
|
||||||
## Usage Tips
|
|
||||||
|
|
||||||
### Signing vs Encryption
|
|
||||||
|
|
||||||
A token is simply a JSON object that is signed by its author. this tells you exactly two things about the data:
|
|
||||||
|
|
||||||
* The author of the token was in the possession of the signing secret
|
|
||||||
* The data has not been modified since it was signed
|
|
||||||
|
|
||||||
It's important to know that JWT does not provide encryption, which means anyone who has access to the token can read its contents. If you need to protect (encrypt) the data, there is a companion spec, `JWE`, that provides this functionality. JWE is currently outside the scope of this library.
|
|
||||||
|
|
||||||
### Choosing a Signing Method
|
|
||||||
|
|
||||||
There are several signing methods available, and you should probably take the time to learn about the various options before choosing one. The principal design decision is most likely going to be symmetric vs asymmetric.
|
|
||||||
|
|
||||||
Symmetric signing methods, such as HSA, use only a single secret. This is probably the simplest signing method to use since any `[]byte` can be used as a valid secret. They are also slightly computationally faster to use, though this rarely is enough to matter. Symmetric signing methods work the best when both producers and consumers of tokens are trusted, or even the same system. Since the same secret is used to both sign and validate tokens, you can't easily distribute the key for validation.
|
|
||||||
|
|
||||||
Asymmetric signing methods, such as RSA, use different keys for signing and verifying tokens. This makes it possible to produce tokens with a private key, and allow any consumer to access the public key for verification.
|
|
||||||
|
|
||||||
### JWT and OAuth
|
|
||||||
|
|
||||||
It's worth mentioning that OAuth and JWT are not the same thing. A JWT token is simply a signed JSON object. It can be used anywhere such a thing is useful. There is some confusion, though, as JWT is the most common type of bearer token used in OAuth2 authentication.
|
|
||||||
|
|
||||||
Without going too far down the rabbit hole, here's a description of the interaction of these technologies:
|
|
||||||
|
|
||||||
* OAuth is a protocol for allowing an identity provider to be separate from the service a user is logging in to. For example, whenever you use Facebook to log into a different service (Yelp, Spotify, etc), you are using OAuth.
|
|
||||||
* OAuth defines several options for passing around authentication data. One popular method is called a "bearer token". A bearer token is simply a string that _should_ only be held by an authenticated user. Thus, simply presenting this token proves your identity. You can probably derive from here why a JWT might make a good bearer token.
|
|
||||||
* Because bearer tokens are used for authentication, it's important they're kept secret. This is why transactions that use bearer tokens typically happen over SSL.
|
|
||||||
|
|
||||||
## More
|
|
||||||
|
|
||||||
Documentation can be found [on godoc.org](http://godoc.org/github.com/dgrijalva/jwt-go).
|
|
||||||
|
|
||||||
The command line utility included in this project (cmd/jwt) provides a straightforward example of token creation and parsing as well as a useful tool for debugging your own integration. You'll also find several implementation examples in to documentation.
|
|
69
vendor/github.com/dgrijalva/jwt-go/rsa_utils.go
generated
vendored
69
vendor/github.com/dgrijalva/jwt-go/rsa_utils.go
generated
vendored
|
@ -1,69 +0,0 @@
|
||||||
package jwt
|
|
||||||
|
|
||||||
import (
|
|
||||||
"crypto/rsa"
|
|
||||||
"crypto/x509"
|
|
||||||
"encoding/pem"
|
|
||||||
"errors"
|
|
||||||
)
|
|
||||||
|
|
||||||
var (
|
|
||||||
ErrKeyMustBePEMEncoded = errors.New("Invalid Key: Key must be PEM encoded PKCS1 or PKCS8 private key")
|
|
||||||
ErrNotRSAPrivateKey = errors.New("Key is not a valid RSA private key")
|
|
||||||
ErrNotRSAPublicKey = errors.New("Key is not a valid RSA public key")
|
|
||||||
)
|
|
||||||
|
|
||||||
// Parse PEM encoded PKCS1 or PKCS8 private key
|
|
||||||
func ParseRSAPrivateKeyFromPEM(key []byte) (*rsa.PrivateKey, error) {
|
|
||||||
var err error
|
|
||||||
|
|
||||||
// Parse PEM block
|
|
||||||
var block *pem.Block
|
|
||||||
if block, _ = pem.Decode(key); block == nil {
|
|
||||||
return nil, ErrKeyMustBePEMEncoded
|
|
||||||
}
|
|
||||||
|
|
||||||
var parsedKey interface{}
|
|
||||||
if parsedKey, err = x509.ParsePKCS1PrivateKey(block.Bytes); err != nil {
|
|
||||||
if parsedKey, err = x509.ParsePKCS8PrivateKey(block.Bytes); err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
var pkey *rsa.PrivateKey
|
|
||||||
var ok bool
|
|
||||||
if pkey, ok = parsedKey.(*rsa.PrivateKey); !ok {
|
|
||||||
return nil, ErrNotRSAPrivateKey
|
|
||||||
}
|
|
||||||
|
|
||||||
return pkey, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// Parse PEM encoded PKCS1 or PKCS8 public key
|
|
||||||
func ParseRSAPublicKeyFromPEM(key []byte) (*rsa.PublicKey, error) {
|
|
||||||
var err error
|
|
||||||
|
|
||||||
// Parse PEM block
|
|
||||||
var block *pem.Block
|
|
||||||
if block, _ = pem.Decode(key); block == nil {
|
|
||||||
return nil, ErrKeyMustBePEMEncoded
|
|
||||||
}
|
|
||||||
|
|
||||||
// Parse the key
|
|
||||||
var parsedKey interface{}
|
|
||||||
if parsedKey, err = x509.ParsePKIXPublicKey(block.Bytes); err != nil {
|
|
||||||
if cert, err := x509.ParseCertificate(block.Bytes); err == nil {
|
|
||||||
parsedKey = cert.PublicKey
|
|
||||||
} else {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
var pkey *rsa.PublicKey
|
|
||||||
var ok bool
|
|
||||||
if pkey, ok = parsedKey.(*rsa.PublicKey); !ok {
|
|
||||||
return nil, ErrNotRSAPublicKey
|
|
||||||
}
|
|
||||||
|
|
||||||
return pkey, nil
|
|
||||||
}
|
|
15
vendor/github.com/gofrs/uuid/.gitignore
generated
vendored
Normal file
15
vendor/github.com/gofrs/uuid/.gitignore
generated
vendored
Normal file
|
@ -0,0 +1,15 @@
|
||||||
|
# Binaries for programs and plugins
|
||||||
|
*.exe
|
||||||
|
*.exe~
|
||||||
|
*.dll
|
||||||
|
*.so
|
||||||
|
*.dylib
|
||||||
|
|
||||||
|
# Test binary, build with `go test -c`
|
||||||
|
*.test
|
||||||
|
|
||||||
|
# Output of the go coverage tool, specifically when used with LiteIDE
|
||||||
|
*.out
|
||||||
|
|
||||||
|
# binary bundle generated by go-fuzz
|
||||||
|
uuid-fuzz.zip
|
22
vendor/github.com/gofrs/uuid/.travis.yml
generated
vendored
Normal file
22
vendor/github.com/gofrs/uuid/.travis.yml
generated
vendored
Normal file
|
@ -0,0 +1,22 @@
|
||||||
|
language: go
|
||||||
|
sudo: false
|
||||||
|
go:
|
||||||
|
- 1.7.x
|
||||||
|
- 1.8.x
|
||||||
|
- 1.9.x
|
||||||
|
- 1.10.x
|
||||||
|
- 1.11.x
|
||||||
|
- 1.12.x
|
||||||
|
- tip
|
||||||
|
matrix:
|
||||||
|
allow_failures:
|
||||||
|
- go: tip
|
||||||
|
fast_finish: true
|
||||||
|
before_install:
|
||||||
|
- go get golang.org/x/tools/cmd/cover
|
||||||
|
script:
|
||||||
|
- go test ./... -race -coverprofile=coverage.txt -covermode=atomic
|
||||||
|
after_success:
|
||||||
|
- bash <(curl -s https://codecov.io/bash)
|
||||||
|
notifications:
|
||||||
|
email: false
|
0
vendor/github.com/satori/go.uuid/LICENSE → vendor/github.com/gofrs/uuid/LICENSE
generated
vendored
0
vendor/github.com/satori/go.uuid/LICENSE → vendor/github.com/gofrs/uuid/LICENSE
generated
vendored
108
vendor/github.com/gofrs/uuid/README.md
generated
vendored
Normal file
108
vendor/github.com/gofrs/uuid/README.md
generated
vendored
Normal file
|
@ -0,0 +1,108 @@
|
||||||
|
# UUID
|
||||||
|
|
||||||
|
[![License](https://img.shields.io/github/license/gofrs/uuid.svg)](https://github.com/gofrs/uuid/blob/master/LICENSE)
|
||||||
|
[![Build Status](https://travis-ci.org/gofrs/uuid.svg?branch=master)](https://travis-ci.org/gofrs/uuid)
|
||||||
|
[![GoDoc](http://godoc.org/github.com/gofrs/uuid?status.svg)](http://godoc.org/github.com/gofrs/uuid)
|
||||||
|
[![Coverage Status](https://codecov.io/gh/gofrs/uuid/branch/master/graphs/badge.svg?branch=master)](https://codecov.io/gh/gofrs/uuid/)
|
||||||
|
[![Go Report Card](https://goreportcard.com/badge/github.com/gofrs/uuid)](https://goreportcard.com/report/github.com/gofrs/uuid)
|
||||||
|
|
||||||
|
Package uuid provides a pure Go implementation of Universally Unique Identifiers
|
||||||
|
(UUID) variant as defined in RFC-4122. This package supports both the creation
|
||||||
|
and parsing of UUIDs in different formats.
|
||||||
|
|
||||||
|
This package supports the following UUID versions:
|
||||||
|
* Version 1, based on timestamp and MAC address (RFC-4122)
|
||||||
|
* Version 3, based on MD5 hashing of a named value (RFC-4122)
|
||||||
|
* Version 4, based on random numbers (RFC-4122)
|
||||||
|
* Version 5, based on SHA-1 hashing of a named value (RFC-4122)
|
||||||
|
|
||||||
|
## Project History
|
||||||
|
|
||||||
|
This project was originally forked from the
|
||||||
|
[github.com/satori/go.uuid](https://github.com/satori/go.uuid) repository after
|
||||||
|
it appeared to be no longer maintained, while exhibiting [critical
|
||||||
|
flaws](https://github.com/satori/go.uuid/issues/73). We have decided to take
|
||||||
|
over this project to ensure it receives regular maintenance for the benefit of
|
||||||
|
the larger Go community.
|
||||||
|
|
||||||
|
We'd like to thank Maxim Bublis for his hard work on the original iteration of
|
||||||
|
the package.
|
||||||
|
|
||||||
|
## License
|
||||||
|
|
||||||
|
This source code of this package is released under the MIT License. Please see
|
||||||
|
the [LICENSE](https://github.com/gofrs/uuid/blob/master/LICENSE) for the full
|
||||||
|
content of the license.
|
||||||
|
|
||||||
|
## Recommended Package Version
|
||||||
|
|
||||||
|
We recommend using v2.0.0+ of this package, as versions prior to 2.0.0 were
|
||||||
|
created before our fork of the original package and have some known
|
||||||
|
deficiencies.
|
||||||
|
|
||||||
|
## Installation
|
||||||
|
|
||||||
|
It is recommended to use a package manager like `dep` that understands tagged
|
||||||
|
releases of a package, as well as semantic versioning.
|
||||||
|
|
||||||
|
If you are unable to make use of a dependency manager with your project, you can
|
||||||
|
use the `go get` command to download it directly:
|
||||||
|
|
||||||
|
```Shell
|
||||||
|
$ go get github.com/gofrs/uuid
|
||||||
|
```
|
||||||
|
|
||||||
|
## Requirements
|
||||||
|
|
||||||
|
Due to subtests not being supported in older versions of Go, this package is
|
||||||
|
only regularly tested against Go 1.7+. This package may work perfectly fine with
|
||||||
|
Go 1.2+, but support for these older versions is not actively maintained.
|
||||||
|
|
||||||
|
## Go 1.11 Modules
|
||||||
|
|
||||||
|
As of v3.2.0, this repository no longer adopts Go modules, and v3.2.0 no longer has a `go.mod` file. As a result, v3.2.0 also drops support for the `github.com/gofrs/uuid/v3` import path. Only module-based consumers are impacted. With the v3.2.0 release, _all_ gofrs/uuid consumers should use the `github.com/gofrs/uuid` import path.
|
||||||
|
|
||||||
|
An existing module-based consumer will continue to be able to build using the `github.com/gofrs/uuid/v3` import path using any valid consumer `go.mod` that worked prior to the publishing of v3.2.0, but any module-based consumer should start using the `github.com/gofrs/uuid` import path when possible and _must_ use the `github.com/gofrs/uuid` import path prior to upgrading to v3.2.0.
|
||||||
|
|
||||||
|
Please refer to [Issue #61](https://github.com/gofrs/uuid/issues/61) and [Issue #66](https://github.com/gofrs/uuid/issues/66) for more details.
|
||||||
|
|
||||||
|
## Usage
|
||||||
|
|
||||||
|
Here is a quick overview of how to use this package. For more detailed
|
||||||
|
documentation, please see the [GoDoc Page](http://godoc.org/github.com/gofrs/uuid).
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"log"
|
||||||
|
|
||||||
|
"github.com/gofrs/uuid"
|
||||||
|
)
|
||||||
|
|
||||||
|
// Create a Version 4 UUID, panicking on error.
|
||||||
|
// Use this form to initialize package-level variables.
|
||||||
|
var u1 = uuid.Must(uuid.NewV4())
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
// Create a Version 4 UUID.
|
||||||
|
u2, err := uuid.NewV4()
|
||||||
|
if err != nil {
|
||||||
|
log.Fatalf("failed to generate UUID: %v", err)
|
||||||
|
}
|
||||||
|
log.Printf("generated Version 4 UUID %v", u2)
|
||||||
|
|
||||||
|
// Parse a UUID from a string.
|
||||||
|
s := "6ba7b810-9dad-11d1-80b4-00c04fd430c8"
|
||||||
|
u3, err := uuid.FromString(s)
|
||||||
|
if err != nil {
|
||||||
|
log.Fatalf("failed to parse UUID %q: %v", s, err)
|
||||||
|
}
|
||||||
|
log.Printf("successfully parsed UUID %v", u3)
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## References
|
||||||
|
|
||||||
|
* [RFC-4122](https://tools.ietf.org/html/rfc4122)
|
||||||
|
* [DCE 1.1: Authentication and Security Services](http://pubs.opengroup.org/onlinepubs/9696989899/chap5.htm#tagcjh_08_02_01_01)
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue