Bump OpenTelemetry dependencies
Signed-off-by: Luca Comellini <luca.com@gmail.com>
This commit is contained in:
		
							
								
								
									
										28
									
								
								go.mod
									
									
									
									
									
								
							
							
						
						
									
										28
									
								
								go.mod
									
									
									
									
									
								
							| @@ -28,7 +28,7 @@ require ( | ||||
| 	github.com/docker/go-units v0.4.0 | ||||
| 	github.com/emicklei/go-restful/v3 v3.7.3 | ||||
| 	github.com/fsnotify/fsnotify v1.5.1 | ||||
| 	github.com/google/go-cmp v0.5.6 | ||||
| 	github.com/google/go-cmp v0.5.8 | ||||
| 	github.com/google/uuid v1.2.0 | ||||
| 	github.com/grpc-ecosystem/go-grpc-middleware v1.3.0 | ||||
| 	github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0 | ||||
| @@ -49,18 +49,18 @@ require ( | ||||
| 	github.com/pkg/errors v0.9.1 | ||||
| 	github.com/prometheus/client_golang v1.12.1 | ||||
| 	github.com/sirupsen/logrus v1.8.1 | ||||
| 	github.com/stretchr/testify v1.7.0 | ||||
| 	github.com/stretchr/testify v1.7.1 | ||||
| 	github.com/tchap/go-patricia/v2 v2.3.1 | ||||
| 	github.com/urfave/cli v1.22.2 | ||||
| 	github.com/vishvananda/netlink v1.1.1-0.20210330154013-f5de75959ad5 | ||||
| 	go.etcd.io/bbolt v1.3.6 | ||||
| 	go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.28.0 | ||||
| 	go.opentelemetry.io/otel v1.3.0 | ||||
| 	go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.3.0 | ||||
| 	go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.3.0 | ||||
| 	go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.3.0 | ||||
| 	go.opentelemetry.io/otel/sdk v1.3.0 | ||||
| 	go.opentelemetry.io/otel/trace v1.3.0 | ||||
| 	go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.32.0 | ||||
| 	go.opentelemetry.io/otel v1.7.0 | ||||
| 	go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.7.0 | ||||
| 	go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.7.0 | ||||
| 	go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.7.0 | ||||
| 	go.opentelemetry.io/otel/sdk v1.7.0 | ||||
| 	go.opentelemetry.io/otel/trace v1.7.0 | ||||
| 	golang.org/x/sync v0.0.0-20210220032951-036812b2e83c | ||||
| 	golang.org/x/sys v0.0.0-20220422013727-9388b58f7150 | ||||
| 	google.golang.org/genproto v0.0.0-20220426171045-31bebdecfb46 | ||||
| @@ -80,21 +80,21 @@ require ( | ||||
| 	github.com/beorn7/perks v1.0.1 // indirect | ||||
| 	github.com/blang/semver v3.5.1+incompatible // indirect | ||||
| 	github.com/blang/semver/v4 v4.0.0 // indirect | ||||
| 	github.com/cenkalti/backoff/v4 v4.1.2 // indirect | ||||
| 	github.com/cenkalti/backoff/v4 v4.1.3 // indirect | ||||
| 	github.com/cespare/xxhash/v2 v2.1.2 // indirect | ||||
| 	github.com/cilium/ebpf v0.7.0 // indirect | ||||
| 	github.com/containernetworking/cni v1.1.0 // indirect | ||||
| 	github.com/containers/ocicrypt v1.1.3 // indirect | ||||
| 	github.com/cpuguy83/go-md2man/v2 v2.0.1 // indirect | ||||
| 	github.com/emicklei/go-restful v2.9.5+incompatible // indirect | ||||
| 	github.com/go-logr/logr v1.2.2 // indirect | ||||
| 	github.com/go-logr/logr v1.2.3 // indirect | ||||
| 	github.com/go-logr/stdr v1.2.2 // indirect | ||||
| 	github.com/godbus/dbus/v5 v5.0.6 // indirect | ||||
| 	github.com/gogo/protobuf v1.3.2 // indirect | ||||
| 	github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect | ||||
| 	github.com/golang/protobuf v1.5.2 // indirect | ||||
| 	github.com/google/gofuzz v1.2.0 // indirect | ||||
| 	github.com/grpc-ecosystem/grpc-gateway v1.16.0 // indirect | ||||
| 	github.com/grpc-ecosystem/grpc-gateway/v2 v2.7.0 // indirect | ||||
| 	github.com/hashicorp/errwrap v1.1.0 // indirect | ||||
| 	github.com/json-iterator/go v1.1.12 // indirect | ||||
| 	github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 // indirect | ||||
| @@ -118,8 +118,8 @@ require ( | ||||
| 	github.com/xeipuuv/gojsonschema v1.2.0 // indirect | ||||
| 	go.mozilla.org/pkcs7 v0.0.0-20200128120323-432b2356ecb1 // indirect | ||||
| 	go.opencensus.io v0.23.0 // indirect | ||||
| 	go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.3.0 // indirect | ||||
| 	go.opentelemetry.io/proto/otlp v0.11.0 // indirect | ||||
| 	go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.7.0 // indirect | ||||
| 	go.opentelemetry.io/proto/otlp v0.16.0 // indirect | ||||
| 	golang.org/x/crypto v0.0.0-20220315160706-3147a52a75dd // indirect | ||||
| 	golang.org/x/net v0.0.0-20220425223048-2871e0cb64e4 // indirect | ||||
| 	golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8 // indirect | ||||
|   | ||||
							
								
								
									
										47
									
								
								go.sum
									
									
									
									
									
								
							
							
						
						
									
										47
									
								
								go.sum
									
									
									
									
									
								
							| @@ -135,8 +135,9 @@ github.com/bugsnag/bugsnag-go v0.0.0-20141110184014-b1d153021fcd/go.mod h1:2oa8n | ||||
| github.com/bugsnag/osext v0.0.0-20130617224835-0dd3f918b21b/go.mod h1:obH5gd0BsqsP2LwDJ9aOkm/6J86V6lyAXCoQWGw3K50= | ||||
| github.com/bugsnag/panicwrap v0.0.0-20151223152923-e2c28503fcd0/go.mod h1:D/8v3kj0zr8ZAKg1AQ6crr+5VwKN5eIywRkfhyM/+dE= | ||||
| github.com/cenkalti/backoff/v4 v4.1.1/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw= | ||||
| github.com/cenkalti/backoff/v4 v4.1.2 h1:6Yo7N8UP2K6LWZnW94DLVSSrbobcWdVzAYOisuDPIFo= | ||||
| github.com/cenkalti/backoff/v4 v4.1.2/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw= | ||||
| github.com/cenkalti/backoff/v4 v4.1.3 h1:cFAlzYUlVYDysBEH2T5hyJZMh3+5+WCBvSnK6Q8UtC4= | ||||
| github.com/cenkalti/backoff/v4 v4.1.3/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw= | ||||
| github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= | ||||
| github.com/certifi/gocertifi v0.0.0-20191021191039-0944d244cd40/go.mod h1:sGbDF6GwGcLpkNXPUTkMRoywsNa/ol15pxFe6ERfguA= | ||||
| github.com/certifi/gocertifi v0.0.0-20200922220541-2c3bb06c6054/go.mod h1:sGbDF6GwGcLpkNXPUTkMRoywsNa/ol15pxFe6ERfguA= | ||||
| @@ -402,8 +403,9 @@ github.com/go-logr/logr v0.2.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTg | ||||
| github.com/go-logr/logr v0.4.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= | ||||
| github.com/go-logr/logr v1.2.0/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= | ||||
| github.com/go-logr/logr v1.2.1/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= | ||||
| github.com/go-logr/logr v1.2.2 h1:ahHml/yUpnlb96Rp8HCvtYVPY8ZYpxq3g7UYchIYwbs= | ||||
| github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= | ||||
| github.com/go-logr/logr v1.2.3 h1:2DntVwHkVopvECVRSlL5PSo9eG+cAkDCuckLubN+rq0= | ||||
| github.com/go-logr/logr v1.2.3/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= | ||||
| github.com/go-logr/stdr v1.2.0/go.mod h1:YkVgnZu1ZjjL7xTxrfm/LLZBfkhTqSR1ydtm6jTKKwI= | ||||
| github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= | ||||
| github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= | ||||
| @@ -444,6 +446,8 @@ github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXP | ||||
| github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= | ||||
| github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= | ||||
| github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= | ||||
| github.com/golang/glog v1.0.0 h1:nfP3RFugxnNRyKgeWd4oI1nYvXpxrx8ck8ZrcizshdQ= | ||||
| github.com/golang/glog v1.0.0/go.mod h1:EWib/APOK0SL3dFbYqvxE3UYd8E6s1ouQ7iEp/0LWV4= | ||||
| github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= | ||||
| github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= | ||||
| github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= | ||||
| @@ -494,8 +498,10 @@ github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ | ||||
| github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= | ||||
| github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= | ||||
| github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= | ||||
| github.com/google/go-cmp v0.5.6 h1:BKbKCqvP6I+rmFHt06ZmyQtvB8xAkWdhFyr0ZUNZcxQ= | ||||
| github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= | ||||
| github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE= | ||||
| github.com/google/go-cmp v0.5.8 h1:e6P7q2lk1O+qJJb4BtCQXlK8vWEO8V1ZeuEdJNOqZyg= | ||||
| github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= | ||||
| github.com/google/go-containerregistry v0.5.1/go.mod h1:Ct15B4yir3PLOP5jsy0GNeYVaIZs/MK/Jz5any1wFW0= | ||||
| github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= | ||||
| github.com/google/gofuzz v1.1.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= | ||||
| @@ -544,8 +550,9 @@ github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0 h1:Ovs26xHkKqVztRpIrF/92Bcuy | ||||
| github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= | ||||
| github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= | ||||
| github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= | ||||
| github.com/grpc-ecosystem/grpc-gateway v1.16.0 h1:gmcG1KaJ57LophUzW0Hy8NmPhnMZb4M0+kPpLofRdBo= | ||||
| github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= | ||||
| github.com/grpc-ecosystem/grpc-gateway/v2 v2.7.0 h1:BZHcxBETFHIdVyhyEfOvn/RdU/QGdLI4y34qQGjGWO0= | ||||
| github.com/grpc-ecosystem/grpc-gateway/v2 v2.7.0/go.mod h1:hgWBS7lorOAVIJEQMi4ZsPv9hVvWI6+ch50m39Pf2Ks= | ||||
| github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q= | ||||
| github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= | ||||
| github.com/hashicorp/errwrap v0.0.0-20141028054710-7554cd9344ce/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= | ||||
| @@ -885,8 +892,9 @@ github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UV | ||||
| github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= | ||||
| github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= | ||||
| github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= | ||||
| github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY= | ||||
| github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= | ||||
| github.com/stretchr/testify v1.7.1 h1:5TQK59W5E3v0r2duFAb7P95B6hEeOyEnHRa8MjYSMTY= | ||||
| github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= | ||||
| github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= | ||||
| github.com/syndtr/gocapability v0.0.0-20170704070218-db04d3cc01c8/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= | ||||
| github.com/syndtr/gocapability v0.0.0-20180916011248-d98352740cb2/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= | ||||
| @@ -960,34 +968,43 @@ go.opencensus.io v0.23.0 h1:gqCw0LfLxScz8irSi8exQc7fyQ0fKQU/qnC/X8+V/1M= | ||||
| go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= | ||||
| go.opentelemetry.io/contrib v0.20.0/go.mod h1:G/EtFaa6qaN7+LxqfIAT3GiZa7Wv5DTBUzl5H4LY0Kc= | ||||
| go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.20.0/go.mod h1:oVGt1LRbBOBq1A5BQLlUg9UaU/54aiHw8cgjV3aWZ/E= | ||||
| go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.28.0 h1:Ky1MObd188aGbgb5OgNnwGuEEwI9MVIcc7rBW6zk5Ak= | ||||
| go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.28.0/go.mod h1:vEhqr0m4eTc+DWxfsXoXue2GBgV2uUwVznkGIHW/e5w= | ||||
| go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.32.0 h1:WenoaOMNP71oq3KkMZ/jnxI9xU/JSCLw8yZILSI2lfU= | ||||
| go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.32.0/go.mod h1:J0dBVrt7dPS/lKJyQoW0xzQiUr4r2Ik1VwPjAUWnofI= | ||||
| go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.20.0/go.mod h1:2AboqHi0CiIZU0qwhtUfCYD1GeUzvvIXWNkhDt7ZMG4= | ||||
| go.opentelemetry.io/otel v0.20.0/go.mod h1:Y3ugLH2oa81t5QO+Lty+zXf8zC9L26ax4Nzoxm/dooo= | ||||
| go.opentelemetry.io/otel v1.3.0 h1:APxLf0eiBwLl+SOXiJJCVYzA1OOJNyAoV8C5RNRyy7Y= | ||||
| go.opentelemetry.io/otel v1.3.0/go.mod h1:PWIKzi6JCp7sM0k9yZ43VX+T345uNbAkDKwHVjb2PTs= | ||||
| go.opentelemetry.io/otel v1.7.0 h1:Z2lA3Tdch0iDcrhJXDIlC94XE+bxok1F9B+4Lz/lGsM= | ||||
| go.opentelemetry.io/otel v1.7.0/go.mod h1:5BdUoMIz5WEs0vt0CUEMtSSaTSHBBVwrhnz7+nrD5xk= | ||||
| go.opentelemetry.io/otel/exporters/otlp v0.20.0/go.mod h1:YIieizyaN77rtLJra0buKiNBOm9XQfkPEKBeuhoMwAM= | ||||
| go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.3.0 h1:R/OBkMoGgfy2fLhs2QhkCI1w4HLEQX92GCcJB6SSdNk= | ||||
| go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.3.0/go.mod h1:VpP4/RMn8bv8gNo9uK7/IMY4mtWLELsS+JIP0inH0h4= | ||||
| go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.3.0 h1:giGm8w67Ja7amYNfYMdme7xSp2pIxThWopw8+QP51Yk= | ||||
| go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.7.0 h1:7Yxsak1q4XrJ5y7XBnNwqWx9amMZvoidCctv62XOQ6Y= | ||||
| go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.7.0/go.mod h1:M1hVZHNxcbkAlcvrOMlpQ4YOO3Awf+4N2dxkZL3xm04= | ||||
| go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.3.0/go.mod h1:hO1KLR7jcKaDDKDkvI9dP/FIhpmna5lkqPUQdEjFAM8= | ||||
| go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.3.0 h1:VQbUHoJqytHHSJ1OZodPH9tvZZSVzUHjPHpkO85sT6k= | ||||
| go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.7.0 h1:cMDtmgJ5FpRvqx9x2Aq+Mm0O6K/zcUkH73SFz20TuBw= | ||||
| go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.7.0/go.mod h1:ceUgdyfNv4h4gLxHR0WNfDiiVmZFodZhZSbOLhpxqXE= | ||||
| go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.3.0/go.mod h1:keUU7UfnwWTWpJ+FWnyqmogPa82nuU5VUANFq49hlMY= | ||||
| go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.3.0 h1:Ydage/P0fRrSPpZeCVxzjqGcI6iVmG2xb43+IR8cjqM= | ||||
| go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.7.0 h1:MFAyzUPrTwLOwCi+cltN0ZVyy4phU41lwH+lyMyQTS4= | ||||
| go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.7.0/go.mod h1:E+/KKhwOSw8yoPxSSuUHG6vKppkvhN+S1Jc7Nib3k3o= | ||||
| go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.3.0/go.mod h1:QNX1aly8ehqqX1LEa6YniTU7VY9I6R3X/oPxhGdTceE= | ||||
| go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.7.0 h1:pLP0MH4MAqeTEV0g/4flxw9O8Is48uAIauAnjznbW50= | ||||
| go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.7.0/go.mod h1:aFXT9Ng2seM9eizF+LfKiyPBGy8xIZKwhusC1gIu3hA= | ||||
| go.opentelemetry.io/otel/metric v0.20.0/go.mod h1:598I5tYlH1vzBjn+BTuhzTCSb/9debfNp6R3s7Pr1eU= | ||||
| go.opentelemetry.io/otel/oteltest v0.20.0/go.mod h1:L7bgKf9ZB7qCwT9Up7i9/pn0PWIa9FqQ2IQ8LoxiGnw= | ||||
| go.opentelemetry.io/otel/sdk v0.20.0/go.mod h1:g/IcepuwNsoiX5Byy2nNV0ySUF1em498m7hBWC279Yc= | ||||
| go.opentelemetry.io/otel/sdk v1.3.0 h1:3278edCoH89MEJ0Ky8WQXVmDQv3FX4ZJ3Pp+9fJreAI= | ||||
| go.opentelemetry.io/otel/sdk v1.3.0/go.mod h1:rIo4suHNhQwBIPg9axF8V9CA72Wz2mKF1teNrup8yzs= | ||||
| go.opentelemetry.io/otel/sdk v1.7.0 h1:4OmStpcKVOfvDOgCt7UriAPtKolwIhxpnSNI/yK+1B0= | ||||
| go.opentelemetry.io/otel/sdk v1.7.0/go.mod h1:uTEOTwaqIVuTGiJN7ii13Ibp75wJmYUDe374q6cZwUU= | ||||
| go.opentelemetry.io/otel/sdk/export/metric v0.20.0/go.mod h1:h7RBNMsDJ5pmI1zExLi+bJK+Dr8NQCh0qGhm1KDnNlE= | ||||
| go.opentelemetry.io/otel/sdk/metric v0.20.0/go.mod h1:knxiS8Xd4E/N+ZqKmUPf3gTTZ4/0TjTXukfxjzSTpHE= | ||||
| go.opentelemetry.io/otel/trace v0.20.0/go.mod h1:6GjCW8zgDjwGHGa6GkyeB8+/5vjT16gUEi0Nf1iBdgw= | ||||
| go.opentelemetry.io/otel/trace v1.3.0 h1:doy8Hzb1RJ+I3yFhtDmwNc7tIyw1tNMOIsyPzp1NOGY= | ||||
| go.opentelemetry.io/otel/trace v1.3.0/go.mod h1:c/VDhno8888bvQYmbYLqe41/Ldmr/KKunbvWM4/fEjk= | ||||
| go.opentelemetry.io/otel/trace v1.7.0 h1:O37Iogk1lEkMRXewVtZ1BBTVn5JEp8GrJvP92bJqC6o= | ||||
| go.opentelemetry.io/otel/trace v1.7.0/go.mod h1:fzLSB9nqR2eXzxPXb2JW9IKE+ScyXA48yyE4TNvoHqU= | ||||
| go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= | ||||
| go.opentelemetry.io/proto/otlp v0.11.0 h1:cLDgIBTf4lLOlztkhzAEdQsJ4Lj+i5Wc9k6Nn0K1VyU= | ||||
| go.opentelemetry.io/proto/otlp v0.11.0/go.mod h1:QpEjXPrNQzrFDZgoTo49dgHR9RYRSrg3NAKnUGl9YpQ= | ||||
| go.opentelemetry.io/proto/otlp v0.16.0 h1:WHzDWdXUvbc5bG2ObdrGfaNpQz7ft7QN9HHmJlbiB1E= | ||||
| go.opentelemetry.io/proto/otlp v0.16.0/go.mod h1:H7XAot3MsfNsj7EXtrA2q5xSNQ10UqI405h3+duxN4U= | ||||
| go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= | ||||
| go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= | ||||
| go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= | ||||
| @@ -1340,7 +1357,6 @@ golang.org/x/tools v0.1.10-0.20220218145154-897bd77cd717/go.mod h1:Uh6Zz+xoGYZom | ||||
| golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= | ||||
| golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= | ||||
| golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= | ||||
| golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE= | ||||
| golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= | ||||
| google.golang.org/api v0.0.0-20160322025152-9bf6e6e569ff/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0= | ||||
| google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= | ||||
| @@ -1421,6 +1437,7 @@ google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6D | ||||
| google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= | ||||
| google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= | ||||
| google.golang.org/genproto v0.0.0-20210831024726-fe130286e0e2/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= | ||||
| google.golang.org/genproto v0.0.0-20211118181313-81c1377c94b1/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= | ||||
| google.golang.org/genproto v0.0.0-20211208223120-3a66f561d7aa/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= | ||||
| google.golang.org/genproto v0.0.0-20220107163113-42d7afdf6368/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= | ||||
| google.golang.org/genproto v0.0.0-20220426171045-31bebdecfb46 h1:G1IeWbjrqEq9ChWxEuRPJu6laA67+XgTFHVSAvepr38= | ||||
|   | ||||
| @@ -15,7 +15,7 @@ require ( | ||||
| 	github.com/opencontainers/image-spec v1.0.3-0.20220303224323-02efb9a75ee1 | ||||
| 	github.com/opencontainers/runtime-spec v1.0.3-0.20210326190908-1c3f411f0417 | ||||
| 	github.com/sirupsen/logrus v1.8.1 | ||||
| 	github.com/stretchr/testify v1.7.0 | ||||
| 	github.com/stretchr/testify v1.7.1 | ||||
| 	golang.org/x/sys v0.0.0-20220422013727-9388b58f7150 | ||||
| ) | ||||
|  | ||||
| @@ -34,7 +34,7 @@ require ( | ||||
| 	github.com/godbus/dbus/v5 v5.0.6 // indirect | ||||
| 	github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect | ||||
| 	github.com/golang/protobuf v1.5.2 // indirect | ||||
| 	github.com/google/go-cmp v0.5.6 // indirect | ||||
| 	github.com/google/go-cmp v0.5.8 // indirect | ||||
| 	github.com/google/uuid v1.2.0 // indirect | ||||
| 	github.com/hashicorp/errwrap v1.1.0 // indirect | ||||
| 	github.com/hashicorp/go-multierror v1.1.1 // indirect | ||||
|   | ||||
| @@ -96,7 +96,7 @@ github.com/blang/semver v3.5.1+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnweb | ||||
| github.com/blang/semver/v4 v4.0.0/go.mod h1:IbckMUScFkM3pff0VJDNKRiT6TG/YpiHIM2yvyW5YoQ= | ||||
| github.com/buger/jsonparser v1.1.1/go.mod h1:6RYKKt7H4d4+iWqouImQ9R2FZql3VbhNgx27UK13J/0= | ||||
| github.com/cenkalti/backoff/v4 v4.1.1/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw= | ||||
| github.com/cenkalti/backoff/v4 v4.1.2/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw= | ||||
| github.com/cenkalti/backoff/v4 v4.1.3/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw= | ||||
| github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= | ||||
| github.com/certifi/gocertifi v0.0.0-20191021191039-0944d244cd40/go.mod h1:sGbDF6GwGcLpkNXPUTkMRoywsNa/ol15pxFe6ERfguA= | ||||
| github.com/certifi/gocertifi v0.0.0-20200922220541-2c3bb06c6054/go.mod h1:sGbDF6GwGcLpkNXPUTkMRoywsNa/ol15pxFe6ERfguA= | ||||
| @@ -248,9 +248,8 @@ github.com/go-logr/logr v0.1.0/go.mod h1:ixOQHD9gLJUVQQ2ZOR7zLEifBX6tGkNJF4QyIY7 | ||||
| github.com/go-logr/logr v0.2.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= | ||||
| github.com/go-logr/logr v0.4.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= | ||||
| github.com/go-logr/logr v1.2.0/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= | ||||
| github.com/go-logr/logr v1.2.1/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= | ||||
| github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= | ||||
| github.com/go-logr/stdr v1.2.0/go.mod h1:YkVgnZu1ZjjL7xTxrfm/LLZBfkhTqSR1ydtm6jTKKwI= | ||||
| github.com/go-logr/logr v1.2.3/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= | ||||
| github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= | ||||
| github.com/go-logr/zapr v1.2.0/go.mod h1:Qa4Bsj2Vb+FAVeAKsLD8RLQ+YRJB8YDmOAKxaBQf7Ro= | ||||
| github.com/go-openapi/jsonpointer v0.0.0-20160704185906-46af16f9f7b1/go.mod h1:+35s3my2LFTysnkMfxsJBAMHj/DoqoB9knIWoYG/Vk0= | ||||
| @@ -279,6 +278,7 @@ github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXP | ||||
| github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= | ||||
| github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= | ||||
| github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= | ||||
| github.com/golang/glog v1.0.0/go.mod h1:EWib/APOK0SL3dFbYqvxE3UYd8E6s1ouQ7iEp/0LWV4= | ||||
| github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= | ||||
| github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= | ||||
| github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= | ||||
| @@ -327,8 +327,10 @@ github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ | ||||
| github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= | ||||
| github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= | ||||
| github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= | ||||
| github.com/google/go-cmp v0.5.6 h1:BKbKCqvP6I+rmFHt06ZmyQtvB8xAkWdhFyr0ZUNZcxQ= | ||||
| github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= | ||||
| github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE= | ||||
| github.com/google/go-cmp v0.5.8 h1:e6P7q2lk1O+qJJb4BtCQXlK8vWEO8V1ZeuEdJNOqZyg= | ||||
| github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= | ||||
| github.com/google/go-containerregistry v0.5.1/go.mod h1:Ct15B4yir3PLOP5jsy0GNeYVaIZs/MK/Jz5any1wFW0= | ||||
| github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= | ||||
| github.com/google/gofuzz v1.1.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= | ||||
| @@ -369,6 +371,7 @@ github.com/grpc-ecosystem/go-grpc-middleware v1.3.0/go.mod h1:z0ButlSOZa5vEBq9m2 | ||||
| github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= | ||||
| github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= | ||||
| github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= | ||||
| github.com/grpc-ecosystem/grpc-gateway/v2 v2.7.0/go.mod h1:hgWBS7lorOAVIJEQMi4ZsPv9hVvWI6+ch50m39Pf2Ks= | ||||
| github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q= | ||||
| github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= | ||||
| github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= | ||||
| @@ -630,8 +633,9 @@ github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UV | ||||
| github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= | ||||
| github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= | ||||
| github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= | ||||
| github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY= | ||||
| github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= | ||||
| github.com/stretchr/testify v1.7.1 h1:5TQK59W5E3v0r2duFAb7P95B6hEeOyEnHRa8MjYSMTY= | ||||
| github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= | ||||
| github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= | ||||
| github.com/syndtr/gocapability v0.0.0-20200815063812-42c35b437635 h1:kdXcSzyDtseVEc4yCz2qF8ZrQvIDBJLl4S1c3GCXmoI= | ||||
| github.com/syndtr/gocapability v0.0.0-20200815063812-42c35b437635/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= | ||||
| @@ -684,25 +688,25 @@ go.opencensus.io v0.23.0 h1:gqCw0LfLxScz8irSi8exQc7fyQ0fKQU/qnC/X8+V/1M= | ||||
| go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= | ||||
| go.opentelemetry.io/contrib v0.20.0/go.mod h1:G/EtFaa6qaN7+LxqfIAT3GiZa7Wv5DTBUzl5H4LY0Kc= | ||||
| go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.20.0/go.mod h1:oVGt1LRbBOBq1A5BQLlUg9UaU/54aiHw8cgjV3aWZ/E= | ||||
| go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.28.0/go.mod h1:vEhqr0m4eTc+DWxfsXoXue2GBgV2uUwVznkGIHW/e5w= | ||||
| go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.32.0/go.mod h1:J0dBVrt7dPS/lKJyQoW0xzQiUr4r2Ik1VwPjAUWnofI= | ||||
| go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.20.0/go.mod h1:2AboqHi0CiIZU0qwhtUfCYD1GeUzvvIXWNkhDt7ZMG4= | ||||
| go.opentelemetry.io/otel v0.20.0/go.mod h1:Y3ugLH2oa81t5QO+Lty+zXf8zC9L26ax4Nzoxm/dooo= | ||||
| go.opentelemetry.io/otel v1.3.0/go.mod h1:PWIKzi6JCp7sM0k9yZ43VX+T345uNbAkDKwHVjb2PTs= | ||||
| go.opentelemetry.io/otel v1.7.0/go.mod h1:5BdUoMIz5WEs0vt0CUEMtSSaTSHBBVwrhnz7+nrD5xk= | ||||
| go.opentelemetry.io/otel/exporters/otlp v0.20.0/go.mod h1:YIieizyaN77rtLJra0buKiNBOm9XQfkPEKBeuhoMwAM= | ||||
| go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.3.0/go.mod h1:VpP4/RMn8bv8gNo9uK7/IMY4mtWLELsS+JIP0inH0h4= | ||||
| go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.3.0/go.mod h1:hO1KLR7jcKaDDKDkvI9dP/FIhpmna5lkqPUQdEjFAM8= | ||||
| go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.3.0/go.mod h1:keUU7UfnwWTWpJ+FWnyqmogPa82nuU5VUANFq49hlMY= | ||||
| go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.3.0/go.mod h1:QNX1aly8ehqqX1LEa6YniTU7VY9I6R3X/oPxhGdTceE= | ||||
| go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.7.0/go.mod h1:M1hVZHNxcbkAlcvrOMlpQ4YOO3Awf+4N2dxkZL3xm04= | ||||
| go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.7.0/go.mod h1:ceUgdyfNv4h4gLxHR0WNfDiiVmZFodZhZSbOLhpxqXE= | ||||
| go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.7.0/go.mod h1:E+/KKhwOSw8yoPxSSuUHG6vKppkvhN+S1Jc7Nib3k3o= | ||||
| go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.7.0/go.mod h1:aFXT9Ng2seM9eizF+LfKiyPBGy8xIZKwhusC1gIu3hA= | ||||
| go.opentelemetry.io/otel/metric v0.20.0/go.mod h1:598I5tYlH1vzBjn+BTuhzTCSb/9debfNp6R3s7Pr1eU= | ||||
| go.opentelemetry.io/otel/oteltest v0.20.0/go.mod h1:L7bgKf9ZB7qCwT9Up7i9/pn0PWIa9FqQ2IQ8LoxiGnw= | ||||
| go.opentelemetry.io/otel/sdk v0.20.0/go.mod h1:g/IcepuwNsoiX5Byy2nNV0ySUF1em498m7hBWC279Yc= | ||||
| go.opentelemetry.io/otel/sdk v1.3.0/go.mod h1:rIo4suHNhQwBIPg9axF8V9CA72Wz2mKF1teNrup8yzs= | ||||
| go.opentelemetry.io/otel/sdk v1.7.0/go.mod h1:uTEOTwaqIVuTGiJN7ii13Ibp75wJmYUDe374q6cZwUU= | ||||
| go.opentelemetry.io/otel/sdk/export/metric v0.20.0/go.mod h1:h7RBNMsDJ5pmI1zExLi+bJK+Dr8NQCh0qGhm1KDnNlE= | ||||
| go.opentelemetry.io/otel/sdk/metric v0.20.0/go.mod h1:knxiS8Xd4E/N+ZqKmUPf3gTTZ4/0TjTXukfxjzSTpHE= | ||||
| go.opentelemetry.io/otel/trace v0.20.0/go.mod h1:6GjCW8zgDjwGHGa6GkyeB8+/5vjT16gUEi0Nf1iBdgw= | ||||
| go.opentelemetry.io/otel/trace v1.3.0/go.mod h1:c/VDhno8888bvQYmbYLqe41/Ldmr/KKunbvWM4/fEjk= | ||||
| go.opentelemetry.io/otel/trace v1.7.0/go.mod h1:fzLSB9nqR2eXzxPXb2JW9IKE+ScyXA48yyE4TNvoHqU= | ||||
| go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= | ||||
| go.opentelemetry.io/proto/otlp v0.11.0/go.mod h1:QpEjXPrNQzrFDZgoTo49dgHR9RYRSrg3NAKnUGl9YpQ= | ||||
| go.opentelemetry.io/proto/otlp v0.16.0/go.mod h1:H7XAot3MsfNsj7EXtrA2q5xSNQ10UqI405h3+duxN4U= | ||||
| go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= | ||||
| go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= | ||||
| go.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A= | ||||
| @@ -1018,7 +1022,6 @@ golang.org/x/tools v0.1.10-0.20220218145154-897bd77cd717/go.mod h1:Uh6Zz+xoGYZom | ||||
| golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= | ||||
| golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= | ||||
| golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= | ||||
| golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE= | ||||
| golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= | ||||
| google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= | ||||
| google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= | ||||
| @@ -1095,6 +1098,7 @@ google.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6D | ||||
| google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= | ||||
| google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= | ||||
| google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= | ||||
| google.golang.org/genproto v0.0.0-20211118181313-81c1377c94b1/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= | ||||
| google.golang.org/genproto v0.0.0-20220107163113-42d7afdf6368/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= | ||||
| google.golang.org/genproto v0.0.0-20220426171045-31bebdecfb46 h1:G1IeWbjrqEq9ChWxEuRPJu6laA67+XgTFHVSAvepr38= | ||||
| google.golang.org/genproto v0.0.0-20220426171045-31bebdecfb46/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= | ||||
|   | ||||
							
								
								
									
										3
									
								
								vendor/github.com/cenkalti/backoff/v4/exponential.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										3
									
								
								vendor/github.com/cenkalti/backoff/v4/exponential.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -147,6 +147,9 @@ func (b *ExponentialBackOff) incrementCurrentInterval() { | ||||
| // Returns a random value from the following interval: | ||||
| // 	[currentInterval - randomizationFactor * currentInterval, currentInterval + randomizationFactor * currentInterval]. | ||||
| func getRandomValueFromInterval(randomizationFactor, random float64, currentInterval time.Duration) time.Duration { | ||||
| 	if randomizationFactor == 0 { | ||||
| 		return currentInterval // make sure no randomness is used when randomizationFactor is 0. | ||||
| 	} | ||||
| 	var delta = randomizationFactor * float64(currentInterval) | ||||
| 	var minInterval = float64(currentInterval) - delta | ||||
| 	var maxInterval = float64(currentInterval) + delta | ||||
|   | ||||
							
								
								
									
										4
									
								
								vendor/github.com/go-logr/logr/README.md
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										4
									
								
								vendor/github.com/go-logr/logr/README.md
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -105,14 +105,18 @@ with higher verbosity means more (and less important) logs will be generated. | ||||
| There are implementations for the following logging libraries: | ||||
|  | ||||
| - **a function** (can bridge to non-structured libraries): [funcr](https://github.com/go-logr/logr/tree/master/funcr) | ||||
| - **a testing.T** (for use in Go tests, with JSON-like output): [testr](https://github.com/go-logr/logr/tree/master/testr) | ||||
| - **github.com/google/glog**: [glogr](https://github.com/go-logr/glogr) | ||||
| - **k8s.io/klog** (for Kubernetes): [klogr](https://git.k8s.io/klog/klogr) | ||||
| - **a testing.T** (with klog-like text output): [ktesting](https://git.k8s.io/klog/ktesting) | ||||
| - **go.uber.org/zap**: [zapr](https://github.com/go-logr/zapr) | ||||
| - **log** (the Go standard library logger): [stdr](https://github.com/go-logr/stdr) | ||||
| - **github.com/sirupsen/logrus**: [logrusr](https://github.com/bombsimon/logrusr) | ||||
| - **github.com/wojas/genericr**: [genericr](https://github.com/wojas/genericr) (makes it easy to implement your own backend) | ||||
| - **logfmt** (Heroku style [logging](https://www.brandur.org/logfmt)): [logfmtr](https://github.com/iand/logfmtr) | ||||
| - **github.com/rs/zerolog**: [zerologr](https://github.com/go-logr/zerologr) | ||||
| - **github.com/go-kit/log**: [gokitlogr](https://github.com/tonglil/gokitlogr) (also compatible with github.com/go-kit/kit/log since v0.12.0) | ||||
| - **bytes.Buffer** (writing to a buffer): [bufrlogr](https://github.com/tonglil/buflogr) (useful for ensuring values were logged, like during testing) | ||||
|  | ||||
| ## FAQ | ||||
|  | ||||
|   | ||||
							
								
								
									
										36
									
								
								vendor/github.com/go-logr/logr/funcr/funcr.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										36
									
								
								vendor/github.com/go-logr/logr/funcr/funcr.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -351,15 +351,15 @@ func (f Formatter) prettyWithFlags(value interface{}, flags uint32, depth int) s | ||||
| 	if v, ok := value.(logr.Marshaler); ok { | ||||
| 		// Replace the value with what the type wants to get logged. | ||||
| 		// That then gets handled below via reflection. | ||||
| 		value = v.MarshalLog() | ||||
| 		value = invokeMarshaler(v) | ||||
| 	} | ||||
|  | ||||
| 	// Handle types that want to format themselves. | ||||
| 	switch v := value.(type) { | ||||
| 	case fmt.Stringer: | ||||
| 		value = v.String() | ||||
| 		value = invokeStringer(v) | ||||
| 	case error: | ||||
| 		value = v.Error() | ||||
| 		value = invokeError(v) | ||||
| 	} | ||||
|  | ||||
| 	// Handling the most common types without reflect is a small perf win. | ||||
| @@ -408,8 +408,9 @@ func (f Formatter) prettyWithFlags(value interface{}, flags uint32, depth int) s | ||||
| 			if i > 0 { | ||||
| 				buf.WriteByte(',') | ||||
| 			} | ||||
| 			k, _ := v[i].(string) // sanitize() above means no need to check success | ||||
| 			// arbitrary keys might need escaping | ||||
| 			buf.WriteString(prettyString(v[i].(string))) | ||||
| 			buf.WriteString(prettyString(k)) | ||||
| 			buf.WriteByte(':') | ||||
| 			buf.WriteString(f.prettyWithFlags(v[i+1], 0, depth+1)) | ||||
| 		} | ||||
| @@ -596,6 +597,33 @@ func isEmpty(v reflect.Value) bool { | ||||
| 	return false | ||||
| } | ||||
|  | ||||
| func invokeMarshaler(m logr.Marshaler) (ret interface{}) { | ||||
| 	defer func() { | ||||
| 		if r := recover(); r != nil { | ||||
| 			ret = fmt.Sprintf("<panic: %s>", r) | ||||
| 		} | ||||
| 	}() | ||||
| 	return m.MarshalLog() | ||||
| } | ||||
|  | ||||
| func invokeStringer(s fmt.Stringer) (ret string) { | ||||
| 	defer func() { | ||||
| 		if r := recover(); r != nil { | ||||
| 			ret = fmt.Sprintf("<panic: %s>", r) | ||||
| 		} | ||||
| 	}() | ||||
| 	return s.String() | ||||
| } | ||||
|  | ||||
| func invokeError(e error) (ret string) { | ||||
| 	defer func() { | ||||
| 		if r := recover(); r != nil { | ||||
| 			ret = fmt.Sprintf("<panic: %s>", r) | ||||
| 		} | ||||
| 	}() | ||||
| 	return e.Error() | ||||
| } | ||||
|  | ||||
| // Caller represents the original call site for a log line, after considering | ||||
| // logr.Logger.WithCallDepth and logr.Logger.WithCallStackHelper.  The File and | ||||
| // Line fields will always be provided, while the Func field is optional. | ||||
|   | ||||
							
								
								
									
										9
									
								
								vendor/github.com/go-logr/logr/logr.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										9
									
								
								vendor/github.com/go-logr/logr/logr.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -115,6 +115,15 @@ limitations under the License. | ||||
| // may be any Go value, but how the value is formatted is determined by the | ||||
| // LogSink implementation. | ||||
| // | ||||
| // Logger instances are meant to be passed around by value. Code that receives | ||||
| // such a value can call its methods without having to check whether the | ||||
| // instance is ready for use. | ||||
| // | ||||
| // Calling methods with the null logger (Logger{}) as instance will crash | ||||
| // because it has no LogSink. Therefore this null logger should never be passed | ||||
| // around. For cases where passing a logger is optional, a pointer to Logger | ||||
| // should be used. | ||||
| // | ||||
| // Key Naming Conventions | ||||
| // | ||||
| // Keys are not strictly required to conform to any specification or regex, but | ||||
|   | ||||
							
								
								
									
										180
									
								
								vendor/github.com/golang/protobuf/descriptor/descriptor.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										180
									
								
								vendor/github.com/golang/protobuf/descriptor/descriptor.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -1,180 +0,0 @@ | ||||
| // Copyright 2016 The Go Authors. All rights reserved. | ||||
| // Use of this source code is governed by a BSD-style | ||||
| // license that can be found in the LICENSE file. | ||||
|  | ||||
| // Package descriptor provides functions for obtaining the protocol buffer | ||||
| // descriptors of generated Go types. | ||||
| // | ||||
| // Deprecated: See the "google.golang.org/protobuf/reflect/protoreflect" package | ||||
| // for how to obtain an EnumDescriptor or MessageDescriptor in order to | ||||
| // programatically interact with the protobuf type system. | ||||
| package descriptor | ||||
|  | ||||
| import ( | ||||
| 	"bytes" | ||||
| 	"compress/gzip" | ||||
| 	"io/ioutil" | ||||
| 	"sync" | ||||
|  | ||||
| 	"github.com/golang/protobuf/proto" | ||||
| 	"google.golang.org/protobuf/reflect/protodesc" | ||||
| 	"google.golang.org/protobuf/reflect/protoreflect" | ||||
| 	"google.golang.org/protobuf/runtime/protoimpl" | ||||
|  | ||||
| 	descriptorpb "github.com/golang/protobuf/protoc-gen-go/descriptor" | ||||
| ) | ||||
|  | ||||
| // Message is proto.Message with a method to return its descriptor. | ||||
| // | ||||
| // Deprecated: The Descriptor method may not be generated by future | ||||
| // versions of protoc-gen-go, meaning that this interface may not | ||||
| // be implemented by many concrete message types. | ||||
| type Message interface { | ||||
| 	proto.Message | ||||
| 	Descriptor() ([]byte, []int) | ||||
| } | ||||
|  | ||||
| // ForMessage returns the file descriptor proto containing | ||||
| // the message and the message descriptor proto for the message itself. | ||||
| // The returned proto messages must not be mutated. | ||||
| // | ||||
| // Deprecated: Not all concrete message types satisfy the Message interface. | ||||
| // Use MessageDescriptorProto instead. If possible, the calling code should | ||||
| // be rewritten to use protobuf reflection instead. | ||||
| // See package "google.golang.org/protobuf/reflect/protoreflect" for details. | ||||
| func ForMessage(m Message) (*descriptorpb.FileDescriptorProto, *descriptorpb.DescriptorProto) { | ||||
| 	return MessageDescriptorProto(m) | ||||
| } | ||||
|  | ||||
| type rawDesc struct { | ||||
| 	fileDesc []byte | ||||
| 	indexes  []int | ||||
| } | ||||
|  | ||||
| var rawDescCache sync.Map // map[protoreflect.Descriptor]*rawDesc | ||||
|  | ||||
| func deriveRawDescriptor(d protoreflect.Descriptor) ([]byte, []int) { | ||||
| 	// Fast-path: check whether raw descriptors are already cached. | ||||
| 	origDesc := d | ||||
| 	if v, ok := rawDescCache.Load(origDesc); ok { | ||||
| 		return v.(*rawDesc).fileDesc, v.(*rawDesc).indexes | ||||
| 	} | ||||
|  | ||||
| 	// Slow-path: derive the raw descriptor from the v2 descriptor. | ||||
|  | ||||
| 	// Start with the leaf (a given enum or message declaration) and | ||||
| 	// ascend upwards until we hit the parent file descriptor. | ||||
| 	var idxs []int | ||||
| 	for { | ||||
| 		idxs = append(idxs, d.Index()) | ||||
| 		d = d.Parent() | ||||
| 		if d == nil { | ||||
| 			// TODO: We could construct a FileDescriptor stub for standalone | ||||
| 			// descriptors to satisfy the API. | ||||
| 			return nil, nil | ||||
| 		} | ||||
| 		if _, ok := d.(protoreflect.FileDescriptor); ok { | ||||
| 			break | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	// Obtain the raw file descriptor. | ||||
| 	fd := d.(protoreflect.FileDescriptor) | ||||
| 	b, _ := proto.Marshal(protodesc.ToFileDescriptorProto(fd)) | ||||
| 	file := protoimpl.X.CompressGZIP(b) | ||||
|  | ||||
| 	// Reverse the indexes, since we populated it in reverse. | ||||
| 	for i, j := 0, len(idxs)-1; i < j; i, j = i+1, j-1 { | ||||
| 		idxs[i], idxs[j] = idxs[j], idxs[i] | ||||
| 	} | ||||
|  | ||||
| 	if v, ok := rawDescCache.LoadOrStore(origDesc, &rawDesc{file, idxs}); ok { | ||||
| 		return v.(*rawDesc).fileDesc, v.(*rawDesc).indexes | ||||
| 	} | ||||
| 	return file, idxs | ||||
| } | ||||
|  | ||||
| // EnumRawDescriptor returns the GZIP'd raw file descriptor representing | ||||
| // the enum and the index path to reach the enum declaration. | ||||
| // The returned slices must not be mutated. | ||||
| func EnumRawDescriptor(e proto.GeneratedEnum) ([]byte, []int) { | ||||
| 	if ev, ok := e.(interface{ EnumDescriptor() ([]byte, []int) }); ok { | ||||
| 		return ev.EnumDescriptor() | ||||
| 	} | ||||
| 	ed := protoimpl.X.EnumTypeOf(e) | ||||
| 	return deriveRawDescriptor(ed.Descriptor()) | ||||
| } | ||||
|  | ||||
| // MessageRawDescriptor returns the GZIP'd raw file descriptor representing | ||||
| // the message and the index path to reach the message declaration. | ||||
| // The returned slices must not be mutated. | ||||
| func MessageRawDescriptor(m proto.GeneratedMessage) ([]byte, []int) { | ||||
| 	if mv, ok := m.(interface{ Descriptor() ([]byte, []int) }); ok { | ||||
| 		return mv.Descriptor() | ||||
| 	} | ||||
| 	md := protoimpl.X.MessageTypeOf(m) | ||||
| 	return deriveRawDescriptor(md.Descriptor()) | ||||
| } | ||||
|  | ||||
| var fileDescCache sync.Map // map[*byte]*descriptorpb.FileDescriptorProto | ||||
|  | ||||
| func deriveFileDescriptor(rawDesc []byte) *descriptorpb.FileDescriptorProto { | ||||
| 	// Fast-path: check whether descriptor protos are already cached. | ||||
| 	if v, ok := fileDescCache.Load(&rawDesc[0]); ok { | ||||
| 		return v.(*descriptorpb.FileDescriptorProto) | ||||
| 	} | ||||
|  | ||||
| 	// Slow-path: derive the descriptor proto from the GZIP'd message. | ||||
| 	zr, err := gzip.NewReader(bytes.NewReader(rawDesc)) | ||||
| 	if err != nil { | ||||
| 		panic(err) | ||||
| 	} | ||||
| 	b, err := ioutil.ReadAll(zr) | ||||
| 	if err != nil { | ||||
| 		panic(err) | ||||
| 	} | ||||
| 	fd := new(descriptorpb.FileDescriptorProto) | ||||
| 	if err := proto.Unmarshal(b, fd); err != nil { | ||||
| 		panic(err) | ||||
| 	} | ||||
| 	if v, ok := fileDescCache.LoadOrStore(&rawDesc[0], fd); ok { | ||||
| 		return v.(*descriptorpb.FileDescriptorProto) | ||||
| 	} | ||||
| 	return fd | ||||
| } | ||||
|  | ||||
| // EnumDescriptorProto returns the file descriptor proto representing | ||||
| // the enum and the enum descriptor proto for the enum itself. | ||||
| // The returned proto messages must not be mutated. | ||||
| func EnumDescriptorProto(e proto.GeneratedEnum) (*descriptorpb.FileDescriptorProto, *descriptorpb.EnumDescriptorProto) { | ||||
| 	rawDesc, idxs := EnumRawDescriptor(e) | ||||
| 	if rawDesc == nil || idxs == nil { | ||||
| 		return nil, nil | ||||
| 	} | ||||
| 	fd := deriveFileDescriptor(rawDesc) | ||||
| 	if len(idxs) == 1 { | ||||
| 		return fd, fd.EnumType[idxs[0]] | ||||
| 	} | ||||
| 	md := fd.MessageType[idxs[0]] | ||||
| 	for _, i := range idxs[1 : len(idxs)-1] { | ||||
| 		md = md.NestedType[i] | ||||
| 	} | ||||
| 	ed := md.EnumType[idxs[len(idxs)-1]] | ||||
| 	return fd, ed | ||||
| } | ||||
|  | ||||
| // MessageDescriptorProto returns the file descriptor proto representing | ||||
| // the message and the message descriptor proto for the message itself. | ||||
| // The returned proto messages must not be mutated. | ||||
| func MessageDescriptorProto(m proto.GeneratedMessage) (*descriptorpb.FileDescriptorProto, *descriptorpb.DescriptorProto) { | ||||
| 	rawDesc, idxs := MessageRawDescriptor(m) | ||||
| 	if rawDesc == nil || idxs == nil { | ||||
| 		return nil, nil | ||||
| 	} | ||||
| 	fd := deriveFileDescriptor(rawDesc) | ||||
| 	md := fd.MessageType[idxs[0]] | ||||
| 	for _, i := range idxs[1:] { | ||||
| 		md = md.NestedType[i] | ||||
| 	} | ||||
| 	return fd, md | ||||
| } | ||||
							
								
								
									
										200
									
								
								vendor/github.com/golang/protobuf/protoc-gen-go/descriptor/descriptor.pb.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										200
									
								
								vendor/github.com/golang/protobuf/protoc-gen-go/descriptor/descriptor.pb.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -1,200 +0,0 @@ | ||||
| // Code generated by protoc-gen-go. DO NOT EDIT. | ||||
| // source: github.com/golang/protobuf/protoc-gen-go/descriptor/descriptor.proto | ||||
|  | ||||
| package descriptor | ||||
|  | ||||
| import ( | ||||
| 	protoreflect "google.golang.org/protobuf/reflect/protoreflect" | ||||
| 	protoimpl "google.golang.org/protobuf/runtime/protoimpl" | ||||
| 	descriptorpb "google.golang.org/protobuf/types/descriptorpb" | ||||
| 	reflect "reflect" | ||||
| ) | ||||
|  | ||||
| // Symbols defined in public import of google/protobuf/descriptor.proto. | ||||
|  | ||||
| type FieldDescriptorProto_Type = descriptorpb.FieldDescriptorProto_Type | ||||
|  | ||||
| const FieldDescriptorProto_TYPE_DOUBLE = descriptorpb.FieldDescriptorProto_TYPE_DOUBLE | ||||
| const FieldDescriptorProto_TYPE_FLOAT = descriptorpb.FieldDescriptorProto_TYPE_FLOAT | ||||
| const FieldDescriptorProto_TYPE_INT64 = descriptorpb.FieldDescriptorProto_TYPE_INT64 | ||||
| const FieldDescriptorProto_TYPE_UINT64 = descriptorpb.FieldDescriptorProto_TYPE_UINT64 | ||||
| const FieldDescriptorProto_TYPE_INT32 = descriptorpb.FieldDescriptorProto_TYPE_INT32 | ||||
| const FieldDescriptorProto_TYPE_FIXED64 = descriptorpb.FieldDescriptorProto_TYPE_FIXED64 | ||||
| const FieldDescriptorProto_TYPE_FIXED32 = descriptorpb.FieldDescriptorProto_TYPE_FIXED32 | ||||
| const FieldDescriptorProto_TYPE_BOOL = descriptorpb.FieldDescriptorProto_TYPE_BOOL | ||||
| const FieldDescriptorProto_TYPE_STRING = descriptorpb.FieldDescriptorProto_TYPE_STRING | ||||
| const FieldDescriptorProto_TYPE_GROUP = descriptorpb.FieldDescriptorProto_TYPE_GROUP | ||||
| const FieldDescriptorProto_TYPE_MESSAGE = descriptorpb.FieldDescriptorProto_TYPE_MESSAGE | ||||
| const FieldDescriptorProto_TYPE_BYTES = descriptorpb.FieldDescriptorProto_TYPE_BYTES | ||||
| const FieldDescriptorProto_TYPE_UINT32 = descriptorpb.FieldDescriptorProto_TYPE_UINT32 | ||||
| const FieldDescriptorProto_TYPE_ENUM = descriptorpb.FieldDescriptorProto_TYPE_ENUM | ||||
| const FieldDescriptorProto_TYPE_SFIXED32 = descriptorpb.FieldDescriptorProto_TYPE_SFIXED32 | ||||
| const FieldDescriptorProto_TYPE_SFIXED64 = descriptorpb.FieldDescriptorProto_TYPE_SFIXED64 | ||||
| const FieldDescriptorProto_TYPE_SINT32 = descriptorpb.FieldDescriptorProto_TYPE_SINT32 | ||||
| const FieldDescriptorProto_TYPE_SINT64 = descriptorpb.FieldDescriptorProto_TYPE_SINT64 | ||||
|  | ||||
| var FieldDescriptorProto_Type_name = descriptorpb.FieldDescriptorProto_Type_name | ||||
| var FieldDescriptorProto_Type_value = descriptorpb.FieldDescriptorProto_Type_value | ||||
|  | ||||
| type FieldDescriptorProto_Label = descriptorpb.FieldDescriptorProto_Label | ||||
|  | ||||
| const FieldDescriptorProto_LABEL_OPTIONAL = descriptorpb.FieldDescriptorProto_LABEL_OPTIONAL | ||||
| const FieldDescriptorProto_LABEL_REQUIRED = descriptorpb.FieldDescriptorProto_LABEL_REQUIRED | ||||
| const FieldDescriptorProto_LABEL_REPEATED = descriptorpb.FieldDescriptorProto_LABEL_REPEATED | ||||
|  | ||||
| var FieldDescriptorProto_Label_name = descriptorpb.FieldDescriptorProto_Label_name | ||||
| var FieldDescriptorProto_Label_value = descriptorpb.FieldDescriptorProto_Label_value | ||||
|  | ||||
| type FileOptions_OptimizeMode = descriptorpb.FileOptions_OptimizeMode | ||||
|  | ||||
| const FileOptions_SPEED = descriptorpb.FileOptions_SPEED | ||||
| const FileOptions_CODE_SIZE = descriptorpb.FileOptions_CODE_SIZE | ||||
| const FileOptions_LITE_RUNTIME = descriptorpb.FileOptions_LITE_RUNTIME | ||||
|  | ||||
| var FileOptions_OptimizeMode_name = descriptorpb.FileOptions_OptimizeMode_name | ||||
| var FileOptions_OptimizeMode_value = descriptorpb.FileOptions_OptimizeMode_value | ||||
|  | ||||
| type FieldOptions_CType = descriptorpb.FieldOptions_CType | ||||
|  | ||||
| const FieldOptions_STRING = descriptorpb.FieldOptions_STRING | ||||
| const FieldOptions_CORD = descriptorpb.FieldOptions_CORD | ||||
| const FieldOptions_STRING_PIECE = descriptorpb.FieldOptions_STRING_PIECE | ||||
|  | ||||
| var FieldOptions_CType_name = descriptorpb.FieldOptions_CType_name | ||||
| var FieldOptions_CType_value = descriptorpb.FieldOptions_CType_value | ||||
|  | ||||
| type FieldOptions_JSType = descriptorpb.FieldOptions_JSType | ||||
|  | ||||
| const FieldOptions_JS_NORMAL = descriptorpb.FieldOptions_JS_NORMAL | ||||
| const FieldOptions_JS_STRING = descriptorpb.FieldOptions_JS_STRING | ||||
| const FieldOptions_JS_NUMBER = descriptorpb.FieldOptions_JS_NUMBER | ||||
|  | ||||
| var FieldOptions_JSType_name = descriptorpb.FieldOptions_JSType_name | ||||
| var FieldOptions_JSType_value = descriptorpb.FieldOptions_JSType_value | ||||
|  | ||||
| type MethodOptions_IdempotencyLevel = descriptorpb.MethodOptions_IdempotencyLevel | ||||
|  | ||||
| const MethodOptions_IDEMPOTENCY_UNKNOWN = descriptorpb.MethodOptions_IDEMPOTENCY_UNKNOWN | ||||
| const MethodOptions_NO_SIDE_EFFECTS = descriptorpb.MethodOptions_NO_SIDE_EFFECTS | ||||
| const MethodOptions_IDEMPOTENT = descriptorpb.MethodOptions_IDEMPOTENT | ||||
|  | ||||
| var MethodOptions_IdempotencyLevel_name = descriptorpb.MethodOptions_IdempotencyLevel_name | ||||
| var MethodOptions_IdempotencyLevel_value = descriptorpb.MethodOptions_IdempotencyLevel_value | ||||
|  | ||||
| type FileDescriptorSet = descriptorpb.FileDescriptorSet | ||||
| type FileDescriptorProto = descriptorpb.FileDescriptorProto | ||||
| type DescriptorProto = descriptorpb.DescriptorProto | ||||
| type ExtensionRangeOptions = descriptorpb.ExtensionRangeOptions | ||||
| type FieldDescriptorProto = descriptorpb.FieldDescriptorProto | ||||
| type OneofDescriptorProto = descriptorpb.OneofDescriptorProto | ||||
| type EnumDescriptorProto = descriptorpb.EnumDescriptorProto | ||||
| type EnumValueDescriptorProto = descriptorpb.EnumValueDescriptorProto | ||||
| type ServiceDescriptorProto = descriptorpb.ServiceDescriptorProto | ||||
| type MethodDescriptorProto = descriptorpb.MethodDescriptorProto | ||||
|  | ||||
| const Default_MethodDescriptorProto_ClientStreaming = descriptorpb.Default_MethodDescriptorProto_ClientStreaming | ||||
| const Default_MethodDescriptorProto_ServerStreaming = descriptorpb.Default_MethodDescriptorProto_ServerStreaming | ||||
|  | ||||
| type FileOptions = descriptorpb.FileOptions | ||||
|  | ||||
| const Default_FileOptions_JavaMultipleFiles = descriptorpb.Default_FileOptions_JavaMultipleFiles | ||||
| const Default_FileOptions_JavaStringCheckUtf8 = descriptorpb.Default_FileOptions_JavaStringCheckUtf8 | ||||
| const Default_FileOptions_OptimizeFor = descriptorpb.Default_FileOptions_OptimizeFor | ||||
| const Default_FileOptions_CcGenericServices = descriptorpb.Default_FileOptions_CcGenericServices | ||||
| const Default_FileOptions_JavaGenericServices = descriptorpb.Default_FileOptions_JavaGenericServices | ||||
| const Default_FileOptions_PyGenericServices = descriptorpb.Default_FileOptions_PyGenericServices | ||||
| const Default_FileOptions_PhpGenericServices = descriptorpb.Default_FileOptions_PhpGenericServices | ||||
| const Default_FileOptions_Deprecated = descriptorpb.Default_FileOptions_Deprecated | ||||
| const Default_FileOptions_CcEnableArenas = descriptorpb.Default_FileOptions_CcEnableArenas | ||||
|  | ||||
| type MessageOptions = descriptorpb.MessageOptions | ||||
|  | ||||
| const Default_MessageOptions_MessageSetWireFormat = descriptorpb.Default_MessageOptions_MessageSetWireFormat | ||||
| const Default_MessageOptions_NoStandardDescriptorAccessor = descriptorpb.Default_MessageOptions_NoStandardDescriptorAccessor | ||||
| const Default_MessageOptions_Deprecated = descriptorpb.Default_MessageOptions_Deprecated | ||||
|  | ||||
| type FieldOptions = descriptorpb.FieldOptions | ||||
|  | ||||
| const Default_FieldOptions_Ctype = descriptorpb.Default_FieldOptions_Ctype | ||||
| const Default_FieldOptions_Jstype = descriptorpb.Default_FieldOptions_Jstype | ||||
| const Default_FieldOptions_Lazy = descriptorpb.Default_FieldOptions_Lazy | ||||
| const Default_FieldOptions_Deprecated = descriptorpb.Default_FieldOptions_Deprecated | ||||
| const Default_FieldOptions_Weak = descriptorpb.Default_FieldOptions_Weak | ||||
|  | ||||
| type OneofOptions = descriptorpb.OneofOptions | ||||
| type EnumOptions = descriptorpb.EnumOptions | ||||
|  | ||||
| const Default_EnumOptions_Deprecated = descriptorpb.Default_EnumOptions_Deprecated | ||||
|  | ||||
| type EnumValueOptions = descriptorpb.EnumValueOptions | ||||
|  | ||||
| const Default_EnumValueOptions_Deprecated = descriptorpb.Default_EnumValueOptions_Deprecated | ||||
|  | ||||
| type ServiceOptions = descriptorpb.ServiceOptions | ||||
|  | ||||
| const Default_ServiceOptions_Deprecated = descriptorpb.Default_ServiceOptions_Deprecated | ||||
|  | ||||
| type MethodOptions = descriptorpb.MethodOptions | ||||
|  | ||||
| const Default_MethodOptions_Deprecated = descriptorpb.Default_MethodOptions_Deprecated | ||||
| const Default_MethodOptions_IdempotencyLevel = descriptorpb.Default_MethodOptions_IdempotencyLevel | ||||
|  | ||||
| type UninterpretedOption = descriptorpb.UninterpretedOption | ||||
| type SourceCodeInfo = descriptorpb.SourceCodeInfo | ||||
| type GeneratedCodeInfo = descriptorpb.GeneratedCodeInfo | ||||
| type DescriptorProto_ExtensionRange = descriptorpb.DescriptorProto_ExtensionRange | ||||
| type DescriptorProto_ReservedRange = descriptorpb.DescriptorProto_ReservedRange | ||||
| type EnumDescriptorProto_EnumReservedRange = descriptorpb.EnumDescriptorProto_EnumReservedRange | ||||
| type UninterpretedOption_NamePart = descriptorpb.UninterpretedOption_NamePart | ||||
| type SourceCodeInfo_Location = descriptorpb.SourceCodeInfo_Location | ||||
| type GeneratedCodeInfo_Annotation = descriptorpb.GeneratedCodeInfo_Annotation | ||||
|  | ||||
| var File_github_com_golang_protobuf_protoc_gen_go_descriptor_descriptor_proto protoreflect.FileDescriptor | ||||
|  | ||||
| var file_github_com_golang_protobuf_protoc_gen_go_descriptor_descriptor_proto_rawDesc = []byte{ | ||||
| 	0x0a, 0x44, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x67, 0x6f, 0x6c, | ||||
| 	0x61, 0x6e, 0x67, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x70, 0x72, 0x6f, | ||||
| 	0x74, 0x6f, 0x63, 0x2d, 0x67, 0x65, 0x6e, 0x2d, 0x67, 0x6f, 0x2f, 0x64, 0x65, 0x73, 0x63, 0x72, | ||||
| 	0x69, 0x70, 0x74, 0x6f, 0x72, 0x2f, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, | ||||
| 	0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x20, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, | ||||
| 	0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, | ||||
| 	0x6f, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x42, 0x40, 0x5a, 0x3e, 0x67, 0x69, 0x74, 0x68, | ||||
| 	0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x67, 0x6f, 0x6c, 0x61, 0x6e, 0x67, 0x2f, 0x70, 0x72, | ||||
| 	0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x2d, 0x67, 0x65, | ||||
| 	0x6e, 0x2d, 0x67, 0x6f, 0x2f, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x3b, | ||||
| 	0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x50, 0x00, 0x62, 0x06, 0x70, 0x72, | ||||
| 	0x6f, 0x74, 0x6f, 0x32, | ||||
| } | ||||
|  | ||||
| var file_github_com_golang_protobuf_protoc_gen_go_descriptor_descriptor_proto_goTypes = []interface{}{} | ||||
| var file_github_com_golang_protobuf_protoc_gen_go_descriptor_descriptor_proto_depIdxs = []int32{ | ||||
| 	0, // [0:0] is the sub-list for method output_type | ||||
| 	0, // [0:0] is the sub-list for method input_type | ||||
| 	0, // [0:0] is the sub-list for extension type_name | ||||
| 	0, // [0:0] is the sub-list for extension extendee | ||||
| 	0, // [0:0] is the sub-list for field type_name | ||||
| } | ||||
|  | ||||
| func init() { file_github_com_golang_protobuf_protoc_gen_go_descriptor_descriptor_proto_init() } | ||||
| func file_github_com_golang_protobuf_protoc_gen_go_descriptor_descriptor_proto_init() { | ||||
| 	if File_github_com_golang_protobuf_protoc_gen_go_descriptor_descriptor_proto != nil { | ||||
| 		return | ||||
| 	} | ||||
| 	type x struct{} | ||||
| 	out := protoimpl.TypeBuilder{ | ||||
| 		File: protoimpl.DescBuilder{ | ||||
| 			GoPackagePath: reflect.TypeOf(x{}).PkgPath(), | ||||
| 			RawDescriptor: file_github_com_golang_protobuf_protoc_gen_go_descriptor_descriptor_proto_rawDesc, | ||||
| 			NumEnums:      0, | ||||
| 			NumMessages:   0, | ||||
| 			NumExtensions: 0, | ||||
| 			NumServices:   0, | ||||
| 		}, | ||||
| 		GoTypes:           file_github_com_golang_protobuf_protoc_gen_go_descriptor_descriptor_proto_goTypes, | ||||
| 		DependencyIndexes: file_github_com_golang_protobuf_protoc_gen_go_descriptor_descriptor_proto_depIdxs, | ||||
| 	}.Build() | ||||
| 	File_github_com_golang_protobuf_protoc_gen_go_descriptor_descriptor_proto = out.File | ||||
| 	file_github_com_golang_protobuf_protoc_gen_go_descriptor_descriptor_proto_rawDesc = nil | ||||
| 	file_github_com_golang_protobuf_protoc_gen_go_descriptor_descriptor_proto_goTypes = nil | ||||
| 	file_github_com_golang_protobuf_protoc_gen_go_descriptor_descriptor_proto_depIdxs = nil | ||||
| } | ||||
							
								
								
									
										71
									
								
								vendor/github.com/golang/protobuf/ptypes/wrappers/wrappers.pb.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										71
									
								
								vendor/github.com/golang/protobuf/ptypes/wrappers/wrappers.pb.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -1,71 +0,0 @@ | ||||
| // Code generated by protoc-gen-go. DO NOT EDIT. | ||||
| // source: github.com/golang/protobuf/ptypes/wrappers/wrappers.proto | ||||
|  | ||||
| package wrappers | ||||
|  | ||||
| import ( | ||||
| 	protoreflect "google.golang.org/protobuf/reflect/protoreflect" | ||||
| 	protoimpl "google.golang.org/protobuf/runtime/protoimpl" | ||||
| 	wrapperspb "google.golang.org/protobuf/types/known/wrapperspb" | ||||
| 	reflect "reflect" | ||||
| ) | ||||
|  | ||||
| // Symbols defined in public import of google/protobuf/wrappers.proto. | ||||
|  | ||||
| type DoubleValue = wrapperspb.DoubleValue | ||||
| type FloatValue = wrapperspb.FloatValue | ||||
| type Int64Value = wrapperspb.Int64Value | ||||
| type UInt64Value = wrapperspb.UInt64Value | ||||
| type Int32Value = wrapperspb.Int32Value | ||||
| type UInt32Value = wrapperspb.UInt32Value | ||||
| type BoolValue = wrapperspb.BoolValue | ||||
| type StringValue = wrapperspb.StringValue | ||||
| type BytesValue = wrapperspb.BytesValue | ||||
|  | ||||
| var File_github_com_golang_protobuf_ptypes_wrappers_wrappers_proto protoreflect.FileDescriptor | ||||
|  | ||||
| var file_github_com_golang_protobuf_ptypes_wrappers_wrappers_proto_rawDesc = []byte{ | ||||
| 	0x0a, 0x39, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x67, 0x6f, 0x6c, | ||||
| 	0x61, 0x6e, 0x67, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x70, 0x74, 0x79, | ||||
| 	0x70, 0x65, 0x73, 0x2f, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x73, 0x2f, 0x77, 0x72, 0x61, | ||||
| 	0x70, 0x70, 0x65, 0x72, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1e, 0x67, 0x6f, 0x6f, | ||||
| 	0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x77, 0x72, 0x61, | ||||
| 	0x70, 0x70, 0x65, 0x72, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x42, 0x35, 0x5a, 0x33, 0x67, | ||||
| 	0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x67, 0x6f, 0x6c, 0x61, 0x6e, 0x67, | ||||
| 	0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x70, 0x74, 0x79, 0x70, 0x65, 0x73, | ||||
| 	0x2f, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x73, 0x3b, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, | ||||
| 	0x72, 0x73, 0x50, 0x00, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, | ||||
| } | ||||
|  | ||||
| var file_github_com_golang_protobuf_ptypes_wrappers_wrappers_proto_goTypes = []interface{}{} | ||||
| var file_github_com_golang_protobuf_ptypes_wrappers_wrappers_proto_depIdxs = []int32{ | ||||
| 	0, // [0:0] is the sub-list for method output_type | ||||
| 	0, // [0:0] is the sub-list for method input_type | ||||
| 	0, // [0:0] is the sub-list for extension type_name | ||||
| 	0, // [0:0] is the sub-list for extension extendee | ||||
| 	0, // [0:0] is the sub-list for field type_name | ||||
| } | ||||
|  | ||||
| func init() { file_github_com_golang_protobuf_ptypes_wrappers_wrappers_proto_init() } | ||||
| func file_github_com_golang_protobuf_ptypes_wrappers_wrappers_proto_init() { | ||||
| 	if File_github_com_golang_protobuf_ptypes_wrappers_wrappers_proto != nil { | ||||
| 		return | ||||
| 	} | ||||
| 	type x struct{} | ||||
| 	out := protoimpl.TypeBuilder{ | ||||
| 		File: protoimpl.DescBuilder{ | ||||
| 			GoPackagePath: reflect.TypeOf(x{}).PkgPath(), | ||||
| 			RawDescriptor: file_github_com_golang_protobuf_ptypes_wrappers_wrappers_proto_rawDesc, | ||||
| 			NumEnums:      0, | ||||
| 			NumMessages:   0, | ||||
| 			NumExtensions: 0, | ||||
| 			NumServices:   0, | ||||
| 		}, | ||||
| 		GoTypes:           file_github_com_golang_protobuf_ptypes_wrappers_wrappers_proto_goTypes, | ||||
| 		DependencyIndexes: file_github_com_golang_protobuf_ptypes_wrappers_wrappers_proto_depIdxs, | ||||
| 	}.Build() | ||||
| 	File_github_com_golang_protobuf_ptypes_wrappers_wrappers_proto = out.File | ||||
| 	file_github_com_golang_protobuf_ptypes_wrappers_wrappers_proto_rawDesc = nil | ||||
| 	file_github_com_golang_protobuf_ptypes_wrappers_wrappers_proto_goTypes = nil | ||||
| 	file_github_com_golang_protobuf_ptypes_wrappers_wrappers_proto_depIdxs = nil | ||||
| } | ||||
							
								
								
									
										19
									
								
								vendor/github.com/google/go-cmp/cmp/compare.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										19
									
								
								vendor/github.com/google/go-cmp/cmp/compare.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -36,11 +36,12 @@ import ( | ||||
| 	"strings" | ||||
|  | ||||
| 	"github.com/google/go-cmp/cmp/internal/diff" | ||||
| 	"github.com/google/go-cmp/cmp/internal/flags" | ||||
| 	"github.com/google/go-cmp/cmp/internal/function" | ||||
| 	"github.com/google/go-cmp/cmp/internal/value" | ||||
| ) | ||||
|  | ||||
| // TODO(≥go1.18): Use any instead of interface{}. | ||||
|  | ||||
| // Equal reports whether x and y are equal by recursively applying the | ||||
| // following rules in the given order to x and y and all of their sub-values: | ||||
| // | ||||
| @@ -319,7 +320,6 @@ func (s *state) tryMethod(t reflect.Type, vx, vy reflect.Value) bool { | ||||
| } | ||||
|  | ||||
| func (s *state) callTRFunc(f, v reflect.Value, step Transform) reflect.Value { | ||||
| 	v = sanitizeValue(v, f.Type().In(0)) | ||||
| 	if !s.dynChecker.Next() { | ||||
| 		return f.Call([]reflect.Value{v})[0] | ||||
| 	} | ||||
| @@ -343,8 +343,6 @@ func (s *state) callTRFunc(f, v reflect.Value, step Transform) reflect.Value { | ||||
| } | ||||
|  | ||||
| func (s *state) callTTBFunc(f, x, y reflect.Value) bool { | ||||
| 	x = sanitizeValue(x, f.Type().In(0)) | ||||
| 	y = sanitizeValue(y, f.Type().In(1)) | ||||
| 	if !s.dynChecker.Next() { | ||||
| 		return f.Call([]reflect.Value{x, y})[0].Bool() | ||||
| 	} | ||||
| @@ -372,19 +370,6 @@ func detectRaces(c chan<- reflect.Value, f reflect.Value, vs ...reflect.Value) { | ||||
| 	ret = f.Call(vs)[0] | ||||
| } | ||||
|  | ||||
| // sanitizeValue converts nil interfaces of type T to those of type R, | ||||
| // assuming that T is assignable to R. | ||||
| // Otherwise, it returns the input value as is. | ||||
| func sanitizeValue(v reflect.Value, t reflect.Type) reflect.Value { | ||||
| 	// TODO(≥go1.10): Workaround for reflect bug (https://golang.org/issue/22143). | ||||
| 	if !flags.AtLeastGo110 { | ||||
| 		if v.Kind() == reflect.Interface && v.IsNil() && v.Type() != t { | ||||
| 			return reflect.New(t).Elem() | ||||
| 		} | ||||
| 	} | ||||
| 	return v | ||||
| } | ||||
|  | ||||
| func (s *state) compareStruct(t reflect.Type, vx, vy reflect.Value) { | ||||
| 	var addr bool | ||||
| 	var vax, vay reflect.Value // Addressable versions of vx and vy | ||||
|   | ||||
							
								
								
									
										1
									
								
								vendor/github.com/google/go-cmp/cmp/export_panic.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								vendor/github.com/google/go-cmp/cmp/export_panic.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -2,6 +2,7 @@ | ||||
| // Use of this source code is governed by a BSD-style | ||||
| // license that can be found in the LICENSE file. | ||||
|  | ||||
| //go:build purego | ||||
| // +build purego | ||||
|  | ||||
| package cmp | ||||
|   | ||||
							
								
								
									
										1
									
								
								vendor/github.com/google/go-cmp/cmp/export_unsafe.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								vendor/github.com/google/go-cmp/cmp/export_unsafe.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -2,6 +2,7 @@ | ||||
| // Use of this source code is governed by a BSD-style | ||||
| // license that can be found in the LICENSE file. | ||||
|  | ||||
| //go:build !purego | ||||
| // +build !purego | ||||
|  | ||||
| package cmp | ||||
|   | ||||
							
								
								
									
										1
									
								
								vendor/github.com/google/go-cmp/cmp/internal/diff/debug_disable.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								vendor/github.com/google/go-cmp/cmp/internal/diff/debug_disable.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -2,6 +2,7 @@ | ||||
| // Use of this source code is governed by a BSD-style | ||||
| // license that can be found in the LICENSE file. | ||||
|  | ||||
| //go:build !cmp_debug | ||||
| // +build !cmp_debug | ||||
|  | ||||
| package diff | ||||
|   | ||||
							
								
								
									
										1
									
								
								vendor/github.com/google/go-cmp/cmp/internal/diff/debug_enable.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								vendor/github.com/google/go-cmp/cmp/internal/diff/debug_enable.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -2,6 +2,7 @@ | ||||
| // Use of this source code is governed by a BSD-style | ||||
| // license that can be found in the LICENSE file. | ||||
|  | ||||
| //go:build cmp_debug | ||||
| // +build cmp_debug | ||||
|  | ||||
| package diff | ||||
|   | ||||
							
								
								
									
										10
									
								
								vendor/github.com/google/go-cmp/cmp/internal/flags/toolchain_legacy.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										10
									
								
								vendor/github.com/google/go-cmp/cmp/internal/flags/toolchain_legacy.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -1,10 +0,0 @@ | ||||
| // Copyright 2019, The Go Authors. All rights reserved. | ||||
| // Use of this source code is governed by a BSD-style | ||||
| // license that can be found in the LICENSE file. | ||||
|  | ||||
| // +build !go1.10 | ||||
|  | ||||
| package flags | ||||
|  | ||||
| // AtLeastGo110 reports whether the Go toolchain is at least Go 1.10. | ||||
| const AtLeastGo110 = false | ||||
							
								
								
									
										10
									
								
								vendor/github.com/google/go-cmp/cmp/internal/flags/toolchain_recent.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										10
									
								
								vendor/github.com/google/go-cmp/cmp/internal/flags/toolchain_recent.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -1,10 +0,0 @@ | ||||
| // Copyright 2019, The Go Authors. All rights reserved. | ||||
| // Use of this source code is governed by a BSD-style | ||||
| // license that can be found in the LICENSE file. | ||||
|  | ||||
| // +build go1.10 | ||||
|  | ||||
| package flags | ||||
|  | ||||
| // AtLeastGo110 reports whether the Go toolchain is at least Go 1.10. | ||||
| const AtLeastGo110 = true | ||||
							
								
								
									
										7
									
								
								vendor/github.com/google/go-cmp/cmp/internal/value/name.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										7
									
								
								vendor/github.com/google/go-cmp/cmp/internal/value/name.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -9,6 +9,8 @@ import ( | ||||
| 	"strconv" | ||||
| ) | ||||
|  | ||||
| var anyType = reflect.TypeOf((*interface{})(nil)).Elem() | ||||
|  | ||||
| // TypeString is nearly identical to reflect.Type.String, | ||||
| // but has an additional option to specify that full type names be used. | ||||
| func TypeString(t reflect.Type, qualified bool) string { | ||||
| @@ -20,6 +22,11 @@ func appendTypeName(b []byte, t reflect.Type, qualified, elideFunc bool) []byte | ||||
| 	// of the same name and within the same package, | ||||
| 	// but declared within the namespace of different functions. | ||||
|  | ||||
| 	// Use the "any" alias instead of "interface{}" for better readability. | ||||
| 	if t == anyType { | ||||
| 		return append(b, "any"...) | ||||
| 	} | ||||
|  | ||||
| 	// Named type. | ||||
| 	if t.Name() != "" { | ||||
| 		if qualified && t.PkgPath() != "" { | ||||
|   | ||||
							
								
								
									
										1
									
								
								vendor/github.com/google/go-cmp/cmp/internal/value/pointer_purego.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								vendor/github.com/google/go-cmp/cmp/internal/value/pointer_purego.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -2,6 +2,7 @@ | ||||
| // Use of this source code is governed by a BSD-style | ||||
| // license that can be found in the LICENSE file. | ||||
|  | ||||
| //go:build purego | ||||
| // +build purego | ||||
|  | ||||
| package value | ||||
|   | ||||
							
								
								
									
										1
									
								
								vendor/github.com/google/go-cmp/cmp/internal/value/pointer_unsafe.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								vendor/github.com/google/go-cmp/cmp/internal/value/pointer_unsafe.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -2,6 +2,7 @@ | ||||
| // Use of this source code is governed by a BSD-style | ||||
| // license that can be found in the LICENSE file. | ||||
|  | ||||
| //go:build !purego | ||||
| // +build !purego | ||||
|  | ||||
| package value | ||||
|   | ||||
							
								
								
									
										2
									
								
								vendor/github.com/google/go-cmp/cmp/path.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								vendor/github.com/google/go-cmp/cmp/path.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -178,7 +178,7 @@ type structField struct { | ||||
| 	unexported bool | ||||
| 	mayForce   bool                // Forcibly allow visibility | ||||
| 	paddr      bool                // Was parent addressable? | ||||
| 	pvx, pvy   reflect.Value       // Parent values (always addressible) | ||||
| 	pvx, pvy   reflect.Value       // Parent values (always addressable) | ||||
| 	field      reflect.StructField // Field information | ||||
| } | ||||
|  | ||||
|   | ||||
							
								
								
									
										5
									
								
								vendor/github.com/google/go-cmp/cmp/report_compare.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										5
									
								
								vendor/github.com/google/go-cmp/cmp/report_compare.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -116,7 +116,10 @@ func (opts formatOptions) FormatDiff(v *valueNode, ptrs *pointerReferences) (out | ||||
| 	} | ||||
|  | ||||
| 	// For leaf nodes, format the value based on the reflect.Values alone. | ||||
| 	if v.MaxDepth == 0 { | ||||
| 	// As a special case, treat equal []byte as a leaf nodes. | ||||
| 	isBytes := v.Type.Kind() == reflect.Slice && v.Type.Elem() == reflect.TypeOf(byte(0)) | ||||
| 	isEqualBytes := isBytes && v.NumDiff+v.NumIgnored+v.NumTransformed == 0 | ||||
| 	if v.MaxDepth == 0 || isEqualBytes { | ||||
| 		switch opts.DiffMode { | ||||
| 		case diffUnknown, diffIdentical: | ||||
| 			// Format Equal. | ||||
|   | ||||
							
								
								
									
										13
									
								
								vendor/github.com/google/go-cmp/cmp/report_reflect.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										13
									
								
								vendor/github.com/google/go-cmp/cmp/report_reflect.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -207,10 +207,11 @@ func (opts formatOptions) FormatValue(v reflect.Value, parentKind reflect.Kind, | ||||
| 		// Check whether this is a []byte of text data. | ||||
| 		if t.Elem() == reflect.TypeOf(byte(0)) { | ||||
| 			b := v.Bytes() | ||||
| 			isPrintSpace := func(r rune) bool { return unicode.IsPrint(r) && unicode.IsSpace(r) } | ||||
| 			isPrintSpace := func(r rune) bool { return unicode.IsPrint(r) || unicode.IsSpace(r) } | ||||
| 			if len(b) > 0 && utf8.Valid(b) && len(bytes.TrimFunc(b, isPrintSpace)) == 0 { | ||||
| 				out = opts.formatString("", string(b)) | ||||
| 				return opts.WithTypeMode(emitType).FormatType(t, out) | ||||
| 				skipType = true | ||||
| 				return opts.FormatType(t, out) | ||||
| 			} | ||||
| 		} | ||||
|  | ||||
| @@ -281,7 +282,12 @@ func (opts formatOptions) FormatValue(v reflect.Value, parentKind reflect.Kind, | ||||
| 		} | ||||
| 		defer ptrs.Pop() | ||||
|  | ||||
| 		skipType = true // Let the underlying value print the type instead | ||||
| 		// Skip the name only if this is an unnamed pointer type. | ||||
| 		// Otherwise taking the address of a value does not reproduce | ||||
| 		// the named pointer type. | ||||
| 		if v.Type().Name() == "" { | ||||
| 			skipType = true // Let the underlying value print the type instead | ||||
| 		} | ||||
| 		out = opts.FormatValue(v.Elem(), t.Kind(), ptrs) | ||||
| 		out = wrapTrunkReference(ptrRef, opts.PrintAddresses, out) | ||||
| 		out = &textWrap{Prefix: "&", Value: out} | ||||
| @@ -292,7 +298,6 @@ func (opts formatOptions) FormatValue(v reflect.Value, parentKind reflect.Kind, | ||||
| 		} | ||||
| 		// Interfaces accept different concrete types, | ||||
| 		// so configure the underlying value to explicitly print the type. | ||||
| 		skipType = true // Print the concrete type instead | ||||
| 		return opts.WithTypeMode(emitType).FormatValue(v.Elem(), t.Kind(), ptrs) | ||||
| 	default: | ||||
| 		panic(fmt.Sprintf("%v kind not handled", v.Kind())) | ||||
|   | ||||
							
								
								
									
										6
									
								
								vendor/github.com/google/go-cmp/cmp/report_slices.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										6
									
								
								vendor/github.com/google/go-cmp/cmp/report_slices.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -80,7 +80,7 @@ func (opts formatOptions) CanFormatDiffSlice(v *valueNode) bool { | ||||
| 	} | ||||
|  | ||||
| 	// Use specialized string diffing for longer slices or strings. | ||||
| 	const minLength = 64 | ||||
| 	const minLength = 32 | ||||
| 	return vx.Len() >= minLength && vy.Len() >= minLength | ||||
| } | ||||
|  | ||||
| @@ -563,10 +563,10 @@ func cleanupSurroundingIdentical(groups []diffStats, eq func(i, j int) bool) []d | ||||
| 		nx := ds.NumIdentical + ds.NumRemoved + ds.NumModified | ||||
| 		ny := ds.NumIdentical + ds.NumInserted + ds.NumModified | ||||
| 		var numLeadingIdentical, numTrailingIdentical int | ||||
| 		for i := 0; i < nx && i < ny && eq(ix+i, iy+i); i++ { | ||||
| 		for j := 0; j < nx && j < ny && eq(ix+j, iy+j); j++ { | ||||
| 			numLeadingIdentical++ | ||||
| 		} | ||||
| 		for i := 0; i < nx && i < ny && eq(ix+nx-1-i, iy+ny-1-i); i++ { | ||||
| 		for j := 0; j < nx && j < ny && eq(ix+nx-1-j, iy+ny-1-j); j++ { | ||||
| 			numTrailingIdentical++ | ||||
| 		} | ||||
| 		if numIdentical := numLeadingIdentical + numTrailingIdentical; numIdentical > 0 { | ||||
|   | ||||
							
								
								
									
										23
									
								
								vendor/github.com/grpc-ecosystem/grpc-gateway/internal/BUILD.bazel
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										23
									
								
								vendor/github.com/grpc-ecosystem/grpc-gateway/internal/BUILD.bazel
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -1,23 +0,0 @@ | ||||
| load("@rules_proto//proto:defs.bzl", "proto_library") | ||||
| load("@io_bazel_rules_go//go:def.bzl", "go_library") | ||||
| load("@io_bazel_rules_go//proto:def.bzl", "go_proto_library") | ||||
|  | ||||
| package(default_visibility = ["//visibility:public"]) | ||||
|  | ||||
| proto_library( | ||||
|     name = "internal_proto", | ||||
|     srcs = ["errors.proto"], | ||||
|     deps = ["@com_google_protobuf//:any_proto"], | ||||
| ) | ||||
|  | ||||
| go_proto_library( | ||||
|     name = "internal_go_proto", | ||||
|     importpath = "github.com/grpc-ecosystem/grpc-gateway/internal", | ||||
|     proto = ":internal_proto", | ||||
| ) | ||||
|  | ||||
| go_library( | ||||
|     name = "go_default_library", | ||||
|     embed = [":internal_go_proto"], | ||||
|     importpath = "github.com/grpc-ecosystem/grpc-gateway/internal", | ||||
| ) | ||||
							
								
								
									
										189
									
								
								vendor/github.com/grpc-ecosystem/grpc-gateway/internal/errors.pb.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										189
									
								
								vendor/github.com/grpc-ecosystem/grpc-gateway/internal/errors.pb.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -1,189 +0,0 @@ | ||||
| // Code generated by protoc-gen-go. DO NOT EDIT. | ||||
| // source: internal/errors.proto | ||||
|  | ||||
| package internal | ||||
|  | ||||
| import ( | ||||
| 	fmt "fmt" | ||||
| 	proto "github.com/golang/protobuf/proto" | ||||
| 	any "github.com/golang/protobuf/ptypes/any" | ||||
| 	math "math" | ||||
| ) | ||||
|  | ||||
| // Reference imports to suppress errors if they are not otherwise used. | ||||
| var _ = proto.Marshal | ||||
| var _ = fmt.Errorf | ||||
| var _ = math.Inf | ||||
|  | ||||
| // This is a compile-time assertion to ensure that this generated file | ||||
| // is compatible with the proto package it is being compiled against. | ||||
| // A compilation error at this line likely means your copy of the | ||||
| // proto package needs to be updated. | ||||
| const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package | ||||
|  | ||||
| // Error is the generic error returned from unary RPCs. | ||||
| type Error struct { | ||||
| 	Error string `protobuf:"bytes,1,opt,name=error,proto3" json:"error,omitempty"` | ||||
| 	// This is to make the error more compatible with users that expect errors to be Status objects: | ||||
| 	// https://github.com/grpc/grpc/blob/master/src/proto/grpc/status/status.proto | ||||
| 	// It should be the exact same message as the Error field. | ||||
| 	Code                 int32      `protobuf:"varint,2,opt,name=code,proto3" json:"code,omitempty"` | ||||
| 	Message              string     `protobuf:"bytes,3,opt,name=message,proto3" json:"message,omitempty"` | ||||
| 	Details              []*any.Any `protobuf:"bytes,4,rep,name=details,proto3" json:"details,omitempty"` | ||||
| 	XXX_NoUnkeyedLiteral struct{}   `json:"-"` | ||||
| 	XXX_unrecognized     []byte     `json:"-"` | ||||
| 	XXX_sizecache        int32      `json:"-"` | ||||
| } | ||||
|  | ||||
| func (m *Error) Reset()         { *m = Error{} } | ||||
| func (m *Error) String() string { return proto.CompactTextString(m) } | ||||
| func (*Error) ProtoMessage()    {} | ||||
| func (*Error) Descriptor() ([]byte, []int) { | ||||
| 	return fileDescriptor_9b093362ca6d1e03, []int{0} | ||||
| } | ||||
|  | ||||
| func (m *Error) XXX_Unmarshal(b []byte) error { | ||||
| 	return xxx_messageInfo_Error.Unmarshal(m, b) | ||||
| } | ||||
| func (m *Error) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { | ||||
| 	return xxx_messageInfo_Error.Marshal(b, m, deterministic) | ||||
| } | ||||
| func (m *Error) XXX_Merge(src proto.Message) { | ||||
| 	xxx_messageInfo_Error.Merge(m, src) | ||||
| } | ||||
| func (m *Error) XXX_Size() int { | ||||
| 	return xxx_messageInfo_Error.Size(m) | ||||
| } | ||||
| func (m *Error) XXX_DiscardUnknown() { | ||||
| 	xxx_messageInfo_Error.DiscardUnknown(m) | ||||
| } | ||||
|  | ||||
| var xxx_messageInfo_Error proto.InternalMessageInfo | ||||
|  | ||||
| func (m *Error) GetError() string { | ||||
| 	if m != nil { | ||||
| 		return m.Error | ||||
| 	} | ||||
| 	return "" | ||||
| } | ||||
|  | ||||
| func (m *Error) GetCode() int32 { | ||||
| 	if m != nil { | ||||
| 		return m.Code | ||||
| 	} | ||||
| 	return 0 | ||||
| } | ||||
|  | ||||
| func (m *Error) GetMessage() string { | ||||
| 	if m != nil { | ||||
| 		return m.Message | ||||
| 	} | ||||
| 	return "" | ||||
| } | ||||
|  | ||||
| func (m *Error) GetDetails() []*any.Any { | ||||
| 	if m != nil { | ||||
| 		return m.Details | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| // StreamError is a response type which is returned when | ||||
| // streaming rpc returns an error. | ||||
| type StreamError struct { | ||||
| 	GrpcCode             int32      `protobuf:"varint,1,opt,name=grpc_code,json=grpcCode,proto3" json:"grpc_code,omitempty"` | ||||
| 	HttpCode             int32      `protobuf:"varint,2,opt,name=http_code,json=httpCode,proto3" json:"http_code,omitempty"` | ||||
| 	Message              string     `protobuf:"bytes,3,opt,name=message,proto3" json:"message,omitempty"` | ||||
| 	HttpStatus           string     `protobuf:"bytes,4,opt,name=http_status,json=httpStatus,proto3" json:"http_status,omitempty"` | ||||
| 	Details              []*any.Any `protobuf:"bytes,5,rep,name=details,proto3" json:"details,omitempty"` | ||||
| 	XXX_NoUnkeyedLiteral struct{}   `json:"-"` | ||||
| 	XXX_unrecognized     []byte     `json:"-"` | ||||
| 	XXX_sizecache        int32      `json:"-"` | ||||
| } | ||||
|  | ||||
| func (m *StreamError) Reset()         { *m = StreamError{} } | ||||
| func (m *StreamError) String() string { return proto.CompactTextString(m) } | ||||
| func (*StreamError) ProtoMessage()    {} | ||||
| func (*StreamError) Descriptor() ([]byte, []int) { | ||||
| 	return fileDescriptor_9b093362ca6d1e03, []int{1} | ||||
| } | ||||
|  | ||||
| func (m *StreamError) XXX_Unmarshal(b []byte) error { | ||||
| 	return xxx_messageInfo_StreamError.Unmarshal(m, b) | ||||
| } | ||||
| func (m *StreamError) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { | ||||
| 	return xxx_messageInfo_StreamError.Marshal(b, m, deterministic) | ||||
| } | ||||
| func (m *StreamError) XXX_Merge(src proto.Message) { | ||||
| 	xxx_messageInfo_StreamError.Merge(m, src) | ||||
| } | ||||
| func (m *StreamError) XXX_Size() int { | ||||
| 	return xxx_messageInfo_StreamError.Size(m) | ||||
| } | ||||
| func (m *StreamError) XXX_DiscardUnknown() { | ||||
| 	xxx_messageInfo_StreamError.DiscardUnknown(m) | ||||
| } | ||||
|  | ||||
| var xxx_messageInfo_StreamError proto.InternalMessageInfo | ||||
|  | ||||
| func (m *StreamError) GetGrpcCode() int32 { | ||||
| 	if m != nil { | ||||
| 		return m.GrpcCode | ||||
| 	} | ||||
| 	return 0 | ||||
| } | ||||
|  | ||||
| func (m *StreamError) GetHttpCode() int32 { | ||||
| 	if m != nil { | ||||
| 		return m.HttpCode | ||||
| 	} | ||||
| 	return 0 | ||||
| } | ||||
|  | ||||
| func (m *StreamError) GetMessage() string { | ||||
| 	if m != nil { | ||||
| 		return m.Message | ||||
| 	} | ||||
| 	return "" | ||||
| } | ||||
|  | ||||
| func (m *StreamError) GetHttpStatus() string { | ||||
| 	if m != nil { | ||||
| 		return m.HttpStatus | ||||
| 	} | ||||
| 	return "" | ||||
| } | ||||
|  | ||||
| func (m *StreamError) GetDetails() []*any.Any { | ||||
| 	if m != nil { | ||||
| 		return m.Details | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| func init() { | ||||
| 	proto.RegisterType((*Error)(nil), "grpc.gateway.runtime.Error") | ||||
| 	proto.RegisterType((*StreamError)(nil), "grpc.gateway.runtime.StreamError") | ||||
| } | ||||
|  | ||||
| func init() { proto.RegisterFile("internal/errors.proto", fileDescriptor_9b093362ca6d1e03) } | ||||
|  | ||||
| var fileDescriptor_9b093362ca6d1e03 = []byte{ | ||||
| 	// 252 bytes of a gzipped FileDescriptorProto | ||||
| 	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x90, 0xc1, 0x4a, 0xc4, 0x30, | ||||
| 	0x10, 0x86, 0x89, 0xbb, 0x75, 0xdb, 0xe9, 0x2d, 0x54, 0x88, 0xee, 0xc1, 0xb2, 0xa7, 0x9e, 0x52, | ||||
| 	0xd0, 0x27, 0xd0, 0xc5, 0x17, 0xe8, 0xde, 0xbc, 0x2c, 0xd9, 0xdd, 0x31, 0x16, 0xda, 0xa4, 0x24, | ||||
| 	0x53, 0xa4, 0xf8, 0x56, 0x3e, 0xa1, 0x24, 0xa5, 0xb0, 0x27, 0xf1, 0xd6, 0xf9, 0xfb, 0xcf, 0x7c, | ||||
| 	0x1f, 0x81, 0xbb, 0xd6, 0x10, 0x3a, 0xa3, 0xba, 0x1a, 0x9d, 0xb3, 0xce, 0xcb, 0xc1, 0x59, 0xb2, | ||||
| 	0xbc, 0xd0, 0x6e, 0x38, 0x4b, 0xad, 0x08, 0xbf, 0xd4, 0x24, 0xdd, 0x68, 0xa8, 0xed, 0xf1, 0xe1, | ||||
| 	0x5e, 0x5b, 0xab, 0x3b, 0xac, 0x63, 0xe7, 0x34, 0x7e, 0xd4, 0xca, 0x4c, 0xf3, 0xc2, 0xee, 0x1b, | ||||
| 	0x92, 0xb7, 0x70, 0x80, 0x17, 0x90, 0xc4, 0x4b, 0x82, 0x95, 0xac, 0xca, 0x9a, 0x79, 0xe0, 0x1c, | ||||
| 	0xd6, 0x67, 0x7b, 0x41, 0x71, 0x53, 0xb2, 0x2a, 0x69, 0xe2, 0x37, 0x17, 0xb0, 0xe9, 0xd1, 0x7b, | ||||
| 	0xa5, 0x51, 0xac, 0x62, 0x77, 0x19, 0xb9, 0x84, 0xcd, 0x05, 0x49, 0xb5, 0x9d, 0x17, 0xeb, 0x72, | ||||
| 	0x55, 0xe5, 0x4f, 0x85, 0x9c, 0xc9, 0x72, 0x21, 0xcb, 0x17, 0x33, 0x35, 0x4b, 0x69, 0xf7, 0xc3, | ||||
| 	0x20, 0x3f, 0x90, 0x43, 0xd5, 0xcf, 0x0e, 0x5b, 0xc8, 0x82, 0xff, 0x31, 0x22, 0x59, 0x44, 0xa6, | ||||
| 	0x21, 0xd8, 0x07, 0xec, 0x16, 0xb2, 0x4f, 0xa2, 0xe1, 0x78, 0xe5, 0x93, 0x86, 0x60, 0xff, 0xb7, | ||||
| 	0xd3, 0x23, 0xe4, 0x71, 0xcd, 0x93, 0xa2, 0x31, 0x78, 0x85, 0xbf, 0x10, 0xa2, 0x43, 0x4c, 0xae, | ||||
| 	0xa5, 0x93, 0x7f, 0x48, 0xbf, 0xc2, 0x7b, 0xba, 0xbc, 0xfd, 0xe9, 0x36, 0x56, 0x9e, 0x7f, 0x03, | ||||
| 	0x00, 0x00, 0xff, 0xff, 0xde, 0x72, 0x6b, 0x83, 0x8e, 0x01, 0x00, 0x00, | ||||
| } | ||||
							
								
								
									
										26
									
								
								vendor/github.com/grpc-ecosystem/grpc-gateway/internal/errors.proto
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										26
									
								
								vendor/github.com/grpc-ecosystem/grpc-gateway/internal/errors.proto
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -1,26 +0,0 @@ | ||||
| syntax = "proto3"; | ||||
| package grpc.gateway.runtime; | ||||
| option go_package = "internal"; | ||||
|  | ||||
| import "google/protobuf/any.proto"; | ||||
|  | ||||
| // Error is the generic error returned from unary RPCs. | ||||
| message Error { | ||||
| 	string error = 1; | ||||
| 	// This is to make the error more compatible with users that expect errors to be Status objects: | ||||
| 	// https://github.com/grpc/grpc/blob/master/src/proto/grpc/status/status.proto | ||||
| 	// It should be the exact same message as the Error field. | ||||
| 	int32 code = 2; | ||||
| 	string message = 3; | ||||
| 	repeated google.protobuf.Any details = 4; | ||||
| } | ||||
|  | ||||
| // StreamError is a response type which is returned when | ||||
| // streaming rpc returns an error. | ||||
| message StreamError { | ||||
| 	int32 grpc_code = 1; | ||||
| 	int32 http_code = 2; | ||||
| 	string message = 3; | ||||
| 	string http_status = 4; | ||||
| 	repeated google.protobuf.Any details = 5; | ||||
| } | ||||
							
								
								
									
										85
									
								
								vendor/github.com/grpc-ecosystem/grpc-gateway/runtime/BUILD.bazel
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										85
									
								
								vendor/github.com/grpc-ecosystem/grpc-gateway/runtime/BUILD.bazel
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -1,85 +0,0 @@ | ||||
| load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") | ||||
|  | ||||
| package(default_visibility = ["//visibility:public"]) | ||||
|  | ||||
| go_library( | ||||
|     name = "go_default_library", | ||||
|     srcs = [ | ||||
|         "context.go", | ||||
|         "convert.go", | ||||
|         "doc.go", | ||||
|         "errors.go", | ||||
|         "fieldmask.go", | ||||
|         "handler.go", | ||||
|         "marshal_httpbodyproto.go", | ||||
|         "marshal_json.go", | ||||
|         "marshal_jsonpb.go", | ||||
|         "marshal_proto.go", | ||||
|         "marshaler.go", | ||||
|         "marshaler_registry.go", | ||||
|         "mux.go", | ||||
|         "pattern.go", | ||||
|         "proto2_convert.go", | ||||
|         "proto_errors.go", | ||||
|         "query.go", | ||||
|     ], | ||||
|     importpath = "github.com/grpc-ecosystem/grpc-gateway/runtime", | ||||
|     deps = [ | ||||
|         "//internal:go_default_library", | ||||
|         "//utilities:go_default_library", | ||||
|         "@com_github_golang_protobuf//descriptor:go_default_library_gen", | ||||
|         "@com_github_golang_protobuf//jsonpb:go_default_library_gen", | ||||
|         "@com_github_golang_protobuf//proto:go_default_library", | ||||
|         "@go_googleapis//google/api:httpbody_go_proto", | ||||
|         "@io_bazel_rules_go//proto/wkt:any_go_proto", | ||||
|         "@io_bazel_rules_go//proto/wkt:descriptor_go_proto", | ||||
|         "@io_bazel_rules_go//proto/wkt:duration_go_proto", | ||||
|         "@io_bazel_rules_go//proto/wkt:field_mask_go_proto", | ||||
|         "@io_bazel_rules_go//proto/wkt:timestamp_go_proto", | ||||
|         "@io_bazel_rules_go//proto/wkt:wrappers_go_proto", | ||||
|         "@org_golang_google_grpc//codes:go_default_library", | ||||
|         "@org_golang_google_grpc//grpclog:go_default_library", | ||||
|         "@org_golang_google_grpc//metadata:go_default_library", | ||||
|         "@org_golang_google_grpc//status:go_default_library", | ||||
|     ], | ||||
| ) | ||||
|  | ||||
| go_test( | ||||
|     name = "go_default_test", | ||||
|     size = "small", | ||||
|     srcs = [ | ||||
|         "context_test.go", | ||||
|         "convert_test.go", | ||||
|         "errors_test.go", | ||||
|         "fieldmask_test.go", | ||||
|         "handler_test.go", | ||||
|         "marshal_httpbodyproto_test.go", | ||||
|         "marshal_json_test.go", | ||||
|         "marshal_jsonpb_test.go", | ||||
|         "marshal_proto_test.go", | ||||
|         "marshaler_registry_test.go", | ||||
|         "mux_test.go", | ||||
|         "pattern_test.go", | ||||
|         "query_test.go", | ||||
|     ], | ||||
|     embed = [":go_default_library"], | ||||
|     deps = [ | ||||
|         "//internal:go_default_library", | ||||
|         "//runtime/internal/examplepb:go_default_library", | ||||
|         "//utilities:go_default_library", | ||||
|         "@com_github_golang_protobuf//jsonpb:go_default_library_gen", | ||||
|         "@com_github_golang_protobuf//proto:go_default_library", | ||||
|         "@com_github_golang_protobuf//ptypes:go_default_library_gen", | ||||
|         "@go_googleapis//google/api:httpbody_go_proto", | ||||
|         "@go_googleapis//google/rpc:errdetails_go_proto", | ||||
|         "@io_bazel_rules_go//proto/wkt:duration_go_proto", | ||||
|         "@io_bazel_rules_go//proto/wkt:empty_go_proto", | ||||
|         "@io_bazel_rules_go//proto/wkt:field_mask_go_proto", | ||||
|         "@io_bazel_rules_go//proto/wkt:struct_go_proto", | ||||
|         "@io_bazel_rules_go//proto/wkt:timestamp_go_proto", | ||||
|         "@io_bazel_rules_go//proto/wkt:wrappers_go_proto", | ||||
|         "@org_golang_google_grpc//codes:go_default_library", | ||||
|         "@org_golang_google_grpc//metadata:go_default_library", | ||||
|         "@org_golang_google_grpc//status:go_default_library", | ||||
|     ], | ||||
| ) | ||||
							
								
								
									
										186
									
								
								vendor/github.com/grpc-ecosystem/grpc-gateway/runtime/errors.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										186
									
								
								vendor/github.com/grpc-ecosystem/grpc-gateway/runtime/errors.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -1,186 +0,0 @@ | ||||
| package runtime | ||||
|  | ||||
| import ( | ||||
| 	"context" | ||||
| 	"io" | ||||
| 	"net/http" | ||||
| 	"strings" | ||||
|  | ||||
| 	"github.com/grpc-ecosystem/grpc-gateway/internal" | ||||
| 	"google.golang.org/grpc/codes" | ||||
| 	"google.golang.org/grpc/grpclog" | ||||
| 	"google.golang.org/grpc/status" | ||||
| ) | ||||
|  | ||||
| // HTTPStatusFromCode converts a gRPC error code into the corresponding HTTP response status. | ||||
| // See: https://github.com/googleapis/googleapis/blob/master/google/rpc/code.proto | ||||
| func HTTPStatusFromCode(code codes.Code) int { | ||||
| 	switch code { | ||||
| 	case codes.OK: | ||||
| 		return http.StatusOK | ||||
| 	case codes.Canceled: | ||||
| 		return http.StatusRequestTimeout | ||||
| 	case codes.Unknown: | ||||
| 		return http.StatusInternalServerError | ||||
| 	case codes.InvalidArgument: | ||||
| 		return http.StatusBadRequest | ||||
| 	case codes.DeadlineExceeded: | ||||
| 		return http.StatusGatewayTimeout | ||||
| 	case codes.NotFound: | ||||
| 		return http.StatusNotFound | ||||
| 	case codes.AlreadyExists: | ||||
| 		return http.StatusConflict | ||||
| 	case codes.PermissionDenied: | ||||
| 		return http.StatusForbidden | ||||
| 	case codes.Unauthenticated: | ||||
| 		return http.StatusUnauthorized | ||||
| 	case codes.ResourceExhausted: | ||||
| 		return http.StatusTooManyRequests | ||||
| 	case codes.FailedPrecondition: | ||||
| 		// Note, this deliberately doesn't translate to the similarly named '412 Precondition Failed' HTTP response status. | ||||
| 		return http.StatusBadRequest | ||||
| 	case codes.Aborted: | ||||
| 		return http.StatusConflict | ||||
| 	case codes.OutOfRange: | ||||
| 		return http.StatusBadRequest | ||||
| 	case codes.Unimplemented: | ||||
| 		return http.StatusNotImplemented | ||||
| 	case codes.Internal: | ||||
| 		return http.StatusInternalServerError | ||||
| 	case codes.Unavailable: | ||||
| 		return http.StatusServiceUnavailable | ||||
| 	case codes.DataLoss: | ||||
| 		return http.StatusInternalServerError | ||||
| 	} | ||||
|  | ||||
| 	grpclog.Infof("Unknown gRPC error code: %v", code) | ||||
| 	return http.StatusInternalServerError | ||||
| } | ||||
|  | ||||
| var ( | ||||
| 	// HTTPError replies to the request with an error. | ||||
| 	// | ||||
| 	// HTTPError is called: | ||||
| 	//  - From generated per-endpoint gateway handler code, when calling the backend results in an error. | ||||
| 	//  - From gateway runtime code, when forwarding the response message results in an error. | ||||
| 	// | ||||
| 	// The default value for HTTPError calls the custom error handler configured on the ServeMux via the | ||||
| 	// WithProtoErrorHandler serve option if that option was used, calling GlobalHTTPErrorHandler otherwise. | ||||
| 	// | ||||
| 	// To customize the error handling of a particular ServeMux instance, use the WithProtoErrorHandler | ||||
| 	// serve option. | ||||
| 	// | ||||
| 	// To customize the error format for all ServeMux instances not using the WithProtoErrorHandler serve | ||||
| 	// option, set GlobalHTTPErrorHandler to a custom function. | ||||
| 	// | ||||
| 	// Setting this variable directly to customize error format is deprecated. | ||||
| 	HTTPError = MuxOrGlobalHTTPError | ||||
|  | ||||
| 	// GlobalHTTPErrorHandler is the HTTPError handler for all ServeMux instances not using the | ||||
| 	// WithProtoErrorHandler serve option. | ||||
| 	// | ||||
| 	// You can set a custom function to this variable to customize error format. | ||||
| 	GlobalHTTPErrorHandler = DefaultHTTPError | ||||
|  | ||||
| 	// OtherErrorHandler handles gateway errors from parsing and routing client requests for all | ||||
| 	// ServeMux instances not using the WithProtoErrorHandler serve option. | ||||
| 	// | ||||
| 	// It returns the following error codes: StatusMethodNotAllowed StatusNotFound StatusBadRequest | ||||
| 	// | ||||
| 	// To customize parsing and routing error handling of a particular ServeMux instance, use the | ||||
| 	// WithProtoErrorHandler serve option. | ||||
| 	// | ||||
| 	// To customize parsing and routing error handling of all ServeMux instances not using the | ||||
| 	// WithProtoErrorHandler serve option, set a custom function to this variable. | ||||
| 	OtherErrorHandler = DefaultOtherErrorHandler | ||||
| ) | ||||
|  | ||||
| // MuxOrGlobalHTTPError uses the mux-configured error handler, falling back to GlobalErrorHandler. | ||||
| func MuxOrGlobalHTTPError(ctx context.Context, mux *ServeMux, marshaler Marshaler, w http.ResponseWriter, r *http.Request, err error) { | ||||
| 	if mux.protoErrorHandler != nil { | ||||
| 		mux.protoErrorHandler(ctx, mux, marshaler, w, r, err) | ||||
| 	} else { | ||||
| 		GlobalHTTPErrorHandler(ctx, mux, marshaler, w, r, err) | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // DefaultHTTPError is the default implementation of HTTPError. | ||||
| // If "err" is an error from gRPC system, the function replies with the status code mapped by HTTPStatusFromCode. | ||||
| // If otherwise, it replies with http.StatusInternalServerError. | ||||
| // | ||||
| // The response body returned by this function is a JSON object, | ||||
| // which contains a member whose key is "error" and whose value is err.Error(). | ||||
| func DefaultHTTPError(ctx context.Context, mux *ServeMux, marshaler Marshaler, w http.ResponseWriter, r *http.Request, err error) { | ||||
| 	const fallback = `{"error": "failed to marshal error message"}` | ||||
|  | ||||
| 	s, ok := status.FromError(err) | ||||
| 	if !ok { | ||||
| 		s = status.New(codes.Unknown, err.Error()) | ||||
| 	} | ||||
|  | ||||
| 	w.Header().Del("Trailer") | ||||
| 	w.Header().Del("Transfer-Encoding") | ||||
|  | ||||
| 	contentType := marshaler.ContentType() | ||||
| 	// Check marshaler on run time in order to keep backwards compatibility | ||||
| 	// An interface param needs to be added to the ContentType() function on | ||||
| 	// the Marshal interface to be able to remove this check | ||||
| 	if typeMarshaler, ok := marshaler.(contentTypeMarshaler); ok { | ||||
| 		pb := s.Proto() | ||||
| 		contentType = typeMarshaler.ContentTypeFromMessage(pb) | ||||
| 	} | ||||
| 	w.Header().Set("Content-Type", contentType) | ||||
|  | ||||
| 	body := &internal.Error{ | ||||
| 		Error:   s.Message(), | ||||
| 		Message: s.Message(), | ||||
| 		Code:    int32(s.Code()), | ||||
| 		Details: s.Proto().GetDetails(), | ||||
| 	} | ||||
|  | ||||
| 	buf, merr := marshaler.Marshal(body) | ||||
| 	if merr != nil { | ||||
| 		grpclog.Infof("Failed to marshal error message %q: %v", body, merr) | ||||
| 		w.WriteHeader(http.StatusInternalServerError) | ||||
| 		if _, err := io.WriteString(w, fallback); err != nil { | ||||
| 			grpclog.Infof("Failed to write response: %v", err) | ||||
| 		} | ||||
| 		return | ||||
| 	} | ||||
|  | ||||
| 	md, ok := ServerMetadataFromContext(ctx) | ||||
| 	if !ok { | ||||
| 		grpclog.Infof("Failed to extract ServerMetadata from context") | ||||
| 	} | ||||
|  | ||||
| 	handleForwardResponseServerMetadata(w, mux, md) | ||||
|  | ||||
| 	// RFC 7230 https://tools.ietf.org/html/rfc7230#section-4.1.2 | ||||
| 	// Unless the request includes a TE header field indicating "trailers" | ||||
| 	// is acceptable, as described in Section 4.3, a server SHOULD NOT | ||||
| 	// generate trailer fields that it believes are necessary for the user | ||||
| 	// agent to receive. | ||||
| 	var wantsTrailers bool | ||||
|  | ||||
| 	if te := r.Header.Get("TE"); strings.Contains(strings.ToLower(te), "trailers") { | ||||
| 		wantsTrailers = true | ||||
| 		handleForwardResponseTrailerHeader(w, md) | ||||
| 		w.Header().Set("Transfer-Encoding", "chunked") | ||||
| 	} | ||||
|  | ||||
| 	st := HTTPStatusFromCode(s.Code()) | ||||
| 	w.WriteHeader(st) | ||||
| 	if _, err := w.Write(buf); err != nil { | ||||
| 		grpclog.Infof("Failed to write response: %v", err) | ||||
| 	} | ||||
|  | ||||
| 	if wantsTrailers { | ||||
| 		handleForwardResponseTrailer(w, md) | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // DefaultOtherErrorHandler is the default implementation of OtherErrorHandler. | ||||
| // It simply writes a string representation of the given error into "w". | ||||
| func DefaultOtherErrorHandler(w http.ResponseWriter, _ *http.Request, msg string, code int) { | ||||
| 	http.Error(w, msg, code) | ||||
| } | ||||
							
								
								
									
										89
									
								
								vendor/github.com/grpc-ecosystem/grpc-gateway/runtime/fieldmask.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										89
									
								
								vendor/github.com/grpc-ecosystem/grpc-gateway/runtime/fieldmask.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -1,89 +0,0 @@ | ||||
| package runtime | ||||
|  | ||||
| import ( | ||||
| 	"encoding/json" | ||||
| 	"io" | ||||
| 	"strings" | ||||
|  | ||||
| 	descriptor2 "github.com/golang/protobuf/descriptor" | ||||
| 	"github.com/golang/protobuf/protoc-gen-go/descriptor" | ||||
| 	"google.golang.org/genproto/protobuf/field_mask" | ||||
| ) | ||||
|  | ||||
| func translateName(name string, md *descriptor.DescriptorProto) (string, *descriptor.DescriptorProto) { | ||||
| 	// TODO - should really gate this with a test that the marshaller has used json names | ||||
| 	if md != nil { | ||||
| 		for _, f := range md.Field { | ||||
| 			if f.JsonName != nil && f.Name != nil && *f.JsonName == name { | ||||
| 				var subType *descriptor.DescriptorProto | ||||
|  | ||||
| 				// If the field has a TypeName then we retrieve the nested type for translating the embedded message names. | ||||
| 				if f.TypeName != nil { | ||||
| 					typeSplit := strings.Split(*f.TypeName, ".") | ||||
| 					typeName := typeSplit[len(typeSplit)-1] | ||||
| 					for _, t := range md.NestedType { | ||||
| 						if typeName == *t.Name { | ||||
| 							subType = t | ||||
| 						} | ||||
| 					} | ||||
| 				} | ||||
| 				return *f.Name, subType | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| 	return name, nil | ||||
| } | ||||
|  | ||||
| // FieldMaskFromRequestBody creates a FieldMask printing all complete paths from the JSON body. | ||||
| func FieldMaskFromRequestBody(r io.Reader, md *descriptor.DescriptorProto) (*field_mask.FieldMask, error) { | ||||
| 	fm := &field_mask.FieldMask{} | ||||
| 	var root interface{} | ||||
| 	if err := json.NewDecoder(r).Decode(&root); err != nil { | ||||
| 		if err == io.EOF { | ||||
| 			return fm, nil | ||||
| 		} | ||||
| 		return nil, err | ||||
| 	} | ||||
|  | ||||
| 	queue := []fieldMaskPathItem{{node: root, md: md}} | ||||
| 	for len(queue) > 0 { | ||||
| 		// dequeue an item | ||||
| 		item := queue[0] | ||||
| 		queue = queue[1:] | ||||
|  | ||||
| 		if m, ok := item.node.(map[string]interface{}); ok { | ||||
| 			// if the item is an object, then enqueue all of its children | ||||
| 			for k, v := range m { | ||||
| 				protoName, subMd := translateName(k, item.md) | ||||
| 				if subMsg, ok := v.(descriptor2.Message); ok { | ||||
| 					_, subMd = descriptor2.ForMessage(subMsg) | ||||
| 				} | ||||
|  | ||||
| 				var path string | ||||
| 				if item.path == "" { | ||||
| 					path = protoName | ||||
| 				} else { | ||||
| 					path = item.path + "." + protoName | ||||
| 				} | ||||
| 				queue = append(queue, fieldMaskPathItem{path: path, node: v, md: subMd}) | ||||
| 			} | ||||
| 		} else if len(item.path) > 0 { | ||||
| 			// otherwise, it's a leaf node so print its path | ||||
| 			fm.Paths = append(fm.Paths, item.path) | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	return fm, nil | ||||
| } | ||||
|  | ||||
| // fieldMaskPathItem stores a in-progress deconstruction of a path for a fieldmask | ||||
| type fieldMaskPathItem struct { | ||||
| 	// the list of prior fields leading up to node connected by dots | ||||
| 	path string | ||||
|  | ||||
| 	// a generic decoded json object the current item to inspect for further path extraction | ||||
| 	node interface{} | ||||
|  | ||||
| 	// descriptor for parent message | ||||
| 	md *descriptor.DescriptorProto | ||||
| } | ||||
							
								
								
									
										106
									
								
								vendor/github.com/grpc-ecosystem/grpc-gateway/runtime/proto_errors.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										106
									
								
								vendor/github.com/grpc-ecosystem/grpc-gateway/runtime/proto_errors.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -1,106 +0,0 @@ | ||||
| package runtime | ||||
|  | ||||
| import ( | ||||
| 	"context" | ||||
| 	"io" | ||||
| 	"net/http" | ||||
|  | ||||
| 	"github.com/golang/protobuf/ptypes/any" | ||||
| 	"github.com/grpc-ecosystem/grpc-gateway/internal" | ||||
| 	"google.golang.org/grpc/codes" | ||||
| 	"google.golang.org/grpc/grpclog" | ||||
| 	"google.golang.org/grpc/status" | ||||
| ) | ||||
|  | ||||
| // StreamErrorHandlerFunc accepts an error as a gRPC error generated via status package and translates it into a | ||||
| // a proto struct used to represent error at the end of a stream. | ||||
| type StreamErrorHandlerFunc func(context.Context, error) *StreamError | ||||
|  | ||||
| // StreamError is the payload for the final message in a server stream in the event that the server returns an | ||||
| // error after a response message has already been sent. | ||||
| type StreamError internal.StreamError | ||||
|  | ||||
| // ProtoErrorHandlerFunc handles the error as a gRPC error generated via status package and replies to the request. | ||||
| type ProtoErrorHandlerFunc func(context.Context, *ServeMux, Marshaler, http.ResponseWriter, *http.Request, error) | ||||
|  | ||||
| var _ ProtoErrorHandlerFunc = DefaultHTTPProtoErrorHandler | ||||
|  | ||||
| // DefaultHTTPProtoErrorHandler is an implementation of HTTPError. | ||||
| // If "err" is an error from gRPC system, the function replies with the status code mapped by HTTPStatusFromCode. | ||||
| // If otherwise, it replies with http.StatusInternalServerError. | ||||
| // | ||||
| // The response body returned by this function is a Status message marshaled by a Marshaler. | ||||
| // | ||||
| // Do not set this function to HTTPError variable directly, use WithProtoErrorHandler option instead. | ||||
| func DefaultHTTPProtoErrorHandler(ctx context.Context, mux *ServeMux, marshaler Marshaler, w http.ResponseWriter, _ *http.Request, err error) { | ||||
| 	// return Internal when Marshal failed | ||||
| 	const fallback = `{"code": 13, "message": "failed to marshal error message"}` | ||||
|  | ||||
| 	s, ok := status.FromError(err) | ||||
| 	if !ok { | ||||
| 		s = status.New(codes.Unknown, err.Error()) | ||||
| 	} | ||||
|  | ||||
| 	w.Header().Del("Trailer") | ||||
|  | ||||
| 	contentType := marshaler.ContentType() | ||||
| 	// Check marshaler on run time in order to keep backwards compatibility | ||||
| 	// An interface param needs to be added to the ContentType() function on | ||||
| 	// the Marshal interface to be able to remove this check | ||||
| 	if typeMarshaler, ok := marshaler.(contentTypeMarshaler); ok { | ||||
| 		pb := s.Proto() | ||||
| 		contentType = typeMarshaler.ContentTypeFromMessage(pb) | ||||
| 	} | ||||
| 	w.Header().Set("Content-Type", contentType) | ||||
|  | ||||
| 	buf, merr := marshaler.Marshal(s.Proto()) | ||||
| 	if merr != nil { | ||||
| 		grpclog.Infof("Failed to marshal error message %q: %v", s.Proto(), merr) | ||||
| 		w.WriteHeader(http.StatusInternalServerError) | ||||
| 		if _, err := io.WriteString(w, fallback); err != nil { | ||||
| 			grpclog.Infof("Failed to write response: %v", err) | ||||
| 		} | ||||
| 		return | ||||
| 	} | ||||
|  | ||||
| 	md, ok := ServerMetadataFromContext(ctx) | ||||
| 	if !ok { | ||||
| 		grpclog.Infof("Failed to extract ServerMetadata from context") | ||||
| 	} | ||||
|  | ||||
| 	handleForwardResponseServerMetadata(w, mux, md) | ||||
| 	handleForwardResponseTrailerHeader(w, md) | ||||
| 	st := HTTPStatusFromCode(s.Code()) | ||||
| 	w.WriteHeader(st) | ||||
| 	if _, err := w.Write(buf); err != nil { | ||||
| 		grpclog.Infof("Failed to write response: %v", err) | ||||
| 	} | ||||
|  | ||||
| 	handleForwardResponseTrailer(w, md) | ||||
| } | ||||
|  | ||||
| // DefaultHTTPStreamErrorHandler converts the given err into a *StreamError via | ||||
| // default logic. | ||||
| // | ||||
| // It extracts the gRPC status from err if possible. The fields of the status are | ||||
| // used to populate the returned StreamError, and the HTTP status code is derived | ||||
| // from the gRPC code via HTTPStatusFromCode. If the given err does not contain a | ||||
| // gRPC status, an "Unknown" gRPC code is used and "Internal Server Error" HTTP code. | ||||
| func DefaultHTTPStreamErrorHandler(_ context.Context, err error) *StreamError { | ||||
| 	grpcCode := codes.Unknown | ||||
| 	grpcMessage := err.Error() | ||||
| 	var grpcDetails []*any.Any | ||||
| 	if s, ok := status.FromError(err); ok { | ||||
| 		grpcCode = s.Code() | ||||
| 		grpcMessage = s.Message() | ||||
| 		grpcDetails = s.Proto().GetDetails() | ||||
| 	} | ||||
| 	httpCode := HTTPStatusFromCode(grpcCode) | ||||
| 	return &StreamError{ | ||||
| 		GrpcCode:   int32(grpcCode), | ||||
| 		HttpCode:   int32(httpCode), | ||||
| 		Message:    grpcMessage, | ||||
| 		HttpStatus: http.StatusText(httpCode), | ||||
| 		Details:    grpcDetails, | ||||
| 	} | ||||
| } | ||||
							
								
								
									
										406
									
								
								vendor/github.com/grpc-ecosystem/grpc-gateway/runtime/query.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										406
									
								
								vendor/github.com/grpc-ecosystem/grpc-gateway/runtime/query.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -1,406 +0,0 @@ | ||||
| package runtime | ||||
|  | ||||
| import ( | ||||
| 	"encoding/base64" | ||||
| 	"fmt" | ||||
| 	"net/url" | ||||
| 	"reflect" | ||||
| 	"regexp" | ||||
| 	"strconv" | ||||
| 	"strings" | ||||
| 	"time" | ||||
|  | ||||
| 	"github.com/golang/protobuf/proto" | ||||
| 	"github.com/grpc-ecosystem/grpc-gateway/utilities" | ||||
| 	"google.golang.org/grpc/grpclog" | ||||
| ) | ||||
|  | ||||
| var valuesKeyRegexp = regexp.MustCompile("^(.*)\\[(.*)\\]$") | ||||
|  | ||||
| var currentQueryParser QueryParameterParser = &defaultQueryParser{} | ||||
|  | ||||
| // QueryParameterParser defines interface for all query parameter parsers | ||||
| type QueryParameterParser interface { | ||||
| 	Parse(msg proto.Message, values url.Values, filter *utilities.DoubleArray) error | ||||
| } | ||||
|  | ||||
| // PopulateQueryParameters parses query parameters | ||||
| // into "msg" using current query parser | ||||
| func PopulateQueryParameters(msg proto.Message, values url.Values, filter *utilities.DoubleArray) error { | ||||
| 	return currentQueryParser.Parse(msg, values, filter) | ||||
| } | ||||
|  | ||||
| type defaultQueryParser struct{} | ||||
|  | ||||
| // Parse populates "values" into "msg". | ||||
| // A value is ignored if its key starts with one of the elements in "filter". | ||||
| func (*defaultQueryParser) Parse(msg proto.Message, values url.Values, filter *utilities.DoubleArray) error { | ||||
| 	for key, values := range values { | ||||
| 		match := valuesKeyRegexp.FindStringSubmatch(key) | ||||
| 		if len(match) == 3 { | ||||
| 			key = match[1] | ||||
| 			values = append([]string{match[2]}, values...) | ||||
| 		} | ||||
| 		fieldPath := strings.Split(key, ".") | ||||
| 		if filter.HasCommonPrefix(fieldPath) { | ||||
| 			continue | ||||
| 		} | ||||
| 		if err := populateFieldValueFromPath(msg, fieldPath, values); err != nil { | ||||
| 			return err | ||||
| 		} | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| // PopulateFieldFromPath sets a value in a nested Protobuf structure. | ||||
| // It instantiates missing protobuf fields as it goes. | ||||
| func PopulateFieldFromPath(msg proto.Message, fieldPathString string, value string) error { | ||||
| 	fieldPath := strings.Split(fieldPathString, ".") | ||||
| 	return populateFieldValueFromPath(msg, fieldPath, []string{value}) | ||||
| } | ||||
|  | ||||
| func populateFieldValueFromPath(msg proto.Message, fieldPath []string, values []string) error { | ||||
| 	m := reflect.ValueOf(msg) | ||||
| 	if m.Kind() != reflect.Ptr { | ||||
| 		return fmt.Errorf("unexpected type %T: %v", msg, msg) | ||||
| 	} | ||||
| 	var props *proto.Properties | ||||
| 	m = m.Elem() | ||||
| 	for i, fieldName := range fieldPath { | ||||
| 		isLast := i == len(fieldPath)-1 | ||||
| 		if !isLast && m.Kind() != reflect.Struct { | ||||
| 			return fmt.Errorf("non-aggregate type in the mid of path: %s", strings.Join(fieldPath, ".")) | ||||
| 		} | ||||
| 		var f reflect.Value | ||||
| 		var err error | ||||
| 		f, props, err = fieldByProtoName(m, fieldName) | ||||
| 		if err != nil { | ||||
| 			return err | ||||
| 		} else if !f.IsValid() { | ||||
| 			grpclog.Infof("field not found in %T: %s", msg, strings.Join(fieldPath, ".")) | ||||
| 			return nil | ||||
| 		} | ||||
|  | ||||
| 		switch f.Kind() { | ||||
| 		case reflect.Bool, reflect.Float32, reflect.Float64, reflect.Int32, reflect.Int64, reflect.String, reflect.Uint32, reflect.Uint64: | ||||
| 			if !isLast { | ||||
| 				return fmt.Errorf("unexpected nested field %s in %s", fieldPath[i+1], strings.Join(fieldPath[:i+1], ".")) | ||||
| 			} | ||||
| 			m = f | ||||
| 		case reflect.Slice: | ||||
| 			if !isLast { | ||||
| 				return fmt.Errorf("unexpected repeated field in %s", strings.Join(fieldPath, ".")) | ||||
| 			} | ||||
| 			// Handle []byte | ||||
| 			if f.Type().Elem().Kind() == reflect.Uint8 { | ||||
| 				m = f | ||||
| 				break | ||||
| 			} | ||||
| 			return populateRepeatedField(f, values, props) | ||||
| 		case reflect.Ptr: | ||||
| 			if f.IsNil() { | ||||
| 				m = reflect.New(f.Type().Elem()) | ||||
| 				f.Set(m.Convert(f.Type())) | ||||
| 			} | ||||
| 			m = f.Elem() | ||||
| 			continue | ||||
| 		case reflect.Struct: | ||||
| 			m = f | ||||
| 			continue | ||||
| 		case reflect.Map: | ||||
| 			if !isLast { | ||||
| 				return fmt.Errorf("unexpected nested field %s in %s", fieldPath[i+1], strings.Join(fieldPath[:i+1], ".")) | ||||
| 			} | ||||
| 			return populateMapField(f, values, props) | ||||
| 		default: | ||||
| 			return fmt.Errorf("unexpected type %s in %T", f.Type(), msg) | ||||
| 		} | ||||
| 	} | ||||
| 	switch len(values) { | ||||
| 	case 0: | ||||
| 		return fmt.Errorf("no value of field: %s", strings.Join(fieldPath, ".")) | ||||
| 	case 1: | ||||
| 	default: | ||||
| 		grpclog.Infof("too many field values: %s", strings.Join(fieldPath, ".")) | ||||
| 	} | ||||
| 	return populateField(m, values[0], props) | ||||
| } | ||||
|  | ||||
| // fieldByProtoName looks up a field whose corresponding protobuf field name is "name". | ||||
| // "m" must be a struct value. It returns zero reflect.Value if no such field found. | ||||
| func fieldByProtoName(m reflect.Value, name string) (reflect.Value, *proto.Properties, error) { | ||||
| 	props := proto.GetProperties(m.Type()) | ||||
|  | ||||
| 	// look up field name in oneof map | ||||
| 	for _, op := range props.OneofTypes { | ||||
| 		if name == op.Prop.OrigName || name == op.Prop.JSONName { | ||||
| 			v := reflect.New(op.Type.Elem()) | ||||
| 			field := m.Field(op.Field) | ||||
| 			if !field.IsNil() { | ||||
| 				return reflect.Value{}, nil, fmt.Errorf("field already set for %s oneof", props.Prop[op.Field].OrigName) | ||||
| 			} | ||||
| 			field.Set(v) | ||||
| 			return v.Elem().Field(0), op.Prop, nil | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	for _, p := range props.Prop { | ||||
| 		if p.OrigName == name { | ||||
| 			return m.FieldByName(p.Name), p, nil | ||||
| 		} | ||||
| 		if p.JSONName == name { | ||||
| 			return m.FieldByName(p.Name), p, nil | ||||
| 		} | ||||
| 	} | ||||
| 	return reflect.Value{}, nil, nil | ||||
| } | ||||
|  | ||||
| func populateMapField(f reflect.Value, values []string, props *proto.Properties) error { | ||||
| 	if len(values) != 2 { | ||||
| 		return fmt.Errorf("more than one value provided for key %s in map %s", values[0], props.Name) | ||||
| 	} | ||||
|  | ||||
| 	key, value := values[0], values[1] | ||||
| 	keyType := f.Type().Key() | ||||
| 	valueType := f.Type().Elem() | ||||
| 	if f.IsNil() { | ||||
| 		f.Set(reflect.MakeMap(f.Type())) | ||||
| 	} | ||||
|  | ||||
| 	keyConv, ok := convFromType[keyType.Kind()] | ||||
| 	if !ok { | ||||
| 		return fmt.Errorf("unsupported key type %s in map %s", keyType, props.Name) | ||||
| 	} | ||||
| 	valueConv, ok := convFromType[valueType.Kind()] | ||||
| 	if !ok { | ||||
| 		return fmt.Errorf("unsupported value type %s in map %s", valueType, props.Name) | ||||
| 	} | ||||
|  | ||||
| 	keyV := keyConv.Call([]reflect.Value{reflect.ValueOf(key)}) | ||||
| 	if err := keyV[1].Interface(); err != nil { | ||||
| 		return err.(error) | ||||
| 	} | ||||
| 	valueV := valueConv.Call([]reflect.Value{reflect.ValueOf(value)}) | ||||
| 	if err := valueV[1].Interface(); err != nil { | ||||
| 		return err.(error) | ||||
| 	} | ||||
|  | ||||
| 	f.SetMapIndex(keyV[0].Convert(keyType), valueV[0].Convert(valueType)) | ||||
|  | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| func populateRepeatedField(f reflect.Value, values []string, props *proto.Properties) error { | ||||
| 	elemType := f.Type().Elem() | ||||
|  | ||||
| 	// is the destination field a slice of an enumeration type? | ||||
| 	if enumValMap := proto.EnumValueMap(props.Enum); enumValMap != nil { | ||||
| 		return populateFieldEnumRepeated(f, values, enumValMap) | ||||
| 	} | ||||
|  | ||||
| 	conv, ok := convFromType[elemType.Kind()] | ||||
| 	if !ok { | ||||
| 		return fmt.Errorf("unsupported field type %s", elemType) | ||||
| 	} | ||||
| 	f.Set(reflect.MakeSlice(f.Type(), len(values), len(values)).Convert(f.Type())) | ||||
| 	for i, v := range values { | ||||
| 		result := conv.Call([]reflect.Value{reflect.ValueOf(v)}) | ||||
| 		if err := result[1].Interface(); err != nil { | ||||
| 			return err.(error) | ||||
| 		} | ||||
| 		f.Index(i).Set(result[0].Convert(f.Index(i).Type())) | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| func populateField(f reflect.Value, value string, props *proto.Properties) error { | ||||
| 	i := f.Addr().Interface() | ||||
|  | ||||
| 	// Handle protobuf well known types | ||||
| 	var name string | ||||
| 	switch m := i.(type) { | ||||
| 	case interface{ XXX_WellKnownType() string }: | ||||
| 		name = m.XXX_WellKnownType() | ||||
| 	case proto.Message: | ||||
| 		const wktPrefix = "google.protobuf." | ||||
| 		if fullName := proto.MessageName(m); strings.HasPrefix(fullName, wktPrefix) { | ||||
| 			name = fullName[len(wktPrefix):] | ||||
| 		} | ||||
| 	} | ||||
| 	switch name { | ||||
| 	case "Timestamp": | ||||
| 		if value == "null" { | ||||
| 			f.FieldByName("Seconds").SetInt(0) | ||||
| 			f.FieldByName("Nanos").SetInt(0) | ||||
| 			return nil | ||||
| 		} | ||||
|  | ||||
| 		t, err := time.Parse(time.RFC3339Nano, value) | ||||
| 		if err != nil { | ||||
| 			return fmt.Errorf("bad Timestamp: %v", err) | ||||
| 		} | ||||
| 		f.FieldByName("Seconds").SetInt(int64(t.Unix())) | ||||
| 		f.FieldByName("Nanos").SetInt(int64(t.Nanosecond())) | ||||
| 		return nil | ||||
| 	case "Duration": | ||||
| 		if value == "null" { | ||||
| 			f.FieldByName("Seconds").SetInt(0) | ||||
| 			f.FieldByName("Nanos").SetInt(0) | ||||
| 			return nil | ||||
| 		} | ||||
| 		d, err := time.ParseDuration(value) | ||||
| 		if err != nil { | ||||
| 			return fmt.Errorf("bad Duration: %v", err) | ||||
| 		} | ||||
|  | ||||
| 		ns := d.Nanoseconds() | ||||
| 		s := ns / 1e9 | ||||
| 		ns %= 1e9 | ||||
| 		f.FieldByName("Seconds").SetInt(s) | ||||
| 		f.FieldByName("Nanos").SetInt(ns) | ||||
| 		return nil | ||||
| 	case "DoubleValue": | ||||
| 		fallthrough | ||||
| 	case "FloatValue": | ||||
| 		float64Val, err := strconv.ParseFloat(value, 64) | ||||
| 		if err != nil { | ||||
| 			return fmt.Errorf("bad DoubleValue: %s", value) | ||||
| 		} | ||||
| 		f.FieldByName("Value").SetFloat(float64Val) | ||||
| 		return nil | ||||
| 	case "Int64Value": | ||||
| 		fallthrough | ||||
| 	case "Int32Value": | ||||
| 		int64Val, err := strconv.ParseInt(value, 10, 64) | ||||
| 		if err != nil { | ||||
| 			return fmt.Errorf("bad DoubleValue: %s", value) | ||||
| 		} | ||||
| 		f.FieldByName("Value").SetInt(int64Val) | ||||
| 		return nil | ||||
| 	case "UInt64Value": | ||||
| 		fallthrough | ||||
| 	case "UInt32Value": | ||||
| 		uint64Val, err := strconv.ParseUint(value, 10, 64) | ||||
| 		if err != nil { | ||||
| 			return fmt.Errorf("bad DoubleValue: %s", value) | ||||
| 		} | ||||
| 		f.FieldByName("Value").SetUint(uint64Val) | ||||
| 		return nil | ||||
| 	case "BoolValue": | ||||
| 		if value == "true" { | ||||
| 			f.FieldByName("Value").SetBool(true) | ||||
| 		} else if value == "false" { | ||||
| 			f.FieldByName("Value").SetBool(false) | ||||
| 		} else { | ||||
| 			return fmt.Errorf("bad BoolValue: %s", value) | ||||
| 		} | ||||
| 		return nil | ||||
| 	case "StringValue": | ||||
| 		f.FieldByName("Value").SetString(value) | ||||
| 		return nil | ||||
| 	case "BytesValue": | ||||
| 		bytesVal, err := base64.StdEncoding.DecodeString(value) | ||||
| 		if err != nil { | ||||
| 			return fmt.Errorf("bad BytesValue: %s", value) | ||||
| 		} | ||||
| 		f.FieldByName("Value").SetBytes(bytesVal) | ||||
| 		return nil | ||||
| 	case "FieldMask": | ||||
| 		p := f.FieldByName("Paths") | ||||
| 		for _, v := range strings.Split(value, ",") { | ||||
| 			if v != "" { | ||||
| 				p.Set(reflect.Append(p, reflect.ValueOf(v))) | ||||
| 			} | ||||
| 		} | ||||
| 		return nil | ||||
| 	} | ||||
|  | ||||
| 	// Handle Time and Duration stdlib types | ||||
| 	switch t := i.(type) { | ||||
| 	case *time.Time: | ||||
| 		pt, err := time.Parse(time.RFC3339Nano, value) | ||||
| 		if err != nil { | ||||
| 			return fmt.Errorf("bad Timestamp: %v", err) | ||||
| 		} | ||||
| 		*t = pt | ||||
| 		return nil | ||||
| 	case *time.Duration: | ||||
| 		d, err := time.ParseDuration(value) | ||||
| 		if err != nil { | ||||
| 			return fmt.Errorf("bad Duration: %v", err) | ||||
| 		} | ||||
| 		*t = d | ||||
| 		return nil | ||||
| 	} | ||||
|  | ||||
| 	// is the destination field an enumeration type? | ||||
| 	if enumValMap := proto.EnumValueMap(props.Enum); enumValMap != nil { | ||||
| 		return populateFieldEnum(f, value, enumValMap) | ||||
| 	} | ||||
|  | ||||
| 	conv, ok := convFromType[f.Kind()] | ||||
| 	if !ok { | ||||
| 		return fmt.Errorf("field type %T is not supported in query parameters", i) | ||||
| 	} | ||||
| 	result := conv.Call([]reflect.Value{reflect.ValueOf(value)}) | ||||
| 	if err := result[1].Interface(); err != nil { | ||||
| 		return err.(error) | ||||
| 	} | ||||
| 	f.Set(result[0].Convert(f.Type())) | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| func convertEnum(value string, t reflect.Type, enumValMap map[string]int32) (reflect.Value, error) { | ||||
| 	// see if it's an enumeration string | ||||
| 	if enumVal, ok := enumValMap[value]; ok { | ||||
| 		return reflect.ValueOf(enumVal).Convert(t), nil | ||||
| 	} | ||||
|  | ||||
| 	// check for an integer that matches an enumeration value | ||||
| 	eVal, err := strconv.Atoi(value) | ||||
| 	if err != nil { | ||||
| 		return reflect.Value{}, fmt.Errorf("%s is not a valid %s", value, t) | ||||
| 	} | ||||
| 	for _, v := range enumValMap { | ||||
| 		if v == int32(eVal) { | ||||
| 			return reflect.ValueOf(eVal).Convert(t), nil | ||||
| 		} | ||||
| 	} | ||||
| 	return reflect.Value{}, fmt.Errorf("%s is not a valid %s", value, t) | ||||
| } | ||||
|  | ||||
| func populateFieldEnum(f reflect.Value, value string, enumValMap map[string]int32) error { | ||||
| 	cval, err := convertEnum(value, f.Type(), enumValMap) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 	f.Set(cval) | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| func populateFieldEnumRepeated(f reflect.Value, values []string, enumValMap map[string]int32) error { | ||||
| 	elemType := f.Type().Elem() | ||||
| 	f.Set(reflect.MakeSlice(f.Type(), len(values), len(values)).Convert(f.Type())) | ||||
| 	for i, v := range values { | ||||
| 		result, err := convertEnum(v, elemType, enumValMap) | ||||
| 		if err != nil { | ||||
| 			return err | ||||
| 		} | ||||
| 		f.Index(i).Set(result) | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| var ( | ||||
| 	convFromType = map[reflect.Kind]reflect.Value{ | ||||
| 		reflect.String:  reflect.ValueOf(String), | ||||
| 		reflect.Bool:    reflect.ValueOf(Bool), | ||||
| 		reflect.Float64: reflect.ValueOf(Float64), | ||||
| 		reflect.Float32: reflect.ValueOf(Float32), | ||||
| 		reflect.Int64:   reflect.ValueOf(Int64), | ||||
| 		reflect.Int32:   reflect.ValueOf(Int32), | ||||
| 		reflect.Uint64:  reflect.ValueOf(Uint64), | ||||
| 		reflect.Uint32:  reflect.ValueOf(Uint32), | ||||
| 		reflect.Slice:   reflect.ValueOf(Bytes), | ||||
| 	} | ||||
| ) | ||||
							
								
								
									
										35
									
								
								vendor/github.com/grpc-ecosystem/grpc-gateway/v2/internal/httprule/BUILD.bazel
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										35
									
								
								vendor/github.com/grpc-ecosystem/grpc-gateway/v2/internal/httprule/BUILD.bazel
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,35 @@ | ||||
| load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") | ||||
|  | ||||
| package(default_visibility = ["//visibility:public"]) | ||||
|  | ||||
| go_library( | ||||
|     name = "httprule", | ||||
|     srcs = [ | ||||
|         "compile.go", | ||||
|         "parse.go", | ||||
|         "types.go", | ||||
|     ], | ||||
|     importpath = "github.com/grpc-ecosystem/grpc-gateway/v2/internal/httprule", | ||||
|     deps = ["//utilities"], | ||||
| ) | ||||
|  | ||||
| go_test( | ||||
|     name = "httprule_test", | ||||
|     size = "small", | ||||
|     srcs = [ | ||||
|         "compile_test.go", | ||||
|         "parse_test.go", | ||||
|         "types_test.go", | ||||
|     ], | ||||
|     embed = [":httprule"], | ||||
|     deps = [ | ||||
|         "//utilities", | ||||
|         "@com_github_golang_glog//:glog", | ||||
|     ], | ||||
| ) | ||||
|  | ||||
| alias( | ||||
|     name = "go_default_library", | ||||
|     actual = ":httprule", | ||||
|     visibility = ["//:__subpackages__"], | ||||
| ) | ||||
							
								
								
									
										121
									
								
								vendor/github.com/grpc-ecosystem/grpc-gateway/v2/internal/httprule/compile.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										121
									
								
								vendor/github.com/grpc-ecosystem/grpc-gateway/v2/internal/httprule/compile.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,121 @@ | ||||
| package httprule | ||||
|  | ||||
| import ( | ||||
| 	"github.com/grpc-ecosystem/grpc-gateway/v2/utilities" | ||||
| ) | ||||
|  | ||||
| const ( | ||||
| 	opcodeVersion = 1 | ||||
| ) | ||||
|  | ||||
| // Template is a compiled representation of path templates. | ||||
| type Template struct { | ||||
| 	// Version is the version number of the format. | ||||
| 	Version int | ||||
| 	// OpCodes is a sequence of operations. | ||||
| 	OpCodes []int | ||||
| 	// Pool is a constant pool | ||||
| 	Pool []string | ||||
| 	// Verb is a VERB part in the template. | ||||
| 	Verb string | ||||
| 	// Fields is a list of field paths bound in this template. | ||||
| 	Fields []string | ||||
| 	// Original template (example: /v1/a_bit_of_everything) | ||||
| 	Template string | ||||
| } | ||||
|  | ||||
| // Compiler compiles utilities representation of path templates into marshallable operations. | ||||
| // They can be unmarshalled by runtime.NewPattern. | ||||
| type Compiler interface { | ||||
| 	Compile() Template | ||||
| } | ||||
|  | ||||
| type op struct { | ||||
| 	// code is the opcode of the operation | ||||
| 	code utilities.OpCode | ||||
|  | ||||
| 	// str is a string operand of the code. | ||||
| 	// num is ignored if str is not empty. | ||||
| 	str string | ||||
|  | ||||
| 	// num is a numeric operand of the code. | ||||
| 	num int | ||||
| } | ||||
|  | ||||
| func (w wildcard) compile() []op { | ||||
| 	return []op{ | ||||
| 		{code: utilities.OpPush}, | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func (w deepWildcard) compile() []op { | ||||
| 	return []op{ | ||||
| 		{code: utilities.OpPushM}, | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func (l literal) compile() []op { | ||||
| 	return []op{ | ||||
| 		{ | ||||
| 			code: utilities.OpLitPush, | ||||
| 			str:  string(l), | ||||
| 		}, | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func (v variable) compile() []op { | ||||
| 	var ops []op | ||||
| 	for _, s := range v.segments { | ||||
| 		ops = append(ops, s.compile()...) | ||||
| 	} | ||||
| 	ops = append(ops, op{ | ||||
| 		code: utilities.OpConcatN, | ||||
| 		num:  len(v.segments), | ||||
| 	}, op{ | ||||
| 		code: utilities.OpCapture, | ||||
| 		str:  v.path, | ||||
| 	}) | ||||
|  | ||||
| 	return ops | ||||
| } | ||||
|  | ||||
| func (t template) Compile() Template { | ||||
| 	var rawOps []op | ||||
| 	for _, s := range t.segments { | ||||
| 		rawOps = append(rawOps, s.compile()...) | ||||
| 	} | ||||
|  | ||||
| 	var ( | ||||
| 		ops    []int | ||||
| 		pool   []string | ||||
| 		fields []string | ||||
| 	) | ||||
| 	consts := make(map[string]int) | ||||
| 	for _, op := range rawOps { | ||||
| 		ops = append(ops, int(op.code)) | ||||
| 		if op.str == "" { | ||||
| 			ops = append(ops, op.num) | ||||
| 		} else { | ||||
| 			// eof segment literal represents the "/" path pattern | ||||
| 			if op.str == eof { | ||||
| 				op.str = "" | ||||
| 			} | ||||
| 			if _, ok := consts[op.str]; !ok { | ||||
| 				consts[op.str] = len(pool) | ||||
| 				pool = append(pool, op.str) | ||||
| 			} | ||||
| 			ops = append(ops, consts[op.str]) | ||||
| 		} | ||||
| 		if op.code == utilities.OpCapture { | ||||
| 			fields = append(fields, op.str) | ||||
| 		} | ||||
| 	} | ||||
| 	return Template{ | ||||
| 		Version:  opcodeVersion, | ||||
| 		OpCodes:  ops, | ||||
| 		Pool:     pool, | ||||
| 		Verb:     t.verb, | ||||
| 		Fields:   fields, | ||||
| 		Template: t.template, | ||||
| 	} | ||||
| } | ||||
							
								
								
									
										11
									
								
								vendor/github.com/grpc-ecosystem/grpc-gateway/v2/internal/httprule/fuzz.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										11
									
								
								vendor/github.com/grpc-ecosystem/grpc-gateway/v2/internal/httprule/fuzz.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,11 @@ | ||||
| // +build gofuzz | ||||
|  | ||||
| package httprule | ||||
|  | ||||
| func Fuzz(data []byte) int { | ||||
| 	_, err := Parse(string(data)) | ||||
| 	if err != nil { | ||||
| 		return 0 | ||||
| 	} | ||||
| 	return 0 | ||||
| } | ||||
							
								
								
									
										368
									
								
								vendor/github.com/grpc-ecosystem/grpc-gateway/v2/internal/httprule/parse.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										368
									
								
								vendor/github.com/grpc-ecosystem/grpc-gateway/v2/internal/httprule/parse.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,368 @@ | ||||
| package httprule | ||||
|  | ||||
| import ( | ||||
| 	"fmt" | ||||
| 	"strings" | ||||
| ) | ||||
|  | ||||
| // InvalidTemplateError indicates that the path template is not valid. | ||||
| type InvalidTemplateError struct { | ||||
| 	tmpl string | ||||
| 	msg  string | ||||
| } | ||||
|  | ||||
| func (e InvalidTemplateError) Error() string { | ||||
| 	return fmt.Sprintf("%s: %s", e.msg, e.tmpl) | ||||
| } | ||||
|  | ||||
| // Parse parses the string representation of path template | ||||
| func Parse(tmpl string) (Compiler, error) { | ||||
| 	if !strings.HasPrefix(tmpl, "/") { | ||||
| 		return template{}, InvalidTemplateError{tmpl: tmpl, msg: "no leading /"} | ||||
| 	} | ||||
| 	tokens, verb := tokenize(tmpl[1:]) | ||||
|  | ||||
| 	p := parser{tokens: tokens} | ||||
| 	segs, err := p.topLevelSegments() | ||||
| 	if err != nil { | ||||
| 		return template{}, InvalidTemplateError{tmpl: tmpl, msg: err.Error()} | ||||
| 	} | ||||
|  | ||||
| 	return template{ | ||||
| 		segments: segs, | ||||
| 		verb:     verb, | ||||
| 		template: tmpl, | ||||
| 	}, nil | ||||
| } | ||||
|  | ||||
| func tokenize(path string) (tokens []string, verb string) { | ||||
| 	if path == "" { | ||||
| 		return []string{eof}, "" | ||||
| 	} | ||||
|  | ||||
| 	const ( | ||||
| 		init = iota | ||||
| 		field | ||||
| 		nested | ||||
| 	) | ||||
| 	st := init | ||||
| 	for path != "" { | ||||
| 		var idx int | ||||
| 		switch st { | ||||
| 		case init: | ||||
| 			idx = strings.IndexAny(path, "/{") | ||||
| 		case field: | ||||
| 			idx = strings.IndexAny(path, ".=}") | ||||
| 		case nested: | ||||
| 			idx = strings.IndexAny(path, "/}") | ||||
| 		} | ||||
| 		if idx < 0 { | ||||
| 			tokens = append(tokens, path) | ||||
| 			break | ||||
| 		} | ||||
| 		switch r := path[idx]; r { | ||||
| 		case '/', '.': | ||||
| 		case '{': | ||||
| 			st = field | ||||
| 		case '=': | ||||
| 			st = nested | ||||
| 		case '}': | ||||
| 			st = init | ||||
| 		} | ||||
| 		if idx == 0 { | ||||
| 			tokens = append(tokens, path[idx:idx+1]) | ||||
| 		} else { | ||||
| 			tokens = append(tokens, path[:idx], path[idx:idx+1]) | ||||
| 		} | ||||
| 		path = path[idx+1:] | ||||
| 	} | ||||
|  | ||||
| 	l := len(tokens) | ||||
| 	// See | ||||
| 	// https://github.com/grpc-ecosystem/grpc-gateway/pull/1947#issuecomment-774523693 ; | ||||
| 	// although normal and backwards-compat logic here is to use the last index | ||||
| 	// of a colon, if the final segment is a variable followed by a colon, the | ||||
| 	// part following the colon must be a verb. Hence if the previous token is | ||||
| 	// an end var marker, we switch the index we're looking for to Index instead | ||||
| 	// of LastIndex, so that we correctly grab the remaining part of the path as | ||||
| 	// the verb. | ||||
| 	var penultimateTokenIsEndVar bool | ||||
| 	switch l { | ||||
| 	case 0, 1: | ||||
| 		// Not enough to be variable so skip this logic and don't result in an | ||||
| 		// invalid index | ||||
| 	default: | ||||
| 		penultimateTokenIsEndVar = tokens[l-2] == "}" | ||||
| 	} | ||||
| 	t := tokens[l-1] | ||||
| 	var idx int | ||||
| 	if penultimateTokenIsEndVar { | ||||
| 		idx = strings.Index(t, ":") | ||||
| 	} else { | ||||
| 		idx = strings.LastIndex(t, ":") | ||||
| 	} | ||||
| 	if idx == 0 { | ||||
| 		tokens, verb = tokens[:l-1], t[1:] | ||||
| 	} else if idx > 0 { | ||||
| 		tokens[l-1], verb = t[:idx], t[idx+1:] | ||||
| 	} | ||||
| 	tokens = append(tokens, eof) | ||||
| 	return tokens, verb | ||||
| } | ||||
|  | ||||
| // parser is a parser of the template syntax defined in github.com/googleapis/googleapis/google/api/http.proto. | ||||
| type parser struct { | ||||
| 	tokens   []string | ||||
| 	accepted []string | ||||
| } | ||||
|  | ||||
| // topLevelSegments is the target of this parser. | ||||
| func (p *parser) topLevelSegments() ([]segment, error) { | ||||
| 	if _, err := p.accept(typeEOF); err == nil { | ||||
| 		p.tokens = p.tokens[:0] | ||||
| 		return []segment{literal(eof)}, nil | ||||
| 	} | ||||
| 	segs, err := p.segments() | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	if _, err := p.accept(typeEOF); err != nil { | ||||
| 		return nil, fmt.Errorf("unexpected token %q after segments %q", p.tokens[0], strings.Join(p.accepted, "")) | ||||
| 	} | ||||
| 	return segs, nil | ||||
| } | ||||
|  | ||||
| func (p *parser) segments() ([]segment, error) { | ||||
| 	s, err := p.segment() | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
|  | ||||
| 	segs := []segment{s} | ||||
| 	for { | ||||
| 		if _, err := p.accept("/"); err != nil { | ||||
| 			return segs, nil | ||||
| 		} | ||||
| 		s, err := p.segment() | ||||
| 		if err != nil { | ||||
| 			return segs, err | ||||
| 		} | ||||
| 		segs = append(segs, s) | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func (p *parser) segment() (segment, error) { | ||||
| 	if _, err := p.accept("*"); err == nil { | ||||
| 		return wildcard{}, nil | ||||
| 	} | ||||
| 	if _, err := p.accept("**"); err == nil { | ||||
| 		return deepWildcard{}, nil | ||||
| 	} | ||||
| 	if l, err := p.literal(); err == nil { | ||||
| 		return l, nil | ||||
| 	} | ||||
|  | ||||
| 	v, err := p.variable() | ||||
| 	if err != nil { | ||||
| 		return nil, fmt.Errorf("segment neither wildcards, literal or variable: %v", err) | ||||
| 	} | ||||
| 	return v, err | ||||
| } | ||||
|  | ||||
| func (p *parser) literal() (segment, error) { | ||||
| 	lit, err := p.accept(typeLiteral) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	return literal(lit), nil | ||||
| } | ||||
|  | ||||
| func (p *parser) variable() (segment, error) { | ||||
| 	if _, err := p.accept("{"); err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
|  | ||||
| 	path, err := p.fieldPath() | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
|  | ||||
| 	var segs []segment | ||||
| 	if _, err := p.accept("="); err == nil { | ||||
| 		segs, err = p.segments() | ||||
| 		if err != nil { | ||||
| 			return nil, fmt.Errorf("invalid segment in variable %q: %v", path, err) | ||||
| 		} | ||||
| 	} else { | ||||
| 		segs = []segment{wildcard{}} | ||||
| 	} | ||||
|  | ||||
| 	if _, err := p.accept("}"); err != nil { | ||||
| 		return nil, fmt.Errorf("unterminated variable segment: %s", path) | ||||
| 	} | ||||
| 	return variable{ | ||||
| 		path:     path, | ||||
| 		segments: segs, | ||||
| 	}, nil | ||||
| } | ||||
|  | ||||
| func (p *parser) fieldPath() (string, error) { | ||||
| 	c, err := p.accept(typeIdent) | ||||
| 	if err != nil { | ||||
| 		return "", err | ||||
| 	} | ||||
| 	components := []string{c} | ||||
| 	for { | ||||
| 		if _, err = p.accept("."); err != nil { | ||||
| 			return strings.Join(components, "."), nil | ||||
| 		} | ||||
| 		c, err := p.accept(typeIdent) | ||||
| 		if err != nil { | ||||
| 			return "", fmt.Errorf("invalid field path component: %v", err) | ||||
| 		} | ||||
| 		components = append(components, c) | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // A termType is a type of terminal symbols. | ||||
| type termType string | ||||
|  | ||||
| // These constants define some of valid values of termType. | ||||
| // They improve readability of parse functions. | ||||
| // | ||||
| // You can also use "/", "*", "**", "." or "=" as valid values. | ||||
| const ( | ||||
| 	typeIdent   = termType("ident") | ||||
| 	typeLiteral = termType("literal") | ||||
| 	typeEOF     = termType("$") | ||||
| ) | ||||
|  | ||||
| const ( | ||||
| 	// eof is the terminal symbol which always appears at the end of token sequence. | ||||
| 	eof = "\u0000" | ||||
| ) | ||||
|  | ||||
| // accept tries to accept a token in "p". | ||||
| // This function consumes a token and returns it if it matches to the specified "term". | ||||
| // If it doesn't match, the function does not consume any tokens and return an error. | ||||
| func (p *parser) accept(term termType) (string, error) { | ||||
| 	t := p.tokens[0] | ||||
| 	switch term { | ||||
| 	case "/", "*", "**", ".", "=", "{", "}": | ||||
| 		if t != string(term) && t != "/" { | ||||
| 			return "", fmt.Errorf("expected %q but got %q", term, t) | ||||
| 		} | ||||
| 	case typeEOF: | ||||
| 		if t != eof { | ||||
| 			return "", fmt.Errorf("expected EOF but got %q", t) | ||||
| 		} | ||||
| 	case typeIdent: | ||||
| 		if err := expectIdent(t); err != nil { | ||||
| 			return "", err | ||||
| 		} | ||||
| 	case typeLiteral: | ||||
| 		if err := expectPChars(t); err != nil { | ||||
| 			return "", err | ||||
| 		} | ||||
| 	default: | ||||
| 		return "", fmt.Errorf("unknown termType %q", term) | ||||
| 	} | ||||
| 	p.tokens = p.tokens[1:] | ||||
| 	p.accepted = append(p.accepted, t) | ||||
| 	return t, nil | ||||
| } | ||||
|  | ||||
| // expectPChars determines if "t" consists of only pchars defined in RFC3986. | ||||
| // | ||||
| // https://www.ietf.org/rfc/rfc3986.txt, P.49 | ||||
| //   pchar         = unreserved / pct-encoded / sub-delims / ":" / "@" | ||||
| //   unreserved    = ALPHA / DIGIT / "-" / "." / "_" / "~" | ||||
| //   sub-delims    = "!" / "$" / "&" / "'" / "(" / ")" | ||||
| //                 / "*" / "+" / "," / ";" / "=" | ||||
| //   pct-encoded   = "%" HEXDIG HEXDIG | ||||
| func expectPChars(t string) error { | ||||
| 	const ( | ||||
| 		init = iota | ||||
| 		pct1 | ||||
| 		pct2 | ||||
| 	) | ||||
| 	st := init | ||||
| 	for _, r := range t { | ||||
| 		if st != init { | ||||
| 			if !isHexDigit(r) { | ||||
| 				return fmt.Errorf("invalid hexdigit: %c(%U)", r, r) | ||||
| 			} | ||||
| 			switch st { | ||||
| 			case pct1: | ||||
| 				st = pct2 | ||||
| 			case pct2: | ||||
| 				st = init | ||||
| 			} | ||||
| 			continue | ||||
| 		} | ||||
|  | ||||
| 		// unreserved | ||||
| 		switch { | ||||
| 		case 'A' <= r && r <= 'Z': | ||||
| 			continue | ||||
| 		case 'a' <= r && r <= 'z': | ||||
| 			continue | ||||
| 		case '0' <= r && r <= '9': | ||||
| 			continue | ||||
| 		} | ||||
| 		switch r { | ||||
| 		case '-', '.', '_', '~': | ||||
| 			// unreserved | ||||
| 		case '!', '$', '&', '\'', '(', ')', '*', '+', ',', ';', '=': | ||||
| 			// sub-delims | ||||
| 		case ':', '@': | ||||
| 			// rest of pchar | ||||
| 		case '%': | ||||
| 			// pct-encoded | ||||
| 			st = pct1 | ||||
| 		default: | ||||
| 			return fmt.Errorf("invalid character in path segment: %q(%U)", r, r) | ||||
| 		} | ||||
| 	} | ||||
| 	if st != init { | ||||
| 		return fmt.Errorf("invalid percent-encoding in %q", t) | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| // expectIdent determines if "ident" is a valid identifier in .proto schema ([[:alpha:]_][[:alphanum:]_]*). | ||||
| func expectIdent(ident string) error { | ||||
| 	if ident == "" { | ||||
| 		return fmt.Errorf("empty identifier") | ||||
| 	} | ||||
| 	for pos, r := range ident { | ||||
| 		switch { | ||||
| 		case '0' <= r && r <= '9': | ||||
| 			if pos == 0 { | ||||
| 				return fmt.Errorf("identifier starting with digit: %s", ident) | ||||
| 			} | ||||
| 			continue | ||||
| 		case 'A' <= r && r <= 'Z': | ||||
| 			continue | ||||
| 		case 'a' <= r && r <= 'z': | ||||
| 			continue | ||||
| 		case r == '_': | ||||
| 			continue | ||||
| 		default: | ||||
| 			return fmt.Errorf("invalid character %q(%U) in identifier: %s", r, r, ident) | ||||
| 		} | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| func isHexDigit(r rune) bool { | ||||
| 	switch { | ||||
| 	case '0' <= r && r <= '9': | ||||
| 		return true | ||||
| 	case 'A' <= r && r <= 'F': | ||||
| 		return true | ||||
| 	case 'a' <= r && r <= 'f': | ||||
| 		return true | ||||
| 	} | ||||
| 	return false | ||||
| } | ||||
							
								
								
									
										60
									
								
								vendor/github.com/grpc-ecosystem/grpc-gateway/v2/internal/httprule/types.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										60
									
								
								vendor/github.com/grpc-ecosystem/grpc-gateway/v2/internal/httprule/types.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,60 @@ | ||||
| package httprule | ||||
|  | ||||
| import ( | ||||
| 	"fmt" | ||||
| 	"strings" | ||||
| ) | ||||
|  | ||||
| type template struct { | ||||
| 	segments []segment | ||||
| 	verb     string | ||||
| 	template string | ||||
| } | ||||
|  | ||||
| type segment interface { | ||||
| 	fmt.Stringer | ||||
| 	compile() (ops []op) | ||||
| } | ||||
|  | ||||
| type wildcard struct{} | ||||
|  | ||||
| type deepWildcard struct{} | ||||
|  | ||||
| type literal string | ||||
|  | ||||
| type variable struct { | ||||
| 	path     string | ||||
| 	segments []segment | ||||
| } | ||||
|  | ||||
| func (wildcard) String() string { | ||||
| 	return "*" | ||||
| } | ||||
|  | ||||
| func (deepWildcard) String() string { | ||||
| 	return "**" | ||||
| } | ||||
|  | ||||
| func (l literal) String() string { | ||||
| 	return string(l) | ||||
| } | ||||
|  | ||||
| func (v variable) String() string { | ||||
| 	var segs []string | ||||
| 	for _, s := range v.segments { | ||||
| 		segs = append(segs, s.String()) | ||||
| 	} | ||||
| 	return fmt.Sprintf("{%s=%s}", v.path, strings.Join(segs, "/")) | ||||
| } | ||||
|  | ||||
| func (t template) String() string { | ||||
| 	var segs []string | ||||
| 	for _, s := range t.segments { | ||||
| 		segs = append(segs, s.String()) | ||||
| 	} | ||||
| 	str := strings.Join(segs, "/") | ||||
| 	if t.verb != "" { | ||||
| 		str = fmt.Sprintf("%s:%s", str, t.verb) | ||||
| 	} | ||||
| 	return "/" + str | ||||
| } | ||||
							
								
								
									
										91
									
								
								vendor/github.com/grpc-ecosystem/grpc-gateway/v2/runtime/BUILD.bazel
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										91
									
								
								vendor/github.com/grpc-ecosystem/grpc-gateway/v2/runtime/BUILD.bazel
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,91 @@ | ||||
| load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") | ||||
|  | ||||
| package(default_visibility = ["//visibility:public"]) | ||||
|  | ||||
| go_library( | ||||
|     name = "runtime", | ||||
|     srcs = [ | ||||
|         "context.go", | ||||
|         "convert.go", | ||||
|         "doc.go", | ||||
|         "errors.go", | ||||
|         "fieldmask.go", | ||||
|         "handler.go", | ||||
|         "marshal_httpbodyproto.go", | ||||
|         "marshal_json.go", | ||||
|         "marshal_jsonpb.go", | ||||
|         "marshal_proto.go", | ||||
|         "marshaler.go", | ||||
|         "marshaler_registry.go", | ||||
|         "mux.go", | ||||
|         "pattern.go", | ||||
|         "proto2_convert.go", | ||||
|         "query.go", | ||||
|     ], | ||||
|     importpath = "github.com/grpc-ecosystem/grpc-gateway/v2/runtime", | ||||
|     deps = [ | ||||
|         "//internal/httprule", | ||||
|         "//utilities", | ||||
|         "@go_googleapis//google/api:httpbody_go_proto", | ||||
|         "@io_bazel_rules_go//proto/wkt:field_mask_go_proto", | ||||
|         "@org_golang_google_grpc//codes", | ||||
|         "@org_golang_google_grpc//grpclog", | ||||
|         "@org_golang_google_grpc//metadata", | ||||
|         "@org_golang_google_grpc//status", | ||||
|         "@org_golang_google_protobuf//encoding/protojson", | ||||
|         "@org_golang_google_protobuf//proto", | ||||
|         "@org_golang_google_protobuf//reflect/protoreflect", | ||||
|         "@org_golang_google_protobuf//reflect/protoregistry", | ||||
|         "@org_golang_google_protobuf//types/known/durationpb", | ||||
|         "@org_golang_google_protobuf//types/known/timestamppb", | ||||
|         "@org_golang_google_protobuf//types/known/wrapperspb", | ||||
|     ], | ||||
| ) | ||||
|  | ||||
| go_test( | ||||
|     name = "runtime_test", | ||||
|     size = "small", | ||||
|     srcs = [ | ||||
|         "context_test.go", | ||||
|         "convert_test.go", | ||||
|         "errors_test.go", | ||||
|         "fieldmask_test.go", | ||||
|         "handler_test.go", | ||||
|         "marshal_httpbodyproto_test.go", | ||||
|         "marshal_json_test.go", | ||||
|         "marshal_jsonpb_test.go", | ||||
|         "marshal_proto_test.go", | ||||
|         "marshaler_registry_test.go", | ||||
|         "mux_test.go", | ||||
|         "pattern_test.go", | ||||
|         "query_test.go", | ||||
|     ], | ||||
|     embed = [":runtime"], | ||||
|     deps = [ | ||||
|         "//runtime/internal/examplepb", | ||||
|         "//utilities", | ||||
|         "@com_github_google_go_cmp//cmp", | ||||
|         "@com_github_google_go_cmp//cmp/cmpopts", | ||||
|         "@go_googleapis//google/api:httpbody_go_proto", | ||||
|         "@go_googleapis//google/rpc:errdetails_go_proto", | ||||
|         "@go_googleapis//google/rpc:status_go_proto", | ||||
|         "@io_bazel_rules_go//proto/wkt:field_mask_go_proto", | ||||
|         "@org_golang_google_grpc//codes", | ||||
|         "@org_golang_google_grpc//metadata", | ||||
|         "@org_golang_google_grpc//status", | ||||
|         "@org_golang_google_protobuf//encoding/protojson", | ||||
|         "@org_golang_google_protobuf//proto", | ||||
|         "@org_golang_google_protobuf//testing/protocmp", | ||||
|         "@org_golang_google_protobuf//types/known/durationpb", | ||||
|         "@org_golang_google_protobuf//types/known/emptypb", | ||||
|         "@org_golang_google_protobuf//types/known/structpb", | ||||
|         "@org_golang_google_protobuf//types/known/timestamppb", | ||||
|         "@org_golang_google_protobuf//types/known/wrapperspb", | ||||
|     ], | ||||
| ) | ||||
|  | ||||
| alias( | ||||
|     name = "go_default_library", | ||||
|     actual = ":runtime", | ||||
|     visibility = ["//visibility:public"], | ||||
| ) | ||||
| @@ -41,6 +41,19 @@ var ( | ||||
| 	DefaultContextTimeout = 0 * time.Second | ||||
| ) | ||||
| 
 | ||||
| type ( | ||||
| 	rpcMethodKey       struct{} | ||||
| 	httpPathPatternKey struct{} | ||||
| 
 | ||||
| 	AnnotateContextOption func(ctx context.Context) context.Context | ||||
| ) | ||||
| 
 | ||||
| func WithHTTPPathPattern(pattern string) AnnotateContextOption { | ||||
| 	return func(ctx context.Context) context.Context { | ||||
| 		return withHTTPPathPattern(ctx, pattern) | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| func decodeBinHeader(v string) ([]byte, error) { | ||||
| 	if len(v)%4 == 0 { | ||||
| 		// Input was padded, or padding was not necessary. | ||||
| @@ -56,8 +69,8 @@ At a minimum, the RemoteAddr is included in the fashion of "X-Forwarded-For", | ||||
| except that the forwarded destination is not another HTTP service but rather | ||||
| a gRPC service. | ||||
| */ | ||||
| func AnnotateContext(ctx context.Context, mux *ServeMux, req *http.Request) (context.Context, error) { | ||||
| 	ctx, md, err := annotateContext(ctx, mux, req) | ||||
| func AnnotateContext(ctx context.Context, mux *ServeMux, req *http.Request, rpcMethodName string, options ...AnnotateContextOption) (context.Context, error) { | ||||
| 	ctx, md, err := annotateContext(ctx, mux, req, rpcMethodName, options...) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| @@ -70,8 +83,8 @@ func AnnotateContext(ctx context.Context, mux *ServeMux, req *http.Request) (con | ||||
| 
 | ||||
| // AnnotateIncomingContext adds context information such as metadata from the request. | ||||
| // Attach metadata as incoming context. | ||||
| func AnnotateIncomingContext(ctx context.Context, mux *ServeMux, req *http.Request) (context.Context, error) { | ||||
| 	ctx, md, err := annotateContext(ctx, mux, req) | ||||
| func AnnotateIncomingContext(ctx context.Context, mux *ServeMux, req *http.Request, rpcMethodName string, options ...AnnotateContextOption) (context.Context, error) { | ||||
| 	ctx, md, err := annotateContext(ctx, mux, req, rpcMethodName, options...) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| @@ -82,7 +95,11 @@ func AnnotateIncomingContext(ctx context.Context, mux *ServeMux, req *http.Reque | ||||
| 	return metadata.NewIncomingContext(ctx, md), nil | ||||
| } | ||||
| 
 | ||||
| func annotateContext(ctx context.Context, mux *ServeMux, req *http.Request) (context.Context, metadata.MD, error) { | ||||
| func annotateContext(ctx context.Context, mux *ServeMux, req *http.Request, rpcMethodName string, options ...AnnotateContextOption) (context.Context, metadata.MD, error) { | ||||
| 	ctx = withRPCMethod(ctx, rpcMethodName) | ||||
| 	for _, o := range options { | ||||
| 		ctx = o(ctx) | ||||
| 	} | ||||
| 	var pairs []string | ||||
| 	timeout := DefaultContextTimeout | ||||
| 	if tm := req.Header.Get(metadataGrpcTimeout); tm != "" { | ||||
| @@ -132,6 +149,7 @@ func annotateContext(ctx context.Context, mux *ServeMux, req *http.Request) (con | ||||
| 	} | ||||
| 
 | ||||
| 	if timeout != 0 { | ||||
| 		//nolint:govet  // The context outlives this function | ||||
| 		ctx, _ = context.WithTimeout(ctx, timeout) | ||||
| 	} | ||||
| 	if len(pairs) == 0 { | ||||
| @@ -289,3 +307,39 @@ func isPermanentHTTPHeader(hdr string) bool { | ||||
| 	} | ||||
| 	return false | ||||
| } | ||||
| 
 | ||||
| // RPCMethod returns the method string for the server context. The returned | ||||
| // string is in the format of "/package.service/method". | ||||
| func RPCMethod(ctx context.Context) (string, bool) { | ||||
| 	m := ctx.Value(rpcMethodKey{}) | ||||
| 	if m == nil { | ||||
| 		return "", false | ||||
| 	} | ||||
| 	ms, ok := m.(string) | ||||
| 	if !ok { | ||||
| 		return "", false | ||||
| 	} | ||||
| 	return ms, true | ||||
| } | ||||
| 
 | ||||
| func withRPCMethod(ctx context.Context, rpcMethodName string) context.Context { | ||||
| 	return context.WithValue(ctx, rpcMethodKey{}, rpcMethodName) | ||||
| } | ||||
| 
 | ||||
| // HTTPPathPattern returns the HTTP path pattern string relating to the HTTP handler, if one exists. | ||||
| // The format of the returned string is defined by the google.api.http path template type. | ||||
| func HTTPPathPattern(ctx context.Context) (string, bool) { | ||||
| 	m := ctx.Value(httpPathPatternKey{}) | ||||
| 	if m == nil { | ||||
| 		return "", false | ||||
| 	} | ||||
| 	ms, ok := m.(string) | ||||
| 	if !ok { | ||||
| 		return "", false | ||||
| 	} | ||||
| 	return ms, true | ||||
| } | ||||
| 
 | ||||
| func withHTTPPathPattern(ctx context.Context, httpPathPattern string) context.Context { | ||||
| 	return context.WithValue(ctx, httpPathPatternKey{}, httpPathPattern) | ||||
| } | ||||
| @@ -6,10 +6,10 @@ import ( | ||||
| 	"strconv" | ||||
| 	"strings" | ||||
| 
 | ||||
| 	"github.com/golang/protobuf/jsonpb" | ||||
| 	"github.com/golang/protobuf/ptypes/duration" | ||||
| 	"github.com/golang/protobuf/ptypes/timestamp" | ||||
| 	"github.com/golang/protobuf/ptypes/wrappers" | ||||
| 	"google.golang.org/protobuf/encoding/protojson" | ||||
| 	"google.golang.org/protobuf/types/known/durationpb" | ||||
| 	"google.golang.org/protobuf/types/known/timestamppb" | ||||
| 	"google.golang.org/protobuf/types/known/wrapperspb" | ||||
| ) | ||||
| 
 | ||||
| // String just returns the given string. | ||||
| @@ -205,9 +205,11 @@ func BytesSlice(val, sep string) ([][]byte, error) { | ||||
| } | ||||
| 
 | ||||
| // Timestamp converts the given RFC3339 formatted string into a timestamp.Timestamp. | ||||
| func Timestamp(val string) (*timestamp.Timestamp, error) { | ||||
| 	var r timestamp.Timestamp | ||||
| 	err := jsonpb.UnmarshalString(val, &r) | ||||
| func Timestamp(val string) (*timestamppb.Timestamp, error) { | ||||
| 	var r timestamppb.Timestamp | ||||
| 	val = strconv.Quote(strings.Trim(val, `"`)) | ||||
| 	unmarshaler := &protojson.UnmarshalOptions{} | ||||
| 	err := unmarshaler.Unmarshal([]byte(val), &r) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| @@ -215,9 +217,11 @@ func Timestamp(val string) (*timestamp.Timestamp, error) { | ||||
| } | ||||
| 
 | ||||
| // Duration converts the given string into a timestamp.Duration. | ||||
| func Duration(val string) (*duration.Duration, error) { | ||||
| 	var r duration.Duration | ||||
| 	err := jsonpb.UnmarshalString(val, &r) | ||||
| func Duration(val string) (*durationpb.Duration, error) { | ||||
| 	var r durationpb.Duration | ||||
| 	val = strconv.Quote(strings.Trim(val, `"`)) | ||||
| 	unmarshaler := &protojson.UnmarshalOptions{} | ||||
| 	err := unmarshaler.Unmarshal([]byte(val), &r) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| @@ -265,54 +269,54 @@ func EnumSlice(val, sep string, enumValMap map[string]int32) ([]int32, error) { | ||||
| */ | ||||
| 
 | ||||
| // StringValue well-known type support as wrapper around string type | ||||
| func StringValue(val string) (*wrappers.StringValue, error) { | ||||
| 	return &wrappers.StringValue{Value: val}, nil | ||||
| func StringValue(val string) (*wrapperspb.StringValue, error) { | ||||
| 	return &wrapperspb.StringValue{Value: val}, nil | ||||
| } | ||||
| 
 | ||||
| // FloatValue well-known type support as wrapper around float32 type | ||||
| func FloatValue(val string) (*wrappers.FloatValue, error) { | ||||
| func FloatValue(val string) (*wrapperspb.FloatValue, error) { | ||||
| 	parsedVal, err := Float32(val) | ||||
| 	return &wrappers.FloatValue{Value: parsedVal}, err | ||||
| 	return &wrapperspb.FloatValue{Value: parsedVal}, err | ||||
| } | ||||
| 
 | ||||
| // DoubleValue well-known type support as wrapper around float64 type | ||||
| func DoubleValue(val string) (*wrappers.DoubleValue, error) { | ||||
| func DoubleValue(val string) (*wrapperspb.DoubleValue, error) { | ||||
| 	parsedVal, err := Float64(val) | ||||
| 	return &wrappers.DoubleValue{Value: parsedVal}, err | ||||
| 	return &wrapperspb.DoubleValue{Value: parsedVal}, err | ||||
| } | ||||
| 
 | ||||
| // BoolValue well-known type support as wrapper around bool type | ||||
| func BoolValue(val string) (*wrappers.BoolValue, error) { | ||||
| func BoolValue(val string) (*wrapperspb.BoolValue, error) { | ||||
| 	parsedVal, err := Bool(val) | ||||
| 	return &wrappers.BoolValue{Value: parsedVal}, err | ||||
| 	return &wrapperspb.BoolValue{Value: parsedVal}, err | ||||
| } | ||||
| 
 | ||||
| // Int32Value well-known type support as wrapper around int32 type | ||||
| func Int32Value(val string) (*wrappers.Int32Value, error) { | ||||
| func Int32Value(val string) (*wrapperspb.Int32Value, error) { | ||||
| 	parsedVal, err := Int32(val) | ||||
| 	return &wrappers.Int32Value{Value: parsedVal}, err | ||||
| 	return &wrapperspb.Int32Value{Value: parsedVal}, err | ||||
| } | ||||
| 
 | ||||
| // UInt32Value well-known type support as wrapper around uint32 type | ||||
| func UInt32Value(val string) (*wrappers.UInt32Value, error) { | ||||
| func UInt32Value(val string) (*wrapperspb.UInt32Value, error) { | ||||
| 	parsedVal, err := Uint32(val) | ||||
| 	return &wrappers.UInt32Value{Value: parsedVal}, err | ||||
| 	return &wrapperspb.UInt32Value{Value: parsedVal}, err | ||||
| } | ||||
| 
 | ||||
| // Int64Value well-known type support as wrapper around int64 type | ||||
| func Int64Value(val string) (*wrappers.Int64Value, error) { | ||||
| func Int64Value(val string) (*wrapperspb.Int64Value, error) { | ||||
| 	parsedVal, err := Int64(val) | ||||
| 	return &wrappers.Int64Value{Value: parsedVal}, err | ||||
| 	return &wrapperspb.Int64Value{Value: parsedVal}, err | ||||
| } | ||||
| 
 | ||||
| // UInt64Value well-known type support as wrapper around uint64 type | ||||
| func UInt64Value(val string) (*wrappers.UInt64Value, error) { | ||||
| func UInt64Value(val string) (*wrapperspb.UInt64Value, error) { | ||||
| 	parsedVal, err := Uint64(val) | ||||
| 	return &wrappers.UInt64Value{Value: parsedVal}, err | ||||
| 	return &wrapperspb.UInt64Value{Value: parsedVal}, err | ||||
| } | ||||
| 
 | ||||
| // BytesValue well-known type support as wrapper around bytes[] type | ||||
| func BytesValue(val string) (*wrappers.BytesValue, error) { | ||||
| func BytesValue(val string) (*wrapperspb.BytesValue, error) { | ||||
| 	parsedVal, err := Bytes(val) | ||||
| 	return &wrappers.BytesValue{Value: parsedVal}, err | ||||
| 	return &wrapperspb.BytesValue{Value: parsedVal}, err | ||||
| } | ||||
							
								
								
									
										180
									
								
								vendor/github.com/grpc-ecosystem/grpc-gateway/v2/runtime/errors.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										180
									
								
								vendor/github.com/grpc-ecosystem/grpc-gateway/v2/runtime/errors.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,180 @@ | ||||
| package runtime | ||||
|  | ||||
| import ( | ||||
| 	"context" | ||||
| 	"errors" | ||||
| 	"io" | ||||
| 	"net/http" | ||||
|  | ||||
| 	"google.golang.org/grpc/codes" | ||||
| 	"google.golang.org/grpc/grpclog" | ||||
| 	"google.golang.org/grpc/status" | ||||
| ) | ||||
|  | ||||
| // ErrorHandlerFunc is the signature used to configure error handling. | ||||
| type ErrorHandlerFunc func(context.Context, *ServeMux, Marshaler, http.ResponseWriter, *http.Request, error) | ||||
|  | ||||
| // StreamErrorHandlerFunc is the signature used to configure stream error handling. | ||||
| type StreamErrorHandlerFunc func(context.Context, error) *status.Status | ||||
|  | ||||
| // RoutingErrorHandlerFunc is the signature used to configure error handling for routing errors. | ||||
| type RoutingErrorHandlerFunc func(context.Context, *ServeMux, Marshaler, http.ResponseWriter, *http.Request, int) | ||||
|  | ||||
| // HTTPStatusError is the error to use when needing to provide a different HTTP status code for an error | ||||
| // passed to the DefaultRoutingErrorHandler. | ||||
| type HTTPStatusError struct { | ||||
| 	HTTPStatus int | ||||
| 	Err        error | ||||
| } | ||||
|  | ||||
| func (e *HTTPStatusError) Error() string { | ||||
| 	return e.Err.Error() | ||||
| } | ||||
|  | ||||
| // HTTPStatusFromCode converts a gRPC error code into the corresponding HTTP response status. | ||||
| // See: https://github.com/googleapis/googleapis/blob/master/google/rpc/code.proto | ||||
| func HTTPStatusFromCode(code codes.Code) int { | ||||
| 	switch code { | ||||
| 	case codes.OK: | ||||
| 		return http.StatusOK | ||||
| 	case codes.Canceled: | ||||
| 		return http.StatusRequestTimeout | ||||
| 	case codes.Unknown: | ||||
| 		return http.StatusInternalServerError | ||||
| 	case codes.InvalidArgument: | ||||
| 		return http.StatusBadRequest | ||||
| 	case codes.DeadlineExceeded: | ||||
| 		return http.StatusGatewayTimeout | ||||
| 	case codes.NotFound: | ||||
| 		return http.StatusNotFound | ||||
| 	case codes.AlreadyExists: | ||||
| 		return http.StatusConflict | ||||
| 	case codes.PermissionDenied: | ||||
| 		return http.StatusForbidden | ||||
| 	case codes.Unauthenticated: | ||||
| 		return http.StatusUnauthorized | ||||
| 	case codes.ResourceExhausted: | ||||
| 		return http.StatusTooManyRequests | ||||
| 	case codes.FailedPrecondition: | ||||
| 		// Note, this deliberately doesn't translate to the similarly named '412 Precondition Failed' HTTP response status. | ||||
| 		return http.StatusBadRequest | ||||
| 	case codes.Aborted: | ||||
| 		return http.StatusConflict | ||||
| 	case codes.OutOfRange: | ||||
| 		return http.StatusBadRequest | ||||
| 	case codes.Unimplemented: | ||||
| 		return http.StatusNotImplemented | ||||
| 	case codes.Internal: | ||||
| 		return http.StatusInternalServerError | ||||
| 	case codes.Unavailable: | ||||
| 		return http.StatusServiceUnavailable | ||||
| 	case codes.DataLoss: | ||||
| 		return http.StatusInternalServerError | ||||
| 	} | ||||
|  | ||||
| 	grpclog.Infof("Unknown gRPC error code: %v", code) | ||||
| 	return http.StatusInternalServerError | ||||
| } | ||||
|  | ||||
| // HTTPError uses the mux-configured error handler. | ||||
| func HTTPError(ctx context.Context, mux *ServeMux, marshaler Marshaler, w http.ResponseWriter, r *http.Request, err error) { | ||||
| 	mux.errorHandler(ctx, mux, marshaler, w, r, err) | ||||
| } | ||||
|  | ||||
| // DefaultHTTPErrorHandler is the default error handler. | ||||
| // If "err" is a gRPC Status, the function replies with the status code mapped by HTTPStatusFromCode. | ||||
| // If "err" is a HTTPStatusError, the function replies with the status code provide by that struct. This is | ||||
| // intended to allow passing through of specific statuses via the function set via WithRoutingErrorHandler | ||||
| // for the ServeMux constructor to handle edge cases which the standard mappings in HTTPStatusFromCode | ||||
| // are insufficient for. | ||||
| // If otherwise, it replies with http.StatusInternalServerError. | ||||
| // | ||||
| // The response body written by this function is a Status message marshaled by the Marshaler. | ||||
| func DefaultHTTPErrorHandler(ctx context.Context, mux *ServeMux, marshaler Marshaler, w http.ResponseWriter, r *http.Request, err error) { | ||||
| 	// return Internal when Marshal failed | ||||
| 	const fallback = `{"code": 13, "message": "failed to marshal error message"}` | ||||
|  | ||||
| 	var customStatus *HTTPStatusError | ||||
| 	if errors.As(err, &customStatus) { | ||||
| 		err = customStatus.Err | ||||
| 	} | ||||
|  | ||||
| 	s := status.Convert(err) | ||||
| 	pb := s.Proto() | ||||
|  | ||||
| 	w.Header().Del("Trailer") | ||||
| 	w.Header().Del("Transfer-Encoding") | ||||
|  | ||||
| 	contentType := marshaler.ContentType(pb) | ||||
| 	w.Header().Set("Content-Type", contentType) | ||||
|  | ||||
| 	if s.Code() == codes.Unauthenticated { | ||||
| 		w.Header().Set("WWW-Authenticate", s.Message()) | ||||
| 	} | ||||
|  | ||||
| 	buf, merr := marshaler.Marshal(pb) | ||||
| 	if merr != nil { | ||||
| 		grpclog.Infof("Failed to marshal error message %q: %v", s, merr) | ||||
| 		w.WriteHeader(http.StatusInternalServerError) | ||||
| 		if _, err := io.WriteString(w, fallback); err != nil { | ||||
| 			grpclog.Infof("Failed to write response: %v", err) | ||||
| 		} | ||||
| 		return | ||||
| 	} | ||||
|  | ||||
| 	md, ok := ServerMetadataFromContext(ctx) | ||||
| 	if !ok { | ||||
| 		grpclog.Infof("Failed to extract ServerMetadata from context") | ||||
| 	} | ||||
|  | ||||
| 	handleForwardResponseServerMetadata(w, mux, md) | ||||
|  | ||||
| 	// RFC 7230 https://tools.ietf.org/html/rfc7230#section-4.1.2 | ||||
| 	// Unless the request includes a TE header field indicating "trailers" | ||||
| 	// is acceptable, as described in Section 4.3, a server SHOULD NOT | ||||
| 	// generate trailer fields that it believes are necessary for the user | ||||
| 	// agent to receive. | ||||
| 	doForwardTrailers := requestAcceptsTrailers(r) | ||||
|  | ||||
| 	if doForwardTrailers { | ||||
| 		handleForwardResponseTrailerHeader(w, md) | ||||
| 		w.Header().Set("Transfer-Encoding", "chunked") | ||||
| 	} | ||||
|  | ||||
| 	st := HTTPStatusFromCode(s.Code()) | ||||
| 	if customStatus != nil { | ||||
| 		st = customStatus.HTTPStatus | ||||
| 	} | ||||
|  | ||||
| 	w.WriteHeader(st) | ||||
| 	if _, err := w.Write(buf); err != nil { | ||||
| 		grpclog.Infof("Failed to write response: %v", err) | ||||
| 	} | ||||
|  | ||||
| 	if doForwardTrailers { | ||||
| 		handleForwardResponseTrailer(w, md) | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func DefaultStreamErrorHandler(_ context.Context, err error) *status.Status { | ||||
| 	return status.Convert(err) | ||||
| } | ||||
|  | ||||
| // DefaultRoutingErrorHandler is our default handler for routing errors. | ||||
| // By default http error codes mapped on the following error codes: | ||||
| //   NotFound -> grpc.NotFound | ||||
| //   StatusBadRequest -> grpc.InvalidArgument | ||||
| //   MethodNotAllowed -> grpc.Unimplemented | ||||
| //   Other -> grpc.Internal, method is not expecting to be called for anything else | ||||
| func DefaultRoutingErrorHandler(ctx context.Context, mux *ServeMux, marshaler Marshaler, w http.ResponseWriter, r *http.Request, httpStatus int) { | ||||
| 	sterr := status.Error(codes.Internal, "Unexpected routing error") | ||||
| 	switch httpStatus { | ||||
| 	case http.StatusBadRequest: | ||||
| 		sterr = status.Error(codes.InvalidArgument, http.StatusText(httpStatus)) | ||||
| 	case http.StatusMethodNotAllowed: | ||||
| 		sterr = status.Error(codes.Unimplemented, http.StatusText(httpStatus)) | ||||
| 	case http.StatusNotFound: | ||||
| 		sterr = status.Error(codes.NotFound, http.StatusText(httpStatus)) | ||||
| 	} | ||||
| 	mux.errorHandler(ctx, mux, marshaler, w, r, sterr) | ||||
| } | ||||
							
								
								
									
										165
									
								
								vendor/github.com/grpc-ecosystem/grpc-gateway/v2/runtime/fieldmask.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										165
									
								
								vendor/github.com/grpc-ecosystem/grpc-gateway/v2/runtime/fieldmask.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,165 @@ | ||||
| package runtime | ||||
|  | ||||
| import ( | ||||
| 	"encoding/json" | ||||
| 	"fmt" | ||||
| 	"io" | ||||
| 	"sort" | ||||
|  | ||||
| 	"google.golang.org/genproto/protobuf/field_mask" | ||||
| 	"google.golang.org/protobuf/proto" | ||||
| 	"google.golang.org/protobuf/reflect/protoreflect" | ||||
| ) | ||||
|  | ||||
| func getFieldByName(fields protoreflect.FieldDescriptors, name string) protoreflect.FieldDescriptor { | ||||
| 	fd := fields.ByName(protoreflect.Name(name)) | ||||
| 	if fd != nil { | ||||
| 		return fd | ||||
| 	} | ||||
|  | ||||
| 	return fields.ByJSONName(name) | ||||
| } | ||||
|  | ||||
| // FieldMaskFromRequestBody creates a FieldMask printing all complete paths from the JSON body. | ||||
| func FieldMaskFromRequestBody(r io.Reader, msg proto.Message) (*field_mask.FieldMask, error) { | ||||
| 	fm := &field_mask.FieldMask{} | ||||
| 	var root interface{} | ||||
|  | ||||
| 	if err := json.NewDecoder(r).Decode(&root); err != nil { | ||||
| 		if err == io.EOF { | ||||
| 			return fm, nil | ||||
| 		} | ||||
| 		return nil, err | ||||
| 	} | ||||
|  | ||||
| 	queue := []fieldMaskPathItem{{node: root, msg: msg.ProtoReflect()}} | ||||
| 	for len(queue) > 0 { | ||||
| 		// dequeue an item | ||||
| 		item := queue[0] | ||||
| 		queue = queue[1:] | ||||
|  | ||||
| 		m, ok := item.node.(map[string]interface{}) | ||||
| 		switch { | ||||
| 		case ok: | ||||
| 			// if the item is an object, then enqueue all of its children | ||||
| 			for k, v := range m { | ||||
| 				if item.msg == nil { | ||||
| 					return nil, fmt.Errorf("JSON structure did not match request type") | ||||
| 				} | ||||
|  | ||||
| 				fd := getFieldByName(item.msg.Descriptor().Fields(), k) | ||||
| 				if fd == nil { | ||||
| 					return nil, fmt.Errorf("could not find field %q in %q", k, item.msg.Descriptor().FullName()) | ||||
| 				} | ||||
|  | ||||
| 				if isDynamicProtoMessage(fd.Message()) { | ||||
| 					for _, p := range buildPathsBlindly(k, v) { | ||||
| 						newPath := p | ||||
| 						if item.path != "" { | ||||
| 							newPath = item.path + "." + newPath | ||||
| 						} | ||||
| 						queue = append(queue, fieldMaskPathItem{path: newPath}) | ||||
| 					} | ||||
| 					continue | ||||
| 				} | ||||
|  | ||||
| 				if isProtobufAnyMessage(fd.Message()) { | ||||
| 					_, hasTypeField := v.(map[string]interface{})["@type"] | ||||
| 					if hasTypeField { | ||||
| 						queue = append(queue, fieldMaskPathItem{path: k}) | ||||
| 						continue | ||||
| 					} else { | ||||
| 						return nil, fmt.Errorf("could not find field @type in %q in message %q", k, item.msg.Descriptor().FullName()) | ||||
| 					} | ||||
|  | ||||
| 				} | ||||
|  | ||||
| 				child := fieldMaskPathItem{ | ||||
| 					node: v, | ||||
| 				} | ||||
| 				if item.path == "" { | ||||
| 					child.path = string(fd.FullName().Name()) | ||||
| 				} else { | ||||
| 					child.path = item.path + "." + string(fd.FullName().Name()) | ||||
| 				} | ||||
|  | ||||
| 				switch { | ||||
| 				case fd.IsList(), fd.IsMap(): | ||||
| 					// As per: https://github.com/protocolbuffers/protobuf/blob/master/src/google/protobuf/field_mask.proto#L85-L86 | ||||
| 					// Do not recurse into repeated fields. The repeated field goes on the end of the path and we stop. | ||||
| 					fm.Paths = append(fm.Paths, child.path) | ||||
| 				case fd.Message() != nil: | ||||
| 					child.msg = item.msg.Get(fd).Message() | ||||
| 					fallthrough | ||||
| 				default: | ||||
| 					queue = append(queue, child) | ||||
| 				} | ||||
| 			} | ||||
| 		case len(item.path) > 0: | ||||
| 			// otherwise, it's a leaf node so print its path | ||||
| 			fm.Paths = append(fm.Paths, item.path) | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	// Sort for deterministic output in the presence | ||||
| 	// of repeated fields. | ||||
| 	sort.Strings(fm.Paths) | ||||
|  | ||||
| 	return fm, nil | ||||
| } | ||||
|  | ||||
| func isProtobufAnyMessage(md protoreflect.MessageDescriptor) bool { | ||||
| 	return md != nil && (md.FullName() == "google.protobuf.Any") | ||||
| } | ||||
|  | ||||
| func isDynamicProtoMessage(md protoreflect.MessageDescriptor) bool { | ||||
| 	return md != nil && (md.FullName() == "google.protobuf.Struct" || md.FullName() == "google.protobuf.Value") | ||||
| } | ||||
|  | ||||
| // buildPathsBlindly does not attempt to match proto field names to the | ||||
| // json value keys.  Instead it relies completely on the structure of | ||||
| // the unmarshalled json contained within in. | ||||
| // Returns a slice containing all subpaths with the root at the | ||||
| // passed in name and json value. | ||||
| func buildPathsBlindly(name string, in interface{}) []string { | ||||
| 	m, ok := in.(map[string]interface{}) | ||||
| 	if !ok { | ||||
| 		return []string{name} | ||||
| 	} | ||||
|  | ||||
| 	var paths []string | ||||
| 	queue := []fieldMaskPathItem{{path: name, node: m}} | ||||
| 	for len(queue) > 0 { | ||||
| 		cur := queue[0] | ||||
| 		queue = queue[1:] | ||||
|  | ||||
| 		m, ok := cur.node.(map[string]interface{}) | ||||
| 		if !ok { | ||||
| 			// This should never happen since we should always check that we only add | ||||
| 			// nodes of type map[string]interface{} to the queue. | ||||
| 			continue | ||||
| 		} | ||||
| 		for k, v := range m { | ||||
| 			if mi, ok := v.(map[string]interface{}); ok { | ||||
| 				queue = append(queue, fieldMaskPathItem{path: cur.path + "." + k, node: mi}) | ||||
| 			} else { | ||||
| 				// This is not a struct, so there are no more levels to descend. | ||||
| 				curPath := cur.path + "." + k | ||||
| 				paths = append(paths, curPath) | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| 	return paths | ||||
| } | ||||
|  | ||||
| // fieldMaskPathItem stores a in-progress deconstruction of a path for a fieldmask | ||||
| type fieldMaskPathItem struct { | ||||
| 	// the list of prior fields leading up to node connected by dots | ||||
| 	path string | ||||
|  | ||||
| 	// a generic decoded json object the current item to inspect for further path extraction | ||||
| 	node interface{} | ||||
|  | ||||
| 	// parent message | ||||
| 	msg protoreflect.Message | ||||
| } | ||||
| @@ -2,19 +2,19 @@ package runtime | ||||
| 
 | ||||
| import ( | ||||
| 	"context" | ||||
| 	"errors" | ||||
| 	"fmt" | ||||
| 	"io" | ||||
| 	"net/http" | ||||
| 	"net/textproto" | ||||
| 	"strings" | ||||
| 
 | ||||
| 	"github.com/golang/protobuf/proto" | ||||
| 	"github.com/grpc-ecosystem/grpc-gateway/internal" | ||||
| 	"google.golang.org/genproto/googleapis/api/httpbody" | ||||
| 	"google.golang.org/grpc/codes" | ||||
| 	"google.golang.org/grpc/grpclog" | ||||
| 	"google.golang.org/grpc/status" | ||||
| 	"google.golang.org/protobuf/proto" | ||||
| ) | ||||
| 
 | ||||
| var errEmptyResponse = errors.New("empty response") | ||||
| 
 | ||||
| // ForwardResponseStream forwards the stream from gRPC server to REST client. | ||||
| func ForwardResponseStream(ctx context.Context, mux *ServeMux, marshaler Marshaler, w http.ResponseWriter, req *http.Request, recv func() (proto.Message, error), opts ...func(context.Context, http.ResponseWriter, proto.Message) error) { | ||||
| 	f, ok := w.(http.Flusher) | ||||
| @@ -33,7 +33,6 @@ func ForwardResponseStream(ctx context.Context, mux *ServeMux, marshaler Marshal | ||||
| 	handleForwardResponseServerMetadata(w, mux, md) | ||||
| 
 | ||||
| 	w.Header().Set("Transfer-Encoding", "chunked") | ||||
| 	w.Header().Set("Content-Type", marshaler.ContentType()) | ||||
| 	if err := handleForwardResponseOptions(ctx, w, nil, opts); err != nil { | ||||
| 		HTTPError(ctx, mux, marshaler, w, req, err) | ||||
| 		return | ||||
| @@ -61,10 +60,17 @@ func ForwardResponseStream(ctx context.Context, mux *ServeMux, marshaler Marshal | ||||
| 			return | ||||
| 		} | ||||
| 
 | ||||
| 		if !wroteHeader { | ||||
| 			w.Header().Set("Content-Type", marshaler.ContentType(resp)) | ||||
| 		} | ||||
| 
 | ||||
| 		var buf []byte | ||||
| 		httpBody, isHTTPBody := resp.(*httpbody.HttpBody) | ||||
| 		switch { | ||||
| 		case resp == nil: | ||||
| 			buf, err = marshaler.Marshal(errorChunk(streamError(ctx, mux.streamErrorHandler, errEmptyResponse))) | ||||
| 			buf, err = marshaler.Marshal(errorChunk(status.New(codes.Internal, "empty response"))) | ||||
| 		case isHTTPBody: | ||||
| 			buf = httpBody.GetData() | ||||
| 		default: | ||||
| 			result := map[string]interface{}{"result": resp} | ||||
| 			if rb, ok := resp.(responseBody); ok { | ||||
| @@ -132,15 +138,22 @@ func ForwardResponseMessage(ctx context.Context, mux *ServeMux, marshaler Marsha | ||||
| 	} | ||||
| 
 | ||||
| 	handleForwardResponseServerMetadata(w, mux, md) | ||||
| 
 | ||||
| 	// RFC 7230 https://tools.ietf.org/html/rfc7230#section-4.1.2 | ||||
| 	// Unless the request includes a TE header field indicating "trailers" | ||||
| 	// is acceptable, as described in Section 4.3, a server SHOULD NOT | ||||
| 	// generate trailer fields that it believes are necessary for the user | ||||
| 	// agent to receive. | ||||
| 	doForwardTrailers := requestAcceptsTrailers(req) | ||||
| 
 | ||||
| 	if doForwardTrailers { | ||||
| 		handleForwardResponseTrailerHeader(w, md) | ||||
| 		w.Header().Set("Transfer-Encoding", "chunked") | ||||
| 	} | ||||
| 
 | ||||
| 	handleForwardResponseTrailerHeader(w, md) | ||||
| 
 | ||||
| 	contentType := marshaler.ContentType() | ||||
| 	// Check marshaler on run time in order to keep backwards compatibility | ||||
| 	// An interface param needs to be added to the ContentType() function on | ||||
| 	// the Marshal interface to be able to remove this check | ||||
| 	if typeMarshaler, ok := marshaler.(contentTypeMarshaler); ok { | ||||
| 		contentType = typeMarshaler.ContentTypeFromMessage(resp) | ||||
| 	} | ||||
| 	contentType := marshaler.ContentType(resp) | ||||
| 	w.Header().Set("Content-Type", contentType) | ||||
| 
 | ||||
| 	if err := handleForwardResponseOptions(ctx, w, resp, opts); err != nil { | ||||
| @@ -164,7 +177,14 @@ func ForwardResponseMessage(ctx context.Context, mux *ServeMux, marshaler Marsha | ||||
| 		grpclog.Infof("Failed to write response: %v", err) | ||||
| 	} | ||||
| 
 | ||||
| 	handleForwardResponseTrailer(w, md) | ||||
| 	if doForwardTrailers { | ||||
| 		handleForwardResponseTrailer(w, md) | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| func requestAcceptsTrailers(req *http.Request) bool { | ||||
| 	te := req.Header.Get("TE") | ||||
| 	return strings.Contains(strings.ToLower(te), "trailers") | ||||
| } | ||||
| 
 | ||||
| func handleForwardResponseOptions(ctx context.Context, w http.ResponseWriter, resp proto.Message, opts []func(context.Context, http.ResponseWriter, proto.Message) error) error { | ||||
| @@ -181,11 +201,13 @@ func handleForwardResponseOptions(ctx context.Context, w http.ResponseWriter, re | ||||
| } | ||||
| 
 | ||||
| func handleForwardResponseStreamError(ctx context.Context, wroteHeader bool, marshaler Marshaler, w http.ResponseWriter, req *http.Request, mux *ServeMux, err error) { | ||||
| 	serr := streamError(ctx, mux.streamErrorHandler, err) | ||||
| 	st := mux.streamErrorHandler(ctx, err) | ||||
| 	msg := errorChunk(st) | ||||
| 	if !wroteHeader { | ||||
| 		w.WriteHeader(int(serr.HttpCode)) | ||||
| 		w.Header().Set("Content-Type", marshaler.ContentType(msg)) | ||||
| 		w.WriteHeader(HTTPStatusFromCode(st.Code())) | ||||
| 	} | ||||
| 	buf, merr := marshaler.Marshal(errorChunk(serr)) | ||||
| 	buf, merr := marshaler.Marshal(msg) | ||||
| 	if merr != nil { | ||||
| 		grpclog.Infof("Failed to marshal an error: %v", merr) | ||||
| 		return | ||||
| @@ -196,17 +218,6 @@ func handleForwardResponseStreamError(ctx context.Context, wroteHeader bool, mar | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| // streamError returns the payload for the final message in a response stream | ||||
| // that represents the given err. | ||||
| func streamError(ctx context.Context, errHandler StreamErrorHandlerFunc, err error) *StreamError { | ||||
| 	serr := errHandler(ctx, err) | ||||
| 	if serr != nil { | ||||
| 		return serr | ||||
| 	} | ||||
| 	// TODO: log about misbehaving stream error handler? | ||||
| 	return DefaultHTTPStreamErrorHandler(ctx, err) | ||||
| } | ||||
| 
 | ||||
| func errorChunk(err *StreamError) map[string]proto.Message { | ||||
| 	return map[string]proto.Message{"error": (*internal.StreamError)(err)} | ||||
| func errorChunk(st *status.Status) map[string]proto.Message { | ||||
| 	return map[string]proto.Message{"error": st.Proto()} | ||||
| } | ||||
| @@ -4,13 +4,6 @@ import ( | ||||
| 	"google.golang.org/genproto/googleapis/api/httpbody" | ||||
| ) | ||||
| 
 | ||||
| // SetHTTPBodyMarshaler overwrite the default marshaler with the HTTPBodyMarshaler | ||||
| func SetHTTPBodyMarshaler(serveMux *ServeMux) { | ||||
| 	serveMux.marshalers.mimeMap[MIMEWildcard] = &HTTPBodyMarshaler{ | ||||
| 		Marshaler: &JSONPb{OrigName: true}, | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| // HTTPBodyMarshaler is a Marshaler which supports marshaling of a | ||||
| // google.api.HttpBody message as the full response body if it is | ||||
| // the actual message used as the response. If not, then this will | ||||
| @@ -19,18 +12,14 @@ type HTTPBodyMarshaler struct { | ||||
| 	Marshaler | ||||
| } | ||||
| 
 | ||||
| // ContentType implementation to keep backwards compatibility with marshal interface | ||||
| func (h *HTTPBodyMarshaler) ContentType() string { | ||||
| 	return h.ContentTypeFromMessage(nil) | ||||
| } | ||||
| 
 | ||||
| // ContentTypeFromMessage in case v is a google.api.HttpBody message it returns | ||||
| // its specified content type otherwise fall back to the default Marshaler. | ||||
| func (h *HTTPBodyMarshaler) ContentTypeFromMessage(v interface{}) string { | ||||
| // ContentType returns its specified content type in case v is a | ||||
| // google.api.HttpBody message, otherwise it will fall back to the default Marshalers | ||||
| // content type. | ||||
| func (h *HTTPBodyMarshaler) ContentType(v interface{}) string { | ||||
| 	if httpBody, ok := v.(*httpbody.HttpBody); ok { | ||||
| 		return httpBody.GetContentType() | ||||
| 	} | ||||
| 	return h.Marshaler.ContentType() | ||||
| 	return h.Marshaler.ContentType(v) | ||||
| } | ||||
| 
 | ||||
| // Marshal marshals "v" by returning the body bytes if v is a | ||||
| @@ -15,7 +15,7 @@ import ( | ||||
| type JSONBuiltin struct{} | ||||
| 
 | ||||
| // ContentType always Returns "application/json". | ||||
| func (*JSONBuiltin) ContentType() string { | ||||
| func (*JSONBuiltin) ContentType(_ interface{}) string { | ||||
| 	return "application/json" | ||||
| } | ||||
| 
 | ||||
| @@ -6,21 +6,25 @@ import ( | ||||
| 	"fmt" | ||||
| 	"io" | ||||
| 	"reflect" | ||||
| 	"strconv" | ||||
| 
 | ||||
| 	"github.com/golang/protobuf/jsonpb" | ||||
| 	"github.com/golang/protobuf/proto" | ||||
| 	"google.golang.org/protobuf/encoding/protojson" | ||||
| 	"google.golang.org/protobuf/proto" | ||||
| ) | ||||
| 
 | ||||
| // JSONPb is a Marshaler which marshals/unmarshals into/from JSON | ||||
| // with the "github.com/golang/protobuf/jsonpb". | ||||
| // It supports fully functionality of protobuf unlike JSONBuiltin. | ||||
| // with the "google.golang.org/protobuf/encoding/protojson" marshaler. | ||||
| // It supports the full functionality of protobuf unlike JSONBuiltin. | ||||
| // | ||||
| // The NewDecoder method returns a DecoderWrapper, so the underlying | ||||
| // *json.Decoder methods can be used. | ||||
| type JSONPb jsonpb.Marshaler | ||||
| type JSONPb struct { | ||||
| 	protojson.MarshalOptions | ||||
| 	protojson.UnmarshalOptions | ||||
| } | ||||
| 
 | ||||
| // ContentType always returns "application/json". | ||||
| func (*JSONPb) ContentType() string { | ||||
| func (*JSONPb) ContentType(_ interface{}) string { | ||||
| 	return "application/json" | ||||
| } | ||||
| 
 | ||||
| @@ -47,7 +51,13 @@ func (j *JSONPb) marshalTo(w io.Writer, v interface{}) error { | ||||
| 		_, err = w.Write(buf) | ||||
| 		return err | ||||
| 	} | ||||
| 	return (*jsonpb.Marshaler)(j).Marshal(w, p) | ||||
| 	b, err := j.MarshalOptions.Marshal(p) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 
 | ||||
| 	_, err = w.Write(b) | ||||
| 	return err | ||||
| } | ||||
| 
 | ||||
| var ( | ||||
| @@ -56,8 +66,8 @@ var ( | ||||
| ) | ||||
| 
 | ||||
| // marshalNonProto marshals a non-message field of a protobuf message. | ||||
| // This function does not correctly marshals arbitrary data structure into JSON, | ||||
| // but it is only capable of marshaling non-message field values of protobuf, | ||||
| // This function does not correctly marshal arbitrary data structures into JSON, | ||||
| // it is only capable of marshaling non-message field values of protobuf, | ||||
| // i.e. primitive types, enums; pointers to primitives or enums; maps from | ||||
| // integer/string types to primitives/enums/pointers to messages. | ||||
| func (j *JSONPb) marshalNonProtoField(v interface{}) ([]byte, error) { | ||||
| @@ -74,7 +84,7 @@ func (j *JSONPb) marshalNonProtoField(v interface{}) ([]byte, error) { | ||||
| 
 | ||||
| 	if rv.Kind() == reflect.Slice { | ||||
| 		if rv.IsNil() { | ||||
| 			if j.EmitDefaults { | ||||
| 			if j.EmitUnpopulated { | ||||
| 				return []byte("[]"), nil | ||||
| 			} | ||||
| 			return []byte("null"), nil | ||||
| @@ -93,7 +103,37 @@ func (j *JSONPb) marshalNonProtoField(v interface{}) ([]byte, error) { | ||||
| 						return nil, err | ||||
| 					} | ||||
| 				} | ||||
| 				if err = (*jsonpb.Marshaler)(j).Marshal(&buf, rv.Index(i).Interface().(proto.Message)); err != nil { | ||||
| 				if err = j.marshalTo(&buf, rv.Index(i).Interface().(proto.Message)); err != nil { | ||||
| 					return nil, err | ||||
| 				} | ||||
| 			} | ||||
| 			err = buf.WriteByte(']') | ||||
| 			if err != nil { | ||||
| 				return nil, err | ||||
| 			} | ||||
| 
 | ||||
| 			return buf.Bytes(), nil | ||||
| 		} | ||||
| 
 | ||||
| 		if rv.Type().Elem().Implements(typeProtoEnum) { | ||||
| 			var buf bytes.Buffer | ||||
| 			err := buf.WriteByte('[') | ||||
| 			if err != nil { | ||||
| 				return nil, err | ||||
| 			} | ||||
| 			for i := 0; i < rv.Len(); i++ { | ||||
| 				if i != 0 { | ||||
| 					err = buf.WriteByte(',') | ||||
| 					if err != nil { | ||||
| 						return nil, err | ||||
| 					} | ||||
| 				} | ||||
| 				if j.UseEnumNumbers { | ||||
| 					_, err = buf.WriteString(strconv.FormatInt(rv.Index(i).Int(), 10)) | ||||
| 				} else { | ||||
| 					_, err = buf.WriteString("\"" + rv.Index(i).Interface().(protoEnum).String() + "\"") | ||||
| 				} | ||||
| 				if err != nil { | ||||
| 					return nil, err | ||||
| 				} | ||||
| 			} | ||||
| @@ -120,7 +160,7 @@ func (j *JSONPb) marshalNonProtoField(v interface{}) ([]byte, error) { | ||||
| 		} | ||||
| 		return json.Marshal(m) | ||||
| 	} | ||||
| 	if enum, ok := rv.Interface().(protoEnum); ok && !j.EnumsAsInts { | ||||
| 	if enum, ok := rv.Interface().(protoEnum); ok && !j.UseEnumNumbers { | ||||
| 		return json.Marshal(enum.String()) | ||||
| 	} | ||||
| 	return json.Marshal(rv.Interface()) | ||||
| @@ -128,25 +168,29 @@ func (j *JSONPb) marshalNonProtoField(v interface{}) ([]byte, error) { | ||||
| 
 | ||||
| // Unmarshal unmarshals JSON "data" into "v" | ||||
| func (j *JSONPb) Unmarshal(data []byte, v interface{}) error { | ||||
| 	return unmarshalJSONPb(data, v) | ||||
| 	return unmarshalJSONPb(data, j.UnmarshalOptions, v) | ||||
| } | ||||
| 
 | ||||
| // NewDecoder returns a Decoder which reads JSON stream from "r". | ||||
| func (j *JSONPb) NewDecoder(r io.Reader) Decoder { | ||||
| 	d := json.NewDecoder(r) | ||||
| 	return DecoderWrapper{Decoder: d} | ||||
| 	return DecoderWrapper{ | ||||
| 		Decoder:          d, | ||||
| 		UnmarshalOptions: j.UnmarshalOptions, | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| // DecoderWrapper is a wrapper around a *json.Decoder that adds | ||||
| // support for protos to the Decode method. | ||||
| type DecoderWrapper struct { | ||||
| 	*json.Decoder | ||||
| 	protojson.UnmarshalOptions | ||||
| } | ||||
| 
 | ||||
| // Decode wraps the embedded decoder's Decode method to support | ||||
| // protos using a jsonpb.Unmarshaler. | ||||
| func (d DecoderWrapper) Decode(v interface{}) error { | ||||
| 	return decodeJSONPb(d.Decoder, v) | ||||
| 	return decodeJSONPb(d.Decoder, d.UnmarshalOptions, v) | ||||
| } | ||||
| 
 | ||||
| // NewEncoder returns an Encoder which writes JSON stream into "w". | ||||
| @@ -162,21 +206,28 @@ func (j *JSONPb) NewEncoder(w io.Writer) Encoder { | ||||
| 	}) | ||||
| } | ||||
| 
 | ||||
| func unmarshalJSONPb(data []byte, v interface{}) error { | ||||
| func unmarshalJSONPb(data []byte, unmarshaler protojson.UnmarshalOptions, v interface{}) error { | ||||
| 	d := json.NewDecoder(bytes.NewReader(data)) | ||||
| 	return decodeJSONPb(d, v) | ||||
| 	return decodeJSONPb(d, unmarshaler, v) | ||||
| } | ||||
| 
 | ||||
| func decodeJSONPb(d *json.Decoder, v interface{}) error { | ||||
| func decodeJSONPb(d *json.Decoder, unmarshaler protojson.UnmarshalOptions, v interface{}) error { | ||||
| 	p, ok := v.(proto.Message) | ||||
| 	if !ok { | ||||
| 		return decodeNonProtoField(d, v) | ||||
| 		return decodeNonProtoField(d, unmarshaler, v) | ||||
| 	} | ||||
| 	unmarshaler := &jsonpb.Unmarshaler{AllowUnknownFields: allowUnknownFields} | ||||
| 	return unmarshaler.UnmarshalNext(d, p) | ||||
| 
 | ||||
| 	// Decode into bytes for marshalling | ||||
| 	var b json.RawMessage | ||||
| 	err := d.Decode(&b) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 
 | ||||
| 	return unmarshaler.Unmarshal([]byte(b), p) | ||||
| } | ||||
| 
 | ||||
| func decodeNonProtoField(d *json.Decoder, v interface{}) error { | ||||
| func decodeNonProtoField(d *json.Decoder, unmarshaler protojson.UnmarshalOptions, v interface{}) error { | ||||
| 	rv := reflect.ValueOf(v) | ||||
| 	if rv.Kind() != reflect.Ptr { | ||||
| 		return fmt.Errorf("%T is not a pointer", v) | ||||
| @@ -186,8 +237,14 @@ func decodeNonProtoField(d *json.Decoder, v interface{}) error { | ||||
| 			rv.Set(reflect.New(rv.Type().Elem())) | ||||
| 		} | ||||
| 		if rv.Type().ConvertibleTo(typeProtoMessage) { | ||||
| 			unmarshaler := &jsonpb.Unmarshaler{AllowUnknownFields: allowUnknownFields} | ||||
| 			return unmarshaler.UnmarshalNext(d, rv.Interface().(proto.Message)) | ||||
| 			// Decode into bytes for marshalling | ||||
| 			var b json.RawMessage | ||||
| 			err := d.Decode(&b) | ||||
| 			if err != nil { | ||||
| 				return err | ||||
| 			} | ||||
| 
 | ||||
| 			return unmarshaler.Unmarshal([]byte(b), rv.Interface().(proto.Message)) | ||||
| 		} | ||||
| 		rv = rv.Elem() | ||||
| 	} | ||||
| @@ -211,24 +268,45 @@ func decodeNonProtoField(d *json.Decoder, v interface{}) error { | ||||
| 			} | ||||
| 			bk := result[0] | ||||
| 			bv := reflect.New(rv.Type().Elem()) | ||||
| 			if err := unmarshalJSONPb([]byte(*v), bv.Interface()); err != nil { | ||||
| 			if v == nil { | ||||
| 				null := json.RawMessage("null") | ||||
| 				v = &null | ||||
| 			} | ||||
| 			if err := unmarshalJSONPb([]byte(*v), unmarshaler, bv.Interface()); err != nil { | ||||
| 				return err | ||||
| 			} | ||||
| 			rv.SetMapIndex(bk, bv.Elem()) | ||||
| 		} | ||||
| 		return nil | ||||
| 	} | ||||
| 	if rv.Kind() == reflect.Slice { | ||||
| 		var sl []json.RawMessage | ||||
| 		if err := d.Decode(&sl); err != nil { | ||||
| 			return err | ||||
| 		} | ||||
| 		if sl != nil { | ||||
| 			rv.Set(reflect.MakeSlice(rv.Type(), 0, 0)) | ||||
| 		} | ||||
| 		for _, item := range sl { | ||||
| 			bv := reflect.New(rv.Type().Elem()) | ||||
| 			if err := unmarshalJSONPb([]byte(item), unmarshaler, bv.Interface()); err != nil { | ||||
| 				return err | ||||
| 			} | ||||
| 			rv.Set(reflect.Append(rv, bv.Elem())) | ||||
| 		} | ||||
| 		return nil | ||||
| 	} | ||||
| 	if _, ok := rv.Interface().(protoEnum); ok { | ||||
| 		var repr interface{} | ||||
| 		if err := d.Decode(&repr); err != nil { | ||||
| 			return err | ||||
| 		} | ||||
| 		switch repr.(type) { | ||||
| 		switch v := repr.(type) { | ||||
| 		case string: | ||||
| 			// TODO(yugui) Should use proto.StructProperties? | ||||
| 			return fmt.Errorf("unmarshaling of symbolic enum %q not supported: %T", repr, rv.Interface()) | ||||
| 		case float64: | ||||
| 			rv.Set(reflect.ValueOf(int32(repr.(float64))).Convert(rv.Type())) | ||||
| 			rv.Set(reflect.ValueOf(int32(v)).Convert(rv.Type())) | ||||
| 			return nil | ||||
| 		default: | ||||
| 			return fmt.Errorf("cannot assign %#v into Go type %T", repr, rv.Interface()) | ||||
| @@ -242,6 +320,8 @@ type protoEnum interface { | ||||
| 	EnumDescriptor() ([]byte, []int) | ||||
| } | ||||
| 
 | ||||
| var typeProtoEnum = reflect.TypeOf((*protoEnum)(nil)).Elem() | ||||
| 
 | ||||
| var typeProtoMessage = reflect.TypeOf((*proto.Message)(nil)).Elem() | ||||
| 
 | ||||
| // Delimiter for newline encoded JSON streams. | ||||
| @@ -249,14 +329,16 @@ func (j *JSONPb) Delimiter() []byte { | ||||
| 	return []byte("\n") | ||||
| } | ||||
| 
 | ||||
| // allowUnknownFields helps not to return an error when the destination | ||||
| // is a struct and the input contains object keys which do not match any | ||||
| // non-ignored, exported fields in the destination. | ||||
| var allowUnknownFields = true | ||||
| 
 | ||||
| // DisallowUnknownFields enables option in decoder (unmarshaller) to | ||||
| // return an error when it finds an unknown field. This function must be | ||||
| // called before using the JSON marshaller. | ||||
| func DisallowUnknownFields() { | ||||
| 	allowUnknownFields = false | ||||
| } | ||||
| var ( | ||||
| 	convFromType = map[reflect.Kind]reflect.Value{ | ||||
| 		reflect.String:  reflect.ValueOf(String), | ||||
| 		reflect.Bool:    reflect.ValueOf(Bool), | ||||
| 		reflect.Float64: reflect.ValueOf(Float64), | ||||
| 		reflect.Float32: reflect.ValueOf(Float32), | ||||
| 		reflect.Int64:   reflect.ValueOf(Int64), | ||||
| 		reflect.Int32:   reflect.ValueOf(Int32), | ||||
| 		reflect.Uint64:  reflect.ValueOf(Uint64), | ||||
| 		reflect.Uint32:  reflect.ValueOf(Uint32), | ||||
| 		reflect.Slice:   reflect.ValueOf(Bytes), | ||||
| 	} | ||||
| ) | ||||
| @@ -4,15 +4,16 @@ import ( | ||||
| 	"io" | ||||
| 
 | ||||
| 	"errors" | ||||
| 	"github.com/golang/protobuf/proto" | ||||
| 	"io/ioutil" | ||||
| 
 | ||||
| 	"google.golang.org/protobuf/proto" | ||||
| ) | ||||
| 
 | ||||
| // ProtoMarshaller is a Marshaller which marshals/unmarshals into/from serialize proto bytes | ||||
| type ProtoMarshaller struct{} | ||||
| 
 | ||||
| // ContentType always returns "application/octet-stream". | ||||
| func (*ProtoMarshaller) ContentType() string { | ||||
| func (*ProtoMarshaller) ContentType(_ interface{}) string { | ||||
| 	return "application/octet-stream" | ||||
| } | ||||
| 
 | ||||
| @@ -16,14 +16,9 @@ type Marshaler interface { | ||||
| 	// NewEncoder returns an Encoder which writes bytes sequence into "w". | ||||
| 	NewEncoder(w io.Writer) Encoder | ||||
| 	// ContentType returns the Content-Type which this marshaler is responsible for. | ||||
| 	ContentType() string | ||||
| } | ||||
| 
 | ||||
| // Marshalers that implement contentTypeMarshaler will have their ContentTypeFromMessage method called | ||||
| // to set the Content-Type header on the response | ||||
| type contentTypeMarshaler interface { | ||||
| 	// ContentTypeFromMessage returns the Content-Type this marshaler produces from the provided message | ||||
| 	ContentTypeFromMessage(v interface{}) string | ||||
| 	// The parameter describes the type which is being marshalled, which can sometimes | ||||
| 	// affect the content type returned. | ||||
| 	ContentType(v interface{}) string | ||||
| } | ||||
| 
 | ||||
| // Decoder decodes a byte sequence | ||||
| @@ -6,6 +6,7 @@ import ( | ||||
| 	"net/http" | ||||
| 
 | ||||
| 	"google.golang.org/grpc/grpclog" | ||||
| 	"google.golang.org/protobuf/encoding/protojson" | ||||
| ) | ||||
| 
 | ||||
| // MIMEWildcard is the fallback MIME type used for requests which do not match | ||||
| @@ -16,7 +17,16 @@ var ( | ||||
| 	acceptHeader      = http.CanonicalHeaderKey("Accept") | ||||
| 	contentTypeHeader = http.CanonicalHeaderKey("Content-Type") | ||||
| 
 | ||||
| 	defaultMarshaler = &JSONPb{OrigName: true} | ||||
| 	defaultMarshaler = &HTTPBodyMarshaler{ | ||||
| 		Marshaler: &JSONPb{ | ||||
| 			MarshalOptions: protojson.MarshalOptions{ | ||||
| 				EmitUnpopulated: true, | ||||
| 			}, | ||||
| 			UnmarshalOptions: protojson.UnmarshalOptions{ | ||||
| 				DiscardUnknown: true, | ||||
| 			}, | ||||
| 		}, | ||||
| 	} | ||||
| ) | ||||
| 
 | ||||
| // MarshalerForRequest returns the inbound/outbound marshalers for this request. | ||||
| @@ -2,28 +2,47 @@ package runtime | ||||
| 
 | ||||
| import ( | ||||
| 	"context" | ||||
| 	"errors" | ||||
| 	"fmt" | ||||
| 	"net/http" | ||||
| 	"net/textproto" | ||||
| 	"strings" | ||||
| 
 | ||||
| 	"github.com/golang/protobuf/proto" | ||||
| 	"github.com/grpc-ecosystem/grpc-gateway/v2/internal/httprule" | ||||
| 	"google.golang.org/grpc/codes" | ||||
| 	"google.golang.org/grpc/metadata" | ||||
| 	"google.golang.org/grpc/status" | ||||
| 	"google.golang.org/protobuf/proto" | ||||
| ) | ||||
| 
 | ||||
| // UnescapingMode defines the behavior of ServeMux when unescaping path parameters. | ||||
| type UnescapingMode int | ||||
| 
 | ||||
| const ( | ||||
| 	// UnescapingModeLegacy is the default V2 behavior, which escapes the entire | ||||
| 	// path string before doing any routing. | ||||
| 	UnescapingModeLegacy UnescapingMode = iota | ||||
| 
 | ||||
| 	// EscapingTypeExceptReserved unescapes all path parameters except RFC 6570 | ||||
| 	// reserved characters. | ||||
| 	UnescapingModeAllExceptReserved | ||||
| 
 | ||||
| 	// EscapingTypeExceptSlash unescapes URL path parameters except path | ||||
| 	// seperators, which will be left as "%2F". | ||||
| 	UnescapingModeAllExceptSlash | ||||
| 
 | ||||
| 	// URL path parameters will be fully decoded. | ||||
| 	UnescapingModeAllCharacters | ||||
| 
 | ||||
| 	// UnescapingModeDefault is the default escaping type. | ||||
| 	// TODO(v3): default this to UnescapingModeAllExceptReserved per grpc-httpjson-transcoding's | ||||
| 	// reference implementation | ||||
| 	UnescapingModeDefault = UnescapingModeLegacy | ||||
| ) | ||||
| 
 | ||||
| // A HandlerFunc handles a specific pair of path pattern and HTTP method. | ||||
| type HandlerFunc func(w http.ResponseWriter, r *http.Request, pathParams map[string]string) | ||||
| 
 | ||||
| // ErrUnknownURI is the error supplied to a custom ProtoErrorHandlerFunc when | ||||
| // a request is received with a URI path that does not match any registered | ||||
| // service method. | ||||
| // | ||||
| // Since gRPC servers return an "Unimplemented" code for requests with an | ||||
| // unrecognized URI path, this error also has a gRPC "Unimplemented" code. | ||||
| var ErrUnknownURI = status.Error(codes.Unimplemented, http.StatusText(http.StatusNotImplemented)) | ||||
| 
 | ||||
| // ServeMux is a request multiplexer for grpc-gateway. | ||||
| // It matches http requests to patterns and invokes the corresponding handler. | ||||
| type ServeMux struct { | ||||
| @@ -34,10 +53,11 @@ type ServeMux struct { | ||||
| 	incomingHeaderMatcher     HeaderMatcherFunc | ||||
| 	outgoingHeaderMatcher     HeaderMatcherFunc | ||||
| 	metadataAnnotators        []func(context.Context, *http.Request) metadata.MD | ||||
| 	errorHandler              ErrorHandlerFunc | ||||
| 	streamErrorHandler        StreamErrorHandlerFunc | ||||
| 	protoErrorHandler         ProtoErrorHandlerFunc | ||||
| 	routingErrorHandler       RoutingErrorHandlerFunc | ||||
| 	disablePathLengthFallback bool | ||||
| 	lastMatchWins             bool | ||||
| 	unescapingMode            UnescapingMode | ||||
| } | ||||
| 
 | ||||
| // ServeMuxOption is an option that can be given to a ServeMux on construction. | ||||
| @@ -55,8 +75,16 @@ func WithForwardResponseOption(forwardResponseOption func(context.Context, http. | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| // WithEscapingType sets the escaping type. See the definitions of UnescapingMode | ||||
| // for more information. | ||||
| func WithUnescapingMode(mode UnescapingMode) ServeMuxOption { | ||||
| 	return func(serveMux *ServeMux) { | ||||
| 		serveMux.unescapingMode = mode | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| // SetQueryParameterParser sets the query parameter parser, used to populate message from query parameters. | ||||
| // Configuring this will mean the generated swagger output is no longer correct, and it should be | ||||
| // Configuring this will mean the generated OpenAPI output is no longer correct, and it should be | ||||
| // done with careful consideration. | ||||
| func SetQueryParameterParser(queryParameterParser QueryParameterParser) ServeMuxOption { | ||||
| 	return func(serveMux *ServeMux) { | ||||
| @@ -111,14 +139,36 @@ func WithMetadata(annotator func(context.Context, *http.Request) metadata.MD) Se | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| // WithProtoErrorHandler returns a ServeMuxOption for configuring a custom error handler. | ||||
| // WithErrorHandler returns a ServeMuxOption for configuring a custom error handler. | ||||
| // | ||||
| // This can be used to handle an error as general proto message defined by gRPC. | ||||
| // When this option is used, the mux uses the configured error handler instead of HTTPError and | ||||
| // OtherErrorHandler. | ||||
| func WithProtoErrorHandler(fn ProtoErrorHandlerFunc) ServeMuxOption { | ||||
| // This can be used to configure a custom error response. | ||||
| func WithErrorHandler(fn ErrorHandlerFunc) ServeMuxOption { | ||||
| 	return func(serveMux *ServeMux) { | ||||
| 		serveMux.protoErrorHandler = fn | ||||
| 		serveMux.errorHandler = fn | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| // WithStreamErrorHandler returns a ServeMuxOption that will use the given custom stream | ||||
| // error handler, which allows for customizing the error trailer for server-streaming | ||||
| // calls. | ||||
| // | ||||
| // For stream errors that occur before any response has been written, the mux's | ||||
| // ErrorHandler will be invoked. However, once data has been written, the errors must | ||||
| // be handled differently: they must be included in the response body. The response body's | ||||
| // final message will include the error details returned by the stream error handler. | ||||
| func WithStreamErrorHandler(fn StreamErrorHandlerFunc) ServeMuxOption { | ||||
| 	return func(serveMux *ServeMux) { | ||||
| 		serveMux.streamErrorHandler = fn | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| // WithRoutingErrorHandler returns a ServeMuxOption for configuring a custom error handler to  handle http routing errors. | ||||
| // | ||||
| // Method called for errors which can happen before gRPC route selected or executed. | ||||
| // The following error codes: StatusMethodNotAllowed StatusNotFound StatusBadRequest | ||||
| func WithRoutingErrorHandler(fn RoutingErrorHandlerFunc) ServeMuxOption { | ||||
| 	return func(serveMux *ServeMux) { | ||||
| 		serveMux.routingErrorHandler = fn | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| @@ -129,36 +179,16 @@ func WithDisablePathLengthFallback() ServeMuxOption { | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| // WithStreamErrorHandler returns a ServeMuxOption that will use the given custom stream | ||||
| // error handler, which allows for customizing the error trailer for server-streaming | ||||
| // calls. | ||||
| // | ||||
| // For stream errors that occur before any response has been written, the mux's | ||||
| // ProtoErrorHandler will be invoked. However, once data has been written, the errors must | ||||
| // be handled differently: they must be included in the response body. The response body's | ||||
| // final message will include the error details returned by the stream error handler. | ||||
| func WithStreamErrorHandler(fn StreamErrorHandlerFunc) ServeMuxOption { | ||||
| 	return func(serveMux *ServeMux) { | ||||
| 		serveMux.streamErrorHandler = fn | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| // WithLastMatchWins returns a ServeMuxOption that will enable "last | ||||
| // match wins" behavior, where if multiple path patterns match a | ||||
| // request path, the last one defined in the .proto file will be used. | ||||
| func WithLastMatchWins() ServeMuxOption { | ||||
| 	return func(serveMux *ServeMux) { | ||||
| 		serveMux.lastMatchWins = true | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| // NewServeMux returns a new ServeMux whose internal mapping is empty. | ||||
| func NewServeMux(opts ...ServeMuxOption) *ServeMux { | ||||
| 	serveMux := &ServeMux{ | ||||
| 		handlers:               make(map[string][]handler), | ||||
| 		forwardResponseOptions: make([]func(context.Context, http.ResponseWriter, proto.Message) error, 0), | ||||
| 		marshalers:             makeMarshalerMIMERegistry(), | ||||
| 		streamErrorHandler:     DefaultHTTPStreamErrorHandler, | ||||
| 		errorHandler:           DefaultHTTPErrorHandler, | ||||
| 		streamErrorHandler:     DefaultStreamErrorHandler, | ||||
| 		routingErrorHandler:    DefaultRoutingErrorHandler, | ||||
| 		unescapingMode:         UnescapingModeDefault, | ||||
| 	} | ||||
| 
 | ||||
| 	for _, opt := range opts { | ||||
| @@ -180,11 +210,23 @@ func NewServeMux(opts ...ServeMuxOption) *ServeMux { | ||||
| 
 | ||||
| // Handle associates "h" to the pair of HTTP method and path pattern. | ||||
| func (s *ServeMux) Handle(meth string, pat Pattern, h HandlerFunc) { | ||||
| 	if s.lastMatchWins { | ||||
| 		s.handlers[meth] = append([]handler{handler{pat: pat, h: h}}, s.handlers[meth]...) | ||||
| 	} else { | ||||
| 		s.handlers[meth] = append(s.handlers[meth], handler{pat: pat, h: h}) | ||||
| 	s.handlers[meth] = append([]handler{{pat: pat, h: h}}, s.handlers[meth]...) | ||||
| } | ||||
| 
 | ||||
| // HandlePath allows users to configure custom path handlers. | ||||
| // refer: https://grpc-ecosystem.github.io/grpc-gateway/docs/operations/inject_router/ | ||||
| func (s *ServeMux) HandlePath(meth string, pathPattern string, h HandlerFunc) error { | ||||
| 	compiler, err := httprule.Parse(pathPattern) | ||||
| 	if err != nil { | ||||
| 		return fmt.Errorf("parsing path pattern: %w", err) | ||||
| 	} | ||||
| 	tp := compiler.Compile() | ||||
| 	pattern, err := NewPattern(tp.Version, tp.OpCodes, tp.Pool, tp.Verb) | ||||
| 	if err != nil { | ||||
| 		return fmt.Errorf("creating new pattern: %w", err) | ||||
| 	} | ||||
| 	s.Handle(meth, pattern, h) | ||||
| 	return nil | ||||
| } | ||||
| 
 | ||||
| // ServeHTTP dispatches the request to the first handler whose pattern matches to r.Method and r.Path. | ||||
| @@ -193,48 +235,66 @@ func (s *ServeMux) ServeHTTP(w http.ResponseWriter, r *http.Request) { | ||||
| 
 | ||||
| 	path := r.URL.Path | ||||
| 	if !strings.HasPrefix(path, "/") { | ||||
| 		if s.protoErrorHandler != nil { | ||||
| 			_, outboundMarshaler := MarshalerForRequest(s, r) | ||||
| 			sterr := status.Error(codes.InvalidArgument, http.StatusText(http.StatusBadRequest)) | ||||
| 			s.protoErrorHandler(ctx, s, outboundMarshaler, w, r, sterr) | ||||
| 		} else { | ||||
| 			OtherErrorHandler(w, r, http.StatusText(http.StatusBadRequest), http.StatusBadRequest) | ||||
| 		} | ||||
| 		_, outboundMarshaler := MarshalerForRequest(s, r) | ||||
| 		s.routingErrorHandler(ctx, s, outboundMarshaler, w, r, http.StatusBadRequest) | ||||
| 		return | ||||
| 	} | ||||
| 
 | ||||
| 	components := strings.Split(path[1:], "/") | ||||
| 	l := len(components) | ||||
| 	var verb string | ||||
| 	if idx := strings.LastIndex(components[l-1], ":"); idx == 0 { | ||||
| 		if s.protoErrorHandler != nil { | ||||
| 			_, outboundMarshaler := MarshalerForRequest(s, r) | ||||
| 			s.protoErrorHandler(ctx, s, outboundMarshaler, w, r, ErrUnknownURI) | ||||
| 		} else { | ||||
| 			OtherErrorHandler(w, r, http.StatusText(http.StatusNotFound), http.StatusNotFound) | ||||
| 		} | ||||
| 		return | ||||
| 	} else if idx > 0 { | ||||
| 		c := components[l-1] | ||||
| 		components[l-1], verb = c[:idx], c[idx+1:] | ||||
| 	// TODO(v3): remove UnescapingModeLegacy | ||||
| 	if s.unescapingMode != UnescapingModeLegacy && r.URL.RawPath != "" { | ||||
| 		path = r.URL.RawPath | ||||
| 	} | ||||
| 
 | ||||
| 	components := strings.Split(path[1:], "/") | ||||
| 
 | ||||
| 	if override := r.Header.Get("X-HTTP-Method-Override"); override != "" && s.isPathLengthFallback(r) { | ||||
| 		r.Method = strings.ToUpper(override) | ||||
| 		if err := r.ParseForm(); err != nil { | ||||
| 			if s.protoErrorHandler != nil { | ||||
| 				_, outboundMarshaler := MarshalerForRequest(s, r) | ||||
| 				sterr := status.Error(codes.InvalidArgument, err.Error()) | ||||
| 				s.protoErrorHandler(ctx, s, outboundMarshaler, w, r, sterr) | ||||
| 			} else { | ||||
| 				OtherErrorHandler(w, r, err.Error(), http.StatusBadRequest) | ||||
| 			} | ||||
| 			_, outboundMarshaler := MarshalerForRequest(s, r) | ||||
| 			sterr := status.Error(codes.InvalidArgument, err.Error()) | ||||
| 			s.errorHandler(ctx, s, outboundMarshaler, w, r, sterr) | ||||
| 			return | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	// Verb out here is to memoize for the fallback case below | ||||
| 	var verb string | ||||
| 
 | ||||
| 	for _, h := range s.handlers[r.Method] { | ||||
| 		pathParams, err := h.pat.Match(components, verb) | ||||
| 		// If the pattern has a verb, explicitly look for a suffix in the last | ||||
| 		// component that matches a colon plus the verb. This allows us to | ||||
| 		// handle some cases that otherwise can't be correctly handled by the | ||||
| 		// former LastIndex case, such as when the verb literal itself contains | ||||
| 		// a colon. This should work for all cases that have run through the | ||||
| 		// parser because we know what verb we're looking for, however, there | ||||
| 		// are still some cases that the parser itself cannot disambiguate. See | ||||
| 		// the comment there if interested. | ||||
| 		patVerb := h.pat.Verb() | ||||
| 		l := len(components) | ||||
| 		lastComponent := components[l-1] | ||||
| 		var idx int = -1 | ||||
| 		if patVerb != "" && strings.HasSuffix(lastComponent, ":"+patVerb) { | ||||
| 			idx = len(lastComponent) - len(patVerb) - 1 | ||||
| 		} | ||||
| 		if idx == 0 { | ||||
| 			_, outboundMarshaler := MarshalerForRequest(s, r) | ||||
| 			s.routingErrorHandler(ctx, s, outboundMarshaler, w, r, http.StatusNotFound) | ||||
| 			return | ||||
| 		} | ||||
| 		if idx > 0 { | ||||
| 			components[l-1], verb = lastComponent[:idx], lastComponent[idx+1:] | ||||
| 		} | ||||
| 
 | ||||
| 		pathParams, err := h.pat.MatchAndEscape(components, verb, s.unescapingMode) | ||||
| 		if err != nil { | ||||
| 			var mse MalformedSequenceError | ||||
| 			if ok := errors.As(err, &mse); ok { | ||||
| 				_, outboundMarshaler := MarshalerForRequest(s, r) | ||||
| 				s.errorHandler(ctx, s, outboundMarshaler, w, r, &HTTPStatusError{ | ||||
| 					HTTPStatus: http.StatusBadRequest, | ||||
| 					Err:        mse, | ||||
| 				}) | ||||
| 			} | ||||
| 			continue | ||||
| 		} | ||||
| 		h.h(w, r, pathParams) | ||||
| @@ -242,47 +302,43 @@ func (s *ServeMux) ServeHTTP(w http.ResponseWriter, r *http.Request) { | ||||
| 	} | ||||
| 
 | ||||
| 	// lookup other methods to handle fallback from GET to POST and | ||||
| 	// to determine if it is MethodNotAllowed or NotFound. | ||||
| 	// to determine if it is NotImplemented or NotFound. | ||||
| 	for m, handlers := range s.handlers { | ||||
| 		if m == r.Method { | ||||
| 			continue | ||||
| 		} | ||||
| 		for _, h := range handlers { | ||||
| 			pathParams, err := h.pat.Match(components, verb) | ||||
| 			pathParams, err := h.pat.MatchAndEscape(components, verb, s.unescapingMode) | ||||
| 			if err != nil { | ||||
| 				var mse MalformedSequenceError | ||||
| 				if ok := errors.As(err, &mse); ok { | ||||
| 					_, outboundMarshaler := MarshalerForRequest(s, r) | ||||
| 					s.errorHandler(ctx, s, outboundMarshaler, w, r, &HTTPStatusError{ | ||||
| 						HTTPStatus: http.StatusBadRequest, | ||||
| 						Err:        mse, | ||||
| 					}) | ||||
| 				} | ||||
| 				continue | ||||
| 			} | ||||
| 			// X-HTTP-Method-Override is optional. Always allow fallback to POST. | ||||
| 			if s.isPathLengthFallback(r) { | ||||
| 				if err := r.ParseForm(); err != nil { | ||||
| 					if s.protoErrorHandler != nil { | ||||
| 						_, outboundMarshaler := MarshalerForRequest(s, r) | ||||
| 						sterr := status.Error(codes.InvalidArgument, err.Error()) | ||||
| 						s.protoErrorHandler(ctx, s, outboundMarshaler, w, r, sterr) | ||||
| 					} else { | ||||
| 						OtherErrorHandler(w, r, err.Error(), http.StatusBadRequest) | ||||
| 					} | ||||
| 					_, outboundMarshaler := MarshalerForRequest(s, r) | ||||
| 					sterr := status.Error(codes.InvalidArgument, err.Error()) | ||||
| 					s.errorHandler(ctx, s, outboundMarshaler, w, r, sterr) | ||||
| 					return | ||||
| 				} | ||||
| 				h.h(w, r, pathParams) | ||||
| 				return | ||||
| 			} | ||||
| 			if s.protoErrorHandler != nil { | ||||
| 				_, outboundMarshaler := MarshalerForRequest(s, r) | ||||
| 				s.protoErrorHandler(ctx, s, outboundMarshaler, w, r, ErrUnknownURI) | ||||
| 			} else { | ||||
| 				OtherErrorHandler(w, r, http.StatusText(http.StatusMethodNotAllowed), http.StatusMethodNotAllowed) | ||||
| 			} | ||||
| 			_, outboundMarshaler := MarshalerForRequest(s, r) | ||||
| 			s.routingErrorHandler(ctx, s, outboundMarshaler, w, r, http.StatusMethodNotAllowed) | ||||
| 			return | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	if s.protoErrorHandler != nil { | ||||
| 		_, outboundMarshaler := MarshalerForRequest(s, r) | ||||
| 		s.protoErrorHandler(ctx, s, outboundMarshaler, w, r, ErrUnknownURI) | ||||
| 	} else { | ||||
| 		OtherErrorHandler(w, r, http.StatusText(http.StatusNotFound), http.StatusNotFound) | ||||
| 	} | ||||
| 	_, outboundMarshaler := MarshalerForRequest(s, r) | ||||
| 	s.routingErrorHandler(ctx, s, outboundMarshaler, w, r, http.StatusNotFound) | ||||
| } | ||||
| 
 | ||||
| // GetForwardResponseOptions returns the ForwardResponseOptions associated with this ServeMux. | ||||
| @@ -3,9 +3,10 @@ package runtime | ||||
| import ( | ||||
| 	"errors" | ||||
| 	"fmt" | ||||
| 	"strconv" | ||||
| 	"strings" | ||||
| 
 | ||||
| 	"github.com/grpc-ecosystem/grpc-gateway/utilities" | ||||
| 	"github.com/grpc-ecosystem/grpc-gateway/v2/utilities" | ||||
| 	"google.golang.org/grpc/grpclog" | ||||
| ) | ||||
| 
 | ||||
| @@ -14,14 +15,23 @@ var ( | ||||
| 	ErrNotMatch = errors.New("not match to the path pattern") | ||||
| 	// ErrInvalidPattern indicates that the given definition of Pattern is not valid. | ||||
| 	ErrInvalidPattern = errors.New("invalid pattern") | ||||
| 	// ErrMalformedSequence indicates that an escape sequence was malformed. | ||||
| 	ErrMalformedSequence = errors.New("malformed escape sequence") | ||||
| ) | ||||
| 
 | ||||
| type MalformedSequenceError string | ||||
| 
 | ||||
| func (e MalformedSequenceError) Error() string { | ||||
| 	return "malformed path escape " + strconv.Quote(string(e)) | ||||
| } | ||||
| 
 | ||||
| type op struct { | ||||
| 	code    utilities.OpCode | ||||
| 	operand int | ||||
| } | ||||
| 
 | ||||
| // Pattern is a template pattern of http request paths defined in github.com/googleapis/googleapis/google/api/http.proto. | ||||
| // Pattern is a template pattern of http request paths defined in | ||||
| // https://github.com/googleapis/googleapis/blob/master/google/api/http.proto | ||||
| type Pattern struct { | ||||
| 	// ops is a list of operations | ||||
| 	ops []op | ||||
| @@ -35,31 +45,14 @@ type Pattern struct { | ||||
| 	tailLen int | ||||
| 	// verb is the VERB part of the path pattern. It is empty if the pattern does not have VERB part. | ||||
| 	verb string | ||||
| 	// assumeColonVerb indicates whether a path suffix after a final | ||||
| 	// colon may only be interpreted as a verb. | ||||
| 	assumeColonVerb bool | ||||
| } | ||||
| 
 | ||||
| type patternOptions struct { | ||||
| 	assumeColonVerb bool | ||||
| } | ||||
| 
 | ||||
| // PatternOpt is an option for creating Patterns. | ||||
| type PatternOpt func(*patternOptions) | ||||
| 
 | ||||
| // NewPattern returns a new Pattern from the given definition values. | ||||
| // "ops" is a sequence of op codes. "pool" is a constant pool. | ||||
| // "verb" is the verb part of the pattern. It is empty if the pattern does not have the part. | ||||
| // "version" must be 1 for now. | ||||
| // It returns an error if the given definition is invalid. | ||||
| func NewPattern(version int, ops []int, pool []string, verb string, opts ...PatternOpt) (Pattern, error) { | ||||
| 	options := patternOptions{ | ||||
| 		assumeColonVerb: true, | ||||
| 	} | ||||
| 	for _, o := range opts { | ||||
| 		o(&options) | ||||
| 	} | ||||
| 
 | ||||
| func NewPattern(version int, ops []int, pool []string, verb string) (Pattern, error) { | ||||
| 	if version != 1 { | ||||
| 		grpclog.Infof("unsupported version: %d", version) | ||||
| 		return Pattern{}, ErrInvalidPattern | ||||
| @@ -111,7 +104,7 @@ func NewPattern(version int, ops []int, pool []string, verb string, opts ...Patt | ||||
| 			} | ||||
| 			stack -= op.operand | ||||
| 			if stack < 0 { | ||||
| 				grpclog.Print("stack underflow") | ||||
| 				grpclog.Info("stack underflow") | ||||
| 				return Pattern{}, ErrInvalidPattern | ||||
| 			} | ||||
| 			stack++ | ||||
| @@ -139,13 +132,12 @@ func NewPattern(version int, ops []int, pool []string, verb string, opts ...Patt | ||||
| 		typedOps = append(typedOps, op) | ||||
| 	} | ||||
| 	return Pattern{ | ||||
| 		ops:             typedOps, | ||||
| 		pool:            pool, | ||||
| 		vars:            vars, | ||||
| 		stacksize:       maxstack, | ||||
| 		tailLen:         tailLen, | ||||
| 		verb:            verb, | ||||
| 		assumeColonVerb: options.assumeColonVerb, | ||||
| 		ops:       typedOps, | ||||
| 		pool:      pool, | ||||
| 		vars:      vars, | ||||
| 		stacksize: maxstack, | ||||
| 		tailLen:   tailLen, | ||||
| 		verb:      verb, | ||||
| 	}, nil | ||||
| } | ||||
| 
 | ||||
| @@ -157,12 +149,13 @@ func MustPattern(p Pattern, err error) Pattern { | ||||
| 	return p | ||||
| } | ||||
| 
 | ||||
| // Match examines components if it matches to the Pattern. | ||||
| // If it matches, the function returns a mapping from field paths to their captured values. | ||||
| // If otherwise, the function returns an error. | ||||
| func (p Pattern) Match(components []string, verb string) (map[string]string, error) { | ||||
| // MatchAndEscape examines components to determine if they match to a Pattern. | ||||
| // MatchAndEscape will return an error if no Patterns matched or if a pattern | ||||
| // matched but contained malformed escape sequences. If successful, the function | ||||
| // returns a mapping from field paths to their captured values. | ||||
| func (p Pattern) MatchAndEscape(components []string, verb string, unescapingMode UnescapingMode) (map[string]string, error) { | ||||
| 	if p.verb != verb { | ||||
| 		if p.assumeColonVerb || p.verb != "" { | ||||
| 		if p.verb != "" { | ||||
| 			return nil, ErrNotMatch | ||||
| 		} | ||||
| 		if len(components) == 0 { | ||||
| @@ -171,7 +164,6 @@ func (p Pattern) Match(components []string, verb string) (map[string]string, err | ||||
| 			components = append([]string{}, components...) | ||||
| 			components[len(components)-1] += ":" + verb | ||||
| 		} | ||||
| 		verb = "" | ||||
| 	} | ||||
| 
 | ||||
| 	var pos int | ||||
| @@ -179,6 +171,8 @@ func (p Pattern) Match(components []string, verb string) (map[string]string, err | ||||
| 	captured := make([]string, len(p.vars)) | ||||
| 	l := len(components) | ||||
| 	for _, op := range p.ops { | ||||
| 		var err error | ||||
| 
 | ||||
| 		switch op.code { | ||||
| 		case utilities.OpNop: | ||||
| 			continue | ||||
| @@ -191,6 +185,10 @@ func (p Pattern) Match(components []string, verb string) (map[string]string, err | ||||
| 				if lit := p.pool[op.operand]; c != lit { | ||||
| 					return nil, ErrNotMatch | ||||
| 				} | ||||
| 			} else if op.code == utilities.OpPush { | ||||
| 				if c, err = unescape(c, unescapingMode, false); err != nil { | ||||
| 					return nil, err | ||||
| 				} | ||||
| 			} | ||||
| 			stack = append(stack, c) | ||||
| 			pos++ | ||||
| @@ -200,7 +198,11 @@ func (p Pattern) Match(components []string, verb string) (map[string]string, err | ||||
| 				return nil, ErrNotMatch | ||||
| 			} | ||||
| 			end -= p.tailLen | ||||
| 			stack = append(stack, strings.Join(components[pos:end], "/")) | ||||
| 			c := strings.Join(components[pos:end], "/") | ||||
| 			if c, err = unescape(c, unescapingMode, true); err != nil { | ||||
| 				return nil, err | ||||
| 			} | ||||
| 			stack = append(stack, c) | ||||
| 			pos = end | ||||
| 		case utilities.OpConcatN: | ||||
| 			n := op.operand | ||||
| @@ -222,6 +224,16 @@ func (p Pattern) Match(components []string, verb string) (map[string]string, err | ||||
| 	return bindings, nil | ||||
| } | ||||
| 
 | ||||
| // MatchAndEscape examines components to determine if they match to a Pattern. | ||||
| // It will never perform per-component unescaping (see: UnescapingModeLegacy). | ||||
| // MatchAndEscape will return an error if no Patterns matched. If successful, | ||||
| // the function returns a mapping from field paths to their captured values. | ||||
| // | ||||
| // Deprecated: Use MatchAndEscape. | ||||
| func (p Pattern) Match(components []string, verb string) (map[string]string, error) { | ||||
| 	return p.MatchAndEscape(components, verb, UnescapingModeDefault) | ||||
| } | ||||
| 
 | ||||
| // Verb returns the verb part of the Pattern. | ||||
| func (p Pattern) Verb() string { return p.verb } | ||||
| 
 | ||||
| @@ -253,10 +265,119 @@ func (p Pattern) String() string { | ||||
| 	return "/" + segs | ||||
| } | ||||
| 
 | ||||
| // AssumeColonVerbOpt indicates whether a path suffix after a final | ||||
| // colon may only be interpreted as a verb. | ||||
| func AssumeColonVerbOpt(val bool) PatternOpt { | ||||
| 	return PatternOpt(func(o *patternOptions) { | ||||
| 		o.assumeColonVerb = val | ||||
| 	}) | ||||
| /* | ||||
|  * The following code is adopted and modified from Go's standard library | ||||
|  * and carries the attached license. | ||||
|  * | ||||
|  *     Copyright 2009 The Go Authors. All rights reserved. | ||||
|  *     Use of this source code is governed by a BSD-style | ||||
|  *     license that can be found in the LICENSE file. | ||||
|  */ | ||||
| 
 | ||||
| // ishex returns whether or not the given byte is a valid hex character | ||||
| func ishex(c byte) bool { | ||||
| 	switch { | ||||
| 	case '0' <= c && c <= '9': | ||||
| 		return true | ||||
| 	case 'a' <= c && c <= 'f': | ||||
| 		return true | ||||
| 	case 'A' <= c && c <= 'F': | ||||
| 		return true | ||||
| 	} | ||||
| 	return false | ||||
| } | ||||
| 
 | ||||
| func isRFC6570Reserved(c byte) bool { | ||||
| 	switch c { | ||||
| 	case '!', '#', '$', '&', '\'', '(', ')', '*', | ||||
| 		'+', ',', '/', ':', ';', '=', '?', '@', '[', ']': | ||||
| 		return true | ||||
| 	default: | ||||
| 		return false | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| // unhex converts a hex point to the bit representation | ||||
| func unhex(c byte) byte { | ||||
| 	switch { | ||||
| 	case '0' <= c && c <= '9': | ||||
| 		return c - '0' | ||||
| 	case 'a' <= c && c <= 'f': | ||||
| 		return c - 'a' + 10 | ||||
| 	case 'A' <= c && c <= 'F': | ||||
| 		return c - 'A' + 10 | ||||
| 	} | ||||
| 	return 0 | ||||
| } | ||||
| 
 | ||||
| // shouldUnescapeWithMode returns true if the character is escapable with the | ||||
| // given mode | ||||
| func shouldUnescapeWithMode(c byte, mode UnescapingMode) bool { | ||||
| 	switch mode { | ||||
| 	case UnescapingModeAllExceptReserved: | ||||
| 		if isRFC6570Reserved(c) { | ||||
| 			return false | ||||
| 		} | ||||
| 	case UnescapingModeAllExceptSlash: | ||||
| 		if c == '/' { | ||||
| 			return false | ||||
| 		} | ||||
| 	case UnescapingModeAllCharacters: | ||||
| 		return true | ||||
| 	} | ||||
| 	return true | ||||
| } | ||||
| 
 | ||||
| // unescape unescapes a path string using the provided mode | ||||
| func unescape(s string, mode UnescapingMode, multisegment bool) (string, error) { | ||||
| 	// TODO(v3): remove UnescapingModeLegacy | ||||
| 	if mode == UnescapingModeLegacy { | ||||
| 		return s, nil | ||||
| 	} | ||||
| 
 | ||||
| 	if !multisegment { | ||||
| 		mode = UnescapingModeAllCharacters | ||||
| 	} | ||||
| 
 | ||||
| 	// Count %, check that they're well-formed. | ||||
| 	n := 0 | ||||
| 	for i := 0; i < len(s); { | ||||
| 		if s[i] == '%' { | ||||
| 			n++ | ||||
| 			if i+2 >= len(s) || !ishex(s[i+1]) || !ishex(s[i+2]) { | ||||
| 				s = s[i:] | ||||
| 				if len(s) > 3 { | ||||
| 					s = s[:3] | ||||
| 				} | ||||
| 
 | ||||
| 				return "", MalformedSequenceError(s) | ||||
| 			} | ||||
| 			i += 3 | ||||
| 		} else { | ||||
| 			i++ | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	if n == 0 { | ||||
| 		return s, nil | ||||
| 	} | ||||
| 
 | ||||
| 	var t strings.Builder | ||||
| 	t.Grow(len(s)) | ||||
| 	for i := 0; i < len(s); i++ { | ||||
| 		switch s[i] { | ||||
| 		case '%': | ||||
| 			c := unhex(s[i+1])<<4 | unhex(s[i+2]) | ||||
| 			if shouldUnescapeWithMode(c, mode) { | ||||
| 				t.WriteByte(c) | ||||
| 				i += 2 | ||||
| 				continue | ||||
| 			} | ||||
| 			fallthrough | ||||
| 		default: | ||||
| 			t.WriteByte(s[i]) | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	return t.String(), nil | ||||
| } | ||||
| @@ -1,7 +1,7 @@ | ||||
| package runtime | ||||
| 
 | ||||
| import ( | ||||
| 	"github.com/golang/protobuf/proto" | ||||
| 	"google.golang.org/protobuf/proto" | ||||
| ) | ||||
| 
 | ||||
| // StringP returns a pointer to a string whose pointee is same as the given string value. | ||||
							
								
								
									
										329
									
								
								vendor/github.com/grpc-ecosystem/grpc-gateway/v2/runtime/query.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										329
									
								
								vendor/github.com/grpc-ecosystem/grpc-gateway/v2/runtime/query.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,329 @@ | ||||
| package runtime | ||||
|  | ||||
| import ( | ||||
| 	"encoding/base64" | ||||
| 	"errors" | ||||
| 	"fmt" | ||||
| 	"net/url" | ||||
| 	"regexp" | ||||
| 	"strconv" | ||||
| 	"strings" | ||||
| 	"time" | ||||
|  | ||||
| 	"github.com/grpc-ecosystem/grpc-gateway/v2/utilities" | ||||
| 	"google.golang.org/genproto/protobuf/field_mask" | ||||
| 	"google.golang.org/grpc/grpclog" | ||||
| 	"google.golang.org/protobuf/proto" | ||||
| 	"google.golang.org/protobuf/reflect/protoreflect" | ||||
| 	"google.golang.org/protobuf/reflect/protoregistry" | ||||
| 	"google.golang.org/protobuf/types/known/durationpb" | ||||
| 	"google.golang.org/protobuf/types/known/timestamppb" | ||||
| 	"google.golang.org/protobuf/types/known/wrapperspb" | ||||
| ) | ||||
|  | ||||
| var valuesKeyRegexp = regexp.MustCompile(`^(.*)\[(.*)\]$`) | ||||
|  | ||||
| var currentQueryParser QueryParameterParser = &defaultQueryParser{} | ||||
|  | ||||
| // QueryParameterParser defines interface for all query parameter parsers | ||||
| type QueryParameterParser interface { | ||||
| 	Parse(msg proto.Message, values url.Values, filter *utilities.DoubleArray) error | ||||
| } | ||||
|  | ||||
| // PopulateQueryParameters parses query parameters | ||||
| // into "msg" using current query parser | ||||
| func PopulateQueryParameters(msg proto.Message, values url.Values, filter *utilities.DoubleArray) error { | ||||
| 	return currentQueryParser.Parse(msg, values, filter) | ||||
| } | ||||
|  | ||||
| type defaultQueryParser struct{} | ||||
|  | ||||
| // Parse populates "values" into "msg". | ||||
| // A value is ignored if its key starts with one of the elements in "filter". | ||||
| func (*defaultQueryParser) Parse(msg proto.Message, values url.Values, filter *utilities.DoubleArray) error { | ||||
| 	for key, values := range values { | ||||
| 		match := valuesKeyRegexp.FindStringSubmatch(key) | ||||
| 		if len(match) == 3 { | ||||
| 			key = match[1] | ||||
| 			values = append([]string{match[2]}, values...) | ||||
| 		} | ||||
| 		fieldPath := strings.Split(key, ".") | ||||
| 		if filter.HasCommonPrefix(fieldPath) { | ||||
| 			continue | ||||
| 		} | ||||
| 		if err := populateFieldValueFromPath(msg.ProtoReflect(), fieldPath, values); err != nil { | ||||
| 			return err | ||||
| 		} | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| // PopulateFieldFromPath sets a value in a nested Protobuf structure. | ||||
| func PopulateFieldFromPath(msg proto.Message, fieldPathString string, value string) error { | ||||
| 	fieldPath := strings.Split(fieldPathString, ".") | ||||
| 	return populateFieldValueFromPath(msg.ProtoReflect(), fieldPath, []string{value}) | ||||
| } | ||||
|  | ||||
| func populateFieldValueFromPath(msgValue protoreflect.Message, fieldPath []string, values []string) error { | ||||
| 	if len(fieldPath) < 1 { | ||||
| 		return errors.New("no field path") | ||||
| 	} | ||||
| 	if len(values) < 1 { | ||||
| 		return errors.New("no value provided") | ||||
| 	} | ||||
|  | ||||
| 	var fieldDescriptor protoreflect.FieldDescriptor | ||||
| 	for i, fieldName := range fieldPath { | ||||
| 		fields := msgValue.Descriptor().Fields() | ||||
|  | ||||
| 		// Get field by name | ||||
| 		fieldDescriptor = fields.ByName(protoreflect.Name(fieldName)) | ||||
| 		if fieldDescriptor == nil { | ||||
| 			fieldDescriptor = fields.ByJSONName(fieldName) | ||||
| 			if fieldDescriptor == nil { | ||||
| 				// We're not returning an error here because this could just be | ||||
| 				// an extra query parameter that isn't part of the request. | ||||
| 				grpclog.Infof("field not found in %q: %q", msgValue.Descriptor().FullName(), strings.Join(fieldPath, ".")) | ||||
| 				return nil | ||||
| 			} | ||||
| 		} | ||||
|  | ||||
| 		// If this is the last element, we're done | ||||
| 		if i == len(fieldPath)-1 { | ||||
| 			break | ||||
| 		} | ||||
|  | ||||
| 		// Only singular message fields are allowed | ||||
| 		if fieldDescriptor.Message() == nil || fieldDescriptor.Cardinality() == protoreflect.Repeated { | ||||
| 			return fmt.Errorf("invalid path: %q is not a message", fieldName) | ||||
| 		} | ||||
|  | ||||
| 		// Get the nested message | ||||
| 		msgValue = msgValue.Mutable(fieldDescriptor).Message() | ||||
| 	} | ||||
|  | ||||
| 	// Check if oneof already set | ||||
| 	if of := fieldDescriptor.ContainingOneof(); of != nil { | ||||
| 		if f := msgValue.WhichOneof(of); f != nil { | ||||
| 			return fmt.Errorf("field already set for oneof %q", of.FullName().Name()) | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	switch { | ||||
| 	case fieldDescriptor.IsList(): | ||||
| 		return populateRepeatedField(fieldDescriptor, msgValue.Mutable(fieldDescriptor).List(), values) | ||||
| 	case fieldDescriptor.IsMap(): | ||||
| 		return populateMapField(fieldDescriptor, msgValue.Mutable(fieldDescriptor).Map(), values) | ||||
| 	} | ||||
|  | ||||
| 	if len(values) > 1 { | ||||
| 		return fmt.Errorf("too many values for field %q: %s", fieldDescriptor.FullName().Name(), strings.Join(values, ", ")) | ||||
| 	} | ||||
|  | ||||
| 	return populateField(fieldDescriptor, msgValue, values[0]) | ||||
| } | ||||
|  | ||||
| func populateField(fieldDescriptor protoreflect.FieldDescriptor, msgValue protoreflect.Message, value string) error { | ||||
| 	v, err := parseField(fieldDescriptor, value) | ||||
| 	if err != nil { | ||||
| 		return fmt.Errorf("parsing field %q: %w", fieldDescriptor.FullName().Name(), err) | ||||
| 	} | ||||
|  | ||||
| 	msgValue.Set(fieldDescriptor, v) | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| func populateRepeatedField(fieldDescriptor protoreflect.FieldDescriptor, list protoreflect.List, values []string) error { | ||||
| 	for _, value := range values { | ||||
| 		v, err := parseField(fieldDescriptor, value) | ||||
| 		if err != nil { | ||||
| 			return fmt.Errorf("parsing list %q: %w", fieldDescriptor.FullName().Name(), err) | ||||
| 		} | ||||
| 		list.Append(v) | ||||
| 	} | ||||
|  | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| func populateMapField(fieldDescriptor protoreflect.FieldDescriptor, mp protoreflect.Map, values []string) error { | ||||
| 	if len(values) != 2 { | ||||
| 		return fmt.Errorf("more than one value provided for key %q in map %q", values[0], fieldDescriptor.FullName()) | ||||
| 	} | ||||
|  | ||||
| 	key, err := parseField(fieldDescriptor.MapKey(), values[0]) | ||||
| 	if err != nil { | ||||
| 		return fmt.Errorf("parsing map key %q: %w", fieldDescriptor.FullName().Name(), err) | ||||
| 	} | ||||
|  | ||||
| 	value, err := parseField(fieldDescriptor.MapValue(), values[1]) | ||||
| 	if err != nil { | ||||
| 		return fmt.Errorf("parsing map value %q: %w", fieldDescriptor.FullName().Name(), err) | ||||
| 	} | ||||
|  | ||||
| 	mp.Set(key.MapKey(), value) | ||||
|  | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| func parseField(fieldDescriptor protoreflect.FieldDescriptor, value string) (protoreflect.Value, error) { | ||||
| 	switch fieldDescriptor.Kind() { | ||||
| 	case protoreflect.BoolKind: | ||||
| 		v, err := strconv.ParseBool(value) | ||||
| 		if err != nil { | ||||
| 			return protoreflect.Value{}, err | ||||
| 		} | ||||
| 		return protoreflect.ValueOfBool(v), nil | ||||
| 	case protoreflect.EnumKind: | ||||
| 		enum, err := protoregistry.GlobalTypes.FindEnumByName(fieldDescriptor.Enum().FullName()) | ||||
| 		switch { | ||||
| 		case errors.Is(err, protoregistry.NotFound): | ||||
| 			return protoreflect.Value{}, fmt.Errorf("enum %q is not registered", fieldDescriptor.Enum().FullName()) | ||||
| 		case err != nil: | ||||
| 			return protoreflect.Value{}, fmt.Errorf("failed to look up enum: %w", err) | ||||
| 		} | ||||
| 		// Look for enum by name | ||||
| 		v := enum.Descriptor().Values().ByName(protoreflect.Name(value)) | ||||
| 		if v == nil { | ||||
| 			i, err := strconv.Atoi(value) | ||||
| 			if err != nil { | ||||
| 				return protoreflect.Value{}, fmt.Errorf("%q is not a valid value", value) | ||||
| 			} | ||||
| 			// Look for enum by number | ||||
| 			v = enum.Descriptor().Values().ByNumber(protoreflect.EnumNumber(i)) | ||||
| 			if v == nil { | ||||
| 				return protoreflect.Value{}, fmt.Errorf("%q is not a valid value", value) | ||||
| 			} | ||||
| 		} | ||||
| 		return protoreflect.ValueOfEnum(v.Number()), nil | ||||
| 	case protoreflect.Int32Kind, protoreflect.Sint32Kind, protoreflect.Sfixed32Kind: | ||||
| 		v, err := strconv.ParseInt(value, 10, 32) | ||||
| 		if err != nil { | ||||
| 			return protoreflect.Value{}, err | ||||
| 		} | ||||
| 		return protoreflect.ValueOfInt32(int32(v)), nil | ||||
| 	case protoreflect.Int64Kind, protoreflect.Sint64Kind, protoreflect.Sfixed64Kind: | ||||
| 		v, err := strconv.ParseInt(value, 10, 64) | ||||
| 		if err != nil { | ||||
| 			return protoreflect.Value{}, err | ||||
| 		} | ||||
| 		return protoreflect.ValueOfInt64(v), nil | ||||
| 	case protoreflect.Uint32Kind, protoreflect.Fixed32Kind: | ||||
| 		v, err := strconv.ParseUint(value, 10, 32) | ||||
| 		if err != nil { | ||||
| 			return protoreflect.Value{}, err | ||||
| 		} | ||||
| 		return protoreflect.ValueOfUint32(uint32(v)), nil | ||||
| 	case protoreflect.Uint64Kind, protoreflect.Fixed64Kind: | ||||
| 		v, err := strconv.ParseUint(value, 10, 64) | ||||
| 		if err != nil { | ||||
| 			return protoreflect.Value{}, err | ||||
| 		} | ||||
| 		return protoreflect.ValueOfUint64(v), nil | ||||
| 	case protoreflect.FloatKind: | ||||
| 		v, err := strconv.ParseFloat(value, 32) | ||||
| 		if err != nil { | ||||
| 			return protoreflect.Value{}, err | ||||
| 		} | ||||
| 		return protoreflect.ValueOfFloat32(float32(v)), nil | ||||
| 	case protoreflect.DoubleKind: | ||||
| 		v, err := strconv.ParseFloat(value, 64) | ||||
| 		if err != nil { | ||||
| 			return protoreflect.Value{}, err | ||||
| 		} | ||||
| 		return protoreflect.ValueOfFloat64(v), nil | ||||
| 	case protoreflect.StringKind: | ||||
| 		return protoreflect.ValueOfString(value), nil | ||||
| 	case protoreflect.BytesKind: | ||||
| 		v, err := base64.URLEncoding.DecodeString(value) | ||||
| 		if err != nil { | ||||
| 			return protoreflect.Value{}, err | ||||
| 		} | ||||
| 		return protoreflect.ValueOfBytes(v), nil | ||||
| 	case protoreflect.MessageKind, protoreflect.GroupKind: | ||||
| 		return parseMessage(fieldDescriptor.Message(), value) | ||||
| 	default: | ||||
| 		panic(fmt.Sprintf("unknown field kind: %v", fieldDescriptor.Kind())) | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func parseMessage(msgDescriptor protoreflect.MessageDescriptor, value string) (protoreflect.Value, error) { | ||||
| 	var msg proto.Message | ||||
| 	switch msgDescriptor.FullName() { | ||||
| 	case "google.protobuf.Timestamp": | ||||
| 		if value == "null" { | ||||
| 			break | ||||
| 		} | ||||
| 		t, err := time.Parse(time.RFC3339Nano, value) | ||||
| 		if err != nil { | ||||
| 			return protoreflect.Value{}, err | ||||
| 		} | ||||
| 		msg = timestamppb.New(t) | ||||
| 	case "google.protobuf.Duration": | ||||
| 		if value == "null" { | ||||
| 			break | ||||
| 		} | ||||
| 		d, err := time.ParseDuration(value) | ||||
| 		if err != nil { | ||||
| 			return protoreflect.Value{}, err | ||||
| 		} | ||||
| 		msg = durationpb.New(d) | ||||
| 	case "google.protobuf.DoubleValue": | ||||
| 		v, err := strconv.ParseFloat(value, 64) | ||||
| 		if err != nil { | ||||
| 			return protoreflect.Value{}, err | ||||
| 		} | ||||
| 		msg = &wrapperspb.DoubleValue{Value: v} | ||||
| 	case "google.protobuf.FloatValue": | ||||
| 		v, err := strconv.ParseFloat(value, 32) | ||||
| 		if err != nil { | ||||
| 			return protoreflect.Value{}, err | ||||
| 		} | ||||
| 		msg = &wrapperspb.FloatValue{Value: float32(v)} | ||||
| 	case "google.protobuf.Int64Value": | ||||
| 		v, err := strconv.ParseInt(value, 10, 64) | ||||
| 		if err != nil { | ||||
| 			return protoreflect.Value{}, err | ||||
| 		} | ||||
| 		msg = &wrapperspb.Int64Value{Value: v} | ||||
| 	case "google.protobuf.Int32Value": | ||||
| 		v, err := strconv.ParseInt(value, 10, 32) | ||||
| 		if err != nil { | ||||
| 			return protoreflect.Value{}, err | ||||
| 		} | ||||
| 		msg = &wrapperspb.Int32Value{Value: int32(v)} | ||||
| 	case "google.protobuf.UInt64Value": | ||||
| 		v, err := strconv.ParseUint(value, 10, 64) | ||||
| 		if err != nil { | ||||
| 			return protoreflect.Value{}, err | ||||
| 		} | ||||
| 		msg = &wrapperspb.UInt64Value{Value: v} | ||||
| 	case "google.protobuf.UInt32Value": | ||||
| 		v, err := strconv.ParseUint(value, 10, 32) | ||||
| 		if err != nil { | ||||
| 			return protoreflect.Value{}, err | ||||
| 		} | ||||
| 		msg = &wrapperspb.UInt32Value{Value: uint32(v)} | ||||
| 	case "google.protobuf.BoolValue": | ||||
| 		v, err := strconv.ParseBool(value) | ||||
| 		if err != nil { | ||||
| 			return protoreflect.Value{}, err | ||||
| 		} | ||||
| 		msg = &wrapperspb.BoolValue{Value: v} | ||||
| 	case "google.protobuf.StringValue": | ||||
| 		msg = &wrapperspb.StringValue{Value: value} | ||||
| 	case "google.protobuf.BytesValue": | ||||
| 		v, err := base64.URLEncoding.DecodeString(value) | ||||
| 		if err != nil { | ||||
| 			return protoreflect.Value{}, err | ||||
| 		} | ||||
| 		msg = &wrapperspb.BytesValue{Value: v} | ||||
| 	case "google.protobuf.FieldMask": | ||||
| 		fm := &field_mask.FieldMask{} | ||||
| 		fm.Paths = append(fm.Paths, strings.Split(value, ",")...) | ||||
| 		msg = fm | ||||
| 	default: | ||||
| 		return protoreflect.Value{}, fmt.Errorf("unsupported message type: %q", string(msgDescriptor.FullName())) | ||||
| 	} | ||||
|  | ||||
| 	return protoreflect.ValueOfMessage(msg.ProtoReflect()), nil | ||||
| } | ||||
| @@ -3,19 +3,25 @@ load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") | ||||
| package(default_visibility = ["//visibility:public"]) | ||||
| 
 | ||||
| go_library( | ||||
|     name = "go_default_library", | ||||
|     name = "utilities", | ||||
|     srcs = [ | ||||
|         "doc.go", | ||||
|         "pattern.go", | ||||
|         "readerfactory.go", | ||||
|         "trie.go", | ||||
|     ], | ||||
|     importpath = "github.com/grpc-ecosystem/grpc-gateway/utilities", | ||||
|     importpath = "github.com/grpc-ecosystem/grpc-gateway/v2/utilities", | ||||
| ) | ||||
| 
 | ||||
| go_test( | ||||
|     name = "go_default_test", | ||||
|     name = "utilities_test", | ||||
|     size = "small", | ||||
|     srcs = ["trie_test.go"], | ||||
|     embed = [":go_default_library"], | ||||
|     deps = [":utilities"], | ||||
| ) | ||||
| 
 | ||||
| alias( | ||||
|     name = "go_default_library", | ||||
|     actual = ":utilities", | ||||
|     visibility = ["//visibility:public"], | ||||
| ) | ||||
| @@ -145,10 +145,7 @@ func (l byLex) Less(i, j int) bool { | ||||
| 			return false | ||||
| 		} | ||||
| 	} | ||||
| 	if k < len(sj) { | ||||
| 		return true | ||||
| 	} | ||||
| 	return false | ||||
| 	return k < len(sj) | ||||
| } | ||||
| 
 | ||||
| // HasCommonPrefix determines if any sequence in the DoubleArray is a prefix of the given sequence. | ||||
							
								
								
									
										54
									
								
								vendor/github.com/stretchr/testify/assert/assertion_compare.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										54
									
								
								vendor/github.com/stretchr/testify/assert/assertion_compare.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -3,6 +3,7 @@ package assert | ||||
| import ( | ||||
| 	"fmt" | ||||
| 	"reflect" | ||||
| 	"time" | ||||
| ) | ||||
|  | ||||
| type CompareType int | ||||
| @@ -30,6 +31,8 @@ var ( | ||||
| 	float64Type = reflect.TypeOf(float64(1)) | ||||
|  | ||||
| 	stringType = reflect.TypeOf("") | ||||
|  | ||||
| 	timeType = reflect.TypeOf(time.Time{}) | ||||
| ) | ||||
|  | ||||
| func compare(obj1, obj2 interface{}, kind reflect.Kind) (CompareType, bool) { | ||||
| @@ -299,6 +302,27 @@ func compare(obj1, obj2 interface{}, kind reflect.Kind) (CompareType, bool) { | ||||
| 				return compareLess, true | ||||
| 			} | ||||
| 		} | ||||
| 	// Check for known struct types we can check for compare results. | ||||
| 	case reflect.Struct: | ||||
| 		{ | ||||
| 			// All structs enter here. We're not interested in most types. | ||||
| 			if !canConvert(obj1Value, timeType) { | ||||
| 				break | ||||
| 			} | ||||
|  | ||||
| 			// time.Time can compared! | ||||
| 			timeObj1, ok := obj1.(time.Time) | ||||
| 			if !ok { | ||||
| 				timeObj1 = obj1Value.Convert(timeType).Interface().(time.Time) | ||||
| 			} | ||||
|  | ||||
| 			timeObj2, ok := obj2.(time.Time) | ||||
| 			if !ok { | ||||
| 				timeObj2 = obj2Value.Convert(timeType).Interface().(time.Time) | ||||
| 			} | ||||
|  | ||||
| 			return compare(timeObj1.UnixNano(), timeObj2.UnixNano(), reflect.Int64) | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	return compareEqual, false | ||||
| @@ -310,7 +334,10 @@ func compare(obj1, obj2 interface{}, kind reflect.Kind) (CompareType, bool) { | ||||
| //    assert.Greater(t, float64(2), float64(1)) | ||||
| //    assert.Greater(t, "b", "a") | ||||
| func Greater(t TestingT, e1 interface{}, e2 interface{}, msgAndArgs ...interface{}) bool { | ||||
| 	return compareTwoValues(t, e1, e2, []CompareType{compareGreater}, "\"%v\" is not greater than \"%v\"", msgAndArgs) | ||||
| 	if h, ok := t.(tHelper); ok { | ||||
| 		h.Helper() | ||||
| 	} | ||||
| 	return compareTwoValues(t, e1, e2, []CompareType{compareGreater}, "\"%v\" is not greater than \"%v\"", msgAndArgs...) | ||||
| } | ||||
|  | ||||
| // GreaterOrEqual asserts that the first element is greater than or equal to the second | ||||
| @@ -320,7 +347,10 @@ func Greater(t TestingT, e1 interface{}, e2 interface{}, msgAndArgs ...interface | ||||
| //    assert.GreaterOrEqual(t, "b", "a") | ||||
| //    assert.GreaterOrEqual(t, "b", "b") | ||||
| func GreaterOrEqual(t TestingT, e1 interface{}, e2 interface{}, msgAndArgs ...interface{}) bool { | ||||
| 	return compareTwoValues(t, e1, e2, []CompareType{compareGreater, compareEqual}, "\"%v\" is not greater than or equal to \"%v\"", msgAndArgs) | ||||
| 	if h, ok := t.(tHelper); ok { | ||||
| 		h.Helper() | ||||
| 	} | ||||
| 	return compareTwoValues(t, e1, e2, []CompareType{compareGreater, compareEqual}, "\"%v\" is not greater than or equal to \"%v\"", msgAndArgs...) | ||||
| } | ||||
|  | ||||
| // Less asserts that the first element is less than the second | ||||
| @@ -329,7 +359,10 @@ func GreaterOrEqual(t TestingT, e1 interface{}, e2 interface{}, msgAndArgs ...in | ||||
| //    assert.Less(t, float64(1), float64(2)) | ||||
| //    assert.Less(t, "a", "b") | ||||
| func Less(t TestingT, e1 interface{}, e2 interface{}, msgAndArgs ...interface{}) bool { | ||||
| 	return compareTwoValues(t, e1, e2, []CompareType{compareLess}, "\"%v\" is not less than \"%v\"", msgAndArgs) | ||||
| 	if h, ok := t.(tHelper); ok { | ||||
| 		h.Helper() | ||||
| 	} | ||||
| 	return compareTwoValues(t, e1, e2, []CompareType{compareLess}, "\"%v\" is not less than \"%v\"", msgAndArgs...) | ||||
| } | ||||
|  | ||||
| // LessOrEqual asserts that the first element is less than or equal to the second | ||||
| @@ -339,7 +372,10 @@ func Less(t TestingT, e1 interface{}, e2 interface{}, msgAndArgs ...interface{}) | ||||
| //    assert.LessOrEqual(t, "a", "b") | ||||
| //    assert.LessOrEqual(t, "b", "b") | ||||
| func LessOrEqual(t TestingT, e1 interface{}, e2 interface{}, msgAndArgs ...interface{}) bool { | ||||
| 	return compareTwoValues(t, e1, e2, []CompareType{compareLess, compareEqual}, "\"%v\" is not less than or equal to \"%v\"", msgAndArgs) | ||||
| 	if h, ok := t.(tHelper); ok { | ||||
| 		h.Helper() | ||||
| 	} | ||||
| 	return compareTwoValues(t, e1, e2, []CompareType{compareLess, compareEqual}, "\"%v\" is not less than or equal to \"%v\"", msgAndArgs...) | ||||
| } | ||||
|  | ||||
| // Positive asserts that the specified element is positive | ||||
| @@ -347,8 +383,11 @@ func LessOrEqual(t TestingT, e1 interface{}, e2 interface{}, msgAndArgs ...inter | ||||
| //    assert.Positive(t, 1) | ||||
| //    assert.Positive(t, 1.23) | ||||
| func Positive(t TestingT, e interface{}, msgAndArgs ...interface{}) bool { | ||||
| 	if h, ok := t.(tHelper); ok { | ||||
| 		h.Helper() | ||||
| 	} | ||||
| 	zero := reflect.Zero(reflect.TypeOf(e)) | ||||
| 	return compareTwoValues(t, e, zero.Interface(), []CompareType{compareGreater}, "\"%v\" is not positive", msgAndArgs) | ||||
| 	return compareTwoValues(t, e, zero.Interface(), []CompareType{compareGreater}, "\"%v\" is not positive", msgAndArgs...) | ||||
| } | ||||
|  | ||||
| // Negative asserts that the specified element is negative | ||||
| @@ -356,8 +395,11 @@ func Positive(t TestingT, e interface{}, msgAndArgs ...interface{}) bool { | ||||
| //    assert.Negative(t, -1) | ||||
| //    assert.Negative(t, -1.23) | ||||
| func Negative(t TestingT, e interface{}, msgAndArgs ...interface{}) bool { | ||||
| 	if h, ok := t.(tHelper); ok { | ||||
| 		h.Helper() | ||||
| 	} | ||||
| 	zero := reflect.Zero(reflect.TypeOf(e)) | ||||
| 	return compareTwoValues(t, e, zero.Interface(), []CompareType{compareLess}, "\"%v\" is not negative", msgAndArgs) | ||||
| 	return compareTwoValues(t, e, zero.Interface(), []CompareType{compareLess}, "\"%v\" is not negative", msgAndArgs...) | ||||
| } | ||||
|  | ||||
| func compareTwoValues(t TestingT, e1 interface{}, e2 interface{}, allowedComparesResults []CompareType, failMessage string, msgAndArgs ...interface{}) bool { | ||||
|   | ||||
							
								
								
									
										16
									
								
								vendor/github.com/stretchr/testify/assert/assertion_compare_can_convert.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										16
									
								
								vendor/github.com/stretchr/testify/assert/assertion_compare_can_convert.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,16 @@ | ||||
| //go:build go1.17 | ||||
| // +build go1.17 | ||||
|  | ||||
| // TODO: once support for Go 1.16 is dropped, this file can be | ||||
| //       merged/removed with assertion_compare_go1.17_test.go and | ||||
| //       assertion_compare_legacy.go | ||||
|  | ||||
| package assert | ||||
|  | ||||
| import "reflect" | ||||
|  | ||||
| // Wrapper around reflect.Value.CanConvert, for compatability | ||||
| // reasons. | ||||
| func canConvert(value reflect.Value, to reflect.Type) bool { | ||||
| 	return value.CanConvert(to) | ||||
| } | ||||
							
								
								
									
										16
									
								
								vendor/github.com/stretchr/testify/assert/assertion_compare_legacy.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										16
									
								
								vendor/github.com/stretchr/testify/assert/assertion_compare_legacy.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,16 @@ | ||||
| //go:build !go1.17 | ||||
| // +build !go1.17 | ||||
|  | ||||
| // TODO: once support for Go 1.16 is dropped, this file can be | ||||
| //       merged/removed with assertion_compare_go1.17_test.go and | ||||
| //       assertion_compare_can_convert.go | ||||
|  | ||||
| package assert | ||||
|  | ||||
| import "reflect" | ||||
|  | ||||
| // Older versions of Go does not have the reflect.Value.CanConvert | ||||
| // method. | ||||
| func canConvert(value reflect.Value, to reflect.Type) bool { | ||||
| 	return false | ||||
| } | ||||
							
								
								
									
										12
									
								
								vendor/github.com/stretchr/testify/assert/assertion_format.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										12
									
								
								vendor/github.com/stretchr/testify/assert/assertion_format.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -123,6 +123,18 @@ func ErrorAsf(t TestingT, err error, target interface{}, msg string, args ...int | ||||
| 	return ErrorAs(t, err, target, append([]interface{}{msg}, args...)...) | ||||
| } | ||||
|  | ||||
| // ErrorContainsf asserts that a function returned an error (i.e. not `nil`) | ||||
| // and that the error contains the specified substring. | ||||
| // | ||||
| //   actualObj, err := SomeFunction() | ||||
| //   assert.ErrorContainsf(t, err,  expectedErrorSubString, "error message %s", "formatted") | ||||
| func ErrorContainsf(t TestingT, theError error, contains string, msg string, args ...interface{}) bool { | ||||
| 	if h, ok := t.(tHelper); ok { | ||||
| 		h.Helper() | ||||
| 	} | ||||
| 	return ErrorContains(t, theError, contains, append([]interface{}{msg}, args...)...) | ||||
| } | ||||
|  | ||||
| // ErrorIsf asserts that at least one of the errors in err's chain matches target. | ||||
| // This is a wrapper for errors.Is. | ||||
| func ErrorIsf(t TestingT, err error, target error, msg string, args ...interface{}) bool { | ||||
|   | ||||
							
								
								
									
										24
									
								
								vendor/github.com/stretchr/testify/assert/assertion_forward.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										24
									
								
								vendor/github.com/stretchr/testify/assert/assertion_forward.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -222,6 +222,30 @@ func (a *Assertions) ErrorAsf(err error, target interface{}, msg string, args .. | ||||
| 	return ErrorAsf(a.t, err, target, msg, args...) | ||||
| } | ||||
|  | ||||
| // ErrorContains asserts that a function returned an error (i.e. not `nil`) | ||||
| // and that the error contains the specified substring. | ||||
| // | ||||
| //   actualObj, err := SomeFunction() | ||||
| //   a.ErrorContains(err,  expectedErrorSubString) | ||||
| func (a *Assertions) ErrorContains(theError error, contains string, msgAndArgs ...interface{}) bool { | ||||
| 	if h, ok := a.t.(tHelper); ok { | ||||
| 		h.Helper() | ||||
| 	} | ||||
| 	return ErrorContains(a.t, theError, contains, msgAndArgs...) | ||||
| } | ||||
|  | ||||
| // ErrorContainsf asserts that a function returned an error (i.e. not `nil`) | ||||
| // and that the error contains the specified substring. | ||||
| // | ||||
| //   actualObj, err := SomeFunction() | ||||
| //   a.ErrorContainsf(err,  expectedErrorSubString, "error message %s", "formatted") | ||||
| func (a *Assertions) ErrorContainsf(theError error, contains string, msg string, args ...interface{}) bool { | ||||
| 	if h, ok := a.t.(tHelper); ok { | ||||
| 		h.Helper() | ||||
| 	} | ||||
| 	return ErrorContainsf(a.t, theError, contains, msg, args...) | ||||
| } | ||||
|  | ||||
| // ErrorIs asserts that at least one of the errors in err's chain matches target. | ||||
| // This is a wrapper for errors.Is. | ||||
| func (a *Assertions) ErrorIs(err error, target error, msgAndArgs ...interface{}) bool { | ||||
|   | ||||
							
								
								
									
										8
									
								
								vendor/github.com/stretchr/testify/assert/assertion_order.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										8
									
								
								vendor/github.com/stretchr/testify/assert/assertion_order.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -50,7 +50,7 @@ func isOrdered(t TestingT, object interface{}, allowedComparesResults []CompareT | ||||
| //    assert.IsIncreasing(t, []float{1, 2}) | ||||
| //    assert.IsIncreasing(t, []string{"a", "b"}) | ||||
| func IsIncreasing(t TestingT, object interface{}, msgAndArgs ...interface{}) bool { | ||||
| 	return isOrdered(t, object, []CompareType{compareLess}, "\"%v\" is not less than \"%v\"", msgAndArgs) | ||||
| 	return isOrdered(t, object, []CompareType{compareLess}, "\"%v\" is not less than \"%v\"", msgAndArgs...) | ||||
| } | ||||
|  | ||||
| // IsNonIncreasing asserts that the collection is not increasing | ||||
| @@ -59,7 +59,7 @@ func IsIncreasing(t TestingT, object interface{}, msgAndArgs ...interface{}) boo | ||||
| //    assert.IsNonIncreasing(t, []float{2, 1}) | ||||
| //    assert.IsNonIncreasing(t, []string{"b", "a"}) | ||||
| func IsNonIncreasing(t TestingT, object interface{}, msgAndArgs ...interface{}) bool { | ||||
| 	return isOrdered(t, object, []CompareType{compareEqual, compareGreater}, "\"%v\" is not greater than or equal to \"%v\"", msgAndArgs) | ||||
| 	return isOrdered(t, object, []CompareType{compareEqual, compareGreater}, "\"%v\" is not greater than or equal to \"%v\"", msgAndArgs...) | ||||
| } | ||||
|  | ||||
| // IsDecreasing asserts that the collection is decreasing | ||||
| @@ -68,7 +68,7 @@ func IsNonIncreasing(t TestingT, object interface{}, msgAndArgs ...interface{}) | ||||
| //    assert.IsDecreasing(t, []float{2, 1}) | ||||
| //    assert.IsDecreasing(t, []string{"b", "a"}) | ||||
| func IsDecreasing(t TestingT, object interface{}, msgAndArgs ...interface{}) bool { | ||||
| 	return isOrdered(t, object, []CompareType{compareGreater}, "\"%v\" is not greater than \"%v\"", msgAndArgs) | ||||
| 	return isOrdered(t, object, []CompareType{compareGreater}, "\"%v\" is not greater than \"%v\"", msgAndArgs...) | ||||
| } | ||||
|  | ||||
| // IsNonDecreasing asserts that the collection is not decreasing | ||||
| @@ -77,5 +77,5 @@ func IsDecreasing(t TestingT, object interface{}, msgAndArgs ...interface{}) boo | ||||
| //    assert.IsNonDecreasing(t, []float{1, 2}) | ||||
| //    assert.IsNonDecreasing(t, []string{"a", "b"}) | ||||
| func IsNonDecreasing(t TestingT, object interface{}, msgAndArgs ...interface{}) bool { | ||||
| 	return isOrdered(t, object, []CompareType{compareLess, compareEqual}, "\"%v\" is not less than or equal to \"%v\"", msgAndArgs) | ||||
| 	return isOrdered(t, object, []CompareType{compareLess, compareEqual}, "\"%v\" is not less than or equal to \"%v\"", msgAndArgs...) | ||||
| } | ||||
|   | ||||
							
								
								
									
										112
									
								
								vendor/github.com/stretchr/testify/assert/assertions.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										112
									
								
								vendor/github.com/stretchr/testify/assert/assertions.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -718,10 +718,14 @@ func NotEqualValues(t TestingT, expected, actual interface{}, msgAndArgs ...inte | ||||
| // return (false, false) if impossible. | ||||
| // return (true, false) if element was not found. | ||||
| // return (true, true) if element was found. | ||||
| func includeElement(list interface{}, element interface{}) (ok, found bool) { | ||||
| func containsElement(list interface{}, element interface{}) (ok, found bool) { | ||||
|  | ||||
| 	listValue := reflect.ValueOf(list) | ||||
| 	listKind := reflect.TypeOf(list).Kind() | ||||
| 	listType := reflect.TypeOf(list) | ||||
| 	if listType == nil { | ||||
| 		return false, false | ||||
| 	} | ||||
| 	listKind := listType.Kind() | ||||
| 	defer func() { | ||||
| 		if e := recover(); e != nil { | ||||
| 			ok = false | ||||
| @@ -764,7 +768,7 @@ func Contains(t TestingT, s, contains interface{}, msgAndArgs ...interface{}) bo | ||||
| 		h.Helper() | ||||
| 	} | ||||
|  | ||||
| 	ok, found := includeElement(s, contains) | ||||
| 	ok, found := containsElement(s, contains) | ||||
| 	if !ok { | ||||
| 		return Fail(t, fmt.Sprintf("%#v could not be applied builtin len()", s), msgAndArgs...) | ||||
| 	} | ||||
| @@ -787,7 +791,7 @@ func NotContains(t TestingT, s, contains interface{}, msgAndArgs ...interface{}) | ||||
| 		h.Helper() | ||||
| 	} | ||||
|  | ||||
| 	ok, found := includeElement(s, contains) | ||||
| 	ok, found := containsElement(s, contains) | ||||
| 	if !ok { | ||||
| 		return Fail(t, fmt.Sprintf("\"%s\" could not be applied builtin len()", s), msgAndArgs...) | ||||
| 	} | ||||
| @@ -831,7 +835,7 @@ func Subset(t TestingT, list, subset interface{}, msgAndArgs ...interface{}) (ok | ||||
|  | ||||
| 	for i := 0; i < subsetValue.Len(); i++ { | ||||
| 		element := subsetValue.Index(i).Interface() | ||||
| 		ok, found := includeElement(list, element) | ||||
| 		ok, found := containsElement(list, element) | ||||
| 		if !ok { | ||||
| 			return Fail(t, fmt.Sprintf("\"%s\" could not be applied builtin len()", list), msgAndArgs...) | ||||
| 		} | ||||
| @@ -852,7 +856,7 @@ func NotSubset(t TestingT, list, subset interface{}, msgAndArgs ...interface{}) | ||||
| 		h.Helper() | ||||
| 	} | ||||
| 	if subset == nil { | ||||
| 		return Fail(t, fmt.Sprintf("nil is the empty set which is a subset of every set"), msgAndArgs...) | ||||
| 		return Fail(t, "nil is the empty set which is a subset of every set", msgAndArgs...) | ||||
| 	} | ||||
|  | ||||
| 	subsetValue := reflect.ValueOf(subset) | ||||
| @@ -875,7 +879,7 @@ func NotSubset(t TestingT, list, subset interface{}, msgAndArgs ...interface{}) | ||||
|  | ||||
| 	for i := 0; i < subsetValue.Len(); i++ { | ||||
| 		element := subsetValue.Index(i).Interface() | ||||
| 		ok, found := includeElement(list, element) | ||||
| 		ok, found := containsElement(list, element) | ||||
| 		if !ok { | ||||
| 			return Fail(t, fmt.Sprintf("\"%s\" could not be applied builtin len()", list), msgAndArgs...) | ||||
| 		} | ||||
| @@ -1000,27 +1004,21 @@ func Condition(t TestingT, comp Comparison, msgAndArgs ...interface{}) bool { | ||||
| type PanicTestFunc func() | ||||
|  | ||||
| // didPanic returns true if the function passed to it panics. Otherwise, it returns false. | ||||
| func didPanic(f PanicTestFunc) (bool, interface{}, string) { | ||||
|  | ||||
| 	didPanic := false | ||||
| 	var message interface{} | ||||
| 	var stack string | ||||
| 	func() { | ||||
|  | ||||
| 		defer func() { | ||||
| 			if message = recover(); message != nil { | ||||
| 				didPanic = true | ||||
| 				stack = string(debug.Stack()) | ||||
| 			} | ||||
| 		}() | ||||
|  | ||||
| 		// call the target function | ||||
| 		f() | ||||
| func didPanic(f PanicTestFunc) (didPanic bool, message interface{}, stack string) { | ||||
| 	didPanic = true | ||||
|  | ||||
| 	defer func() { | ||||
| 		message = recover() | ||||
| 		if didPanic { | ||||
| 			stack = string(debug.Stack()) | ||||
| 		} | ||||
| 	}() | ||||
|  | ||||
| 	return didPanic, message, stack | ||||
| 	// call the target function | ||||
| 	f() | ||||
| 	didPanic = false | ||||
|  | ||||
| 	return | ||||
| } | ||||
|  | ||||
| // Panics asserts that the code inside the specified PanicTestFunc panics. | ||||
| @@ -1161,11 +1159,15 @@ func InDelta(t TestingT, expected, actual interface{}, delta float64, msgAndArgs | ||||
| 	bf, bok := toFloat(actual) | ||||
|  | ||||
| 	if !aok || !bok { | ||||
| 		return Fail(t, fmt.Sprintf("Parameters must be numerical"), msgAndArgs...) | ||||
| 		return Fail(t, "Parameters must be numerical", msgAndArgs...) | ||||
| 	} | ||||
|  | ||||
| 	if math.IsNaN(af) && math.IsNaN(bf) { | ||||
| 		return true | ||||
| 	} | ||||
|  | ||||
| 	if math.IsNaN(af) { | ||||
| 		return Fail(t, fmt.Sprintf("Expected must not be NaN"), msgAndArgs...) | ||||
| 		return Fail(t, "Expected must not be NaN", msgAndArgs...) | ||||
| 	} | ||||
|  | ||||
| 	if math.IsNaN(bf) { | ||||
| @@ -1188,7 +1190,7 @@ func InDeltaSlice(t TestingT, expected, actual interface{}, delta float64, msgAn | ||||
| 	if expected == nil || actual == nil || | ||||
| 		reflect.TypeOf(actual).Kind() != reflect.Slice || | ||||
| 		reflect.TypeOf(expected).Kind() != reflect.Slice { | ||||
| 		return Fail(t, fmt.Sprintf("Parameters must be slice"), msgAndArgs...) | ||||
| 		return Fail(t, "Parameters must be slice", msgAndArgs...) | ||||
| 	} | ||||
|  | ||||
| 	actualSlice := reflect.ValueOf(actual) | ||||
| @@ -1250,8 +1252,12 @@ func InDeltaMapValues(t TestingT, expected, actual interface{}, delta float64, m | ||||
|  | ||||
| func calcRelativeError(expected, actual interface{}) (float64, error) { | ||||
| 	af, aok := toFloat(expected) | ||||
| 	if !aok { | ||||
| 		return 0, fmt.Errorf("expected value %q cannot be converted to float", expected) | ||||
| 	bf, bok := toFloat(actual) | ||||
| 	if !aok || !bok { | ||||
| 		return 0, fmt.Errorf("Parameters must be numerical") | ||||
| 	} | ||||
| 	if math.IsNaN(af) && math.IsNaN(bf) { | ||||
| 		return 0, nil | ||||
| 	} | ||||
| 	if math.IsNaN(af) { | ||||
| 		return 0, errors.New("expected value must not be NaN") | ||||
| @@ -1259,10 +1265,6 @@ func calcRelativeError(expected, actual interface{}) (float64, error) { | ||||
| 	if af == 0 { | ||||
| 		return 0, fmt.Errorf("expected value must have a value other than zero to calculate the relative error") | ||||
| 	} | ||||
| 	bf, bok := toFloat(actual) | ||||
| 	if !bok { | ||||
| 		return 0, fmt.Errorf("actual value %q cannot be converted to float", actual) | ||||
| 	} | ||||
| 	if math.IsNaN(bf) { | ||||
| 		return 0, errors.New("actual value must not be NaN") | ||||
| 	} | ||||
| @@ -1298,7 +1300,7 @@ func InEpsilonSlice(t TestingT, expected, actual interface{}, epsilon float64, m | ||||
| 	if expected == nil || actual == nil || | ||||
| 		reflect.TypeOf(actual).Kind() != reflect.Slice || | ||||
| 		reflect.TypeOf(expected).Kind() != reflect.Slice { | ||||
| 		return Fail(t, fmt.Sprintf("Parameters must be slice"), msgAndArgs...) | ||||
| 		return Fail(t, "Parameters must be slice", msgAndArgs...) | ||||
| 	} | ||||
|  | ||||
| 	actualSlice := reflect.ValueOf(actual) | ||||
| @@ -1375,6 +1377,27 @@ func EqualError(t TestingT, theError error, errString string, msgAndArgs ...inte | ||||
| 	return true | ||||
| } | ||||
|  | ||||
| // ErrorContains asserts that a function returned an error (i.e. not `nil`) | ||||
| // and that the error contains the specified substring. | ||||
| // | ||||
| //   actualObj, err := SomeFunction() | ||||
| //   assert.ErrorContains(t, err,  expectedErrorSubString) | ||||
| func ErrorContains(t TestingT, theError error, contains string, msgAndArgs ...interface{}) bool { | ||||
| 	if h, ok := t.(tHelper); ok { | ||||
| 		h.Helper() | ||||
| 	} | ||||
| 	if !Error(t, theError, msgAndArgs...) { | ||||
| 		return false | ||||
| 	} | ||||
|  | ||||
| 	actual := theError.Error() | ||||
| 	if !strings.Contains(actual, contains) { | ||||
| 		return Fail(t, fmt.Sprintf("Error %#v does not contain %#v", actual, contains), msgAndArgs...) | ||||
| 	} | ||||
|  | ||||
| 	return true | ||||
| } | ||||
|  | ||||
| // matchRegexp return true if a specified regexp matches a string. | ||||
| func matchRegexp(rx interface{}, str interface{}) bool { | ||||
|  | ||||
| @@ -1588,12 +1611,17 @@ func diff(expected interface{}, actual interface{}) string { | ||||
| 	} | ||||
|  | ||||
| 	var e, a string | ||||
| 	if et != reflect.TypeOf("") { | ||||
| 		e = spewConfig.Sdump(expected) | ||||
| 		a = spewConfig.Sdump(actual) | ||||
| 	} else { | ||||
|  | ||||
| 	switch et { | ||||
| 	case reflect.TypeOf(""): | ||||
| 		e = reflect.ValueOf(expected).String() | ||||
| 		a = reflect.ValueOf(actual).String() | ||||
| 	case reflect.TypeOf(time.Time{}): | ||||
| 		e = spewConfigStringerEnabled.Sdump(expected) | ||||
| 		a = spewConfigStringerEnabled.Sdump(actual) | ||||
| 	default: | ||||
| 		e = spewConfig.Sdump(expected) | ||||
| 		a = spewConfig.Sdump(actual) | ||||
| 	} | ||||
|  | ||||
| 	diff, _ := difflib.GetUnifiedDiffString(difflib.UnifiedDiff{ | ||||
| @@ -1625,6 +1653,14 @@ var spewConfig = spew.ConfigState{ | ||||
| 	MaxDepth:                10, | ||||
| } | ||||
|  | ||||
| var spewConfigStringerEnabled = spew.ConfigState{ | ||||
| 	Indent:                  " ", | ||||
| 	DisablePointerAddresses: true, | ||||
| 	DisableCapacities:       true, | ||||
| 	SortKeys:                true, | ||||
| 	MaxDepth:                10, | ||||
| } | ||||
|  | ||||
| type tHelper interface { | ||||
| 	Helper() | ||||
| } | ||||
|   | ||||
							
								
								
									
										30
									
								
								vendor/github.com/stretchr/testify/require/require.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										30
									
								
								vendor/github.com/stretchr/testify/require/require.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -280,6 +280,36 @@ func ErrorAsf(t TestingT, err error, target interface{}, msg string, args ...int | ||||
| 	t.FailNow() | ||||
| } | ||||
|  | ||||
| // ErrorContains asserts that a function returned an error (i.e. not `nil`) | ||||
| // and that the error contains the specified substring. | ||||
| // | ||||
| //   actualObj, err := SomeFunction() | ||||
| //   assert.ErrorContains(t, err,  expectedErrorSubString) | ||||
| func ErrorContains(t TestingT, theError error, contains string, msgAndArgs ...interface{}) { | ||||
| 	if h, ok := t.(tHelper); ok { | ||||
| 		h.Helper() | ||||
| 	} | ||||
| 	if assert.ErrorContains(t, theError, contains, msgAndArgs...) { | ||||
| 		return | ||||
| 	} | ||||
| 	t.FailNow() | ||||
| } | ||||
|  | ||||
| // ErrorContainsf asserts that a function returned an error (i.e. not `nil`) | ||||
| // and that the error contains the specified substring. | ||||
| // | ||||
| //   actualObj, err := SomeFunction() | ||||
| //   assert.ErrorContainsf(t, err,  expectedErrorSubString, "error message %s", "formatted") | ||||
| func ErrorContainsf(t TestingT, theError error, contains string, msg string, args ...interface{}) { | ||||
| 	if h, ok := t.(tHelper); ok { | ||||
| 		h.Helper() | ||||
| 	} | ||||
| 	if assert.ErrorContainsf(t, theError, contains, msg, args...) { | ||||
| 		return | ||||
| 	} | ||||
| 	t.FailNow() | ||||
| } | ||||
|  | ||||
| // ErrorIs asserts that at least one of the errors in err's chain matches target. | ||||
| // This is a wrapper for errors.Is. | ||||
| func ErrorIs(t TestingT, err error, target error, msgAndArgs ...interface{}) { | ||||
|   | ||||
							
								
								
									
										24
									
								
								vendor/github.com/stretchr/testify/require/require_forward.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										24
									
								
								vendor/github.com/stretchr/testify/require/require_forward.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -223,6 +223,30 @@ func (a *Assertions) ErrorAsf(err error, target interface{}, msg string, args .. | ||||
| 	ErrorAsf(a.t, err, target, msg, args...) | ||||
| } | ||||
|  | ||||
| // ErrorContains asserts that a function returned an error (i.e. not `nil`) | ||||
| // and that the error contains the specified substring. | ||||
| // | ||||
| //   actualObj, err := SomeFunction() | ||||
| //   a.ErrorContains(err,  expectedErrorSubString) | ||||
| func (a *Assertions) ErrorContains(theError error, contains string, msgAndArgs ...interface{}) { | ||||
| 	if h, ok := a.t.(tHelper); ok { | ||||
| 		h.Helper() | ||||
| 	} | ||||
| 	ErrorContains(a.t, theError, contains, msgAndArgs...) | ||||
| } | ||||
|  | ||||
| // ErrorContainsf asserts that a function returned an error (i.e. not `nil`) | ||||
| // and that the error contains the specified substring. | ||||
| // | ||||
| //   actualObj, err := SomeFunction() | ||||
| //   a.ErrorContainsf(err,  expectedErrorSubString, "error message %s", "formatted") | ||||
| func (a *Assertions) ErrorContainsf(theError error, contains string, msg string, args ...interface{}) { | ||||
| 	if h, ok := a.t.(tHelper); ok { | ||||
| 		h.Helper() | ||||
| 	} | ||||
| 	ErrorContainsf(a.t, theError, contains, msg, args...) | ||||
| } | ||||
|  | ||||
| // ErrorIs asserts that at least one of the errors in err's chain matches target. | ||||
| // This is a wrapper for errors.Is. | ||||
| func (a *Assertions) ErrorIs(err error, target error, msgAndArgs ...interface{}) { | ||||
|   | ||||
| @@ -12,7 +12,7 @@ | ||||
| // See the License for the specific language governing permissions and | ||||
| // limitations under the License. | ||||
|  | ||||
| package otelgrpc | ||||
| package otelgrpc // import "go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc" | ||||
|  | ||||
| import ( | ||||
| 	"context" | ||||
|   | ||||
| @@ -12,7 +12,7 @@ | ||||
| // See the License for the specific language governing permissions and | ||||
| // limitations under the License. | ||||
|  | ||||
| package otelgrpc | ||||
| package otelgrpc // import "go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc" | ||||
|  | ||||
| // gRPC tracing middleware | ||||
| // https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/trace/semantic_conventions/rpc.md | ||||
| @@ -33,7 +33,7 @@ import ( | ||||
| 	"go.opentelemetry.io/otel/attribute" | ||||
| 	"go.opentelemetry.io/otel/baggage" | ||||
| 	"go.opentelemetry.io/otel/codes" | ||||
| 	semconv "go.opentelemetry.io/otel/semconv/v1.7.0" | ||||
| 	semconv "go.opentelemetry.io/otel/semconv/v1.10.0" | ||||
| 	"go.opentelemetry.io/otel/trace" | ||||
| ) | ||||
|  | ||||
|   | ||||
| @@ -12,13 +12,13 @@ | ||||
| // See the License for the specific language governing permissions and | ||||
| // limitations under the License. | ||||
|  | ||||
| package internal | ||||
| package internal // import "go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc/internal" | ||||
|  | ||||
| import ( | ||||
| 	"strings" | ||||
|  | ||||
| 	"go.opentelemetry.io/otel/attribute" | ||||
| 	semconv "go.opentelemetry.io/otel/semconv/v1.7.0" | ||||
| 	semconv "go.opentelemetry.io/otel/semconv/v1.10.0" | ||||
| ) | ||||
|  | ||||
| // ParseFullMethod returns a span name following the OpenTelemetry semantic | ||||
|   | ||||
| @@ -12,11 +12,11 @@ | ||||
| // See the License for the specific language governing permissions and | ||||
| // limitations under the License. | ||||
|  | ||||
| package otelgrpc | ||||
| package otelgrpc // import "go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc" | ||||
|  | ||||
| import ( | ||||
| 	"go.opentelemetry.io/otel/attribute" | ||||
| 	semconv "go.opentelemetry.io/otel/semconv/v1.7.0" | ||||
| 	semconv "go.opentelemetry.io/otel/semconv/v1.10.0" | ||||
| ) | ||||
|  | ||||
| // Semantic conventions for attribute keys for gRPC. | ||||
|   | ||||
| @@ -12,11 +12,11 @@ | ||||
| // See the License for the specific language governing permissions and | ||||
| // limitations under the License. | ||||
|  | ||||
| package otelgrpc | ||||
| package otelgrpc // import "go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc" | ||||
|  | ||||
| // Version is the current release version of the gRPC instrumentation. | ||||
| func Version() string { | ||||
| 	return "0.27.0" | ||||
| 	return "0.32.0" | ||||
| 	// This string is updated by the pre_release.sh script during release | ||||
| } | ||||
|  | ||||
|   | ||||
							
								
								
									
										1
									
								
								vendor/go.opentelemetry.io/otel/.gitignore
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								vendor/go.opentelemetry.io/otel/.gitignore
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -16,6 +16,5 @@ gen/ | ||||
| /example/opencensus/opencensus | ||||
| /example/passthrough/passthrough | ||||
| /example/prometheus/prometheus | ||||
| /example/prom-collector/prom-collector | ||||
| /example/zipkin/zipkin | ||||
| /example/otel-collector/otel-collector | ||||
|   | ||||
							
								
								
									
										28
									
								
								vendor/go.opentelemetry.io/otel/.golangci.yml
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										28
									
								
								vendor/go.opentelemetry.io/otel/.golangci.yml
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -4,11 +4,27 @@ run: | ||||
|   tests: true #Default | ||||
|  | ||||
| linters: | ||||
|   # Disable everything by default so upgrades to not include new "default | ||||
|   # enabled" linters. | ||||
|   disable-all: true | ||||
|   # Specifically enable linters we want to use. | ||||
|   enable: | ||||
|     - misspell | ||||
|     - goimports | ||||
|     - revive | ||||
|     - deadcode | ||||
|     - errcheck | ||||
|     - gofmt | ||||
|     - goimports | ||||
|     - gosimple | ||||
|     - govet | ||||
|     - godot | ||||
|     - ineffassign | ||||
|     - misspell | ||||
|     - revive | ||||
|     - staticcheck | ||||
|     - structcheck | ||||
|     - typecheck | ||||
|     - unused | ||||
|     - varcheck | ||||
|  | ||||
|  | ||||
| issues: | ||||
|   exclude-rules: | ||||
| @@ -30,3 +46,9 @@ linters-settings: | ||||
|       - cancelled | ||||
|   goimports: | ||||
|     local-prefixes: go.opentelemetry.io | ||||
|   godot: | ||||
|     exclude: | ||||
|       # Exclude sentence fragments for lists. | ||||
|       - '^[ ]*[-•]' | ||||
|       # Exclude sentences prefixing a list. | ||||
|       - ':$' | ||||
|   | ||||
							
								
								
									
										2
									
								
								vendor/go.opentelemetry.io/otel/.lycheeignore
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										2
									
								
								vendor/go.opentelemetry.io/otel/.lycheeignore
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,2 @@ | ||||
| http://localhost | ||||
| http://jaeger-collector | ||||
							
								
								
									
										16
									
								
								vendor/go.opentelemetry.io/otel/.markdown-link.json
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										16
									
								
								vendor/go.opentelemetry.io/otel/.markdown-link.json
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -1,16 +0,0 @@ | ||||
| { | ||||
|     "ignorePatterns": [ | ||||
|         { | ||||
|             "pattern": "^http(s)?://localhost" | ||||
|         } | ||||
|     ], | ||||
|     "replacementPatterns": [ | ||||
|         { | ||||
|             "pattern": "^/registry", | ||||
|             "replacement": "https://opentelemetry.io/registry" | ||||
|         } | ||||
|     ], | ||||
|     "retryOn429": true, | ||||
|     "retryCount": 5, | ||||
|     "fallbackRetryDelay": "30s" | ||||
| } | ||||
							
								
								
									
										224
									
								
								vendor/go.opentelemetry.io/otel/CHANGELOG.md
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										224
									
								
								vendor/go.opentelemetry.io/otel/CHANGELOG.md
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -8,6 +8,219 @@ This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.htm | ||||
|  | ||||
| ## [Unreleased] | ||||
|  | ||||
| ## [1.7.0/0.30.0] - 2022-04-28 | ||||
|  | ||||
| ### Added | ||||
|  | ||||
| - Add the `go.opentelemetry.io/otel/semconv/v1.8.0` package. | ||||
|   The package contains semantic conventions from the `v1.8.0` version of the OpenTelemetry specification. (#2763) | ||||
| - Add the `go.opentelemetry.io/otel/semconv/v1.9.0` package. | ||||
|   The package contains semantic conventions from the `v1.9.0` version of the OpenTelemetry specification. (#2792) | ||||
| - Add the `go.opentelemetry.io/otel/semconv/v1.10.0` package. | ||||
|   The package contains semantic conventions from the `v1.10.0` version of the OpenTelemetry specification. (#2842) | ||||
| - Added an in-memory exporter to metrictest to aid testing with a full SDK. (#2776) | ||||
|  | ||||
| ### Fixed | ||||
|  | ||||
| - Globally delegated instruments are unwrapped before delegating asynchronous callbacks. (#2784) | ||||
| - Remove import of `testing` package in non-tests builds of the `go.opentelemetry.io/otel` package. (#2786) | ||||
|  | ||||
| ### Changed | ||||
|  | ||||
| - The `WithLabelEncoder` option from the `go.opentelemetry.io/otel/exporters/stdout/stdoutmetric` package is renamed to `WithAttributeEncoder`. (#2790) | ||||
| - The `LabelFilterSelector` interface from `go.opentelemetry.io/otel/sdk/metric/processor/reducer` is renamed to `AttributeFilterSelector`. | ||||
|   The method included in the renamed interface also changed from `LabelFilterFor` to `AttributeFilterFor`. (#2790) | ||||
| - The `Metadata.Labels` method from the `go.opentelemetry.io/otel/sdk/metric/export` package is renamed to `Metadata.Attributes`. | ||||
|   Consequentially, the `Record` type from the same package also has had the embedded method renamed. (#2790) | ||||
|  | ||||
| ### Deprecated | ||||
|  | ||||
| - The `Iterator.Label` method in the `go.opentelemetry.io/otel/attribute` package is deprecated. | ||||
|   Use the equivalent `Iterator.Attribute` method instead. (#2790) | ||||
| - The `Iterator.IndexedLabel` method in the `go.opentelemetry.io/otel/attribute` package is deprecated. | ||||
|   Use the equivalent `Iterator.IndexedAttribute` method instead. (#2790) | ||||
| - The `MergeIterator.Label` method in the `go.opentelemetry.io/otel/attribute` package is deprecated. | ||||
|   Use the equivalent `MergeIterator.Attribute` method instead. (#2790) | ||||
|  | ||||
| ### Removed | ||||
|  | ||||
| - Removed the `Batch` type from the `go.opentelemetry.io/otel/sdk/metric/metrictest` package. (#2864) | ||||
| - Removed the `Measurement` type from the `go.opentelemetry.io/otel/sdk/metric/metrictest` package. (#2864) | ||||
|  | ||||
| ## [0.29.0] - 2022-04-11 | ||||
|  | ||||
| ### Added | ||||
|  | ||||
| - The metrics global package was added back into several test files. (#2764) | ||||
| - The `Meter` function is added back to the `go.opentelemetry.io/otel/metric/global` package. | ||||
|   This function is a convenience function equivalent to calling `global.MeterProvider().Meter(...)`. (#2750) | ||||
|  | ||||
| ### Removed | ||||
|  | ||||
| - Removed module the `go.opentelemetry.io/otel/sdk/export/metric`. | ||||
|   Use the `go.opentelemetry.io/otel/sdk/metric` module instead. (#2720) | ||||
|  | ||||
| ### Changed | ||||
|  | ||||
| - Don't panic anymore when setting a global MeterProvider to itself. (#2749) | ||||
| - Upgrade `go.opentelemetry.io/proto/otlp` in `go.opentelemetry.io/otel/exporters/otlp/otlpmetric` from `v0.12.1` to `v0.15.0`. | ||||
|   This replaces the use of the now deprecated `InstrumentationLibrary` and `InstrumentationLibraryMetrics` types and fields in the proto library with the equivalent `InstrumentationScope` and `ScopeMetrics`. (#2748) | ||||
|  | ||||
| ## [1.6.3] - 2022-04-07 | ||||
|  | ||||
| ### Fixed | ||||
|  | ||||
| - Allow non-comparable global `MeterProvider`, `TracerProvider`, and `TextMapPropagator` types to be set. (#2772, #2773) | ||||
|  | ||||
| ## [1.6.2] - 2022-04-06 | ||||
|  | ||||
| ### Changed | ||||
|  | ||||
| - Don't panic anymore when setting a global TracerProvider or TextMapPropagator to itself. (#2749) | ||||
| - Upgrade `go.opentelemetry.io/proto/otlp` in `go.opentelemetry.io/otel/exporters/otlp/otlptrace` from `v0.12.1` to `v0.15.0`. | ||||
|   This replaces the use of the now deprecated `InstrumentationLibrary` and `InstrumentationLibrarySpans` types and fields in the proto library with the equivalent `InstrumentationScope` and `ScopeSpans`. (#2748) | ||||
|  | ||||
| ## [1.6.1] - 2022-03-28 | ||||
|  | ||||
| ### Fixed | ||||
|  | ||||
| - The `go.opentelemetry.io/otel/schema/*` packages now use the correct schema URL for their `SchemaURL` constant. | ||||
|   Instead of using `"https://opentelemetry.io/schemas/v<version>"` they now use the correct URL without a `v` prefix, `"https://opentelemetry.io/schemas/<version>"`. (#2743, #2744) | ||||
|  | ||||
| ### Security | ||||
|  | ||||
| - Upgrade `go.opentelemetry.io/proto/otlp` from `v0.12.0` to `v0.12.1`. | ||||
|   This includes an indirect upgrade of `github.com/grpc-ecosystem/grpc-gateway` which resolves [a vulnerability](https://nvd.nist.gov/vuln/detail/CVE-2019-11254) from `gopkg.in/yaml.v2` in version `v2.2.3`. (#2724, #2728) | ||||
|  | ||||
| ## [1.6.0/0.28.0] - 2022-03-23 | ||||
|  | ||||
| ### ⚠️ Notice ⚠️ | ||||
|  | ||||
| This update is a breaking change of the unstable Metrics API. | ||||
| Code instrumented with the `go.opentelemetry.io/otel/metric` will need to be modified. | ||||
|  | ||||
| ### Added | ||||
|  | ||||
| - Add metrics exponential histogram support. | ||||
|   New mapping functions have been made available in `sdk/metric/aggregator/exponential/mapping` for other OpenTelemetry projects to take dependencies on. (#2502) | ||||
| - Add Go 1.18 to our compatibility tests. (#2679) | ||||
| - Allow configuring the Sampler with the `OTEL_TRACES_SAMPLER` and `OTEL_TRACES_SAMPLER_ARG` environment variables. (#2305, #2517) | ||||
| - Add the `metric/global` for obtaining and setting the global `MeterProvider`. (#2660) | ||||
|  | ||||
| ### Changed | ||||
|  | ||||
| - The metrics API has been significantly changed to match the revised OpenTelemetry specification. | ||||
|   High-level changes include: | ||||
|  | ||||
|   - Synchronous and asynchronous instruments are now handled by independent `InstrumentProvider`s. | ||||
|     These `InstrumentProvider`s are managed with a `Meter`. | ||||
|   - Synchronous and asynchronous instruments are grouped into their own packages based on value types. | ||||
|   - Asynchronous callbacks can now be registered with a `Meter`. | ||||
|  | ||||
|   Be sure to check out the metric module documentation for more information on how to use the revised API. (#2587, #2660) | ||||
|  | ||||
| ### Fixed | ||||
|  | ||||
| - Fallback to general attribute limits when span specific ones are not set in the environment. (#2675, #2677) | ||||
|  | ||||
| ## [1.5.0] - 2022-03-16 | ||||
|  | ||||
| ### Added | ||||
|  | ||||
| - Log the Exporters configuration in the TracerProviders message. (#2578) | ||||
| - Added support to configure the span limits with environment variables. | ||||
|   The following environment variables are supported. (#2606, #2637) | ||||
|   - `OTEL_SPAN_ATTRIBUTE_VALUE_LENGTH_LIMIT` | ||||
|   - `OTEL_SPAN_ATTRIBUTE_COUNT_LIMIT` | ||||
|   - `OTEL_SPAN_EVENT_COUNT_LIMIT` | ||||
|   - `OTEL_EVENT_ATTRIBUTE_COUNT_LIMIT` | ||||
|   - `OTEL_SPAN_LINK_COUNT_LIMIT` | ||||
|   - `OTEL_LINK_ATTRIBUTE_COUNT_LIMIT` | ||||
|    | ||||
|   If the provided environment variables are invalid (negative), the default values would be used. | ||||
| - Rename the `gc` runtime name to `go` (#2560) | ||||
| - Add resource container ID detection. (#2418) | ||||
| - Add span attribute value length limit. | ||||
|   The new `AttributeValueLengthLimit` field is added to the `"go.opentelemetry.io/otel/sdk/trace".SpanLimits` type to configure this limit for a `TracerProvider`. | ||||
|   The default limit for this resource is "unlimited". (#2637) | ||||
| - Add the `WithRawSpanLimits` option to `go.opentelemetry.io/otel/sdk/trace`. | ||||
|   This option replaces the `WithSpanLimits` option. | ||||
|   Zero or negative values will not be changed to the default value like `WithSpanLimits` does. | ||||
|   Setting a limit to zero will effectively disable the related resource it limits and setting to a negative value will mean that resource is unlimited. | ||||
|   Consequentially, limits should be constructed using `NewSpanLimits` and updated accordingly. (#2637) | ||||
|  | ||||
| ### Changed | ||||
|  | ||||
| - Drop oldest tracestate `Member` when capacity is reached. (#2592) | ||||
| - Add event and link drop counts to the exported data from the `oltptrace` exporter. (#2601) | ||||
| - Unify path cleaning functionally in the `otlpmetric` and `otlptrace` configuration. (#2639) | ||||
| - Change the debug message from the `sdk/trace.BatchSpanProcessor` to reflect the count is cumulative. (#2640) | ||||
| - Introduce new internal `envconfig` package for OTLP exporters. (#2608) | ||||
| - If `http.Request.Host` is empty, fall back to use `URL.Host` when populating `http.host` in the `semconv` packages. (#2661) | ||||
|  | ||||
| ### Fixed | ||||
|  | ||||
| - Remove the OTLP trace exporter limit of SpanEvents when exporting. (#2616) | ||||
| - Default to port `4318` instead of `4317` for the `otlpmetrichttp` and `otlptracehttp` client. (#2614, #2625) | ||||
| - Unlimited span limits are now supported (negative values). (#2636, #2637) | ||||
|  | ||||
| ### Deprecated | ||||
|  | ||||
| - Deprecated `"go.opentelemetry.io/otel/sdk/trace".WithSpanLimits`. | ||||
|   Use `WithRawSpanLimits` instead. | ||||
|   That option allows setting unlimited and zero limits, this option does not. | ||||
|   This option will be kept until the next major version incremented release. (#2637) | ||||
|  | ||||
| ## [1.4.1] - 2022-02-16 | ||||
|  | ||||
| ### Fixed | ||||
|  | ||||
| - Fix race condition in reading the dropped spans number for the `BatchSpanProcessor`. (#2615) | ||||
|  | ||||
| ## [1.4.0] - 2022-02-11 | ||||
|  | ||||
| ### Added | ||||
|  | ||||
| - Use `OTEL_EXPORTER_ZIPKIN_ENDPOINT` environment variable to specify zipkin collector endpoint. (#2490) | ||||
| - Log the configuration of `TracerProvider`s, and `Tracer`s for debugging. | ||||
|   To enable use a logger with Verbosity (V level) `>=1`. (#2500) | ||||
| - Added support to configure the batch span-processor with environment variables. | ||||
|   The following environment variables are used. (#2515) | ||||
|   - `OTEL_BSP_SCHEDULE_DELAY` | ||||
|   - `OTEL_BSP_EXPORT_TIMEOUT` | ||||
|   - `OTEL_BSP_MAX_QUEUE_SIZE`. | ||||
|   - `OTEL_BSP_MAX_EXPORT_BATCH_SIZE` | ||||
|  | ||||
| ### Changed | ||||
|  | ||||
| - Zipkin exporter exports `Resource` attributes in the `Tags` field. (#2589) | ||||
|  | ||||
| ### Deprecated | ||||
|  | ||||
| - Deprecate module the `go.opentelemetry.io/otel/sdk/export/metric`. | ||||
|   Use the `go.opentelemetry.io/otel/sdk/metric` module instead. (#2382) | ||||
| - Deprecate `"go.opentelemetry.io/otel/sdk/metric".AtomicFieldOffsets`. (#2445) | ||||
|  | ||||
| ### Fixed | ||||
|  | ||||
| - Fixed the instrument kind for noop async instruments to correctly report an implementation. (#2461) | ||||
| - Fix UDP packets overflowing with Jaeger payloads. (#2489, #2512) | ||||
| - Change the `otlpmetric.Client` interface's `UploadMetrics` method to accept a single `ResourceMetrics` instead of a slice of them. (#2491) | ||||
| - Specify explicit buckets in Prometheus example, fixing issue where example only has `+inf` bucket. (#2419, #2493) | ||||
| - W3C baggage will now decode urlescaped values. (#2529) | ||||
| - Baggage members are now only validated once, when calling `NewMember` and not also when adding it to the baggage itself. (#2522) | ||||
| - The order attributes are dropped from spans in the `go.opentelemetry.io/otel/sdk/trace` package when capacity is reached is fixed to be in compliance with the OpenTelemetry specification. | ||||
|   Instead of dropping the least-recently-used attribute, the last added attribute is dropped. | ||||
|   This drop order still only applies to attributes with unique keys not already contained in the span. | ||||
|   If an attribute is added with a key already contained in the span, that attribute is updated to the new value being added. (#2576) | ||||
|  | ||||
| ### Removed | ||||
|  | ||||
| - Updated `go.opentelemetry.io/proto/otlp` from `v0.11.0` to `v0.12.0`. This version removes a number of deprecated methods. (#2546) | ||||
|   - [`Metric.GetIntGauge()`](https://pkg.go.dev/go.opentelemetry.io/proto/otlp@v0.11.0/metrics/v1#Metric.GetIntGauge) | ||||
|   - [`Metric.GetIntHistogram()`](https://pkg.go.dev/go.opentelemetry.io/proto/otlp@v0.11.0/metrics/v1#Metric.GetIntHistogram) | ||||
|   - [`Metric.GetIntSum()`](https://pkg.go.dev/go.opentelemetry.io/proto/otlp@v0.11.0/metrics/v1#Metric.GetIntSum) | ||||
|  | ||||
| ## [1.3.0] - 2021-12-10 | ||||
|  | ||||
| ### ⚠️ Notice ⚠️ | ||||
| @@ -1639,7 +1852,16 @@ It contains api and sdk for trace and meter. | ||||
| - CircleCI build CI manifest files. | ||||
| - CODEOWNERS file to track owners of this project. | ||||
|  | ||||
| [Unreleased]: https://github.com/open-telemetry/opentelemetry-go/compare/v1.3.0...HEAD | ||||
| [Unreleased]: https://github.com/open-telemetry/opentelemetry-go/compare/v1.7.0...HEAD | ||||
| [1.7.0/0.30.0]: https://github.com/open-telemetry/opentelemetry-go/releases/tag/v1.7.0 | ||||
| [0.29.0]: https://github.com/open-telemetry/opentelemetry-go/releases/tag/metric/v0.29.0 | ||||
| [1.6.3]: https://github.com/open-telemetry/opentelemetry-go/releases/tag/v1.6.3 | ||||
| [1.6.2]: https://github.com/open-telemetry/opentelemetry-go/releases/tag/v1.6.2 | ||||
| [1.6.1]: https://github.com/open-telemetry/opentelemetry-go/releases/tag/v1.6.1 | ||||
| [1.6.0/0.28.0]: https://github.com/open-telemetry/opentelemetry-go/releases/tag/v1.6.0 | ||||
| [1.5.0]: https://github.com/open-telemetry/opentelemetry-go/releases/tag/v1.5.0 | ||||
| [1.4.1]: https://github.com/open-telemetry/opentelemetry-go/releases/tag/v1.4.1 | ||||
| [1.4.0]: https://github.com/open-telemetry/opentelemetry-go/releases/tag/v1.4.0 | ||||
| [1.3.0]: https://github.com/open-telemetry/opentelemetry-go/releases/tag/v1.3.0 | ||||
| [1.2.0]: https://github.com/open-telemetry/opentelemetry-go/releases/tag/v1.2.0 | ||||
| [1.1.0]: https://github.com/open-telemetry/opentelemetry-go/releases/tag/v1.1.0 | ||||
|   | ||||
							
								
								
									
										2
									
								
								vendor/go.opentelemetry.io/otel/CODEOWNERS
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								vendor/go.opentelemetry.io/otel/CODEOWNERS
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -12,6 +12,6 @@ | ||||
| #  https://help.github.com/en/articles/about-code-owners | ||||
| # | ||||
|  | ||||
| * @jmacd @MrAlias @Aneurysm9 @evantorrie @XSAM @dashpole @paivagustavo @MadVikingGod @pellared | ||||
| * @jmacd @MrAlias @Aneurysm9 @evantorrie @XSAM @dashpole @paivagustavo @MadVikingGod @pellared @hanyuancheung | ||||
|  | ||||
| CODEOWNERS @MrAlias @Aneurysm9 @MadVikingGod | ||||
|   | ||||
							
								
								
									
										67
									
								
								vendor/go.opentelemetry.io/otel/CONTRIBUTING.md
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										67
									
								
								vendor/go.opentelemetry.io/otel/CONTRIBUTING.md
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -228,11 +228,11 @@ all options to create a configured `config`. | ||||
|  | ||||
| ```go | ||||
| // newConfig returns an appropriately configured config. | ||||
| func newConfig([]Option) config { | ||||
| func newConfig(options ...Option) config { | ||||
| 	// Set default values for config. | ||||
| 	config := config{/* […] */} | ||||
| 	for _, option := range options { | ||||
| 		option.apply(&config) | ||||
| 		config = option.apply(config) | ||||
| 	} | ||||
| 	// Preform any validation here. | ||||
| 	return config | ||||
| @@ -253,7 +253,7 @@ To set the value of the options a `config` contains, a corresponding | ||||
|  | ||||
| ```go | ||||
| type Option interface { | ||||
| 	apply(*config) | ||||
| 	apply(config) config | ||||
| } | ||||
| ``` | ||||
|  | ||||
| @@ -261,6 +261,9 @@ Having `apply` unexported makes sure that it will not be used externally. | ||||
| Moreover, the interface becomes sealed so the user cannot easily implement | ||||
| the interface on its own. | ||||
|  | ||||
| The `apply` method should return a modified version of the passed config. | ||||
| This approach, instead of passing a pointer, is used to prevent the config from being allocated to the heap. | ||||
|  | ||||
| The name of the interface should be prefixed in the same way the | ||||
| corresponding `config` is (if at all). | ||||
|  | ||||
| @@ -283,8 +286,9 @@ func With*(…) Option { … } | ||||
| ```go | ||||
| type defaultFalseOption bool | ||||
|  | ||||
| func (o defaultFalseOption) apply(c *config) { | ||||
| func (o defaultFalseOption) apply(c config) config { | ||||
| 	c.Bool = bool(o) | ||||
|     return c | ||||
| } | ||||
|  | ||||
| // WithOption sets a T to have an option included. | ||||
| @@ -296,8 +300,9 @@ func WithOption() Option { | ||||
| ```go | ||||
| type defaultTrueOption bool | ||||
|  | ||||
| func (o defaultTrueOption) apply(c *config) { | ||||
| func (o defaultTrueOption) apply(c config) config { | ||||
| 	c.Bool = bool(o) | ||||
|     return c | ||||
| } | ||||
|  | ||||
| // WithoutOption sets a T to have Bool option excluded. | ||||
| @@ -313,8 +318,9 @@ type myTypeOption struct { | ||||
| 	MyType MyType | ||||
| } | ||||
|  | ||||
| func (o myTypeOption) apply(c *config) { | ||||
| func (o myTypeOption) apply(c config) config { | ||||
| 	c.MyType = o.MyType | ||||
|     return c | ||||
| } | ||||
|  | ||||
| // WithMyType sets T to have include MyType. | ||||
| @@ -326,16 +332,17 @@ func WithMyType(t MyType) Option { | ||||
| ##### Functional Options | ||||
|  | ||||
| ```go | ||||
| type optionFunc func(*config) | ||||
| type optionFunc func(config) config | ||||
|  | ||||
| func (fn optionFunc) apply(c *config) { | ||||
| 	fn(c) | ||||
| func (fn optionFunc) apply(c config) config { | ||||
| 	return fn(c) | ||||
| } | ||||
|  | ||||
| // WithMyType sets t as MyType. | ||||
| func WithMyType(t MyType) Option { | ||||
| 	return optionFunc(func(c *config) { | ||||
| 	return optionFunc(func(c config) config { | ||||
| 		c.MyType = t | ||||
|         return c | ||||
| 	}) | ||||
| } | ||||
| ``` | ||||
| @@ -370,12 +377,12 @@ type config struct { | ||||
|  | ||||
| // DogOption apply Dog specific options. | ||||
| type DogOption interface { | ||||
| 	applyDog(*config) | ||||
| 	applyDog(config) config | ||||
| } | ||||
|  | ||||
| // BirdOption apply Bird specific options. | ||||
| type BirdOption interface { | ||||
| 	applyBird(*config) | ||||
| 	applyBird(config) config | ||||
| } | ||||
|  | ||||
| // Option apply options for all animals. | ||||
| @@ -385,17 +392,36 @@ type Option interface { | ||||
| } | ||||
|  | ||||
| type weightOption float64 | ||||
| func (o weightOption) applyDog(c *config)  { c.Weight = float64(o) } | ||||
| func (o weightOption) applyBird(c *config) { c.Weight = float64(o) } | ||||
| func WithWeight(w float64) Option          { return weightOption(w) } | ||||
|  | ||||
| func (o weightOption) applyDog(c config) config { | ||||
| 	c.Weight = float64(o) | ||||
| 	return c | ||||
| } | ||||
|  | ||||
| func (o weightOption) applyBird(c config) config { | ||||
| 	c.Weight = float64(o) | ||||
| 	return c | ||||
| } | ||||
|  | ||||
| func WithWeight(w float64) Option { return weightOption(w) } | ||||
|  | ||||
| type furColorOption string | ||||
| func (o furColorOption) applyDog(c *config) { c.Color = string(o) } | ||||
| func WithFurColor(c string) DogOption       { return furColorOption(c) } | ||||
|  | ||||
| func (o furColorOption) applyDog(c config) config { | ||||
| 	c.Color = string(o) | ||||
| 	return c | ||||
| } | ||||
|  | ||||
| func WithFurColor(c string) DogOption { return furColorOption(c) } | ||||
|  | ||||
| type maxAltitudeOption float64 | ||||
| func (o maxAltitudeOption) applyBird(c *config) { c.MaxAltitude = float64(o) } | ||||
| func WithMaxAltitude(a float64) BirdOption      { return maxAltitudeOption(a) } | ||||
|  | ||||
| func (o maxAltitudeOption) applyBird(c config) config { | ||||
| 	c.MaxAltitude = float64(o) | ||||
| 	return c | ||||
| } | ||||
|  | ||||
| func WithMaxAltitude(a float64) BirdOption { return maxAltitudeOption(a) } | ||||
|  | ||||
| func NewDog(name string, o ...DogOption) Dog    {…} | ||||
| func NewBird(name string, o ...BirdOption) Bird {…} | ||||
| @@ -478,10 +504,11 @@ Approvers: | ||||
|  | ||||
| - [Evan Torrie](https://github.com/evantorrie), Verizon Media | ||||
| - [Josh MacDonald](https://github.com/jmacd), LightStep | ||||
| - [Sam Xie](https://github.com/XSAM) | ||||
| - [Sam Xie](https://github.com/XSAM), Cisco/AppDynamics | ||||
| - [David Ashpole](https://github.com/dashpole), Google | ||||
| - [Gustavo Silva Paiva](https://github.com/paivagustavo), LightStep | ||||
| - [Robert Pająk](https://github.com/pellared), Splunk | ||||
| - [Chester Cheung](https://github.com/hanyuancheung), Tencent | ||||
|  | ||||
| Maintainers: | ||||
|  | ||||
|   | ||||
							
								
								
									
										165
									
								
								vendor/go.opentelemetry.io/otel/Makefile
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										165
									
								
								vendor/go.opentelemetry.io/otel/Makefile
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -12,13 +12,11 @@ | ||||
| # See the License for the specific language governing permissions and | ||||
| # limitations under the License. | ||||
|  | ||||
| EXAMPLES := $(shell ./get_main_pkgs.sh ./example) | ||||
| TOOLS_MOD_DIR := ./internal/tools | ||||
|  | ||||
| # All source code and documents. Used in spell check. | ||||
| ALL_DOCS := $(shell find . -name '*.md' -type f | sort) | ||||
| # All directories with go.mod files related to opentelemetry library. Used for building, testing and linting. | ||||
| ALL_GO_MOD_DIRS := $(filter-out $(TOOLS_MOD_DIR), $(shell find . -type f -name 'go.mod' -exec dirname {} \; | egrep -v '^./example' | sort)) $(shell find ./example -type f -name 'go.mod' -exec dirname {} \; | sort) | ||||
| ALL_GO_MOD_DIRS := $(shell find . -type f -name 'go.mod' -exec dirname {} \; | sort) | ||||
| OTEL_GO_MOD_DIRS := $(filter-out $(TOOLS_MOD_DIR), $(ALL_GO_MOD_DIRS)) | ||||
| ALL_COVERAGE_MOD_DIRS := $(shell find . -type f -name 'go.mod' -exec dirname {} \; | egrep -v '^./example|^$(TOOLS_MOD_DIR)' | sort) | ||||
|  | ||||
| GO = go | ||||
| @@ -27,8 +25,8 @@ TIMEOUT = 60 | ||||
| .DEFAULT_GOAL := precommit | ||||
|  | ||||
| .PHONY: precommit ci | ||||
| precommit: dependabot-check license-check lint build examples test-default | ||||
| ci: precommit check-clean-work-tree test-coverage | ||||
| precommit: dependabot-generate license-check vanity-import-fix misspell go-mod-tidy golangci-lint-fix test-default | ||||
| ci: dependabot-check license-check lint vanity-import-check build test-default check-clean-work-tree test-coverage | ||||
|  | ||||
| # Tools | ||||
|  | ||||
| @@ -49,6 +47,12 @@ $(TOOLS)/semconvgen: PACKAGE=go.opentelemetry.io/build-tools/semconvgen | ||||
| CROSSLINK = $(TOOLS)/crosslink | ||||
| $(TOOLS)/crosslink: PACKAGE=go.opentelemetry.io/otel/$(TOOLS_MOD_DIR)/crosslink | ||||
|  | ||||
| SEMCONVKIT = $(TOOLS)/semconvkit | ||||
| $(TOOLS)/semconvkit: PACKAGE=go.opentelemetry.io/otel/$(TOOLS_MOD_DIR)/semconvkit | ||||
|  | ||||
| DBOTCONF = $(TOOLS)/dbotconf | ||||
| $(TOOLS)/dbotconf: PACKAGE=go.opentelemetry.io/build-tools/dbotconf | ||||
|  | ||||
| GOLANGCI_LINT = $(TOOLS)/golangci-lint | ||||
| $(TOOLS)/golangci-lint: PACKAGE=github.com/golangci/golangci-lint/cmd/golangci-lint | ||||
|  | ||||
| @@ -68,55 +72,51 @@ GOJQ = $(TOOLS)/gojq | ||||
| $(TOOLS)/gojq: PACKAGE=github.com/itchyny/gojq/cmd/gojq | ||||
|  | ||||
| .PHONY: tools | ||||
| tools: $(CROSSLINK) $(GOLANGCI_LINT) $(MISSPELL) $(GOCOVMERGE) $(STRINGER) $(PORTO) $(GOJQ) $(SEMCONVGEN) $(MULTIMOD) | ||||
| tools: $(CROSSLINK) $(DBOTCONF) $(GOLANGCI_LINT) $(MISSPELL) $(GOCOVMERGE) $(STRINGER) $(PORTO) $(GOJQ) $(SEMCONVGEN) $(MULTIMOD) $(SEMCONVKIT) | ||||
|  | ||||
| # Build | ||||
|  | ||||
| .PHONY: examples generate build | ||||
| examples: | ||||
| 	@set -e; for dir in $(EXAMPLES); do \ | ||||
| 	  echo "$(GO) build $${dir}/..."; \ | ||||
| 	  (cd "$${dir}" && \ | ||||
| 	   $(GO) build .); \ | ||||
| 	done | ||||
| .PHONY: generate build | ||||
|  | ||||
| generate: $(STRINGER) $(PORTO) | ||||
| 	set -e; for dir in $(ALL_GO_MOD_DIRS); do \ | ||||
| 	  echo "$(GO) generate $${dir}/..."; \ | ||||
| 	  (cd "$${dir}" && \ | ||||
| 	    PATH="$(TOOLS):$${PATH}" $(GO) generate ./... && \ | ||||
| 		$(PORTO) -w .); \ | ||||
| 	done | ||||
| generate: $(OTEL_GO_MOD_DIRS:%=generate/%) | ||||
| generate/%: DIR=$* | ||||
| generate/%: | $(STRINGER) $(PORTO) | ||||
| 	@echo "$(GO) generate $(DIR)/..." \ | ||||
| 		&& cd $(DIR) \ | ||||
| 		&& PATH="$(TOOLS):$${PATH}" $(GO) generate ./... && $(PORTO) -w . | ||||
|  | ||||
| build: generate | ||||
| 	# Build all package code including testing code. | ||||
| 	set -e; for dir in $(ALL_GO_MOD_DIRS); do \ | ||||
| 	  echo "$(GO) build $${dir}/..."; \ | ||||
| 	  (cd "$${dir}" && \ | ||||
| 	    $(GO) build ./... && \ | ||||
| 		$(GO) list ./... \ | ||||
| 		  | grep -v third_party \ | ||||
| 		  | xargs $(GO) test -vet=off -run xxxxxMatchNothingxxxxx >/dev/null); \ | ||||
| 	done | ||||
| build: generate $(OTEL_GO_MOD_DIRS:%=build/%) $(OTEL_GO_MOD_DIRS:%=build-tests/%) | ||||
| build/%: DIR=$* | ||||
| build/%: | ||||
| 	@echo "$(GO) build $(DIR)/..." \ | ||||
| 		&& cd $(DIR) \ | ||||
| 		&& $(GO) build ./... | ||||
|  | ||||
| build-tests/%: DIR=$* | ||||
| build-tests/%: | ||||
| 	@echo "$(GO) build tests $(DIR)/..." \ | ||||
| 		&& cd $(DIR) \ | ||||
| 		&& $(GO) list ./... \ | ||||
| 		| grep -v third_party \ | ||||
| 		| xargs $(GO) test -vet=off -run xxxxxMatchNothingxxxxx >/dev/null | ||||
|  | ||||
| # Tests | ||||
|  | ||||
| TEST_TARGETS := test-default test-bench test-short test-verbose test-race | ||||
| .PHONY: $(TEST_TARGETS) test | ||||
| test-default: ARGS=-v -race | ||||
| test-default test-race: ARGS=-race | ||||
| test-bench:   ARGS=-run=xxxxxMatchNothingxxxxx -test.benchtime=1ms -bench=. | ||||
| test-short:   ARGS=-short | ||||
| test-verbose: ARGS=-v | ||||
| test-race:    ARGS=-race | ||||
| test-verbose: ARGS=-v -race | ||||
| $(TEST_TARGETS): test | ||||
| test: | ||||
| 	@set -e; for dir in $(ALL_GO_MOD_DIRS); do \ | ||||
| 	  echo "$(GO) test -timeout $(TIMEOUT)s $(ARGS) $${dir}/..."; \ | ||||
| 	  (cd "$${dir}" && \ | ||||
| 	    $(GO) list ./... \ | ||||
| 		  | grep -v third_party \ | ||||
| 		  | xargs $(GO) test -timeout $(TIMEOUT)s $(ARGS)); \ | ||||
| 	done | ||||
| test: $(OTEL_GO_MOD_DIRS:%=test/%) | ||||
| test/%: DIR=$* | ||||
| test/%: | ||||
| 	@echo "$(GO) test -timeout $(TIMEOUT)s $(ARGS) $(DIR)/..." \ | ||||
| 		&& cd $(DIR) \ | ||||
| 		&& $(GO) list ./... \ | ||||
| 		| grep -v third_party \ | ||||
| 		| xargs $(GO) test -timeout $(TIMEOUT)s $(ARGS) | ||||
|  | ||||
| COVERAGE_MODE    = atomic | ||||
| COVERAGE_PROFILE = coverage.out | ||||
| @@ -129,37 +129,52 @@ test-coverage: | $(GOCOVMERGE) | ||||
| 	  (cd "$${dir}" && \ | ||||
| 	    $(GO) list ./... \ | ||||
| 	    | grep -v third_party \ | ||||
| 	    | grep -v 'semconv/v.*' \ | ||||
| 	    | xargs $(GO) test -coverpkg=./... -covermode=$(COVERAGE_MODE) -coverprofile="$(COVERAGE_PROFILE)" && \ | ||||
| 	  $(GO) tool cover -html=coverage.out -o coverage.html); \ | ||||
| 	done; \ | ||||
| 	$(GOCOVMERGE) $$(find . -name coverage.out) > coverage.txt | ||||
|  | ||||
| .PHONY: golangci-lint golangci-lint-fix | ||||
| golangci-lint-fix: ARGS=--fix | ||||
| golangci-lint-fix: golangci-lint | ||||
| golangci-lint: $(OTEL_GO_MOD_DIRS:%=golangci-lint/%) | ||||
| golangci-lint/%: DIR=$* | ||||
| golangci-lint/%: | $(GOLANGCI_LINT) | ||||
| 	@echo 'golangci-lint $(if $(ARGS),$(ARGS) ,)$(DIR)' \ | ||||
| 		&& cd $(DIR) \ | ||||
| 		&& $(GOLANGCI_LINT) run --allow-serial-runners $(ARGS) | ||||
|  | ||||
| .PHONY: crosslink | ||||
| crosslink: | $(CROSSLINK) | ||||
| 	@echo "cross-linking all go modules" \ | ||||
| 		&& $(CROSSLINK) | ||||
|  | ||||
| .PHONY: go-mod-tidy | ||||
| go-mod-tidy: $(ALL_GO_MOD_DIRS:%=go-mod-tidy/%) | ||||
| go-mod-tidy/%: DIR=$* | ||||
| go-mod-tidy/%: | crosslink | ||||
| 	@echo "$(GO) mod tidy in $(DIR)" \ | ||||
| 		&& cd $(DIR) \ | ||||
| 		&& $(GO) mod tidy | ||||
|  | ||||
| .PHONY: lint-modules | ||||
| lint-modules: go-mod-tidy | ||||
|  | ||||
| .PHONY: lint | ||||
| lint: misspell lint-modules | $(GOLANGCI_LINT) | ||||
| 	set -e; for dir in $(ALL_GO_MOD_DIRS); do \ | ||||
| 	  echo "golangci-lint in $${dir}"; \ | ||||
| 	  (cd "$${dir}" && \ | ||||
| 	    $(GOLANGCI_LINT) run --fix && \ | ||||
| 	    $(GOLANGCI_LINT) run); \ | ||||
| 	done | ||||
| lint: misspell lint-modules golangci-lint | ||||
|  | ||||
| .PHONY: vanity-import-check | ||||
| vanity-import-check: | $(PORTO) | ||||
| 	$(PORTO) --include-internal -l . | ||||
| 	@$(PORTO) --include-internal -l . || echo "(run: make vanity-import-fix)" | ||||
|  | ||||
| .PHONY: vanity-import-fix | ||||
| vanity-import-fix: | $(PORTO) | ||||
| 	@$(PORTO) --include-internal -w . | ||||
|  | ||||
| .PHONY: misspell | ||||
| misspell: | $(MISSPELL) | ||||
| 	$(MISSPELL) -w $(ALL_DOCS) | ||||
|  | ||||
| .PHONY: lint-modules | ||||
| lint-modules: | $(CROSSLINK) | ||||
| 	set -e; for dir in $(ALL_GO_MOD_DIRS) $(TOOLS_MOD_DIR); do \ | ||||
| 	  echo "$(GO) mod tidy in $${dir}"; \ | ||||
| 	  (cd "$${dir}" && \ | ||||
| 	    $(GO) mod tidy); \ | ||||
| 	done | ||||
| 	echo "cross-linking all go modules" | ||||
| 	$(CROSSLINK) | ||||
| 	@$(MISSPELL) -w $(ALL_DOCS) | ||||
|  | ||||
| .PHONY: license-check | ||||
| license-check: | ||||
| @@ -171,19 +186,14 @@ license-check: | ||||
| 	           exit 1; \ | ||||
| 	   fi | ||||
|  | ||||
| DEPENDABOT_CONFIG = .github/dependabot.yml | ||||
| .PHONY: dependabot-check | ||||
| dependabot-check: | ||||
| 	@result=$$( \ | ||||
| 		for f in $$( find . -type f -name go.mod -exec dirname {} \; | sed 's/^.//' ); \ | ||||
| 			do grep -q "directory: \+$$f" .github/dependabot.yml \ | ||||
| 			|| echo "$$f"; \ | ||||
| 		done; \ | ||||
| 	); \ | ||||
| 	if [ -n "$$result" ]; then \ | ||||
| 		echo "missing go.mod dependabot check:"; echo "$$result"; \ | ||||
| 		echo "new modules need to be added to the .github/dependabot.yml file"; \ | ||||
| 		exit 1; \ | ||||
| 	fi | ||||
| dependabot-check: | $(DBOTCONF) | ||||
| 	@$(DBOTCONF) verify $(DEPENDABOT_CONFIG) || echo "(run: make dependabot-generate)" | ||||
|  | ||||
| .PHONY: dependabot-generate | ||||
| dependabot-generate: | $(DBOTCONF) | ||||
| 	@$(DBOTCONF) generate > $(DEPENDABOT_CONFIG) | ||||
|  | ||||
| .PHONY: check-clean-work-tree | ||||
| check-clean-work-tree: | ||||
| @@ -195,6 +205,15 @@ check-clean-work-tree: | ||||
| 	  exit 1; \ | ||||
| 	fi | ||||
|  | ||||
| SEMCONVPKG ?= "semconv/" | ||||
| .PHONY: semconv-generate | ||||
| semconv-generate: | $(SEMCONVGEN) $(SEMCONVKIT) | ||||
| 	@[ "$(TAG)" ] || ( echo "TAG unset: missing opentelemetry specification tag"; exit 1 ) | ||||
| 	@[ "$(OTEL_SPEC_REPO)" ] || ( echo "OTEL_SPEC_REPO unset: missing path to opentelemetry specification repo"; exit 1 ) | ||||
| 	@$(SEMCONVGEN) -i "$(OTEL_SPEC_REPO)/semantic_conventions/trace" -t "$(SEMCONVPKG)/template.j2" -s "$(TAG)" | ||||
| 	@$(SEMCONVGEN) -i "$(OTEL_SPEC_REPO)/semantic_conventions/resource" -t "$(SEMCONVPKG)/template.j2" -s "$(TAG)" | ||||
| 	@$(SEMCONVKIT) -output "$(SEMCONVPKG)/$(TAG)" -tag "$(TAG)" | ||||
|  | ||||
| .PHONY: prerelease | ||||
| prerelease: | $(MULTIMOD) | ||||
| 	@[ "${MODSET}" ] || ( echo ">> env var MODSET is not set"; exit 1 ) | ||||
|   | ||||
							
								
								
									
										12
									
								
								vendor/go.opentelemetry.io/otel/README.md
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										12
									
								
								vendor/go.opentelemetry.io/otel/README.md
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -41,20 +41,28 @@ This project is tested on the following systems. | ||||
|  | ||||
| | OS      | Go Version | Architecture | | ||||
| | ------- | ---------- | ------------ | | ||||
| | Ubuntu  | 1.18       | amd64        | | ||||
| | Ubuntu  | 1.17       | amd64        | | ||||
| | Ubuntu  | 1.16       | amd64        | | ||||
| | Ubuntu  | 1.18       | 386          | | ||||
| | Ubuntu  | 1.17       | 386          | | ||||
| | Ubuntu  | 1.16       | 386          | | ||||
| | MacOS   | 1.18       | amd64        | | ||||
| | MacOS   | 1.17       | amd64        | | ||||
| | MacOS   | 1.16       | amd64        | | ||||
| | Windows | 1.18       | amd64        | | ||||
| | Windows | 1.17       | amd64        | | ||||
| | Windows | 1.16       | amd64        | | ||||
| | Windows | 1.18       | 386          | | ||||
| | Windows | 1.17       | 386          | | ||||
| | Windows | 1.16       | 386          | | ||||
|  | ||||
| While this project should work for other systems, no compatibility guarantees | ||||
| are made for those systems currently. | ||||
|  | ||||
| Go 1.18 was added in March of 2022. | ||||
| Go 1.16 will be removed around June 2022. | ||||
|  | ||||
| ## Getting Started | ||||
|  | ||||
| You can find a getting started guide on [opentelemetry.io](https://opentelemetry.io/docs/go/getting-started/). | ||||
| @@ -76,7 +84,7 @@ libraries](https://github.com/open-telemetry/opentelemetry-go-contrib/tree/main/ | ||||
| If you need to extend the telemetry an instrumentation library provides or want | ||||
| to build your own instrumentation for your application directly you will need | ||||
| to use the | ||||
| [go.opentelemetry.io/otel/api](https://pkg.go.dev/go.opentelemetry.io/otel/api) | ||||
| [Go otel](https://pkg.go.dev/go.opentelemetry.io/otel) | ||||
| package. The included [examples](./example/) are a good way to see some | ||||
| practical uses of this process. | ||||
|  | ||||
| @@ -95,8 +103,6 @@ All officially supported exporters for the OpenTelemetry project are contained i | ||||
| | [stdout](./exporters/stdout/)         | ✓       | ✓      | | ||||
| | [Zipkin](./exporters/zipkin/)         |         | ✓      | | ||||
|  | ||||
| Additionally, OpenTelemetry community supported exporters can be found in the [contrib repository](https://github.com/open-telemetry/opentelemetry-go-contrib/tree/main/exporters). | ||||
|  | ||||
| ## Contributing | ||||
|  | ||||
| See the [contributing documentation](CONTRIBUTING.md). | ||||
|   | ||||
							
								
								
									
										41
									
								
								vendor/go.opentelemetry.io/otel/RELEASING.md
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										41
									
								
								vendor/go.opentelemetry.io/otel/RELEASING.md
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -2,35 +2,23 @@ | ||||
|  | ||||
| ## Semantic Convention Generation | ||||
|  | ||||
| If a new version of the OpenTelemetry Specification has been released it will be necessary to generate a new | ||||
| semantic convention package from the YAML definitions in the specification repository. There is a `semconvgen` utility | ||||
| installed by `make tools` that can be used to generate the a package with the name matching the specification | ||||
| version number under the `semconv` package. This will ideally be done soon after the specification release is | ||||
| tagged. Make sure that the specification repo contains a checkout of the the latest tagged release so that the | ||||
| generated files match the released semantic conventions. | ||||
| New versions of the [OpenTelemetry specification] mean new versions of the `semconv` package need to be generated. | ||||
| The `semconv-generate` make target is used for this. | ||||
|  | ||||
| There are currently two categories of semantic conventions that must be generated, `resource` and `trace`. | ||||
| 1. Checkout a local copy of the [OpenTelemetry specification] to the desired release tag. | ||||
| 2. Run the `make semconv-generate ...` target from this repository. | ||||
|  | ||||
| ``` | ||||
| .tools/semconvgen -i /path/to/specification/repo/semantic_conventions/resource -t semconv/template.j2 | ||||
| .tools/semconvgen -i /path/to/specification/repo/semantic_conventions/trace -t semconv/template.j2 | ||||
| For example, | ||||
|  | ||||
| ```sh | ||||
| export TAG="v1.7.0" # Change to the release version you are generating. | ||||
| export OTEL_SPEC_REPO="/absolute/path/to/opentelemetry-specification" | ||||
| git -C "$OTEL_SPEC_REPO" checkout "tags/$TAG" | ||||
| make semconv-generate # Uses the exported TAG and OTEL_SPEC_REPO. | ||||
| ``` | ||||
|  | ||||
| Using default values for all options other than `input` will result in using the `template.j2` template to | ||||
| generate `resource.go` and `trace.go` in `/path/to/otelgo/repo/semconv/<version>`. | ||||
|  | ||||
| There are several ancillary files that are not generated and should be copied into the new package from the | ||||
| prior package, with updates made as appropriate to canonical import path statements and constant values. | ||||
| These files include: | ||||
|  | ||||
| * doc.go | ||||
| * exception.go | ||||
| * http(_test)?.go | ||||
| * schema.go | ||||
|  | ||||
| Uses of the previous schema version in this repository should be updated to use the newly generated version. | ||||
| No tooling for this exists at present, so use find/replace in your editor of choice or craft a `grep | sed` | ||||
| pipeline if you like living on the edge. | ||||
| This should create a new sub-package of [`semconv`](./semconv). | ||||
| Ensure things look correct before submitting a pull request to include the addition. | ||||
|  | ||||
| ## Pre-Release | ||||
|  | ||||
| @@ -108,7 +96,6 @@ It is critical you make sure the version you push upstream is correct. | ||||
|  | ||||
| Finally create a Release for the new `<new tag>` on GitHub. | ||||
| The release body should include all the release notes from the Changelog for this release. | ||||
| Additionally, the `tag.sh` script generates commit logs since last release which can be used to supplement the release notes. | ||||
|  | ||||
| ## Verify Examples | ||||
|  | ||||
| @@ -131,3 +118,5 @@ Once verified be sure to [make a release for the `contrib` repository](https://g | ||||
|  | ||||
| Update [the documentation](./website_docs) for [the OpenTelemetry website](https://opentelemetry.io/docs/go/). | ||||
| Importantly, bump any package versions referenced to be the latest one you just released and ensure all code examples still compile and are accurate. | ||||
|  | ||||
| [OpenTelemetry specification]: https://github.com/open-telemetry/opentelemetry-specification | ||||
|   | ||||
							
								
								
									
										82
									
								
								vendor/go.opentelemetry.io/otel/attribute/encoder.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										82
									
								
								vendor/go.opentelemetry.io/otel/attribute/encoder.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -21,19 +21,17 @@ import ( | ||||
| ) | ||||
|  | ||||
| type ( | ||||
| 	// Encoder is a mechanism for serializing a label set into a | ||||
| 	// specific string representation that supports caching, to | ||||
| 	// avoid repeated serialization. An example could be an | ||||
| 	// exporter encoding the label set into a wire representation. | ||||
| 	// Encoder is a mechanism for serializing an attribute set into a specific | ||||
| 	// string representation that supports caching, to avoid repeated | ||||
| 	// serialization. An example could be an exporter encoding the attribute | ||||
| 	// set into a wire representation. | ||||
| 	Encoder interface { | ||||
| 		// Encode returns the serialized encoding of the label | ||||
| 		// set using its Iterator.  This result may be cached | ||||
| 		// by a attribute.Set. | ||||
| 		// Encode returns the serialized encoding of the attribute set using | ||||
| 		// its Iterator. This result may be cached by a attribute.Set. | ||||
| 		Encode(iterator Iterator) string | ||||
|  | ||||
| 		// ID returns a value that is unique for each class of | ||||
| 		// label encoder.  Label encoders allocate these using | ||||
| 		// `NewEncoderID`. | ||||
| 		// ID returns a value that is unique for each class of attribute | ||||
| 		// encoder. Attribute encoders allocate these using `NewEncoderID`. | ||||
| 		ID() EncoderID | ||||
| 	} | ||||
|  | ||||
| @@ -43,54 +41,53 @@ type ( | ||||
| 		value uint64 | ||||
| 	} | ||||
|  | ||||
| 	// defaultLabelEncoder uses a sync.Pool of buffers to reduce | ||||
| 	// the number of allocations used in encoding labels.  This | ||||
| 	// implementation encodes a comma-separated list of key=value, | ||||
| 	// with '/'-escaping of '=', ',', and '\'. | ||||
| 	defaultLabelEncoder struct { | ||||
| 		// pool is a pool of labelset builders.  The buffers in this | ||||
| 		// pool grow to a size that most label encodings will not | ||||
| 		// allocate new memory. | ||||
| 	// defaultAttrEncoder uses a sync.Pool of buffers to reduce the number of | ||||
| 	// allocations used in encoding attributes. This implementation encodes a | ||||
| 	// comma-separated list of key=value, with '/'-escaping of '=', ',', and | ||||
| 	// '\'. | ||||
| 	defaultAttrEncoder struct { | ||||
| 		// pool is a pool of attribute set builders. The buffers in this pool | ||||
| 		// grow to a size that most attribute encodings will not allocate new | ||||
| 		// memory. | ||||
| 		pool sync.Pool // *bytes.Buffer | ||||
| 	} | ||||
| ) | ||||
|  | ||||
| // escapeChar is used to ensure uniqueness of the label encoding where | ||||
| // keys or values contain either '=' or ','.  Since there is no parser | ||||
| // needed for this encoding and its only requirement is to be unique, | ||||
| // this choice is arbitrary.  Users will see these in some exporters | ||||
| // (e.g., stdout), so the backslash ('\') is used as a conventional choice. | ||||
| // escapeChar is used to ensure uniqueness of the attribute encoding where | ||||
| // keys or values contain either '=' or ','.  Since there is no parser needed | ||||
| // for this encoding and its only requirement is to be unique, this choice is | ||||
| // arbitrary.  Users will see these in some exporters (e.g., stdout), so the | ||||
| // backslash ('\') is used as a conventional choice. | ||||
| const escapeChar = '\\' | ||||
|  | ||||
| var ( | ||||
| 	_ Encoder = &defaultLabelEncoder{} | ||||
| 	_ Encoder = &defaultAttrEncoder{} | ||||
|  | ||||
| 	// encoderIDCounter is for generating IDs for other label | ||||
| 	// encoders. | ||||
| 	// encoderIDCounter is for generating IDs for other attribute encoders. | ||||
| 	encoderIDCounter uint64 | ||||
|  | ||||
| 	defaultEncoderOnce     sync.Once | ||||
| 	defaultEncoderID       = NewEncoderID() | ||||
| 	defaultEncoderInstance *defaultLabelEncoder | ||||
| 	defaultEncoderInstance *defaultAttrEncoder | ||||
| ) | ||||
|  | ||||
| // NewEncoderID returns a unique label encoder ID. It should be | ||||
| // called once per each type of label encoder. Preferably in init() or | ||||
| // in var definition. | ||||
| // NewEncoderID returns a unique attribute encoder ID. It should be called | ||||
| // once per each type of attribute encoder. Preferably in init() or in var | ||||
| // definition. | ||||
| func NewEncoderID() EncoderID { | ||||
| 	return EncoderID{value: atomic.AddUint64(&encoderIDCounter, 1)} | ||||
| } | ||||
|  | ||||
| // DefaultEncoder returns a label encoder that encodes labels | ||||
| // in such a way that each escaped label's key is followed by an equal | ||||
| // sign and then by an escaped label's value. All key-value pairs are | ||||
| // separated by a comma. | ||||
| // DefaultEncoder returns an attribute encoder that encodes attributes in such | ||||
| // a way that each escaped attribute's key is followed by an equal sign and | ||||
| // then by an escaped attribute's value. All key-value pairs are separated by | ||||
| // a comma. | ||||
| // | ||||
| // Escaping is done by prepending a backslash before either a | ||||
| // backslash, equal sign or a comma. | ||||
| // Escaping is done by prepending a backslash before either a backslash, equal | ||||
| // sign or a comma. | ||||
| func DefaultEncoder() Encoder { | ||||
| 	defaultEncoderOnce.Do(func() { | ||||
| 		defaultEncoderInstance = &defaultLabelEncoder{ | ||||
| 		defaultEncoderInstance = &defaultAttrEncoder{ | ||||
| 			pool: sync.Pool{ | ||||
| 				New: func() interface{} { | ||||
| 					return &bytes.Buffer{} | ||||
| @@ -101,15 +98,14 @@ func DefaultEncoder() Encoder { | ||||
| 	return defaultEncoderInstance | ||||
| } | ||||
|  | ||||
| // Encode is a part of an implementation of the LabelEncoder | ||||
| // interface. | ||||
| func (d *defaultLabelEncoder) Encode(iter Iterator) string { | ||||
| // Encode is a part of an implementation of the AttributeEncoder interface. | ||||
| func (d *defaultAttrEncoder) Encode(iter Iterator) string { | ||||
| 	buf := d.pool.Get().(*bytes.Buffer) | ||||
| 	defer d.pool.Put(buf) | ||||
| 	buf.Reset() | ||||
|  | ||||
| 	for iter.Next() { | ||||
| 		i, keyValue := iter.IndexedLabel() | ||||
| 		i, keyValue := iter.IndexedAttribute() | ||||
| 		if i > 0 { | ||||
| 			_, _ = buf.WriteRune(',') | ||||
| 		} | ||||
| @@ -126,8 +122,8 @@ func (d *defaultLabelEncoder) Encode(iter Iterator) string { | ||||
| 	return buf.String() | ||||
| } | ||||
|  | ||||
| // ID is a part of an implementation of the LabelEncoder interface. | ||||
| func (*defaultLabelEncoder) ID() EncoderID { | ||||
| // ID is a part of an implementation of the AttributeEncoder interface. | ||||
| func (*defaultAttrEncoder) ID() EncoderID { | ||||
| 	return defaultEncoderID | ||||
| } | ||||
|  | ||||
|   | ||||
							
								
								
									
										80
									
								
								vendor/go.opentelemetry.io/otel/attribute/iterator.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										80
									
								
								vendor/go.opentelemetry.io/otel/attribute/iterator.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -14,16 +14,16 @@ | ||||
|  | ||||
| package attribute // import "go.opentelemetry.io/otel/attribute" | ||||
|  | ||||
| // Iterator allows iterating over the set of labels in order, | ||||
| // sorted by key. | ||||
| // Iterator allows iterating over the set of attributes in order, sorted by | ||||
| // key. | ||||
| type Iterator struct { | ||||
| 	storage *Set | ||||
| 	idx     int | ||||
| } | ||||
|  | ||||
| // MergeIterator supports iterating over two sets of labels while | ||||
| // eliminating duplicate values from the combined set.  The first | ||||
| // iterator value takes precedence. | ||||
| // MergeIterator supports iterating over two sets of attributes while | ||||
| // eliminating duplicate values from the combined set. The first iterator | ||||
| // value takes precedence. | ||||
| type MergeIterator struct { | ||||
| 	one     oneIterator | ||||
| 	two     oneIterator | ||||
| @@ -31,13 +31,13 @@ type MergeIterator struct { | ||||
| } | ||||
|  | ||||
| type oneIterator struct { | ||||
| 	iter  Iterator | ||||
| 	done  bool | ||||
| 	label KeyValue | ||||
| 	iter Iterator | ||||
| 	done bool | ||||
| 	attr KeyValue | ||||
| } | ||||
|  | ||||
| // Next moves the iterator to the next position. Returns false if there | ||||
| // are no more labels. | ||||
| // Next moves the iterator to the next position. Returns false if there are no | ||||
| // more attributes. | ||||
| func (i *Iterator) Next() bool { | ||||
| 	i.idx++ | ||||
| 	return i.idx < i.Len() | ||||
| @@ -45,30 +45,41 @@ func (i *Iterator) Next() bool { | ||||
|  | ||||
| // Label returns current KeyValue. Must be called only after Next returns | ||||
| // true. | ||||
| // | ||||
| // Deprecated: Use Attribute instead. | ||||
| func (i *Iterator) Label() KeyValue { | ||||
| 	return i.Attribute() | ||||
| } | ||||
|  | ||||
| // Attribute returns the current KeyValue of the Iterator. It must be called | ||||
| // only after Next returns true. | ||||
| func (i *Iterator) Attribute() KeyValue { | ||||
| 	kv, _ := i.storage.Get(i.idx) | ||||
| 	return kv | ||||
| } | ||||
|  | ||||
| // Attribute is a synonym for Label(). | ||||
| func (i *Iterator) Attribute() KeyValue { | ||||
| 	return i.Label() | ||||
| } | ||||
|  | ||||
| // IndexedLabel returns current index and attribute. Must be called only | ||||
| // after Next returns true. | ||||
| // | ||||
| // Deprecated: Use IndexedAttribute instead. | ||||
| func (i *Iterator) IndexedLabel() (int, KeyValue) { | ||||
| 	return i.idx, i.Label() | ||||
| 	return i.idx, i.Attribute() | ||||
| } | ||||
|  | ||||
| // Len returns a number of labels in the iterator's `*Set`. | ||||
| // IndexedAttribute returns current index and attribute. Must be called only | ||||
| // after Next returns true. | ||||
| func (i *Iterator) IndexedAttribute() (int, KeyValue) { | ||||
| 	return i.idx, i.Attribute() | ||||
| } | ||||
|  | ||||
| // Len returns a number of attributes in the iterated set. | ||||
| func (i *Iterator) Len() int { | ||||
| 	return i.storage.Len() | ||||
| } | ||||
|  | ||||
| // ToSlice is a convenience function that creates a slice of labels | ||||
| // from the passed iterator. The iterator is set up to start from the | ||||
| // beginning before creating the slice. | ||||
| // ToSlice is a convenience function that creates a slice of attributes from | ||||
| // the passed iterator. The iterator is set up to start from the beginning | ||||
| // before creating the slice. | ||||
| func (i *Iterator) ToSlice() []KeyValue { | ||||
| 	l := i.Len() | ||||
| 	if l == 0 { | ||||
| @@ -77,12 +88,12 @@ func (i *Iterator) ToSlice() []KeyValue { | ||||
| 	i.idx = -1 | ||||
| 	slice := make([]KeyValue, 0, l) | ||||
| 	for i.Next() { | ||||
| 		slice = append(slice, i.Label()) | ||||
| 		slice = append(slice, i.Attribute()) | ||||
| 	} | ||||
| 	return slice | ||||
| } | ||||
|  | ||||
| // NewMergeIterator returns a MergeIterator for merging two label sets | ||||
| // NewMergeIterator returns a MergeIterator for merging two attribute sets. | ||||
| // Duplicates are resolved by taking the value from the first set. | ||||
| func NewMergeIterator(s1, s2 *Set) MergeIterator { | ||||
| 	mi := MergeIterator{ | ||||
| @@ -102,42 +113,49 @@ func makeOne(iter Iterator) oneIterator { | ||||
|  | ||||
| func (oi *oneIterator) advance() { | ||||
| 	if oi.done = !oi.iter.Next(); !oi.done { | ||||
| 		oi.label = oi.iter.Label() | ||||
| 		oi.attr = oi.iter.Attribute() | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // Next returns true if there is another label available. | ||||
| // Next returns true if there is another attribute available. | ||||
| func (m *MergeIterator) Next() bool { | ||||
| 	if m.one.done && m.two.done { | ||||
| 		return false | ||||
| 	} | ||||
| 	if m.one.done { | ||||
| 		m.current = m.two.label | ||||
| 		m.current = m.two.attr | ||||
| 		m.two.advance() | ||||
| 		return true | ||||
| 	} | ||||
| 	if m.two.done { | ||||
| 		m.current = m.one.label | ||||
| 		m.current = m.one.attr | ||||
| 		m.one.advance() | ||||
| 		return true | ||||
| 	} | ||||
| 	if m.one.label.Key == m.two.label.Key { | ||||
| 		m.current = m.one.label // first iterator label value wins | ||||
| 	if m.one.attr.Key == m.two.attr.Key { | ||||
| 		m.current = m.one.attr // first iterator attribute value wins | ||||
| 		m.one.advance() | ||||
| 		m.two.advance() | ||||
| 		return true | ||||
| 	} | ||||
| 	if m.one.label.Key < m.two.label.Key { | ||||
| 		m.current = m.one.label | ||||
| 	if m.one.attr.Key < m.two.attr.Key { | ||||
| 		m.current = m.one.attr | ||||
| 		m.one.advance() | ||||
| 		return true | ||||
| 	} | ||||
| 	m.current = m.two.label | ||||
| 	m.current = m.two.attr | ||||
| 	m.two.advance() | ||||
| 	return true | ||||
| } | ||||
|  | ||||
| // Label returns the current value after Next() returns true. | ||||
| // | ||||
| // Deprecated: Use Attribute instead. | ||||
| func (m *MergeIterator) Label() KeyValue { | ||||
| 	return m.current | ||||
| } | ||||
|  | ||||
| // Attribute returns the current value after Next() returns true. | ||||
| func (m *MergeIterator) Attribute() KeyValue { | ||||
| 	return m.current | ||||
| } | ||||
|   | ||||
							
								
								
									
										2
									
								
								vendor/go.opentelemetry.io/otel/attribute/kv.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								vendor/go.opentelemetry.io/otel/attribute/kv.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -26,7 +26,7 @@ type KeyValue struct { | ||||
|  | ||||
| // Valid returns if kv is a valid OpenTelemetry attribute. | ||||
| func (kv KeyValue) Valid() bool { | ||||
| 	return kv.Key != "" && kv.Value.Type() != INVALID | ||||
| 	return kv.Key.Defined() && kv.Value.Type() != INVALID | ||||
| } | ||||
|  | ||||
| // Bool creates a KeyValue with a BOOL Value type. | ||||
|   | ||||
							
								
								
									
										152
									
								
								vendor/go.opentelemetry.io/otel/attribute/set.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										152
									
								
								vendor/go.opentelemetry.io/otel/attribute/set.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -21,49 +21,42 @@ import ( | ||||
| ) | ||||
|  | ||||
| type ( | ||||
| 	// Set is the representation for a distinct label set.  It | ||||
| 	// manages an immutable set of labels, with an internal cache | ||||
| 	// for storing label encodings. | ||||
| 	// Set is the representation for a distinct attribute set. It manages an | ||||
| 	// immutable set of attributes, with an internal cache for storing | ||||
| 	// attribute encodings. | ||||
| 	// | ||||
| 	// This type supports the `Equivalent` method of comparison | ||||
| 	// using values of type `Distinct`. | ||||
| 	// | ||||
| 	// This type is used to implement: | ||||
| 	// 1. Metric labels | ||||
| 	// 2. Resource sets | ||||
| 	// 3. Correlation map (TODO) | ||||
| 	// This type supports the Equivalent method of comparison using values of | ||||
| 	// type Distinct. | ||||
| 	Set struct { | ||||
| 		equivalent Distinct | ||||
| 	} | ||||
|  | ||||
| 	// Distinct wraps a variable-size array of `KeyValue`, | ||||
| 	// constructed with keys in sorted order.  This can be used as | ||||
| 	// a map key or for equality checking between Sets. | ||||
| 	// Distinct wraps a variable-size array of KeyValue, constructed with keys | ||||
| 	// in sorted order. This can be used as a map key or for equality checking | ||||
| 	// between Sets. | ||||
| 	Distinct struct { | ||||
| 		iface interface{} | ||||
| 	} | ||||
|  | ||||
| 	// Filter supports removing certain labels from label sets. | ||||
| 	// When the filter returns true, the label will be kept in | ||||
| 	// the filtered label set.  When the filter returns false, the | ||||
| 	// label is excluded from the filtered label set, and the | ||||
| 	// label instead appears in the `removed` list of excluded labels. | ||||
| 	// Filter supports removing certain attributes from attribute sets. When | ||||
| 	// the filter returns true, the attribute will be kept in the filtered | ||||
| 	// attribute set. When the filter returns false, the attribute is excluded | ||||
| 	// from the filtered attribute set, and the attribute instead appears in | ||||
| 	// the removed list of excluded attributes. | ||||
| 	Filter func(KeyValue) bool | ||||
|  | ||||
| 	// Sortable implements `sort.Interface`, used for sorting | ||||
| 	// `KeyValue`.  This is an exported type to support a | ||||
| 	// memory optimization.  A pointer to one of these is needed | ||||
| 	// for the call to `sort.Stable()`, which the caller may | ||||
| 	// provide in order to avoid an allocation.  See | ||||
| 	// `NewSetWithSortable()`. | ||||
| 	// Sortable implements sort.Interface, used for sorting KeyValue. This is | ||||
| 	// an exported type to support a memory optimization. A pointer to one of | ||||
| 	// these is needed for the call to sort.Stable(), which the caller may | ||||
| 	// provide in order to avoid an allocation. See NewSetWithSortable(). | ||||
| 	Sortable []KeyValue | ||||
| ) | ||||
|  | ||||
| var ( | ||||
| 	// keyValueType is used in `computeDistinctReflect`. | ||||
| 	// keyValueType is used in computeDistinctReflect. | ||||
| 	keyValueType = reflect.TypeOf(KeyValue{}) | ||||
|  | ||||
| 	// emptySet is returned for empty label sets. | ||||
| 	// emptySet is returned for empty attribute sets. | ||||
| 	emptySet = &Set{ | ||||
| 		equivalent: Distinct{ | ||||
| 			iface: [0]KeyValue{}, | ||||
| @@ -78,17 +71,17 @@ func EmptySet() *Set { | ||||
| 	return emptySet | ||||
| } | ||||
|  | ||||
| // reflect abbreviates `reflect.ValueOf`. | ||||
| // reflect abbreviates reflect.ValueOf. | ||||
| func (d Distinct) reflect() reflect.Value { | ||||
| 	return reflect.ValueOf(d.iface) | ||||
| } | ||||
|  | ||||
| // Valid returns true if this value refers to a valid `*Set`. | ||||
| // Valid returns true if this value refers to a valid Set. | ||||
| func (d Distinct) Valid() bool { | ||||
| 	return d.iface != nil | ||||
| } | ||||
|  | ||||
| // Len returns the number of labels in this set. | ||||
| // Len returns the number of attributes in this set. | ||||
| func (l *Set) Len() int { | ||||
| 	if l == nil || !l.equivalent.Valid() { | ||||
| 		return 0 | ||||
| @@ -96,7 +89,7 @@ func (l *Set) Len() int { | ||||
| 	return l.equivalent.reflect().Len() | ||||
| } | ||||
|  | ||||
| // Get returns the KeyValue at ordered position `idx` in this set. | ||||
| // Get returns the KeyValue at ordered position idx in this set. | ||||
| func (l *Set) Get(idx int) (KeyValue, bool) { | ||||
| 	if l == nil { | ||||
| 		return KeyValue{}, false | ||||
| @@ -142,7 +135,7 @@ func (l *Set) HasValue(k Key) bool { | ||||
| 	return ok | ||||
| } | ||||
|  | ||||
| // Iter returns an iterator for visiting the labels in this set. | ||||
| // Iter returns an iterator for visiting the attributes in this set. | ||||
| func (l *Set) Iter() Iterator { | ||||
| 	return Iterator{ | ||||
| 		storage: l, | ||||
| @@ -150,18 +143,17 @@ func (l *Set) Iter() Iterator { | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // ToSlice returns the set of labels belonging to this set, sorted, | ||||
| // where keys appear no more than once. | ||||
| // ToSlice returns the set of attributes belonging to this set, sorted, where | ||||
| // keys appear no more than once. | ||||
| func (l *Set) ToSlice() []KeyValue { | ||||
| 	iter := l.Iter() | ||||
| 	return iter.ToSlice() | ||||
| } | ||||
|  | ||||
| // Equivalent returns a value that may be used as a map key.  The | ||||
| // Distinct type guarantees that the result will equal the equivalent | ||||
| // Distinct value of any label set with the same elements as this, | ||||
| // where sets are made unique by choosing the last value in the input | ||||
| // for any given key. | ||||
| // Equivalent returns a value that may be used as a map key. The Distinct type | ||||
| // guarantees that the result will equal the equivalent. Distinct value of any | ||||
| // attribute set with the same elements as this, where sets are made unique by | ||||
| // choosing the last value in the input for any given key. | ||||
| func (l *Set) Equivalent() Distinct { | ||||
| 	if l == nil || !l.equivalent.Valid() { | ||||
| 		return emptySet.equivalent | ||||
| @@ -174,8 +166,7 @@ func (l *Set) Equals(o *Set) bool { | ||||
| 	return l.Equivalent() == o.Equivalent() | ||||
| } | ||||
|  | ||||
| // Encoded returns the encoded form of this set, according to | ||||
| // `encoder`. | ||||
| // Encoded returns the encoded form of this set, according to encoder. | ||||
| func (l *Set) Encoded(encoder Encoder) string { | ||||
| 	if l == nil || encoder == nil { | ||||
| 		return "" | ||||
| @@ -190,11 +181,11 @@ func empty() Set { | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // NewSet returns a new `Set`.  See the documentation for | ||||
| // `NewSetWithSortableFiltered` for more details. | ||||
| // NewSet returns a new Set. See the documentation for | ||||
| // NewSetWithSortableFiltered for more details. | ||||
| // | ||||
| // Except for empty sets, this method adds an additional allocation | ||||
| // compared with calls that include a `*Sortable`. | ||||
| // Except for empty sets, this method adds an additional allocation compared | ||||
| // with calls that include a Sortable. | ||||
| func NewSet(kvs ...KeyValue) Set { | ||||
| 	// Check for empty set. | ||||
| 	if len(kvs) == 0 { | ||||
| @@ -204,10 +195,10 @@ func NewSet(kvs ...KeyValue) Set { | ||||
| 	return s | ||||
| } | ||||
|  | ||||
| // NewSetWithSortable returns a new `Set`.  See the documentation for | ||||
| // `NewSetWithSortableFiltered` for more details. | ||||
| // NewSetWithSortable returns a new Set. See the documentation for | ||||
| // NewSetWithSortableFiltered for more details. | ||||
| // | ||||
| // This call includes a `*Sortable` option as a memory optimization. | ||||
| // This call includes a Sortable option as a memory optimization. | ||||
| func NewSetWithSortable(kvs []KeyValue, tmp *Sortable) Set { | ||||
| 	// Check for empty set. | ||||
| 	if len(kvs) == 0 { | ||||
| @@ -217,12 +208,11 @@ func NewSetWithSortable(kvs []KeyValue, tmp *Sortable) Set { | ||||
| 	return s | ||||
| } | ||||
|  | ||||
| // NewSetWithFiltered returns a new `Set`.  See the documentation for | ||||
| // `NewSetWithSortableFiltered` for more details. | ||||
| // NewSetWithFiltered returns a new Set. See the documentation for | ||||
| // NewSetWithSortableFiltered for more details. | ||||
| // | ||||
| // This call includes a `Filter` to include/exclude label keys from | ||||
| // the return value.  Excluded keys are returned as a slice of label | ||||
| // values. | ||||
| // This call includes a Filter to include/exclude attribute keys from the | ||||
| // return value. Excluded keys are returned as a slice of attribute values. | ||||
| func NewSetWithFiltered(kvs []KeyValue, filter Filter) (Set, []KeyValue) { | ||||
| 	// Check for empty set. | ||||
| 	if len(kvs) == 0 { | ||||
| @@ -231,7 +221,7 @@ func NewSetWithFiltered(kvs []KeyValue, filter Filter) (Set, []KeyValue) { | ||||
| 	return NewSetWithSortableFiltered(kvs, new(Sortable), filter) | ||||
| } | ||||
|  | ||||
| // NewSetWithSortableFiltered returns a new `Set`. | ||||
| // NewSetWithSortableFiltered returns a new Set. | ||||
| // | ||||
| // Duplicate keys are eliminated by taking the last value.  This | ||||
| // re-orders the input slice so that unique last-values are contiguous | ||||
| @@ -243,17 +233,16 @@ func NewSetWithFiltered(kvs []KeyValue, filter Filter) (Set, []KeyValue) { | ||||
| // - Caller sees the reordering, but doesn't lose values | ||||
| // - Repeated call preserve last-value wins. | ||||
| // | ||||
| // Note that methods are defined on `*Set`, although this returns `Set`. | ||||
| // Callers can avoid memory allocations by: | ||||
| // Note that methods are defined on Set, although this returns Set. Callers | ||||
| // can avoid memory allocations by: | ||||
| // | ||||
| // - allocating a `Sortable` for use as a temporary in this method | ||||
| // - allocating a `Set` for storing the return value of this | ||||
| //   constructor. | ||||
| // - allocating a Sortable for use as a temporary in this method | ||||
| // - allocating a Set for storing the return value of this constructor. | ||||
| // | ||||
| // The result maintains a cache of encoded labels, by attribute.EncoderID. | ||||
| // The result maintains a cache of encoded attributes, by attribute.EncoderID. | ||||
| // This value should not be copied after its first use. | ||||
| // | ||||
| // The second `[]KeyValue` return value is a list of labels that were | ||||
| // The second []KeyValue return value is a list of attributes that were | ||||
| // excluded by the Filter (if non-nil). | ||||
| func NewSetWithSortableFiltered(kvs []KeyValue, tmp *Sortable, filter Filter) (Set, []KeyValue) { | ||||
| 	// Check for empty set. | ||||
| @@ -293,13 +282,13 @@ func NewSetWithSortableFiltered(kvs []KeyValue, tmp *Sortable, filter Filter) (S | ||||
| 	}, nil | ||||
| } | ||||
|  | ||||
| // filterSet reorders `kvs` so that included keys are contiguous at | ||||
| // the end of the slice, while excluded keys precede the included keys. | ||||
| // filterSet reorders kvs so that included keys are contiguous at the end of | ||||
| // the slice, while excluded keys precede the included keys. | ||||
| func filterSet(kvs []KeyValue, filter Filter) (Set, []KeyValue) { | ||||
| 	var excluded []KeyValue | ||||
|  | ||||
| 	// Move labels that do not match the filter so | ||||
| 	// they're adjacent before calling computeDistinct(). | ||||
| 	// Move attributes that do not match the filter so they're adjacent before | ||||
| 	// calling computeDistinct(). | ||||
| 	distinctPosition := len(kvs) | ||||
|  | ||||
| 	// Swap indistinct keys forward and distinct keys toward the | ||||
| @@ -319,8 +308,8 @@ func filterSet(kvs []KeyValue, filter Filter) (Set, []KeyValue) { | ||||
| 	}, excluded | ||||
| } | ||||
|  | ||||
| // Filter returns a filtered copy of this `Set`.  See the | ||||
| // documentation for `NewSetWithSortableFiltered` for more details. | ||||
| // Filter returns a filtered copy of this Set. See the documentation for | ||||
| // NewSetWithSortableFiltered for more details. | ||||
| func (l *Set) Filter(re Filter) (Set, []KeyValue) { | ||||
| 	if re == nil { | ||||
| 		return Set{ | ||||
| @@ -333,9 +322,9 @@ func (l *Set) Filter(re Filter) (Set, []KeyValue) { | ||||
| 	return filterSet(l.ToSlice(), re) | ||||
| } | ||||
|  | ||||
| // computeDistinct returns a `Distinct` using either the fixed- or | ||||
| // reflect-oriented code path, depending on the size of the input. | ||||
| // The input slice is assumed to already be sorted and de-duplicated. | ||||
| // computeDistinct returns a Distinct using either the fixed- or | ||||
| // reflect-oriented code path, depending on the size of the input. The input | ||||
| // slice is assumed to already be sorted and de-duplicated. | ||||
| func computeDistinct(kvs []KeyValue) Distinct { | ||||
| 	iface := computeDistinctFixed(kvs) | ||||
| 	if iface == nil { | ||||
| @@ -346,8 +335,8 @@ func computeDistinct(kvs []KeyValue) Distinct { | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // computeDistinctFixed computes a `Distinct` for small slices.  It | ||||
| // returns nil if the input is too large for this code path. | ||||
| // computeDistinctFixed computes a Distinct for small slices. It returns nil | ||||
| // if the input is too large for this code path. | ||||
| func computeDistinctFixed(kvs []KeyValue) interface{} { | ||||
| 	switch len(kvs) { | ||||
| 	case 1: | ||||
| @@ -395,8 +384,8 @@ func computeDistinctFixed(kvs []KeyValue) interface{} { | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // computeDistinctReflect computes a `Distinct` using reflection, | ||||
| // works for any size input. | ||||
| // computeDistinctReflect computes a Distinct using reflection, works for any | ||||
| // size input. | ||||
| func computeDistinctReflect(kvs []KeyValue) interface{} { | ||||
| 	at := reflect.New(reflect.ArrayOf(len(kvs), keyValueType)).Elem() | ||||
| 	for i, keyValue := range kvs { | ||||
| @@ -405,22 +394,31 @@ func computeDistinctReflect(kvs []KeyValue) interface{} { | ||||
| 	return at.Interface() | ||||
| } | ||||
|  | ||||
| // MarshalJSON returns the JSON encoding of the `*Set`. | ||||
| // MarshalJSON returns the JSON encoding of the Set. | ||||
| func (l *Set) MarshalJSON() ([]byte, error) { | ||||
| 	return json.Marshal(l.equivalent.iface) | ||||
| } | ||||
|  | ||||
| // Len implements `sort.Interface`. | ||||
| // MarshalLog is the marshaling function used by the logging system to represent this exporter. | ||||
| func (l Set) MarshalLog() interface{} { | ||||
| 	kvs := make(map[string]string) | ||||
| 	for _, kv := range l.ToSlice() { | ||||
| 		kvs[string(kv.Key)] = kv.Value.Emit() | ||||
| 	} | ||||
| 	return kvs | ||||
| } | ||||
|  | ||||
| // Len implements sort.Interface. | ||||
| func (l *Sortable) Len() int { | ||||
| 	return len(*l) | ||||
| } | ||||
|  | ||||
| // Swap implements `sort.Interface`. | ||||
| // Swap implements sort.Interface. | ||||
| func (l *Sortable) Swap(i, j int) { | ||||
| 	(*l)[i], (*l)[j] = (*l)[j], (*l)[i] | ||||
| } | ||||
|  | ||||
| // Less implements `sort.Interface`. | ||||
| // Less implements sort.Interface. | ||||
| func (l *Sortable) Less(i, j int) bool { | ||||
| 	return (*l)[i].Key < (*l)[j].Key | ||||
| } | ||||
|   | ||||
							
								
								
									
										4
									
								
								vendor/go.opentelemetry.io/otel/attribute/value.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										4
									
								
								vendor/go.opentelemetry.io/otel/attribute/value.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -187,7 +187,7 @@ func (v Value) AsFloat64() float64 { | ||||
| } | ||||
|  | ||||
| // AsFloat64Slice returns the []float64 value. Make sure that the Value's type is | ||||
| // INT64SLICE. | ||||
| // FLOAT64SLICE. | ||||
| func (v Value) AsFloat64Slice() []float64 { | ||||
| 	if s, ok := v.slice.(*[]float64); ok { | ||||
| 		return *s | ||||
| @@ -202,7 +202,7 @@ func (v Value) AsString() string { | ||||
| } | ||||
|  | ||||
| // AsStringSlice returns the []string value. Make sure that the Value's type is | ||||
| // INT64SLICE. | ||||
| // STRINGSLICE. | ||||
| func (v Value) AsStringSlice() []string { | ||||
| 	if s, ok := v.slice.(*[]string); ok { | ||||
| 		return *s | ||||
|   | ||||
							
								
								
									
										105
									
								
								vendor/go.opentelemetry.io/otel/baggage/baggage.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										105
									
								
								vendor/go.opentelemetry.io/otel/baggage/baggage.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -61,45 +61,57 @@ type Property struct { | ||||
| 	// hasValue indicates if a zero-value value means the property does not | ||||
| 	// have a value or if it was the zero-value. | ||||
| 	hasValue bool | ||||
|  | ||||
| 	// hasData indicates whether the created property contains data or not. | ||||
| 	// Properties that do not contain data are invalid with no other check | ||||
| 	// required. | ||||
| 	hasData bool | ||||
| } | ||||
|  | ||||
| func NewKeyProperty(key string) (Property, error) { | ||||
| 	p := Property{} | ||||
| 	if !keyRe.MatchString(key) { | ||||
| 		return p, fmt.Errorf("%w: %q", errInvalidKey, key) | ||||
| 		return newInvalidProperty(), fmt.Errorf("%w: %q", errInvalidKey, key) | ||||
| 	} | ||||
| 	p.key = key | ||||
|  | ||||
| 	p := Property{key: key, hasData: true} | ||||
| 	return p, nil | ||||
| } | ||||
|  | ||||
| func NewKeyValueProperty(key, value string) (Property, error) { | ||||
| 	p := Property{} | ||||
| 	if !keyRe.MatchString(key) { | ||||
| 		return p, fmt.Errorf("%w: %q", errInvalidKey, key) | ||||
| 		return newInvalidProperty(), fmt.Errorf("%w: %q", errInvalidKey, key) | ||||
| 	} | ||||
| 	if !valueRe.MatchString(value) { | ||||
| 		return p, fmt.Errorf("%w: %q", errInvalidValue, value) | ||||
| 		return newInvalidProperty(), fmt.Errorf("%w: %q", errInvalidValue, value) | ||||
| 	} | ||||
|  | ||||
| 	p := Property{ | ||||
| 		key:      key, | ||||
| 		value:    value, | ||||
| 		hasValue: true, | ||||
| 		hasData:  true, | ||||
| 	} | ||||
| 	p.key = key | ||||
| 	p.value = value | ||||
| 	p.hasValue = true | ||||
| 	return p, nil | ||||
| } | ||||
|  | ||||
| func newInvalidProperty() Property { | ||||
| 	return Property{} | ||||
| } | ||||
|  | ||||
| // parseProperty attempts to decode a Property from the passed string. It | ||||
| // returns an error if the input is invalid according to the W3C Baggage | ||||
| // specification. | ||||
| func parseProperty(property string) (Property, error) { | ||||
| 	p := Property{} | ||||
| 	if property == "" { | ||||
| 		return p, nil | ||||
| 		return newInvalidProperty(), nil | ||||
| 	} | ||||
|  | ||||
| 	match := propertyRe.FindStringSubmatch(property) | ||||
| 	if len(match) != 4 { | ||||
| 		return p, fmt.Errorf("%w: %q", errInvalidProperty, property) | ||||
| 		return newInvalidProperty(), fmt.Errorf("%w: %q", errInvalidProperty, property) | ||||
| 	} | ||||
|  | ||||
| 	p := Property{hasData: true} | ||||
| 	if match[1] != "" { | ||||
| 		p.key = match[1] | ||||
| 	} else { | ||||
| @@ -107,6 +119,7 @@ func parseProperty(property string) (Property, error) { | ||||
| 		p.value = match[3] | ||||
| 		p.hasValue = true | ||||
| 	} | ||||
|  | ||||
| 	return p, nil | ||||
| } | ||||
|  | ||||
| @@ -117,6 +130,10 @@ func (p Property) validate() error { | ||||
| 		return fmt.Errorf("invalid property: %w", err) | ||||
| 	} | ||||
|  | ||||
| 	if !p.hasData { | ||||
| 		return errFunc(fmt.Errorf("%w: %q", errInvalidProperty, p)) | ||||
| 	} | ||||
|  | ||||
| 	if !keyRe.MatchString(p.key) { | ||||
| 		return errFunc(fmt.Errorf("%w: %q", errInvalidKey, p.key)) | ||||
| 	} | ||||
| @@ -220,26 +237,40 @@ func (p properties) String() string { | ||||
| type Member struct { | ||||
| 	key, value string | ||||
| 	properties properties | ||||
|  | ||||
| 	// hasData indicates whether the created property contains data or not. | ||||
| 	// Properties that do not contain data are invalid with no other check | ||||
| 	// required. | ||||
| 	hasData bool | ||||
| } | ||||
|  | ||||
| // NewMember returns a new Member from the passed arguments. An error is | ||||
| // returned if the created Member would be invalid according to the W3C | ||||
| // Baggage specification. | ||||
| func NewMember(key, value string, props ...Property) (Member, error) { | ||||
| 	m := Member{key: key, value: value, properties: properties(props).Copy()} | ||||
| 	m := Member{ | ||||
| 		key:        key, | ||||
| 		value:      value, | ||||
| 		properties: properties(props).Copy(), | ||||
| 		hasData:    true, | ||||
| 	} | ||||
| 	if err := m.validate(); err != nil { | ||||
| 		return Member{}, err | ||||
| 		return newInvalidMember(), err | ||||
| 	} | ||||
|  | ||||
| 	return m, nil | ||||
| } | ||||
|  | ||||
| func newInvalidMember() Member { | ||||
| 	return Member{} | ||||
| } | ||||
|  | ||||
| // parseMember attempts to decode a Member from the passed string. It returns | ||||
| // an error if the input is invalid according to the W3C Baggage | ||||
| // specification. | ||||
| func parseMember(member string) (Member, error) { | ||||
| 	if n := len(member); n > maxBytesPerMembers { | ||||
| 		return Member{}, fmt.Errorf("%w: %d", errMemberBytes, n) | ||||
| 		return newInvalidMember(), fmt.Errorf("%w: %d", errMemberBytes, n) | ||||
| 	} | ||||
|  | ||||
| 	var ( | ||||
| @@ -254,7 +285,7 @@ func parseMember(member string) (Member, error) { | ||||
| 		for _, pStr := range strings.Split(parts[1], propertyDelimiter) { | ||||
| 			p, err := parseProperty(pStr) | ||||
| 			if err != nil { | ||||
| 				return Member{}, err | ||||
| 				return newInvalidMember(), err | ||||
| 			} | ||||
| 			props = append(props, p) | ||||
| 		} | ||||
| @@ -265,16 +296,21 @@ func parseMember(member string) (Member, error) { | ||||
| 		// Take into account a value can contain equal signs (=). | ||||
| 		kv := strings.SplitN(parts[0], keyValueDelimiter, 2) | ||||
| 		if len(kv) != 2 { | ||||
| 			return Member{}, fmt.Errorf("%w: %q", errInvalidMember, member) | ||||
| 			return newInvalidMember(), fmt.Errorf("%w: %q", errInvalidMember, member) | ||||
| 		} | ||||
| 		// "Leading and trailing whitespaces are allowed but MUST be trimmed | ||||
| 		// when converting the header into a data structure." | ||||
| 		key, value = strings.TrimSpace(kv[0]), strings.TrimSpace(kv[1]) | ||||
| 		key = strings.TrimSpace(kv[0]) | ||||
| 		var err error | ||||
| 		value, err = url.QueryUnescape(strings.TrimSpace(kv[1])) | ||||
| 		if err != nil { | ||||
| 			return newInvalidMember(), fmt.Errorf("%w: %q", err, value) | ||||
| 		} | ||||
| 		if !keyRe.MatchString(key) { | ||||
| 			return Member{}, fmt.Errorf("%w: %q", errInvalidKey, key) | ||||
| 			return newInvalidMember(), fmt.Errorf("%w: %q", errInvalidKey, key) | ||||
| 		} | ||||
| 		if !valueRe.MatchString(value) { | ||||
| 			return Member{}, fmt.Errorf("%w: %q", errInvalidValue, value) | ||||
| 			return newInvalidMember(), fmt.Errorf("%w: %q", errInvalidValue, value) | ||||
| 		} | ||||
| 	default: | ||||
| 		// This should never happen unless a developer has changed the string | ||||
| @@ -283,12 +319,16 @@ func parseMember(member string) (Member, error) { | ||||
| 		panic("failed to parse baggage member") | ||||
| 	} | ||||
|  | ||||
| 	return Member{key: key, value: value, properties: props}, nil | ||||
| 	return Member{key: key, value: value, properties: props, hasData: true}, nil | ||||
| } | ||||
|  | ||||
| // validate ensures m conforms to the W3C Baggage specification, returning an | ||||
| // error otherwise. | ||||
| func (m Member) validate() error { | ||||
| 	if !m.hasData { | ||||
| 		return fmt.Errorf("%w: %q", errInvalidMember, m) | ||||
| 	} | ||||
|  | ||||
| 	if !keyRe.MatchString(m.key) { | ||||
| 		return fmt.Errorf("%w: %q", errInvalidKey, m.key) | ||||
| 	} | ||||
| @@ -324,9 +364,10 @@ type Baggage struct { //nolint:golint | ||||
| 	list baggage.List | ||||
| } | ||||
|  | ||||
| // New returns a new valid Baggage. It returns an error if the passed members | ||||
| // are invalid according to the W3C Baggage specification or if it results in | ||||
| // a Baggage exceeding limits set in that specification. | ||||
| // New returns a new valid Baggage. It returns an error if it results in a | ||||
| // Baggage exceeding limits set in that specification. | ||||
| // | ||||
| // It expects all the provided members to have already been validated. | ||||
| func New(members ...Member) (Baggage, error) { | ||||
| 	if len(members) == 0 { | ||||
| 		return Baggage{}, nil | ||||
| @@ -334,9 +375,10 @@ func New(members ...Member) (Baggage, error) { | ||||
|  | ||||
| 	b := make(baggage.List) | ||||
| 	for _, m := range members { | ||||
| 		if err := m.validate(); err != nil { | ||||
| 			return Baggage{}, err | ||||
| 		if !m.hasData { | ||||
| 			return Baggage{}, errInvalidMember | ||||
| 		} | ||||
|  | ||||
| 		// OpenTelemetry resolves duplicates by last-one-wins. | ||||
| 		b[m.key] = baggage.Item{ | ||||
| 			Value:      m.value, | ||||
| @@ -401,6 +443,8 @@ func Parse(bStr string) (Baggage, error) { | ||||
| // | ||||
| // If there is no list-member matching the passed key the returned Member will | ||||
| // be a zero-value Member. | ||||
| // The returned member is not validated, as we assume the validation happened | ||||
| // when it was added to the Baggage. | ||||
| func (b Baggage) Member(key string) Member { | ||||
| 	v, ok := b.list[key] | ||||
| 	if !ok { | ||||
| @@ -408,7 +452,7 @@ func (b Baggage) Member(key string) Member { | ||||
| 		// where a zero-valued Member is included in the Baggage because a | ||||
| 		// zero-valued Member is invalid according to the W3C Baggage | ||||
| 		// specification (it has an empty key). | ||||
| 		return Member{} | ||||
| 		return newInvalidMember() | ||||
| 	} | ||||
|  | ||||
| 	return Member{ | ||||
| @@ -420,6 +464,9 @@ func (b Baggage) Member(key string) Member { | ||||
|  | ||||
| // Members returns all the baggage list-members. | ||||
| // The order of the returned list-members does not have significance. | ||||
| // | ||||
| // The returned members are not validated, as we assume the validation happened | ||||
| // when they were added to the Baggage. | ||||
| func (b Baggage) Members() []Member { | ||||
| 	if len(b.list) == 0 { | ||||
| 		return nil | ||||
| @@ -443,8 +490,8 @@ func (b Baggage) Members() []Member { | ||||
| // If member is invalid according to the W3C Baggage specification, an error | ||||
| // is returned with the original Baggage. | ||||
| func (b Baggage) SetMember(member Member) (Baggage, error) { | ||||
| 	if err := member.validate(); err != nil { | ||||
| 		return b, fmt.Errorf("%w: %s", errInvalidMember, err) | ||||
| 	if !member.hasData { | ||||
| 		return b, errInvalidMember | ||||
| 	} | ||||
|  | ||||
| 	n := len(b.list) | ||||
|   | ||||
							
								
								
									
										34
									
								
								vendor/go.opentelemetry.io/otel/exporters/otlp/internal/config.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										34
									
								
								vendor/go.opentelemetry.io/otel/exporters/otlp/internal/config.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,34 @@ | ||||
| // Copyright The OpenTelemetry Authors | ||||
| // | ||||
| // 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 internal contains common functionality for all OTLP exporters. | ||||
| package internal // import "go.opentelemetry.io/otel/exporters/otlp/internal" | ||||
|  | ||||
| import ( | ||||
| 	"fmt" | ||||
| 	"path" | ||||
| 	"strings" | ||||
| ) | ||||
|  | ||||
| // CleanPath returns a path with all spaces trimmed and all redundancies removed. If urlPath is empty or cleaning it results in an empty string, defaultPath is returned instead. | ||||
| func CleanPath(urlPath string, defaultPath string) string { | ||||
| 	tmp := path.Clean(strings.TrimSpace(urlPath)) | ||||
| 	if tmp == "." { | ||||
| 		return defaultPath | ||||
| 	} | ||||
| 	if !path.IsAbs(tmp) { | ||||
| 		tmp = fmt.Sprintf("/%s", tmp) | ||||
| 	} | ||||
| 	return tmp | ||||
| } | ||||
							
								
								
									
										148
									
								
								vendor/go.opentelemetry.io/otel/exporters/otlp/internal/envconfig/envconfig.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										148
									
								
								vendor/go.opentelemetry.io/otel/exporters/otlp/internal/envconfig/envconfig.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,148 @@ | ||||
| // Copyright The OpenTelemetry Authors | ||||
| // | ||||
| // 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 envconfig // import "go.opentelemetry.io/otel/exporters/otlp/internal/envconfig" | ||||
|  | ||||
| import ( | ||||
| 	"crypto/tls" | ||||
| 	"crypto/x509" | ||||
| 	"errors" | ||||
| 	"fmt" | ||||
| 	"net/url" | ||||
| 	"strconv" | ||||
| 	"strings" | ||||
| 	"time" | ||||
| ) | ||||
|  | ||||
| // ConfigFn is the generic function used to set a config. | ||||
| type ConfigFn func(*EnvOptionsReader) | ||||
|  | ||||
| // EnvOptionsReader reads the required environment variables. | ||||
| type EnvOptionsReader struct { | ||||
| 	GetEnv    func(string) string | ||||
| 	ReadFile  func(string) ([]byte, error) | ||||
| 	Namespace string | ||||
| } | ||||
|  | ||||
| // Apply runs every ConfigFn. | ||||
| func (e *EnvOptionsReader) Apply(opts ...ConfigFn) { | ||||
| 	for _, o := range opts { | ||||
| 		o(e) | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // GetEnvValue gets an OTLP environment variable value of the specified key | ||||
| // using the GetEnv function. | ||||
| // This function prepends the OTLP specified namespace to all key lookups. | ||||
| func (e *EnvOptionsReader) GetEnvValue(key string) (string, bool) { | ||||
| 	v := strings.TrimSpace(e.GetEnv(keyWithNamespace(e.Namespace, key))) | ||||
| 	return v, v != "" | ||||
| } | ||||
|  | ||||
| // WithString retrieves the specified config and passes it to ConfigFn as a string. | ||||
| func WithString(n string, fn func(string)) func(e *EnvOptionsReader) { | ||||
| 	return func(e *EnvOptionsReader) { | ||||
| 		if v, ok := e.GetEnvValue(n); ok { | ||||
| 			fn(v) | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // WithDuration retrieves the specified config and passes it to ConfigFn as a duration. | ||||
| func WithDuration(n string, fn func(time.Duration)) func(e *EnvOptionsReader) { | ||||
| 	return func(e *EnvOptionsReader) { | ||||
| 		if v, ok := e.GetEnvValue(n); ok { | ||||
| 			if d, err := strconv.Atoi(v); err == nil { | ||||
| 				fn(time.Duration(d) * time.Millisecond) | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // WithHeaders retrieves the specified config and passes it to ConfigFn as a map of HTTP headers. | ||||
| func WithHeaders(n string, fn func(map[string]string)) func(e *EnvOptionsReader) { | ||||
| 	return func(e *EnvOptionsReader) { | ||||
| 		if v, ok := e.GetEnvValue(n); ok { | ||||
| 			fn(stringToHeader(v)) | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // WithURL retrieves the specified config and passes it to ConfigFn as a net/url.URL. | ||||
| func WithURL(n string, fn func(*url.URL)) func(e *EnvOptionsReader) { | ||||
| 	return func(e *EnvOptionsReader) { | ||||
| 		if v, ok := e.GetEnvValue(n); ok { | ||||
| 			if u, err := url.Parse(v); err == nil { | ||||
| 				fn(u) | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // WithTLSConfig retrieves the specified config and passes it to ConfigFn as a crypto/tls.Config. | ||||
| func WithTLSConfig(n string, fn func(*tls.Config)) func(e *EnvOptionsReader) { | ||||
| 	return func(e *EnvOptionsReader) { | ||||
| 		if v, ok := e.GetEnvValue(n); ok { | ||||
| 			if b, err := e.ReadFile(v); err == nil { | ||||
| 				if c, err := createTLSConfig(b); err == nil { | ||||
| 					fn(c) | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func keyWithNamespace(ns, key string) string { | ||||
| 	if ns == "" { | ||||
| 		return key | ||||
| 	} | ||||
| 	return fmt.Sprintf("%s_%s", ns, key) | ||||
| } | ||||
|  | ||||
| func stringToHeader(value string) map[string]string { | ||||
| 	headersPairs := strings.Split(value, ",") | ||||
| 	headers := make(map[string]string) | ||||
|  | ||||
| 	for _, header := range headersPairs { | ||||
| 		nameValue := strings.SplitN(header, "=", 2) | ||||
| 		if len(nameValue) < 2 { | ||||
| 			continue | ||||
| 		} | ||||
| 		name, err := url.QueryUnescape(nameValue[0]) | ||||
| 		if err != nil { | ||||
| 			continue | ||||
| 		} | ||||
| 		trimmedName := strings.TrimSpace(name) | ||||
| 		value, err := url.QueryUnescape(nameValue[1]) | ||||
| 		if err != nil { | ||||
| 			continue | ||||
| 		} | ||||
| 		trimmedValue := strings.TrimSpace(value) | ||||
|  | ||||
| 		headers[trimmedName] = trimmedValue | ||||
| 	} | ||||
|  | ||||
| 	return headers | ||||
| } | ||||
|  | ||||
| func createTLSConfig(certBytes []byte) (*tls.Config, error) { | ||||
| 	cp := x509.NewCertPool() | ||||
| 	if ok := cp.AppendCertsFromPEM(certBytes); !ok { | ||||
| 		return nil, errors.New("failed to append certificate to the cert pool") | ||||
| 	} | ||||
|  | ||||
| 	return &tls.Config{ | ||||
| 		RootCAs: cp, | ||||
| 	}, nil | ||||
| } | ||||
							
								
								
									
										16
									
								
								vendor/go.opentelemetry.io/otel/exporters/otlp/otlptrace/README.md
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										16
									
								
								vendor/go.opentelemetry.io/otel/exporters/otlp/otlptrace/README.md
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -38,12 +38,14 @@ override the default configuration. For more information about how each of | ||||
| these environment variables is interpreted, see [the OpenTelemetry | ||||
| specification](https://github.com/open-telemetry/opentelemetry-specification/blob/v1.8.0/specification/protocol/exporter.md). | ||||
|  | ||||
| | Environment variable                                                     | Option                        | Default value                       | | ||||
| | ------------------------------------------------------------------------ |------------------------------ | ----------------------------------- | | ||||
| | `OTEL_EXPORTER_OTLP_ENDPOINT` `OTEL_EXPORTER_OTLP_TRACES_ENDPOINT`       | `WithEndpoint` `WithInsecure` | `https://localhost:4317`            | | ||||
| | `OTEL_EXPORTER_OTLP_CERTIFICATE` `OTEL_EXPORTER_OTLP_TRACES_CERTIFICATE` | `WithTLSClientConfig`         |                                     | | ||||
| | `OTEL_EXPORTER_OTLP_HEADERS` `OTEL_EXPORTER_OTLP_TRACES_HEADERS`         | `WithHeaders`                 |                                     | | ||||
| | `OTEL_EXPORTER_OTLP_COMPRESSION` `OTEL_EXPORTER_OTLP_TRACES_COMPRESSION` | `WithCompression`             |                                     | | ||||
| | `OTEL_EXPORTER_OTLP_TIMEOUT` `OTEL_EXPORTER_OTLP_TRACES_TIMEOUT`         | `WithTimeout`                 | `10s`                               | | ||||
| | Environment variable                                                     | Option                        | Default value                                            | | ||||
| | ------------------------------------------------------------------------ |------------------------------ | -------------------------------------------------------- | | ||||
| | `OTEL_EXPORTER_OTLP_ENDPOINT` `OTEL_EXPORTER_OTLP_TRACES_ENDPOINT`       | `WithEndpoint` `WithInsecure` | `https://localhost:4317` or `https://localhost:4318`[^1] | | ||||
| | `OTEL_EXPORTER_OTLP_CERTIFICATE` `OTEL_EXPORTER_OTLP_TRACES_CERTIFICATE` | `WithTLSClientConfig`         |                                                          | | ||||
| | `OTEL_EXPORTER_OTLP_HEADERS` `OTEL_EXPORTER_OTLP_TRACES_HEADERS`         | `WithHeaders`                 |                                                          | | ||||
| | `OTEL_EXPORTER_OTLP_COMPRESSION` `OTEL_EXPORTER_OTLP_TRACES_COMPRESSION` | `WithCompression`             |                                                          | | ||||
| | `OTEL_EXPORTER_OTLP_TIMEOUT` `OTEL_EXPORTER_OTLP_TRACES_TIMEOUT`         | `WithTimeout`                 | `10s`                                                    | | ||||
|  | ||||
| [^1]: The gRPC client defaults to `https://localhost:4317` and the HTTP client `https://localhost:4318`. | ||||
|  | ||||
| Configuration using options have precedence over the environment variables. | ||||
|   | ||||
							
								
								
									
										11
									
								
								vendor/go.opentelemetry.io/otel/exporters/otlp/otlptrace/exporter.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										11
									
								
								vendor/go.opentelemetry.io/otel/exporters/otlp/otlptrace/exporter.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -100,3 +100,14 @@ func NewUnstarted(client Client) *Exporter { | ||||
| 		client: client, | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // MarshalLog is the marshaling function used by the logging system to represent this exporter. | ||||
| func (e *Exporter) MarshalLog() interface{} { | ||||
| 	return struct { | ||||
| 		Type   string | ||||
| 		Client Client | ||||
| 	}{ | ||||
| 		Type:   "otlptrace", | ||||
| 		Client: e.client, | ||||
| 	} | ||||
| } | ||||
|   | ||||
							
								
								
									
										222
									
								
								vendor/go.opentelemetry.io/otel/exporters/otlp/otlptrace/internal/otlpconfig/envconfig.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										222
									
								
								vendor/go.opentelemetry.io/otel/exporters/otlp/otlptrace/internal/otlpconfig/envconfig.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -16,65 +16,59 @@ package otlpconfig // import "go.opentelemetry.io/otel/exporters/otlp/otlptrace/ | ||||
|  | ||||
| import ( | ||||
| 	"crypto/tls" | ||||
| 	"fmt" | ||||
| 	"io/ioutil" | ||||
| 	"net/url" | ||||
| 	"os" | ||||
| 	"path" | ||||
| 	"strconv" | ||||
| 	"strings" | ||||
| 	"time" | ||||
|  | ||||
| 	"go.opentelemetry.io/otel" | ||||
| 	"go.opentelemetry.io/otel/exporters/otlp/internal/envconfig" | ||||
| ) | ||||
|  | ||||
| var DefaultEnvOptionsReader = EnvOptionsReader{ | ||||
| 	GetEnv:   os.Getenv, | ||||
| 	ReadFile: ioutil.ReadFile, | ||||
| // DefaultEnvOptionsReader is the default environments reader. | ||||
| var DefaultEnvOptionsReader = envconfig.EnvOptionsReader{ | ||||
| 	GetEnv:    os.Getenv, | ||||
| 	ReadFile:  ioutil.ReadFile, | ||||
| 	Namespace: "OTEL_EXPORTER_OTLP", | ||||
| } | ||||
|  | ||||
| func ApplyGRPCEnvConfigs(cfg *Config) { | ||||
| 	DefaultEnvOptionsReader.ApplyGRPCEnvConfigs(cfg) | ||||
| } | ||||
|  | ||||
| func ApplyHTTPEnvConfigs(cfg *Config) { | ||||
| 	DefaultEnvOptionsReader.ApplyHTTPEnvConfigs(cfg) | ||||
| } | ||||
|  | ||||
| type EnvOptionsReader struct { | ||||
| 	GetEnv   func(string) string | ||||
| 	ReadFile func(filename string) ([]byte, error) | ||||
| } | ||||
|  | ||||
| func (e *EnvOptionsReader) ApplyHTTPEnvConfigs(cfg *Config) { | ||||
| 	opts := e.GetOptionsFromEnv() | ||||
| // ApplyGRPCEnvConfigs applies the env configurations for gRPC. | ||||
| func ApplyGRPCEnvConfigs(cfg Config) Config { | ||||
| 	opts := getOptionsFromEnv() | ||||
| 	for _, opt := range opts { | ||||
| 		opt.ApplyHTTPOption(cfg) | ||||
| 		cfg = opt.ApplyGRPCOption(cfg) | ||||
| 	} | ||||
| 	return cfg | ||||
| } | ||||
|  | ||||
| func (e *EnvOptionsReader) ApplyGRPCEnvConfigs(cfg *Config) { | ||||
| 	opts := e.GetOptionsFromEnv() | ||||
| // ApplyHTTPEnvConfigs applies the env configurations for HTTP. | ||||
| func ApplyHTTPEnvConfigs(cfg Config) Config { | ||||
| 	opts := getOptionsFromEnv() | ||||
| 	for _, opt := range opts { | ||||
| 		opt.ApplyGRPCOption(cfg) | ||||
| 		cfg = opt.ApplyHTTPOption(cfg) | ||||
| 	} | ||||
| 	return cfg | ||||
| } | ||||
|  | ||||
| func (e *EnvOptionsReader) GetOptionsFromEnv() []GenericOption { | ||||
| 	var opts []GenericOption | ||||
| func getOptionsFromEnv() []GenericOption { | ||||
| 	opts := []GenericOption{} | ||||
|  | ||||
| 	// Endpoint | ||||
| 	if v, ok := e.getEnvValue("TRACES_ENDPOINT"); ok { | ||||
| 		u, err := url.Parse(v) | ||||
| 		// Ignore invalid values. | ||||
| 		if err == nil { | ||||
| 			// This is used to set the scheme for OTLP/HTTP. | ||||
| 			if insecureSchema(u.Scheme) { | ||||
| 				opts = append(opts, WithInsecure()) | ||||
| 			} else { | ||||
| 				opts = append(opts, WithSecure()) | ||||
| 			} | ||||
| 			opts = append(opts, newSplitOption(func(cfg *Config) { | ||||
| 	DefaultEnvOptionsReader.Apply( | ||||
| 		envconfig.WithURL("ENDPOINT", func(u *url.URL) { | ||||
| 			opts = append(opts, withEndpointScheme(u)) | ||||
| 			opts = append(opts, newSplitOption(func(cfg Config) Config { | ||||
| 				cfg.Traces.Endpoint = u.Host | ||||
| 				// For OTLP/HTTP endpoint URLs without a per-signal | ||||
| 				// configuration, the passed endpoint is used as a base URL | ||||
| 				// and the signals are sent to these paths relative to that. | ||||
| 				cfg.Traces.URLPath = path.Join(u.Path, DefaultTracesPath) | ||||
| 				return cfg | ||||
| 			}, withEndpointForGRPC(u))) | ||||
| 		}), | ||||
| 		envconfig.WithURL("TRACES_ENDPOINT", func(u *url.URL) { | ||||
| 			opts = append(opts, withEndpointScheme(u)) | ||||
| 			opts = append(opts, newSplitOption(func(cfg Config) Config { | ||||
| 				cfg.Traces.Endpoint = u.Host | ||||
| 				// For endpoint URLs for OTLP/HTTP per-signal variables, the | ||||
| 				// URL MUST be used as-is without any modification. The only | ||||
| @@ -85,137 +79,51 @@ func (e *EnvOptionsReader) GetOptionsFromEnv() []GenericOption { | ||||
| 					path = "/" | ||||
| 				} | ||||
| 				cfg.Traces.URLPath = path | ||||
| 			}, func(cfg *Config) { | ||||
| 				// For OTLP/gRPC endpoints, this is the target to which the | ||||
| 				// exporter is going to send telemetry. | ||||
| 				cfg.Traces.Endpoint = path.Join(u.Host, u.Path) | ||||
| 			})) | ||||
| 		} | ||||
| 	} else if v, ok = e.getEnvValue("ENDPOINT"); ok { | ||||
| 		u, err := url.Parse(v) | ||||
| 		// Ignore invalid values. | ||||
| 		if err == nil { | ||||
| 			// This is used to set the scheme for OTLP/HTTP. | ||||
| 			if insecureSchema(u.Scheme) { | ||||
| 				opts = append(opts, WithInsecure()) | ||||
| 			} else { | ||||
| 				opts = append(opts, WithSecure()) | ||||
| 			} | ||||
| 			opts = append(opts, newSplitOption(func(cfg *Config) { | ||||
| 				cfg.Traces.Endpoint = u.Host | ||||
| 				// For OTLP/HTTP endpoint URLs without a per-signal | ||||
| 				// configuration, the passed endpoint is used as a base URL | ||||
| 				// and the signals are sent to these paths relative to that. | ||||
| 				cfg.Traces.URLPath = path.Join(u.Path, DefaultTracesPath) | ||||
| 			}, func(cfg *Config) { | ||||
| 				// For OTLP/gRPC endpoints, this is the target to which the | ||||
| 				// exporter is going to send telemetry. | ||||
| 				cfg.Traces.Endpoint = path.Join(u.Host, u.Path) | ||||
| 			})) | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	// Certificate File | ||||
| 	if path, ok := e.getEnvValue("CERTIFICATE"); ok { | ||||
| 		if tls, err := e.readTLSConfig(path); err == nil { | ||||
| 			opts = append(opts, WithTLSClientConfig(tls)) | ||||
| 		} else { | ||||
| 			otel.Handle(fmt.Errorf("failed to configure otlp exporter certificate '%s': %w", path, err)) | ||||
| 		} | ||||
| 	} | ||||
| 	if path, ok := e.getEnvValue("TRACES_CERTIFICATE"); ok { | ||||
| 		if tls, err := e.readTLSConfig(path); err == nil { | ||||
| 			opts = append(opts, WithTLSClientConfig(tls)) | ||||
| 		} else { | ||||
| 			otel.Handle(fmt.Errorf("failed to configure otlp traces exporter certificate '%s': %w", path, err)) | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	// Headers | ||||
| 	if h, ok := e.getEnvValue("HEADERS"); ok { | ||||
| 		opts = append(opts, WithHeaders(stringToHeader(h))) | ||||
| 	} | ||||
| 	if h, ok := e.getEnvValue("TRACES_HEADERS"); ok { | ||||
| 		opts = append(opts, WithHeaders(stringToHeader(h))) | ||||
| 	} | ||||
|  | ||||
| 	// Compression | ||||
| 	if c, ok := e.getEnvValue("COMPRESSION"); ok { | ||||
| 		opts = append(opts, WithCompression(stringToCompression(c))) | ||||
| 	} | ||||
| 	if c, ok := e.getEnvValue("TRACES_COMPRESSION"); ok { | ||||
| 		opts = append(opts, WithCompression(stringToCompression(c))) | ||||
| 	} | ||||
| 	// Timeout | ||||
| 	if t, ok := e.getEnvValue("TIMEOUT"); ok { | ||||
| 		if d, err := strconv.Atoi(t); err == nil { | ||||
| 			opts = append(opts, WithTimeout(time.Duration(d)*time.Millisecond)) | ||||
| 		} | ||||
| 	} | ||||
| 	if t, ok := e.getEnvValue("TRACES_TIMEOUT"); ok { | ||||
| 		if d, err := strconv.Atoi(t); err == nil { | ||||
| 			opts = append(opts, WithTimeout(time.Duration(d)*time.Millisecond)) | ||||
| 		} | ||||
| 	} | ||||
| 				return cfg | ||||
| 			}, withEndpointForGRPC(u))) | ||||
| 		}), | ||||
| 		envconfig.WithTLSConfig("CERTIFICATE", func(c *tls.Config) { opts = append(opts, WithTLSClientConfig(c)) }), | ||||
| 		envconfig.WithTLSConfig("TRACES_CERTIFICATE", func(c *tls.Config) { opts = append(opts, WithTLSClientConfig(c)) }), | ||||
| 		envconfig.WithHeaders("HEADERS", func(h map[string]string) { opts = append(opts, WithHeaders(h)) }), | ||||
| 		envconfig.WithHeaders("TRACES_HEADERS", func(h map[string]string) { opts = append(opts, WithHeaders(h)) }), | ||||
| 		WithEnvCompression("COMPRESSION", func(c Compression) { opts = append(opts, WithCompression(c)) }), | ||||
| 		WithEnvCompression("TRACES_COMPRESSION", func(c Compression) { opts = append(opts, WithCompression(c)) }), | ||||
| 		envconfig.WithDuration("TIMEOUT", func(d time.Duration) { opts = append(opts, WithTimeout(d)) }), | ||||
| 		envconfig.WithDuration("TRACES_TIMEOUT", func(d time.Duration) { opts = append(opts, WithTimeout(d)) }), | ||||
| 	) | ||||
|  | ||||
| 	return opts | ||||
| } | ||||
|  | ||||
| func insecureSchema(schema string) bool { | ||||
| 	switch strings.ToLower(schema) { | ||||
| func withEndpointScheme(u *url.URL) GenericOption { | ||||
| 	switch strings.ToLower(u.Scheme) { | ||||
| 	case "http", "unix": | ||||
| 		return true | ||||
| 		return WithInsecure() | ||||
| 	default: | ||||
| 		return false | ||||
| 		return WithSecure() | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // getEnvValue gets an OTLP environment variable value of the specified key using the GetEnv function. | ||||
| // This function already prepends the OTLP prefix to all key lookup. | ||||
| func (e *EnvOptionsReader) getEnvValue(key string) (string, bool) { | ||||
| 	v := strings.TrimSpace(e.GetEnv(fmt.Sprintf("OTEL_EXPORTER_OTLP_%s", key))) | ||||
| 	return v, v != "" | ||||
| } | ||||
|  | ||||
| func (e *EnvOptionsReader) readTLSConfig(path string) (*tls.Config, error) { | ||||
| 	b, err := e.ReadFile(path) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| func withEndpointForGRPC(u *url.URL) func(cfg Config) Config { | ||||
| 	return func(cfg Config) Config { | ||||
| 		// For OTLP/gRPC endpoints, this is the target to which the | ||||
| 		// exporter is going to send telemetry. | ||||
| 		cfg.Traces.Endpoint = path.Join(u.Host, u.Path) | ||||
| 		return cfg | ||||
| 	} | ||||
| 	return CreateTLSConfig(b) | ||||
| } | ||||
|  | ||||
| func stringToCompression(value string) Compression { | ||||
| 	switch value { | ||||
| 	case "gzip": | ||||
| 		return GzipCompression | ||||
| 	} | ||||
| // WithEnvCompression retrieves the specified config and passes it to ConfigFn as a Compression. | ||||
| func WithEnvCompression(n string, fn func(Compression)) func(e *envconfig.EnvOptionsReader) { | ||||
| 	return func(e *envconfig.EnvOptionsReader) { | ||||
| 		if v, ok := e.GetEnvValue(n); ok { | ||||
| 			cp := NoCompression | ||||
| 			switch v { | ||||
| 			case "gzip": | ||||
| 				cp = GzipCompression | ||||
| 			} | ||||
|  | ||||
| 	return NoCompression | ||||
| } | ||||
|  | ||||
| func stringToHeader(value string) map[string]string { | ||||
| 	headersPairs := strings.Split(value, ",") | ||||
| 	headers := make(map[string]string) | ||||
|  | ||||
| 	for _, header := range headersPairs { | ||||
| 		nameValue := strings.SplitN(header, "=", 2) | ||||
| 		if len(nameValue) < 2 { | ||||
| 			continue | ||||
| 			fn(cp) | ||||
| 		} | ||||
| 		name, err := url.QueryUnescape(nameValue[0]) | ||||
| 		if err != nil { | ||||
| 			continue | ||||
| 		} | ||||
| 		trimmedName := strings.TrimSpace(name) | ||||
| 		value, err := url.QueryUnescape(nameValue[1]) | ||||
| 		if err != nil { | ||||
| 			continue | ||||
| 		} | ||||
| 		trimmedValue := strings.TrimSpace(value) | ||||
|  | ||||
| 		headers[trimmedName] = trimmedValue | ||||
| 	} | ||||
|  | ||||
| 	return headers | ||||
| } | ||||
|   | ||||
							
								
								
									
										114
									
								
								vendor/go.opentelemetry.io/otel/exporters/otlp/otlptrace/internal/otlpconfig/options.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										114
									
								
								vendor/go.opentelemetry.io/otel/exporters/otlp/otlptrace/internal/otlpconfig/options.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -22,8 +22,10 @@ import ( | ||||
| 	"google.golang.org/grpc" | ||||
| 	"google.golang.org/grpc/backoff" | ||||
| 	"google.golang.org/grpc/credentials" | ||||
| 	"google.golang.org/grpc/credentials/insecure" | ||||
| 	"google.golang.org/grpc/encoding/gzip" | ||||
|  | ||||
| 	"go.opentelemetry.io/otel/exporters/otlp/internal" | ||||
| 	"go.opentelemetry.io/otel/exporters/otlp/internal/retry" | ||||
| ) | ||||
|  | ||||
| @@ -64,27 +66,41 @@ type ( | ||||
| 	} | ||||
| ) | ||||
|  | ||||
| func NewDefaultConfig() Config { | ||||
| 	c := Config{ | ||||
| // NewHTTPConfig returns a new Config with all settings applied from opts and | ||||
| // any unset setting using the default HTTP config values. | ||||
| func NewHTTPConfig(opts ...HTTPOption) Config { | ||||
| 	cfg := Config{ | ||||
| 		Traces: SignalConfig{ | ||||
| 			Endpoint:    fmt.Sprintf("%s:%d", DefaultCollectorHost, DefaultCollectorPort), | ||||
| 			Endpoint:    fmt.Sprintf("%s:%d", DefaultCollectorHost, DefaultCollectorHTTPPort), | ||||
| 			URLPath:     DefaultTracesPath, | ||||
| 			Compression: NoCompression, | ||||
| 			Timeout:     DefaultTimeout, | ||||
| 		}, | ||||
| 		RetryConfig: retry.DefaultConfig, | ||||
| 	} | ||||
|  | ||||
| 	return c | ||||
| 	cfg = ApplyHTTPEnvConfigs(cfg) | ||||
| 	for _, opt := range opts { | ||||
| 		cfg = opt.ApplyHTTPOption(cfg) | ||||
| 	} | ||||
| 	cfg.Traces.URLPath = internal.CleanPath(cfg.Traces.URLPath, DefaultTracesPath) | ||||
| 	return cfg | ||||
| } | ||||
|  | ||||
| // NewGRPCConfig returns a new Config with all settings applied from opts and | ||||
| // any unset setting using the default gRPC config values. | ||||
| func NewGRPCConfig(opts ...GRPCOption) Config { | ||||
| 	cfg := NewDefaultConfig() | ||||
| 	ApplyGRPCEnvConfigs(&cfg) | ||||
| 	cfg := Config{ | ||||
| 		Traces: SignalConfig{ | ||||
| 			Endpoint:    fmt.Sprintf("%s:%d", DefaultCollectorHost, DefaultCollectorGRPCPort), | ||||
| 			URLPath:     DefaultTracesPath, | ||||
| 			Compression: NoCompression, | ||||
| 			Timeout:     DefaultTimeout, | ||||
| 		}, | ||||
| 		RetryConfig: retry.DefaultConfig, | ||||
| 	} | ||||
| 	cfg = ApplyGRPCEnvConfigs(cfg) | ||||
| 	for _, opt := range opts { | ||||
| 		opt.ApplyGRPCOption(&cfg) | ||||
| 		cfg = opt.ApplyGRPCOption(cfg) | ||||
| 	} | ||||
|  | ||||
| 	if cfg.ServiceConfig != "" { | ||||
| @@ -94,7 +110,7 @@ func NewGRPCConfig(opts ...GRPCOption) Config { | ||||
| 	if cfg.Traces.GRPCCredentials != nil { | ||||
| 		cfg.DialOptions = append(cfg.DialOptions, grpc.WithTransportCredentials(cfg.Traces.GRPCCredentials)) | ||||
| 	} else if cfg.Traces.Insecure { | ||||
| 		cfg.DialOptions = append(cfg.DialOptions, grpc.WithInsecure()) | ||||
| 		cfg.DialOptions = append(cfg.DialOptions, grpc.WithTransportCredentials(insecure.NewCredentials())) | ||||
| 	} else { | ||||
| 		// Default to using the host's root CA. | ||||
| 		creds := credentials.NewTLS(nil) | ||||
| @@ -121,8 +137,8 @@ func NewGRPCConfig(opts ...GRPCOption) Config { | ||||
| type ( | ||||
| 	// GenericOption applies an option to the HTTP or gRPC driver. | ||||
| 	GenericOption interface { | ||||
| 		ApplyHTTPOption(*Config) | ||||
| 		ApplyGRPCOption(*Config) | ||||
| 		ApplyHTTPOption(Config) Config | ||||
| 		ApplyGRPCOption(Config) Config | ||||
|  | ||||
| 		// A private method to prevent users implementing the | ||||
| 		// interface and so future additions to it will not | ||||
| @@ -132,7 +148,7 @@ type ( | ||||
|  | ||||
| 	// HTTPOption applies an option to the HTTP driver. | ||||
| 	HTTPOption interface { | ||||
| 		ApplyHTTPOption(*Config) | ||||
| 		ApplyHTTPOption(Config) Config | ||||
|  | ||||
| 		// A private method to prevent users implementing the | ||||
| 		// interface and so future additions to it will not | ||||
| @@ -142,7 +158,7 @@ type ( | ||||
|  | ||||
| 	// GRPCOption applies an option to the gRPC driver. | ||||
| 	GRPCOption interface { | ||||
| 		ApplyGRPCOption(*Config) | ||||
| 		ApplyGRPCOption(Config) Config | ||||
|  | ||||
| 		// A private method to prevent users implementing the | ||||
| 		// interface and so future additions to it will not | ||||
| @@ -154,128 +170,138 @@ type ( | ||||
| // genericOption is an option that applies the same logic | ||||
| // for both gRPC and HTTP. | ||||
| type genericOption struct { | ||||
| 	fn func(*Config) | ||||
| 	fn func(Config) Config | ||||
| } | ||||
|  | ||||
| func (g *genericOption) ApplyGRPCOption(cfg *Config) { | ||||
| 	g.fn(cfg) | ||||
| func (g *genericOption) ApplyGRPCOption(cfg Config) Config { | ||||
| 	return g.fn(cfg) | ||||
| } | ||||
|  | ||||
| func (g *genericOption) ApplyHTTPOption(cfg *Config) { | ||||
| 	g.fn(cfg) | ||||
| func (g *genericOption) ApplyHTTPOption(cfg Config) Config { | ||||
| 	return g.fn(cfg) | ||||
| } | ||||
|  | ||||
| func (genericOption) private() {} | ||||
|  | ||||
| func newGenericOption(fn func(cfg *Config)) GenericOption { | ||||
| func newGenericOption(fn func(cfg Config) Config) GenericOption { | ||||
| 	return &genericOption{fn: fn} | ||||
| } | ||||
|  | ||||
| // splitOption is an option that applies different logics | ||||
| // for gRPC and HTTP. | ||||
| type splitOption struct { | ||||
| 	httpFn func(*Config) | ||||
| 	grpcFn func(*Config) | ||||
| 	httpFn func(Config) Config | ||||
| 	grpcFn func(Config) Config | ||||
| } | ||||
|  | ||||
| func (g *splitOption) ApplyGRPCOption(cfg *Config) { | ||||
| 	g.grpcFn(cfg) | ||||
| func (g *splitOption) ApplyGRPCOption(cfg Config) Config { | ||||
| 	return g.grpcFn(cfg) | ||||
| } | ||||
|  | ||||
| func (g *splitOption) ApplyHTTPOption(cfg *Config) { | ||||
| 	g.httpFn(cfg) | ||||
| func (g *splitOption) ApplyHTTPOption(cfg Config) Config { | ||||
| 	return g.httpFn(cfg) | ||||
| } | ||||
|  | ||||
| func (splitOption) private() {} | ||||
|  | ||||
| func newSplitOption(httpFn func(cfg *Config), grpcFn func(cfg *Config)) GenericOption { | ||||
| func newSplitOption(httpFn func(cfg Config) Config, grpcFn func(cfg Config) Config) GenericOption { | ||||
| 	return &splitOption{httpFn: httpFn, grpcFn: grpcFn} | ||||
| } | ||||
|  | ||||
| // httpOption is an option that is only applied to the HTTP driver. | ||||
| type httpOption struct { | ||||
| 	fn func(*Config) | ||||
| 	fn func(Config) Config | ||||
| } | ||||
|  | ||||
| func (h *httpOption) ApplyHTTPOption(cfg *Config) { | ||||
| 	h.fn(cfg) | ||||
| func (h *httpOption) ApplyHTTPOption(cfg Config) Config { | ||||
| 	return h.fn(cfg) | ||||
| } | ||||
|  | ||||
| func (httpOption) private() {} | ||||
|  | ||||
| func NewHTTPOption(fn func(cfg *Config)) HTTPOption { | ||||
| func NewHTTPOption(fn func(cfg Config) Config) HTTPOption { | ||||
| 	return &httpOption{fn: fn} | ||||
| } | ||||
|  | ||||
| // grpcOption is an option that is only applied to the gRPC driver. | ||||
| type grpcOption struct { | ||||
| 	fn func(*Config) | ||||
| 	fn func(Config) Config | ||||
| } | ||||
|  | ||||
| func (h *grpcOption) ApplyGRPCOption(cfg *Config) { | ||||
| 	h.fn(cfg) | ||||
| func (h *grpcOption) ApplyGRPCOption(cfg Config) Config { | ||||
| 	return h.fn(cfg) | ||||
| } | ||||
|  | ||||
| func (grpcOption) private() {} | ||||
|  | ||||
| func NewGRPCOption(fn func(cfg *Config)) GRPCOption { | ||||
| func NewGRPCOption(fn func(cfg Config) Config) GRPCOption { | ||||
| 	return &grpcOption{fn: fn} | ||||
| } | ||||
|  | ||||
| // Generic Options | ||||
|  | ||||
| func WithEndpoint(endpoint string) GenericOption { | ||||
| 	return newGenericOption(func(cfg *Config) { | ||||
| 	return newGenericOption(func(cfg Config) Config { | ||||
| 		cfg.Traces.Endpoint = endpoint | ||||
| 		return cfg | ||||
| 	}) | ||||
| } | ||||
|  | ||||
| func WithCompression(compression Compression) GenericOption { | ||||
| 	return newGenericOption(func(cfg *Config) { | ||||
| 	return newGenericOption(func(cfg Config) Config { | ||||
| 		cfg.Traces.Compression = compression | ||||
| 		return cfg | ||||
| 	}) | ||||
| } | ||||
|  | ||||
| func WithURLPath(urlPath string) GenericOption { | ||||
| 	return newGenericOption(func(cfg *Config) { | ||||
| 	return newGenericOption(func(cfg Config) Config { | ||||
| 		cfg.Traces.URLPath = urlPath | ||||
| 		return cfg | ||||
| 	}) | ||||
| } | ||||
|  | ||||
| func WithRetry(rc retry.Config) GenericOption { | ||||
| 	return newGenericOption(func(cfg *Config) { | ||||
| 	return newGenericOption(func(cfg Config) Config { | ||||
| 		cfg.RetryConfig = rc | ||||
| 		return cfg | ||||
| 	}) | ||||
| } | ||||
|  | ||||
| func WithTLSClientConfig(tlsCfg *tls.Config) GenericOption { | ||||
| 	return newSplitOption(func(cfg *Config) { | ||||
| 	return newSplitOption(func(cfg Config) Config { | ||||
| 		cfg.Traces.TLSCfg = tlsCfg.Clone() | ||||
| 	}, func(cfg *Config) { | ||||
| 		return cfg | ||||
| 	}, func(cfg Config) Config { | ||||
| 		cfg.Traces.GRPCCredentials = credentials.NewTLS(tlsCfg) | ||||
| 		return cfg | ||||
| 	}) | ||||
| } | ||||
|  | ||||
| func WithInsecure() GenericOption { | ||||
| 	return newGenericOption(func(cfg *Config) { | ||||
| 	return newGenericOption(func(cfg Config) Config { | ||||
| 		cfg.Traces.Insecure = true | ||||
| 		return cfg | ||||
| 	}) | ||||
| } | ||||
|  | ||||
| func WithSecure() GenericOption { | ||||
| 	return newGenericOption(func(cfg *Config) { | ||||
| 	return newGenericOption(func(cfg Config) Config { | ||||
| 		cfg.Traces.Insecure = false | ||||
| 		return cfg | ||||
| 	}) | ||||
| } | ||||
|  | ||||
| func WithHeaders(headers map[string]string) GenericOption { | ||||
| 	return newGenericOption(func(cfg *Config) { | ||||
| 	return newGenericOption(func(cfg Config) Config { | ||||
| 		cfg.Traces.Headers = headers | ||||
| 		return cfg | ||||
| 	}) | ||||
| } | ||||
|  | ||||
| func WithTimeout(duration time.Duration) GenericOption { | ||||
| 	return newGenericOption(func(cfg *Config) { | ||||
| 	return newGenericOption(func(cfg Config) Config { | ||||
| 		cfg.Traces.Timeout = duration | ||||
| 		return cfg | ||||
| 	}) | ||||
| } | ||||
|   | ||||
| @@ -15,9 +15,10 @@ | ||||
| package otlpconfig // import "go.opentelemetry.io/otel/exporters/otlp/otlptrace/internal/otlpconfig" | ||||
|  | ||||
| const ( | ||||
| 	// DefaultCollectorPort is the port the Exporter will attempt connect to | ||||
| 	// if no collector port is provided. | ||||
| 	DefaultCollectorPort uint16 = 4317 | ||||
| 	// DefaultCollectorGRPCPort is the default gRPC port of the collector. | ||||
| 	DefaultCollectorGRPCPort uint16 = 4317 | ||||
| 	// DefaultCollectorHTTPPort is the default HTTP port of the collector. | ||||
| 	DefaultCollectorHTTPPort uint16 = 4318 | ||||
| 	// DefaultCollectorHost is the host address the Exporter will attempt | ||||
| 	// connect to if no collector address is provided. | ||||
| 	DefaultCollectorHost string = "localhost" | ||||
| @@ -36,7 +37,7 @@ const ( | ||||
| 	GzipCompression | ||||
| ) | ||||
|  | ||||
| // Marshaler describes the kind of message format sent to the collector | ||||
| // Marshaler describes the kind of message format sent to the collector. | ||||
| type Marshaler int | ||||
|  | ||||
| const ( | ||||
|   | ||||
| @@ -19,11 +19,11 @@ import ( | ||||
| 	commonpb "go.opentelemetry.io/proto/otlp/common/v1" | ||||
| ) | ||||
|  | ||||
| func InstrumentationLibrary(il instrumentation.Library) *commonpb.InstrumentationLibrary { | ||||
| func InstrumentationScope(il instrumentation.Library) *commonpb.InstrumentationScope { | ||||
| 	if il == (instrumentation.Library{}) { | ||||
| 		return nil | ||||
| 	} | ||||
| 	return &commonpb.InstrumentationLibrary{ | ||||
| 	return &commonpb.InstrumentationScope{ | ||||
| 		Name:    il.Name, | ||||
| 		Version: il.Version, | ||||
| 	} | ||||
|   | ||||
							
								
								
									
										68
									
								
								vendor/go.opentelemetry.io/otel/exporters/otlp/otlptrace/internal/tracetransform/span.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										68
									
								
								vendor/go.opentelemetry.io/otel/exporters/otlp/otlptrace/internal/tracetransform/span.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -23,10 +23,6 @@ import ( | ||||
| 	tracepb "go.opentelemetry.io/proto/otlp/trace/v1" | ||||
| ) | ||||
|  | ||||
| const ( | ||||
| 	maxEventsPerSpan = 128 | ||||
| ) | ||||
|  | ||||
| // Spans transforms a slice of OpenTelemetry spans into a slice of OTLP | ||||
| // ResourceSpans. | ||||
| func Spans(sdl []tracesdk.ReadOnlySpan) []*tracepb.ResourceSpans { | ||||
| @@ -36,11 +32,11 @@ func Spans(sdl []tracesdk.ReadOnlySpan) []*tracepb.ResourceSpans { | ||||
|  | ||||
| 	rsm := make(map[attribute.Distinct]*tracepb.ResourceSpans) | ||||
|  | ||||
| 	type ilsKey struct { | ||||
| 	type key struct { | ||||
| 		r  attribute.Distinct | ||||
| 		il instrumentation.Library | ||||
| 	} | ||||
| 	ilsm := make(map[ilsKey]*tracepb.InstrumentationLibrarySpans) | ||||
| 	ssm := make(map[key]*tracepb.ScopeSpans) | ||||
|  | ||||
| 	var resources int | ||||
| 	for _, sd := range sdl { | ||||
| @@ -49,30 +45,30 @@ func Spans(sdl []tracesdk.ReadOnlySpan) []*tracepb.ResourceSpans { | ||||
| 		} | ||||
|  | ||||
| 		rKey := sd.Resource().Equivalent() | ||||
| 		iKey := ilsKey{ | ||||
| 		k := key{ | ||||
| 			r:  rKey, | ||||
| 			il: sd.InstrumentationLibrary(), | ||||
| 		} | ||||
| 		ils, iOk := ilsm[iKey] | ||||
| 		scopeSpan, iOk := ssm[k] | ||||
| 		if !iOk { | ||||
| 			// Either the resource or instrumentation library were unknown. | ||||
| 			ils = &tracepb.InstrumentationLibrarySpans{ | ||||
| 				InstrumentationLibrary: InstrumentationLibrary(sd.InstrumentationLibrary()), | ||||
| 				Spans:                  []*tracepb.Span{}, | ||||
| 				SchemaUrl:              sd.InstrumentationLibrary().SchemaURL, | ||||
| 			scopeSpan = &tracepb.ScopeSpans{ | ||||
| 				Scope:     InstrumentationScope(sd.InstrumentationLibrary()), | ||||
| 				Spans:     []*tracepb.Span{}, | ||||
| 				SchemaUrl: sd.InstrumentationLibrary().SchemaURL, | ||||
| 			} | ||||
| 		} | ||||
| 		ils.Spans = append(ils.Spans, span(sd)) | ||||
| 		ilsm[iKey] = ils | ||||
| 		scopeSpan.Spans = append(scopeSpan.Spans, span(sd)) | ||||
| 		ssm[k] = scopeSpan | ||||
|  | ||||
| 		rs, rOk := rsm[rKey] | ||||
| 		if !rOk { | ||||
| 			resources++ | ||||
| 			// The resource was unknown. | ||||
| 			rs = &tracepb.ResourceSpans{ | ||||
| 				Resource:                    Resource(sd.Resource()), | ||||
| 				InstrumentationLibrarySpans: []*tracepb.InstrumentationLibrarySpans{ils}, | ||||
| 				SchemaUrl:                   sd.Resource().SchemaURL(), | ||||
| 				Resource:   Resource(sd.Resource()), | ||||
| 				ScopeSpans: []*tracepb.ScopeSpans{scopeSpan}, | ||||
| 				SchemaUrl:  sd.Resource().SchemaURL(), | ||||
| 			} | ||||
| 			rsm[rKey] = rs | ||||
| 			continue | ||||
| @@ -82,9 +78,9 @@ func Spans(sdl []tracesdk.ReadOnlySpan) []*tracepb.ResourceSpans { | ||||
| 		// library lookup was unknown because if so we need to add it to the | ||||
| 		// ResourceSpans. Otherwise, the instrumentation library has already | ||||
| 		// been seen and the append we did above will be included it in the | ||||
| 		// InstrumentationLibrarySpans reference. | ||||
| 		// ScopeSpans reference. | ||||
| 		if !iOk { | ||||
| 			rs.InstrumentationLibrarySpans = append(rs.InstrumentationLibrarySpans, ils) | ||||
| 			rs.ScopeSpans = append(rs.ScopeSpans, scopeSpan) | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| @@ -162,9 +158,10 @@ func links(links []tracesdk.Link) []*tracepb.Span_Link { | ||||
| 		sid := otLink.SpanContext.SpanID() | ||||
|  | ||||
| 		sl = append(sl, &tracepb.Span_Link{ | ||||
| 			TraceId:    tid[:], | ||||
| 			SpanId:     sid[:], | ||||
| 			Attributes: KeyValues(otLink.Attributes), | ||||
| 			TraceId:                tid[:], | ||||
| 			SpanId:                 sid[:], | ||||
| 			Attributes:             KeyValues(otLink.Attributes), | ||||
| 			DroppedAttributesCount: uint32(otLink.DroppedAttributeCount), | ||||
| 		}) | ||||
| 	} | ||||
| 	return sl | ||||
| @@ -176,29 +173,16 @@ func spanEvents(es []tracesdk.Event) []*tracepb.Span_Event { | ||||
| 		return nil | ||||
| 	} | ||||
|  | ||||
| 	evCount := len(es) | ||||
| 	if evCount > maxEventsPerSpan { | ||||
| 		evCount = maxEventsPerSpan | ||||
| 	} | ||||
| 	events := make([]*tracepb.Span_Event, 0, evCount) | ||||
| 	nEvents := 0 | ||||
|  | ||||
| 	events := make([]*tracepb.Span_Event, len(es)) | ||||
| 	// Transform message events | ||||
| 	for _, e := range es { | ||||
| 		if nEvents >= maxEventsPerSpan { | ||||
| 			break | ||||
| 	for i := 0; i < len(es); i++ { | ||||
| 		events[i] = &tracepb.Span_Event{ | ||||
| 			Name:                   es[i].Name, | ||||
| 			TimeUnixNano:           uint64(es[i].Time.UnixNano()), | ||||
| 			Attributes:             KeyValues(es[i].Attributes), | ||||
| 			DroppedAttributesCount: uint32(es[i].DroppedAttributeCount), | ||||
| 		} | ||||
| 		nEvents++ | ||||
| 		events = append(events, | ||||
| 			&tracepb.Span_Event{ | ||||
| 				Name:         e.Name, | ||||
| 				TimeUnixNano: uint64(e.Time.UnixNano()), | ||||
| 				Attributes:   KeyValues(e.Attributes), | ||||
| 				// TODO (rghetia) : Add Drop Counts when supported. | ||||
| 			}, | ||||
| 		) | ||||
| 	} | ||||
|  | ||||
| 	return events | ||||
| } | ||||
|  | ||||
|   | ||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user
	 Luca Comellini
					Luca Comellini