mirror of
https://github.com/fullstorydev/grpcurl.git
synced 2026-05-25 21:21:46 +03:00
Compare commits
18 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
1986364acd | ||
|
|
bdf97bc934 | ||
|
|
2f55ac63a4 | ||
|
|
8d7770a962 | ||
|
|
1f34448998 | ||
|
|
06a970022e | ||
|
|
db90ec1160 | ||
|
|
9da71fbe53 | ||
|
|
9846afccbc | ||
|
|
ba5f667e13 | ||
|
|
54ffdcacda | ||
|
|
ceef817807 | ||
|
|
e544b9e66f | ||
|
|
41a6ac0479 | ||
|
|
f37ec641c5 | ||
|
|
8e51c5e2d3 | ||
|
|
8376c2f7bb | ||
|
|
0162fa9726 |
1
.gitignore
vendored
1
.gitignore
vendored
@@ -1,2 +1,3 @@
|
|||||||
dist/
|
dist/
|
||||||
|
.idea/
|
||||||
VERSION
|
VERSION
|
||||||
|
|||||||
@@ -8,6 +8,12 @@ builds:
|
|||||||
goarch:
|
goarch:
|
||||||
- amd64
|
- amd64
|
||||||
- 386
|
- 386
|
||||||
|
- arm64
|
||||||
|
ignore:
|
||||||
|
- goos: darwin
|
||||||
|
goarch: 386
|
||||||
|
- goos: windows
|
||||||
|
goarch: arm64
|
||||||
ldflags:
|
ldflags:
|
||||||
- -s -w -X main.version=v{{.Version}}
|
- -s -w -X main.version=v{{.Version}}
|
||||||
|
|
||||||
|
|||||||
@@ -3,8 +3,6 @@ sudo: false
|
|||||||
|
|
||||||
matrix:
|
matrix:
|
||||||
include:
|
include:
|
||||||
- go: 1.11.x
|
|
||||||
env: GO111MODULE=off
|
|
||||||
- go: 1.11.x
|
- go: 1.11.x
|
||||||
env: GO111MODULE=on
|
env: GO111MODULE=on
|
||||||
- go: 1.12.x
|
- go: 1.12.x
|
||||||
|
|||||||
12
Makefile
12
Makefile
@@ -22,7 +22,7 @@ install:
|
|||||||
|
|
||||||
.PHONY: release
|
.PHONY: release
|
||||||
release:
|
release:
|
||||||
@go get github.com/goreleaser/goreleaser
|
@GO111MODULE=on go install github.com/goreleaser/goreleaser
|
||||||
goreleaser --rm-dist
|
goreleaser --rm-dist
|
||||||
|
|
||||||
.PHONY: docker
|
.PHONY: docker
|
||||||
@@ -46,29 +46,29 @@ vet:
|
|||||||
# CI is just getting latest master for dependencies like grpc.
|
# CI is just getting latest master for dependencies like grpc.
|
||||||
.PHONY: staticcheck
|
.PHONY: staticcheck
|
||||||
staticcheck:
|
staticcheck:
|
||||||
@go get honnef.co/go/tools/cmd/staticcheck
|
@GO111MODULE=on go install honnef.co/go/tools/cmd/staticcheck
|
||||||
staticcheck ./...
|
staticcheck ./...
|
||||||
|
|
||||||
.PHONY: ineffassign
|
.PHONY: ineffassign
|
||||||
ineffassign:
|
ineffassign:
|
||||||
@go get github.com/gordonklaus/ineffassign
|
@GO111MODULE=on go install github.com/gordonklaus/ineffassign
|
||||||
ineffassign .
|
ineffassign .
|
||||||
|
|
||||||
.PHONY: predeclared
|
.PHONY: predeclared
|
||||||
predeclared:
|
predeclared:
|
||||||
@go get github.com/nishanths/predeclared
|
@GO111MODULE=on go install github.com/nishanths/predeclared
|
||||||
predeclared .
|
predeclared .
|
||||||
|
|
||||||
# Intentionally omitted from CI, but target here for ad-hoc reports.
|
# Intentionally omitted from CI, but target here for ad-hoc reports.
|
||||||
.PHONY: golint
|
.PHONY: golint
|
||||||
golint:
|
golint:
|
||||||
@go get golang.org/x/lint/golint
|
@GO111MODULE=on go install golang.org/x/lint/golint
|
||||||
golint -min_confidence 0.9 -set_exit_status ./...
|
golint -min_confidence 0.9 -set_exit_status ./...
|
||||||
|
|
||||||
# Intentionally omitted from CI, but target here for ad-hoc reports.
|
# Intentionally omitted from CI, but target here for ad-hoc reports.
|
||||||
.PHONY: errcheck
|
.PHONY: errcheck
|
||||||
errcheck:
|
errcheck:
|
||||||
@go get github.com/kisielk/errcheck
|
@GO111MODULE=on go install github.com/kisielk/errcheck
|
||||||
errcheck ./...
|
errcheck ./...
|
||||||
|
|
||||||
.PHONY: test
|
.PHONY: test
|
||||||
|
|||||||
11
README.md
11
README.md
@@ -35,9 +35,9 @@ See also the [`grpcurl` talk at GopherCon 2018](https://www.youtube.com/watch?v=
|
|||||||
operate bi-directional streaming methods interactively by running `grpcurl` from an
|
operate bi-directional streaming methods interactively by running `grpcurl` from an
|
||||||
interactive terminal and using stdin as the request body!
|
interactive terminal and using stdin as the request body!
|
||||||
|
|
||||||
`grpcurl` supports both plain-text and TLS servers and has numerous options for TLS
|
`grpcurl` supports both secure/TLS servers _and_ plain-text servers (i.e. no TLS) and has
|
||||||
configuration. It also supports mutual TLS, where the client is required to present a
|
numerous options for TLS configuration. It also supports mutual TLS, where the client is
|
||||||
client certificate.
|
required to present a client certificate.
|
||||||
|
|
||||||
As mentioned above, `grpcurl` works seamlessly if the server supports the reflection
|
As mentioned above, `grpcurl` works seamlessly if the server supports the reflection
|
||||||
service. If not, you can supply the `.proto` source files or you can supply protoset
|
service. If not, you can supply the `.proto` source files or you can supply protoset
|
||||||
@@ -57,7 +57,7 @@ brew install grpcurl
|
|||||||
### From Source
|
### From Source
|
||||||
You can use the `go` tool to install `grpcurl`:
|
You can use the `go` tool to install `grpcurl`:
|
||||||
```shell
|
```shell
|
||||||
go get github.com/fullstorydev/grpcurl
|
go get github.com/fullstorydev/grpcurl/...
|
||||||
go install github.com/fullstorydev/grpcurl/cmd/grpcurl
|
go install github.com/fullstorydev/grpcurl/cmd/grpcurl
|
||||||
```
|
```
|
||||||
|
|
||||||
@@ -91,6 +91,9 @@ that requires no client certs and supports server reflection is the simplest thi
|
|||||||
do with `grpcurl`. This minimal invocation sends an empty request body:
|
do with `grpcurl`. This minimal invocation sends an empty request body:
|
||||||
```shell
|
```shell
|
||||||
grpcurl grpc.server.com:443 my.custom.server.Service/Method
|
grpcurl grpc.server.com:443 my.custom.server.Service/Method
|
||||||
|
|
||||||
|
# no TLS
|
||||||
|
grpcurl -plaintext grpc.server.com:80 my.custom.server.Service/Method
|
||||||
```
|
```
|
||||||
|
|
||||||
To send a non-empty request, use the `-d` argument. Note that all arguments must come
|
To send a non-empty request, use the `-d` argument. Note that all arguments must come
|
||||||
|
|||||||
@@ -4,6 +4,7 @@
|
|||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"context"
|
||||||
"flag"
|
"flag"
|
||||||
"fmt"
|
"fmt"
|
||||||
"io"
|
"io"
|
||||||
@@ -13,11 +14,8 @@ import (
|
|||||||
"strings"
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/fullstorydev/grpcurl"
|
|
||||||
descpb "github.com/golang/protobuf/protoc-gen-go/descriptor"
|
|
||||||
"github.com/jhump/protoreflect/desc"
|
"github.com/jhump/protoreflect/desc"
|
||||||
"github.com/jhump/protoreflect/grpcreflect"
|
"github.com/jhump/protoreflect/grpcreflect"
|
||||||
"golang.org/x/net/context"
|
|
||||||
"google.golang.org/grpc"
|
"google.golang.org/grpc"
|
||||||
"google.golang.org/grpc/codes"
|
"google.golang.org/grpc/codes"
|
||||||
"google.golang.org/grpc/credentials"
|
"google.golang.org/grpc/credentials"
|
||||||
@@ -25,9 +23,14 @@ import (
|
|||||||
"google.golang.org/grpc/metadata"
|
"google.golang.org/grpc/metadata"
|
||||||
reflectpb "google.golang.org/grpc/reflection/grpc_reflection_v1alpha"
|
reflectpb "google.golang.org/grpc/reflection/grpc_reflection_v1alpha"
|
||||||
"google.golang.org/grpc/status"
|
"google.golang.org/grpc/status"
|
||||||
|
"google.golang.org/protobuf/types/descriptorpb"
|
||||||
|
|
||||||
// Register gzip compressor so compressed responses will work:
|
// Register gzip compressor so compressed responses will work
|
||||||
_ "google.golang.org/grpc/encoding/gzip"
|
_ "google.golang.org/grpc/encoding/gzip"
|
||||||
|
// Register xds so xds and xds-experimental resolver schemes work
|
||||||
|
_ "google.golang.org/grpc/xds"
|
||||||
|
|
||||||
|
"github.com/fullstorydev/grpcurl"
|
||||||
)
|
)
|
||||||
|
|
||||||
// To avoid confusion between program error codes and the gRPC resonse
|
// To avoid confusion between program error codes and the gRPC resonse
|
||||||
@@ -35,7 +38,9 @@ import (
|
|||||||
// the response status codes emitted use an offest of 64
|
// the response status codes emitted use an offest of 64
|
||||||
const statusCodeOffset = 64
|
const statusCodeOffset = 64
|
||||||
|
|
||||||
var version = "dev build <no version set>"
|
const no_version = "dev build <no version set>"
|
||||||
|
|
||||||
|
var version = no_version
|
||||||
|
|
||||||
var (
|
var (
|
||||||
exit = os.Exit
|
exit = os.Exit
|
||||||
@@ -83,6 +88,10 @@ var (
|
|||||||
is used, this will also be used as the server name when verifying the
|
is used, this will also be used as the server name when verifying the
|
||||||
server's certificate. It defaults to the address that is provided in the
|
server's certificate. It defaults to the address that is provided in the
|
||||||
positional arguments.`))
|
positional arguments.`))
|
||||||
|
userAgent = flags.String("user-agent", "", prettify(`
|
||||||
|
If set, the specified value will be added to the User-Agent header set
|
||||||
|
by the grpc-go library.
|
||||||
|
`))
|
||||||
data = flags.String("d", "", prettify(`
|
data = flags.String("d", "", prettify(`
|
||||||
Data for request contents. If the value is '@' then the request contents
|
Data for request contents. If the value is '@' then the request contents
|
||||||
are read from stdin. For calls that accept a stream of requests, the
|
are read from stdin. For calls that accept a stream of requests, the
|
||||||
@@ -98,6 +107,10 @@ var (
|
|||||||
ASCII character: 0x1E. The stream should not end in a record separator.
|
ASCII character: 0x1E. The stream should not end in a record separator.
|
||||||
If it does, it will be interpreted as a final, blank message after the
|
If it does, it will be interpreted as a final, blank message after the
|
||||||
separator.`))
|
separator.`))
|
||||||
|
allowUnknownFields = flags.Bool("allow-unknown-fields", false, prettify(`
|
||||||
|
When true, the request contents, if 'json' format is used, allows
|
||||||
|
unkown fields to be present. They will be ignored when parsing
|
||||||
|
the request.`))
|
||||||
connectTimeout = flags.Float64("connect-timeout", 0, prettify(`
|
connectTimeout = flags.Float64("connect-timeout", 0, prettify(`
|
||||||
The maximum time, in seconds, to wait for connection to be established.
|
The maximum time, in seconds, to wait for connection to be established.
|
||||||
Defaults to 10 seconds.`))
|
Defaults to 10 seconds.`))
|
||||||
@@ -129,6 +142,8 @@ var (
|
|||||||
When describing messages, show a template of input data.`))
|
When describing messages, show a template of input data.`))
|
||||||
verbose = flags.Bool("v", false, prettify(`
|
verbose = flags.Bool("v", false, prettify(`
|
||||||
Enable verbose output.`))
|
Enable verbose output.`))
|
||||||
|
veryVerbose = flags.Bool("vv", false, prettify(`
|
||||||
|
Enable very verbose output.`))
|
||||||
serverName = flags.String("servername", "", prettify(`
|
serverName = flags.String("servername", "", prettify(`
|
||||||
Override server name when validating TLS certificate. This flag is
|
Override server name when validating TLS certificate. This flag is
|
||||||
ignored if -plaintext or -insecure is used.
|
ignored if -plaintext or -insecure is used.
|
||||||
@@ -143,7 +158,7 @@ func init() {
|
|||||||
flags.Var(&addlHeaders, "H", prettify(`
|
flags.Var(&addlHeaders, "H", prettify(`
|
||||||
Additional headers in 'name: value' format. May specify more than one
|
Additional headers in 'name: value' format. May specify more than one
|
||||||
via multiple flags. These headers will also be included in reflection
|
via multiple flags. These headers will also be included in reflection
|
||||||
requests requests to a server.`))
|
requests to a server.`))
|
||||||
flags.Var(&rpcHeaders, "rpc-header", prettify(`
|
flags.Var(&rpcHeaders, "rpc-header", prettify(`
|
||||||
Additional RPC headers in 'name: value' format. May specify more than
|
Additional RPC headers in 'name: value' format. May specify more than
|
||||||
one via multiple flags. These headers will *only* be used when invoking
|
one via multiple flags. These headers will *only* be used when invoking
|
||||||
@@ -310,6 +325,14 @@ func main() {
|
|||||||
invoke = true
|
invoke = true
|
||||||
}
|
}
|
||||||
|
|
||||||
|
verbosityLevel := 0
|
||||||
|
if *verbose {
|
||||||
|
verbosityLevel = 1
|
||||||
|
}
|
||||||
|
if *veryVerbose {
|
||||||
|
verbosityLevel = 2
|
||||||
|
}
|
||||||
|
|
||||||
var symbol string
|
var symbol string
|
||||||
if invoke {
|
if invoke {
|
||||||
if len(args) == 0 {
|
if len(args) == 0 {
|
||||||
@@ -360,7 +383,9 @@ func main() {
|
|||||||
ctx := context.Background()
|
ctx := context.Background()
|
||||||
if *maxTime > 0 {
|
if *maxTime > 0 {
|
||||||
timeout := time.Duration(*maxTime * float64(time.Second))
|
timeout := time.Duration(*maxTime * float64(time.Second))
|
||||||
ctx, _ = context.WithTimeout(ctx, timeout)
|
var cancel context.CancelFunc
|
||||||
|
ctx, cancel = context.WithTimeout(ctx, timeout)
|
||||||
|
defer cancel()
|
||||||
}
|
}
|
||||||
|
|
||||||
dial := func() *grpc.ClientConn {
|
dial := func() *grpc.ClientConn {
|
||||||
@@ -410,6 +435,16 @@ func main() {
|
|||||||
} else if *authority != "" {
|
} else if *authority != "" {
|
||||||
opts = append(opts, grpc.WithAuthority(*authority))
|
opts = append(opts, grpc.WithAuthority(*authority))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
grpcurlUA := "grpcurl/" + version
|
||||||
|
if version == no_version {
|
||||||
|
grpcurlUA = "grpcurl/dev-build (no version set)"
|
||||||
|
}
|
||||||
|
if *userAgent != "" {
|
||||||
|
grpcurlUA = *userAgent + " " + grpcurlUA
|
||||||
|
}
|
||||||
|
opts = append(opts, grpc.WithUserAgent(grpcurlUA))
|
||||||
|
|
||||||
network := "tcp"
|
network := "tcp"
|
||||||
if isUnixSocket != nil && isUnixSocket() {
|
if isUnixSocket != nil && isUnixSocket() {
|
||||||
network = "unix"
|
network = "unix"
|
||||||
@@ -571,7 +606,7 @@ func main() {
|
|||||||
} else {
|
} else {
|
||||||
// see if it's a group
|
// see if it's a group
|
||||||
for _, f := range parent.GetFields() {
|
for _, f := range parent.GetFields() {
|
||||||
if f.GetType() == descpb.FieldDescriptorProto_TYPE_GROUP && f.GetMessageType() == d {
|
if f.GetType() == descriptorpb.FieldDescriptorProto_TYPE_GROUP && f.GetMessageType() == d {
|
||||||
// found it: describe the map field instead
|
// found it: describe the map field instead
|
||||||
elementType = "the type of a group field"
|
elementType = "the type of a group field"
|
||||||
dsc = f
|
dsc = f
|
||||||
@@ -582,7 +617,7 @@ func main() {
|
|||||||
}
|
}
|
||||||
case *desc.FieldDescriptor:
|
case *desc.FieldDescriptor:
|
||||||
elementType = "a field"
|
elementType = "a field"
|
||||||
if d.GetType() == descpb.FieldDescriptorProto_TYPE_GROUP {
|
if d.GetType() == descriptorpb.FieldDescriptorProto_TYPE_GROUP {
|
||||||
elementType = "a group field"
|
elementType = "a group field"
|
||||||
} else if d.IsExtension() {
|
} else if d.IsExtension() {
|
||||||
elementType = "an extension"
|
elementType = "an extension"
|
||||||
@@ -613,7 +648,8 @@ func main() {
|
|||||||
// for messages, also show a template in JSON, to make it easier to
|
// for messages, also show a template in JSON, to make it easier to
|
||||||
// create a request to invoke an RPC
|
// create a request to invoke an RPC
|
||||||
tmpl := grpcurl.MakeTemplate(dsc)
|
tmpl := grpcurl.MakeTemplate(dsc)
|
||||||
_, formatter, err := grpcurl.RequestParserAndFormatterFor(grpcurl.Format(*format), descSource, true, false, nil)
|
options := grpcurl.FormatOptions{EmitJSONDefaultFields: true}
|
||||||
|
_, formatter, err := grpcurl.RequestParserAndFormatter(grpcurl.Format(*format), descSource, nil, options)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fail(err, "Failed to construct formatter for %q", *format)
|
fail(err, "Failed to construct formatter for %q", *format)
|
||||||
}
|
}
|
||||||
@@ -644,16 +680,29 @@ func main() {
|
|||||||
// if not verbose output, then also include record delimiters
|
// if not verbose output, then also include record delimiters
|
||||||
// between each message, so output could potentially be piped
|
// between each message, so output could potentially be piped
|
||||||
// to another grpcurl process
|
// to another grpcurl process
|
||||||
includeSeparators := !*verbose
|
includeSeparators := verbosityLevel == 0
|
||||||
rf, formatter, err := grpcurl.RequestParserAndFormatterFor(grpcurl.Format(*format), descSource, *emitDefaults, includeSeparators, in)
|
options := grpcurl.FormatOptions{
|
||||||
|
EmitJSONDefaultFields: *emitDefaults,
|
||||||
|
IncludeTextSeparator: includeSeparators,
|
||||||
|
AllowUnknownFields: *allowUnknownFields,
|
||||||
|
}
|
||||||
|
rf, formatter, err := grpcurl.RequestParserAndFormatter(grpcurl.Format(*format), descSource, in, options)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fail(err, "Failed to construct request parser and formatter for %q", *format)
|
fail(err, "Failed to construct request parser and formatter for %q", *format)
|
||||||
}
|
}
|
||||||
h := grpcurl.NewDefaultEventHandler(os.Stdout, descSource, formatter, *verbose)
|
h := &grpcurl.DefaultEventHandler{
|
||||||
|
Out: os.Stdout,
|
||||||
|
Formatter: formatter,
|
||||||
|
VerbosityLevel: verbosityLevel,
|
||||||
|
}
|
||||||
|
|
||||||
err = grpcurl.InvokeRPC(ctx, descSource, cc, symbol, append(addlHeaders, rpcHeaders...), h, rf.Next)
|
err = grpcurl.InvokeRPC(ctx, descSource, cc, symbol, append(addlHeaders, rpcHeaders...), h, rf.Next)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fail(err, "Error invoking method %q", symbol)
|
if errStatus, ok := status.FromError(err); ok && *formatError {
|
||||||
|
h.Status = errStatus
|
||||||
|
} else {
|
||||||
|
fail(err, "Error invoking method %q", symbol)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
reqSuffix := ""
|
reqSuffix := ""
|
||||||
respSuffix := ""
|
respSuffix := ""
|
||||||
@@ -664,7 +713,7 @@ func main() {
|
|||||||
if h.NumResponses != 1 {
|
if h.NumResponses != 1 {
|
||||||
respSuffix = "s"
|
respSuffix = "s"
|
||||||
}
|
}
|
||||||
if *verbose {
|
if verbosityLevel > 0 {
|
||||||
fmt.Printf("Sent %d request%s and received %d response%s\n", reqCount, reqSuffix, h.NumResponses, respSuffix)
|
fmt.Printf("Sent %d request%s and received %d response%s\n", reqCount, reqSuffix, h.NumResponses, respSuffix)
|
||||||
}
|
}
|
||||||
if h.Status.Code() != codes.OK {
|
if h.Status.Code() != codes.OK {
|
||||||
|
|||||||
@@ -1,21 +1,21 @@
|
|||||||
package grpcurl
|
package grpcurl
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"context"
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"io"
|
"io"
|
||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
"sync"
|
"sync"
|
||||||
|
|
||||||
"github.com/golang/protobuf/proto"
|
"github.com/golang/protobuf/proto" //lint:ignore SA1019 we have to import this because it appears in exported API
|
||||||
descpb "github.com/golang/protobuf/protoc-gen-go/descriptor"
|
|
||||||
"github.com/jhump/protoreflect/desc"
|
"github.com/jhump/protoreflect/desc"
|
||||||
"github.com/jhump/protoreflect/desc/protoparse"
|
"github.com/jhump/protoreflect/desc/protoparse"
|
||||||
"github.com/jhump/protoreflect/dynamic"
|
"github.com/jhump/protoreflect/dynamic"
|
||||||
"github.com/jhump/protoreflect/grpcreflect"
|
"github.com/jhump/protoreflect/grpcreflect"
|
||||||
"golang.org/x/net/context"
|
|
||||||
"google.golang.org/grpc/codes"
|
"google.golang.org/grpc/codes"
|
||||||
"google.golang.org/grpc/status"
|
"google.golang.org/grpc/status"
|
||||||
|
"google.golang.org/protobuf/types/descriptorpb"
|
||||||
)
|
)
|
||||||
|
|
||||||
// ErrReflectionNotSupported is returned by DescriptorSource operations that
|
// ErrReflectionNotSupported is returned by DescriptorSource operations that
|
||||||
@@ -39,13 +39,13 @@ type DescriptorSource interface {
|
|||||||
// DescriptorSourceFromProtoSets creates a DescriptorSource that is backed by the named files, whose contents
|
// DescriptorSourceFromProtoSets creates a DescriptorSource that is backed by the named files, whose contents
|
||||||
// are encoded FileDescriptorSet protos.
|
// are encoded FileDescriptorSet protos.
|
||||||
func DescriptorSourceFromProtoSets(fileNames ...string) (DescriptorSource, error) {
|
func DescriptorSourceFromProtoSets(fileNames ...string) (DescriptorSource, error) {
|
||||||
files := &descpb.FileDescriptorSet{}
|
files := &descriptorpb.FileDescriptorSet{}
|
||||||
for _, fileName := range fileNames {
|
for _, fileName := range fileNames {
|
||||||
b, err := ioutil.ReadFile(fileName)
|
b, err := ioutil.ReadFile(fileName)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("could not load protoset file %q: %v", fileName, err)
|
return nil, fmt.Errorf("could not load protoset file %q: %v", fileName, err)
|
||||||
}
|
}
|
||||||
var fs descpb.FileDescriptorSet
|
var fs descriptorpb.FileDescriptorSet
|
||||||
err = proto.Unmarshal(b, &fs)
|
err = proto.Unmarshal(b, &fs)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("could not parse contents of protoset file %q: %v", fileName, err)
|
return nil, fmt.Errorf("could not parse contents of protoset file %q: %v", fileName, err)
|
||||||
@@ -76,8 +76,8 @@ func DescriptorSourceFromProtoFiles(importPaths []string, fileNames ...string) (
|
|||||||
}
|
}
|
||||||
|
|
||||||
// DescriptorSourceFromFileDescriptorSet creates a DescriptorSource that is backed by the FileDescriptorSet.
|
// DescriptorSourceFromFileDescriptorSet creates a DescriptorSource that is backed by the FileDescriptorSet.
|
||||||
func DescriptorSourceFromFileDescriptorSet(files *descpb.FileDescriptorSet) (DescriptorSource, error) {
|
func DescriptorSourceFromFileDescriptorSet(files *descriptorpb.FileDescriptorSet) (DescriptorSource, error) {
|
||||||
unresolved := map[string]*descpb.FileDescriptorProto{}
|
unresolved := map[string]*descriptorpb.FileDescriptorProto{}
|
||||||
for _, fd := range files.File {
|
for _, fd := range files.File {
|
||||||
unresolved[fd.GetName()] = fd
|
unresolved[fd.GetName()] = fd
|
||||||
}
|
}
|
||||||
@@ -91,7 +91,7 @@ func DescriptorSourceFromFileDescriptorSet(files *descpb.FileDescriptorSet) (Des
|
|||||||
return &fileSource{files: resolved}, nil
|
return &fileSource{files: resolved}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func resolveFileDescriptor(unresolved map[string]*descpb.FileDescriptorProto, resolved map[string]*desc.FileDescriptor, filename string) (*desc.FileDescriptor, error) {
|
func resolveFileDescriptor(unresolved map[string]*descriptorpb.FileDescriptorProto, resolved map[string]*desc.FileDescriptor, filename string) (*desc.FileDescriptor, error) {
|
||||||
if r, ok := resolved[filename]; ok {
|
if r, ok := resolved[filename]; ok {
|
||||||
return r, nil
|
return r, nil
|
||||||
}
|
}
|
||||||
@@ -275,12 +275,12 @@ func WriteProtoset(out io.Writer, descSource DescriptorSource, symbols ...string
|
|||||||
// now expand that to include transitive dependencies in topologically sorted
|
// now expand that to include transitive dependencies in topologically sorted
|
||||||
// order (such that file always appears after its dependencies)
|
// order (such that file always appears after its dependencies)
|
||||||
expandedFiles := make(map[string]struct{}, len(fds))
|
expandedFiles := make(map[string]struct{}, len(fds))
|
||||||
allFilesSlice := make([]*descpb.FileDescriptorProto, 0, len(fds))
|
allFilesSlice := make([]*descriptorpb.FileDescriptorProto, 0, len(fds))
|
||||||
for _, filename := range filenames {
|
for _, filename := range filenames {
|
||||||
allFilesSlice = addFilesToSet(allFilesSlice, expandedFiles, fds[filename])
|
allFilesSlice = addFilesToSet(allFilesSlice, expandedFiles, fds[filename])
|
||||||
}
|
}
|
||||||
// now we can serialize to file
|
// now we can serialize to file
|
||||||
b, err := proto.Marshal(&descpb.FileDescriptorSet{File: allFilesSlice})
|
b, err := proto.Marshal(&descriptorpb.FileDescriptorSet{File: allFilesSlice})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("failed to serialize file descriptor set: %v", err)
|
return fmt.Errorf("failed to serialize file descriptor set: %v", err)
|
||||||
}
|
}
|
||||||
@@ -290,7 +290,7 @@ func WriteProtoset(out io.Writer, descSource DescriptorSource, symbols ...string
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func addFilesToSet(allFiles []*descpb.FileDescriptorProto, expanded map[string]struct{}, fd *desc.FileDescriptor) []*descpb.FileDescriptorProto {
|
func addFilesToSet(allFiles []*descriptorpb.FileDescriptorProto, expanded map[string]struct{}, fd *desc.FileDescriptor) []*descriptorpb.FileDescriptorProto {
|
||||||
if _, ok := expanded[fd.GetName()]; ok {
|
if _, ok := expanded[fd.GetName()]; ok {
|
||||||
// already seen this one
|
// already seen this one
|
||||||
return allFiles
|
return allFiles
|
||||||
|
|||||||
@@ -5,21 +5,21 @@ import (
|
|||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"github.com/golang/protobuf/proto"
|
"github.com/golang/protobuf/proto" //lint:ignore SA1019 we have to import this because it appears in exported API
|
||||||
"github.com/golang/protobuf/protoc-gen-go/descriptor"
|
"google.golang.org/protobuf/types/descriptorpb"
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestWriteProtoset(t *testing.T) {
|
func TestWriteProtoset(t *testing.T) {
|
||||||
exampleProtoset, err := loadProtoset("./testing/example.protoset")
|
exampleProtoset, err := loadProtoset("./internal/testing/example.protoset")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatalf("failed to load example.protoset: %v", err)
|
t.Fatalf("failed to load example.protoset: %v", err)
|
||||||
}
|
}
|
||||||
testProtoset, err := loadProtoset("./testing/test.protoset")
|
testProtoset, err := loadProtoset("./internal/testing/test.protoset")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatalf("failed to load test.protoset: %v", err)
|
t.Fatalf("failed to load test.protoset: %v", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
mergedProtoset := &descriptor.FileDescriptorSet{
|
mergedProtoset := &descriptorpb.FileDescriptorSet{
|
||||||
File: append(exampleProtoset.File, testProtoset.File...),
|
File: append(exampleProtoset.File, testProtoset.File...),
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -29,29 +29,29 @@ func TestWriteProtoset(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
checkWriteProtoset(t, descSrc, exampleProtoset, "TestService")
|
checkWriteProtoset(t, descSrc, exampleProtoset, "TestService")
|
||||||
checkWriteProtoset(t, descSrc, testProtoset, "grpc.testing.TestService")
|
checkWriteProtoset(t, descSrc, testProtoset, "testing.TestService")
|
||||||
checkWriteProtoset(t, descSrc, mergedProtoset, "TestService", "grpc.testing.TestService")
|
checkWriteProtoset(t, descSrc, mergedProtoset, "TestService", "testing.TestService")
|
||||||
}
|
}
|
||||||
|
|
||||||
func loadProtoset(path string) (*descriptor.FileDescriptorSet, error) {
|
func loadProtoset(path string) (*descriptorpb.FileDescriptorSet, error) {
|
||||||
b, err := ioutil.ReadFile(path)
|
b, err := ioutil.ReadFile(path)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
var protoset descriptor.FileDescriptorSet
|
var protoset descriptorpb.FileDescriptorSet
|
||||||
if err := proto.Unmarshal(b, &protoset); err != nil {
|
if err := proto.Unmarshal(b, &protoset); err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
return &protoset, nil
|
return &protoset, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func checkWriteProtoset(t *testing.T, descSrc DescriptorSource, protoset *descriptor.FileDescriptorSet, symbols ...string) {
|
func checkWriteProtoset(t *testing.T, descSrc DescriptorSource, protoset *descriptorpb.FileDescriptorSet, symbols ...string) {
|
||||||
var buf bytes.Buffer
|
var buf bytes.Buffer
|
||||||
if err := WriteProtoset(&buf, descSrc, symbols...); err != nil {
|
if err := WriteProtoset(&buf, descSrc, symbols...); err != nil {
|
||||||
t.Fatalf("failed to write protoset: %v", err)
|
t.Fatalf("failed to write protoset: %v", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
var result descriptor.FileDescriptorSet
|
var result descriptorpb.FileDescriptorSet
|
||||||
if err := proto.Unmarshal(buf.Bytes(), &result); err != nil {
|
if err := proto.Unmarshal(buf.Bytes(), &result); err != nil {
|
||||||
t.Fatalf("failed to unmarshal written protoset: %v", err)
|
t.Fatalf("failed to unmarshal written protoset: %v", err)
|
||||||
}
|
}
|
||||||
|
|||||||
126
format.go
126
format.go
@@ -11,8 +11,8 @@ import (
|
|||||||
"strings"
|
"strings"
|
||||||
"sync"
|
"sync"
|
||||||
|
|
||||||
"github.com/golang/protobuf/jsonpb"
|
"github.com/golang/protobuf/jsonpb" //lint:ignore SA1019 we have to import this because it appears in exported API
|
||||||
"github.com/golang/protobuf/proto"
|
"github.com/golang/protobuf/proto" //lint:ignore SA1019 we have to import this because it appears in exported API
|
||||||
"github.com/jhump/protoreflect/desc"
|
"github.com/jhump/protoreflect/desc"
|
||||||
"github.com/jhump/protoreflect/dynamic"
|
"github.com/jhump/protoreflect/dynamic"
|
||||||
"google.golang.org/grpc/codes"
|
"google.golang.org/grpc/codes"
|
||||||
@@ -55,6 +55,15 @@ func NewJSONRequestParser(in io.Reader, resolver jsonpb.AnyResolver) RequestPars
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// NewJSONRequestParserWithUnmarshaler is like NewJSONRequestParser but
|
||||||
|
// accepts a protobuf jsonpb.Unmarshaler instead of jsonpb.AnyResolver.
|
||||||
|
func NewJSONRequestParserWithUnmarshaler(in io.Reader, unmarshaler jsonpb.Unmarshaler) RequestParser {
|
||||||
|
return &jsonRequestParser{
|
||||||
|
dec: json.NewDecoder(in),
|
||||||
|
unmarshaler: unmarshaler,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func (f *jsonRequestParser) Next(m proto.Message) error {
|
func (f *jsonRequestParser) Next(m proto.Message) error {
|
||||||
var msg json.RawMessage
|
var msg json.RawMessage
|
||||||
if err := f.dec.Decode(&msg); err != nil {
|
if err := f.dec.Decode(&msg); err != nil {
|
||||||
@@ -296,6 +305,7 @@ func (r anyResolverWithFallback) Resolve(typeUrl string) (proto.Message, error)
|
|||||||
if slash := strings.LastIndex(mname, "/"); slash >= 0 {
|
if slash := strings.LastIndex(mname, "/"); slash >= 0 {
|
||||||
mname = mname[slash+1:]
|
mname = mname[slash+1:]
|
||||||
}
|
}
|
||||||
|
//lint:ignore SA1019 new non-deprecated API requires other code changes; deferring...
|
||||||
mt := proto.MessageType(mname)
|
mt := proto.MessageType(mname)
|
||||||
if mt != nil {
|
if mt != nil {
|
||||||
return reflect.New(mt.Elem()).Interface().(proto.Message), nil
|
return reflect.New(mt.Elem()).Interface().(proto.Message), nil
|
||||||
@@ -342,31 +352,70 @@ func (a *unknownAny) ProtoMessage() {
|
|||||||
|
|
||||||
var _ proto.Message = (*unknownAny)(nil)
|
var _ proto.Message = (*unknownAny)(nil)
|
||||||
|
|
||||||
|
// FormatOptions is a set of flags that are passed to a JSON or text formatter.
|
||||||
|
type FormatOptions struct {
|
||||||
|
// EmitJSONDefaultFields flag, when true, includes empty/default values in the output.
|
||||||
|
// FormatJSON only flag.
|
||||||
|
EmitJSONDefaultFields bool
|
||||||
|
|
||||||
|
// AllowUnknownFields is an option for the parser. When true,
|
||||||
|
// it accepts input which includes unknown fields. These unknown fields
|
||||||
|
// are skipped instead of returning an error.
|
||||||
|
// FormatJSON only flag.
|
||||||
|
AllowUnknownFields bool
|
||||||
|
|
||||||
|
// IncludeTextSeparator is true then, when invoked to format multiple messages,
|
||||||
|
// all messages after the first one will be prefixed with the
|
||||||
|
// ASCII 'Record Separator' character (0x1E).
|
||||||
|
// It might be useful when the output is piped to another grpcurl process.
|
||||||
|
// FormatText only flag.
|
||||||
|
IncludeTextSeparator bool
|
||||||
|
}
|
||||||
|
|
||||||
|
// RequestParserAndFormatter returns a request parser and formatter for the
|
||||||
|
// given format. The given descriptor source may be used for parsing message
|
||||||
|
// data (if needed by the format).
|
||||||
|
// It accepts a set of options. The field EmitJSONDefaultFields and IncludeTextSeparator
|
||||||
|
// are options for JSON and protobuf text formats, respectively. The AllowUnknownFields field
|
||||||
|
// is a JSON-only format flag.
|
||||||
|
// Requests will be parsed from the given in.
|
||||||
|
func RequestParserAndFormatter(format Format, descSource DescriptorSource, in io.Reader, opts FormatOptions) (RequestParser, Formatter, error) {
|
||||||
|
switch format {
|
||||||
|
case FormatJSON:
|
||||||
|
resolver := AnyResolverFromDescriptorSource(descSource)
|
||||||
|
unmarshaler := jsonpb.Unmarshaler{AnyResolver: resolver, AllowUnknownFields: opts.AllowUnknownFields}
|
||||||
|
return NewJSONRequestParserWithUnmarshaler(in, unmarshaler), NewJSONFormatter(opts.EmitJSONDefaultFields, anyResolverWithFallback{AnyResolver: resolver}), nil
|
||||||
|
case FormatText:
|
||||||
|
return NewTextRequestParser(in), NewTextFormatter(opts.IncludeTextSeparator), nil
|
||||||
|
default:
|
||||||
|
return nil, nil, fmt.Errorf("unknown format: %s", format)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// RequestParserAndFormatterFor returns a request parser and formatter for the
|
// RequestParserAndFormatterFor returns a request parser and formatter for the
|
||||||
// given format. The given descriptor source may be used for parsing message
|
// given format. The given descriptor source may be used for parsing message
|
||||||
// data (if needed by the format). The flags emitJSONDefaultFields and
|
// data (if needed by the format). The flags emitJSONDefaultFields and
|
||||||
// includeTextSeparator are options for JSON and protobuf text formats,
|
// includeTextSeparator are options for JSON and protobuf text formats,
|
||||||
// respectively. Requests will be parsed from the given in.
|
// respectively. Requests will be parsed from the given in.
|
||||||
|
// This function is deprecated. Please use RequestParserAndFormatter instead.
|
||||||
|
// DEPRECATED
|
||||||
func RequestParserAndFormatterFor(format Format, descSource DescriptorSource, emitJSONDefaultFields, includeTextSeparator bool, in io.Reader) (RequestParser, Formatter, error) {
|
func RequestParserAndFormatterFor(format Format, descSource DescriptorSource, emitJSONDefaultFields, includeTextSeparator bool, in io.Reader) (RequestParser, Formatter, error) {
|
||||||
switch format {
|
return RequestParserAndFormatter(format, descSource, in, FormatOptions{
|
||||||
case FormatJSON:
|
EmitJSONDefaultFields: emitJSONDefaultFields,
|
||||||
resolver := AnyResolverFromDescriptorSource(descSource)
|
IncludeTextSeparator: includeTextSeparator,
|
||||||
return NewJSONRequestParser(in, resolver), NewJSONFormatter(emitJSONDefaultFields, anyResolverWithFallback{AnyResolver: resolver}), nil
|
})
|
||||||
case FormatText:
|
|
||||||
return NewTextRequestParser(in), NewTextFormatter(includeTextSeparator), nil
|
|
||||||
default:
|
|
||||||
return nil, nil, fmt.Errorf("unknown format: %s", format)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// DefaultEventHandler logs events to a writer. This is not thread-safe, but is
|
// DefaultEventHandler logs events to a writer. This is not thread-safe, but is
|
||||||
// safe for use with InvokeRPC as long as NumResponses and Status are not read
|
// safe for use with InvokeRPC as long as NumResponses and Status are not read
|
||||||
// until the call to InvokeRPC completes.
|
// until the call to InvokeRPC completes.
|
||||||
type DefaultEventHandler struct {
|
type DefaultEventHandler struct {
|
||||||
out io.Writer
|
Out io.Writer
|
||||||
descSource DescriptorSource
|
Formatter Formatter
|
||||||
formatter func(proto.Message) (string, error)
|
// 0 = default
|
||||||
verbose bool
|
// 1 = verbose
|
||||||
|
// 2 = very verbose
|
||||||
|
VerbosityLevel int
|
||||||
|
|
||||||
// NumResponses is the number of responses that have been received.
|
// NumResponses is the number of responses that have been received.
|
||||||
NumResponses int
|
NumResponses int
|
||||||
@@ -378,54 +427,65 @@ type DefaultEventHandler struct {
|
|||||||
// NewDefaultEventHandler returns an InvocationEventHandler that logs events to
|
// NewDefaultEventHandler returns an InvocationEventHandler that logs events to
|
||||||
// the given output. If verbose is true, all events are logged. Otherwise, only
|
// the given output. If verbose is true, all events are logged. Otherwise, only
|
||||||
// response messages are logged.
|
// response messages are logged.
|
||||||
|
//
|
||||||
|
// Deprecated: NewDefaultEventHandler exists for compatability.
|
||||||
|
// It doesn't allow fine control over the `VerbosityLevel`
|
||||||
|
// and provides only 0 and 1 options (which corresponds to the `verbose` argument).
|
||||||
|
// Use DefaultEventHandler{} initializer directly.
|
||||||
func NewDefaultEventHandler(out io.Writer, descSource DescriptorSource, formatter Formatter, verbose bool) *DefaultEventHandler {
|
func NewDefaultEventHandler(out io.Writer, descSource DescriptorSource, formatter Formatter, verbose bool) *DefaultEventHandler {
|
||||||
|
verbosityLevel := 0
|
||||||
|
if verbose {
|
||||||
|
verbosityLevel = 1
|
||||||
|
}
|
||||||
return &DefaultEventHandler{
|
return &DefaultEventHandler{
|
||||||
out: out,
|
Out: out,
|
||||||
descSource: descSource,
|
Formatter: formatter,
|
||||||
formatter: formatter,
|
VerbosityLevel: verbosityLevel,
|
||||||
verbose: verbose,
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
var _ InvocationEventHandler = (*DefaultEventHandler)(nil)
|
var _ InvocationEventHandler = (*DefaultEventHandler)(nil)
|
||||||
|
|
||||||
func (h *DefaultEventHandler) OnResolveMethod(md *desc.MethodDescriptor) {
|
func (h *DefaultEventHandler) OnResolveMethod(md *desc.MethodDescriptor) {
|
||||||
if h.verbose {
|
if h.VerbosityLevel > 0 {
|
||||||
txt, err := GetDescriptorText(md, h.descSource)
|
txt, err := GetDescriptorText(md, nil)
|
||||||
if err == nil {
|
if err == nil {
|
||||||
fmt.Fprintf(h.out, "\nResolved method descriptor:\n%s\n", txt)
|
fmt.Fprintf(h.Out, "\nResolved method descriptor:\n%s\n", txt)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (h *DefaultEventHandler) OnSendHeaders(md metadata.MD) {
|
func (h *DefaultEventHandler) OnSendHeaders(md metadata.MD) {
|
||||||
if h.verbose {
|
if h.VerbosityLevel > 0 {
|
||||||
fmt.Fprintf(h.out, "\nRequest metadata to send:\n%s\n", MetadataToString(md))
|
fmt.Fprintf(h.Out, "\nRequest metadata to send:\n%s\n", MetadataToString(md))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (h *DefaultEventHandler) OnReceiveHeaders(md metadata.MD) {
|
func (h *DefaultEventHandler) OnReceiveHeaders(md metadata.MD) {
|
||||||
if h.verbose {
|
if h.VerbosityLevel > 0 {
|
||||||
fmt.Fprintf(h.out, "\nResponse headers received:\n%s\n", MetadataToString(md))
|
fmt.Fprintf(h.Out, "\nResponse headers received:\n%s\n", MetadataToString(md))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (h *DefaultEventHandler) OnReceiveResponse(resp proto.Message) {
|
func (h *DefaultEventHandler) OnReceiveResponse(resp proto.Message) {
|
||||||
h.NumResponses++
|
h.NumResponses++
|
||||||
if h.verbose {
|
if h.VerbosityLevel > 1 {
|
||||||
fmt.Fprint(h.out, "\nResponse contents:\n")
|
fmt.Fprintf(h.Out, "\nEstimated response size: %d bytes\n", proto.Size(resp))
|
||||||
}
|
}
|
||||||
if respStr, err := h.formatter(resp); err != nil {
|
if h.VerbosityLevel > 0 {
|
||||||
fmt.Fprintf(h.out, "Failed to format response message %d: %v\n", h.NumResponses, err)
|
fmt.Fprint(h.Out, "\nResponse contents:\n")
|
||||||
|
}
|
||||||
|
if respStr, err := h.Formatter(resp); err != nil {
|
||||||
|
fmt.Fprintf(h.Out, "Failed to format response message %d: %v\n", h.NumResponses, err)
|
||||||
} else {
|
} else {
|
||||||
fmt.Fprintln(h.out, respStr)
|
fmt.Fprintln(h.Out, respStr)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (h *DefaultEventHandler) OnReceiveTrailers(stat *status.Status, md metadata.MD) {
|
func (h *DefaultEventHandler) OnReceiveTrailers(stat *status.Status, md metadata.MD) {
|
||||||
h.Status = stat
|
h.Status = stat
|
||||||
if h.verbose {
|
if h.VerbosityLevel > 0 {
|
||||||
fmt.Fprintf(h.out, "\nResponse trailers received:\n%s\n", MetadataToString(md))
|
fmt.Fprintf(h.Out, "\nResponse trailers received:\n%s\n", MetadataToString(md))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -7,15 +7,15 @@ import (
|
|||||||
"strings"
|
"strings"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"github.com/golang/protobuf/jsonpb"
|
"github.com/golang/protobuf/jsonpb" //lint:ignore SA1019 we have to import this because it appears in exported API
|
||||||
"github.com/golang/protobuf/proto"
|
"github.com/golang/protobuf/proto" //lint:ignore SA1019 we have to import this because it appears in exported API
|
||||||
"github.com/golang/protobuf/ptypes/struct"
|
|
||||||
"github.com/jhump/protoreflect/desc"
|
"github.com/jhump/protoreflect/desc"
|
||||||
"google.golang.org/grpc/metadata"
|
"google.golang.org/grpc/metadata"
|
||||||
|
"google.golang.org/protobuf/types/known/structpb"
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestRequestParser(t *testing.T) {
|
func TestRequestParser(t *testing.T) {
|
||||||
source, err := DescriptorSourceFromProtoSets("testing/example.protoset")
|
source, err := DescriptorSourceFromProtoSets("internal/testing/example.protoset")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatalf("failed to create descriptor source: %v", err)
|
t.Fatalf("failed to create descriptor source: %v", err)
|
||||||
}
|
}
|
||||||
@@ -69,7 +69,7 @@ func TestRequestParser(t *testing.T) {
|
|||||||
|
|
||||||
for i, tc := range testCases {
|
for i, tc := range testCases {
|
||||||
name := fmt.Sprintf("#%d, %s, %d message(s)", i+1, tc.format, len(tc.expectedOutput))
|
name := fmt.Sprintf("#%d, %s, %d message(s)", i+1, tc.format, len(tc.expectedOutput))
|
||||||
rf, _, err := RequestParserAndFormatterFor(tc.format, source, false, false, strings.NewReader(tc.input))
|
rf, _, err := RequestParserAndFormatter(tc.format, source, strings.NewReader(tc.input), FormatOptions{})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Errorf("Failed to create parser and formatter: %v", err)
|
t.Errorf("Failed to create parser and formatter: %v", err)
|
||||||
continue
|
continue
|
||||||
@@ -97,7 +97,7 @@ func TestRequestParser(t *testing.T) {
|
|||||||
// Handler prints response data (and headers/trailers in verbose mode).
|
// Handler prints response data (and headers/trailers in verbose mode).
|
||||||
// This verifies that we get the right output in both JSON and proto text modes.
|
// This verifies that we get the right output in both JSON and proto text modes.
|
||||||
func TestHandler(t *testing.T) {
|
func TestHandler(t *testing.T) {
|
||||||
source, err := DescriptorSourceFromProtoSets("testing/example.protoset")
|
source, err := DescriptorSourceFromProtoSets("internal/testing/example.protoset")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatalf("failed to create descriptor source: %v", err)
|
t.Fatalf("failed to create descriptor source: %v", err)
|
||||||
}
|
}
|
||||||
@@ -120,20 +120,26 @@ func TestHandler(t *testing.T) {
|
|||||||
|
|
||||||
for _, format := range []Format{FormatJSON, FormatText} {
|
for _, format := range []Format{FormatJSON, FormatText} {
|
||||||
for _, numMessages := range []int{1, 3} {
|
for _, numMessages := range []int{1, 3} {
|
||||||
for _, verbose := range []bool{true, false} {
|
for verbosityLevel := 0; verbosityLevel <= 2; verbosityLevel++ {
|
||||||
name := fmt.Sprintf("%s, %d message(s)", format, numMessages)
|
name := fmt.Sprintf("%s, %d message(s)", format, numMessages)
|
||||||
if verbose {
|
if verbosityLevel > 0 {
|
||||||
name += ", verbose"
|
name += fmt.Sprintf(", verbosityLevel=%d", verbosityLevel)
|
||||||
}
|
}
|
||||||
|
|
||||||
_, formatter, err := RequestParserAndFormatterFor(format, source, false, !verbose, nil)
|
verbose := verbosityLevel > 0
|
||||||
|
|
||||||
|
_, formatter, err := RequestParserAndFormatter(format, source, nil, FormatOptions{IncludeTextSeparator: !verbose})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Errorf("Failed to create parser and formatter: %v", err)
|
t.Errorf("Failed to create parser and formatter: %v", err)
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
var buf bytes.Buffer
|
var buf bytes.Buffer
|
||||||
h := NewDefaultEventHandler(&buf, source, formatter, verbose)
|
h := &DefaultEventHandler{
|
||||||
|
Out: &buf,
|
||||||
|
Formatter: formatter,
|
||||||
|
VerbosityLevel: verbosityLevel,
|
||||||
|
}
|
||||||
|
|
||||||
h.OnResolveMethod(md)
|
h.OnResolveMethod(md)
|
||||||
h.OnSendHeaders(reqHeaders)
|
h.OnSendHeaders(reqHeaders)
|
||||||
@@ -148,6 +154,9 @@ func TestHandler(t *testing.T) {
|
|||||||
expectedOutput += verbosePrefix
|
expectedOutput += verbosePrefix
|
||||||
}
|
}
|
||||||
for i := 0; i < numMessages; i++ {
|
for i := 0; i < numMessages; i++ {
|
||||||
|
if verbosityLevel > 1 {
|
||||||
|
expectedOutput += verboseResponseSize
|
||||||
|
}
|
||||||
if verbose {
|
if verbose {
|
||||||
expectedOutput += verboseResponseHeader
|
expectedOutput += verboseResponseHeader
|
||||||
}
|
}
|
||||||
@@ -226,6 +235,9 @@ Response trailers received:
|
|||||||
a: 1
|
a: 1
|
||||||
b: 2
|
b: 2
|
||||||
c: 3
|
c: 3
|
||||||
|
`
|
||||||
|
verboseResponseSize = `
|
||||||
|
Estimated response size: 100 bytes
|
||||||
`
|
`
|
||||||
verboseResponseHeader = `
|
verboseResponseHeader = `
|
||||||
Response contents:
|
Response contents:
|
||||||
|
|||||||
16
go.mod
16
go.mod
@@ -1,12 +1,16 @@
|
|||||||
module github.com/fullstorydev/grpcurl
|
module github.com/fullstorydev/grpcurl
|
||||||
|
|
||||||
|
go 1.13
|
||||||
|
|
||||||
require (
|
require (
|
||||||
github.com/golang/protobuf v1.3.5
|
github.com/golang/protobuf v1.4.2
|
||||||
github.com/gordonklaus/ineffassign v0.0.0-20200309095847-7953dde2c7bf // indirect
|
github.com/gordonklaus/ineffassign v0.0.0-20200309095847-7953dde2c7bf // indirect
|
||||||
github.com/goreleaser/goreleaser v0.134.0 // indirect
|
github.com/goreleaser/goreleaser v0.134.0 // indirect
|
||||||
github.com/jhump/protoreflect v1.6.1
|
github.com/jhump/protoreflect v1.8.2
|
||||||
github.com/nishanths/predeclared v0.0.0-20190419143655-18a43bb90ffc // indirect
|
github.com/nishanths/predeclared v0.0.0-20200524104333-86fad755b4d3 // indirect
|
||||||
golang.org/x/net v0.0.0-20200226121028-0de0cce0169b
|
golang.org/x/net v0.0.0-20200625001655-4c5254603344
|
||||||
google.golang.org/grpc v1.30.0
|
google.golang.org/api v0.29.0 // indirect
|
||||||
honnef.co/go/tools v0.0.1-2020.1.3 // indirect
|
google.golang.org/grpc v1.37.0
|
||||||
|
google.golang.org/protobuf v1.25.1-0.20200805231151-a709e31e5d12
|
||||||
|
honnef.co/go/tools v0.0.1-2020.1.4 // indirect
|
||||||
)
|
)
|
||||||
|
|||||||
176
go.sum
176
go.sum
@@ -5,9 +5,28 @@ cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMT
|
|||||||
cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU=
|
cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU=
|
||||||
cloud.google.com/go v0.39.0/go.mod h1:rVLT6fkc8chs9sfPtFc1SBH6em7n+ZoXaG+87tDISts=
|
cloud.google.com/go v0.39.0/go.mod h1:rVLT6fkc8chs9sfPtFc1SBH6em7n+ZoXaG+87tDISts=
|
||||||
cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU=
|
cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU=
|
||||||
|
cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY=
|
||||||
cloud.google.com/go v0.44.3 h1:0sMegbmn/8uTwpNkB0q9cLEpZ2W5a6kl+wtBQgPWBJQ=
|
cloud.google.com/go v0.44.3 h1:0sMegbmn/8uTwpNkB0q9cLEpZ2W5a6kl+wtBQgPWBJQ=
|
||||||
cloud.google.com/go v0.44.3/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY=
|
cloud.google.com/go v0.44.3/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY=
|
||||||
|
cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc=
|
||||||
|
cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0=
|
||||||
|
cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To=
|
||||||
|
cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4=
|
||||||
|
cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M=
|
||||||
|
cloud.google.com/go v0.56.0 h1:WRz29PgAsVEyPSDHyk+0fpEkwEFyfhHn+JbksT6gIL4=
|
||||||
|
cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk=
|
||||||
|
cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o=
|
||||||
|
cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE=
|
||||||
|
cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc=
|
||||||
cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE=
|
cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE=
|
||||||
|
cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk=
|
||||||
|
cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I=
|
||||||
|
cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw=
|
||||||
|
cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA=
|
||||||
|
cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw=
|
||||||
|
cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos=
|
||||||
|
cloud.google.com/go/storage v1.6.0 h1:UDpwYIwla4jHGzZJaEJYx1tOejbgSoNqsAfHAUYe2r8=
|
||||||
|
cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk=
|
||||||
code.gitea.io/sdk/gitea v0.11.3 h1:CdI3J82Mqn0mElyEKa5DUSr3Wi2R+qm/6uVtCkSSqSM=
|
code.gitea.io/sdk/gitea v0.11.3 h1:CdI3J82Mqn0mElyEKa5DUSr3Wi2R+qm/6uVtCkSSqSM=
|
||||||
code.gitea.io/sdk/gitea v0.11.3/go.mod h1:z3uwDV/b9Ls47NGukYM9XhnHtqPh/J+t40lsUrR6JDY=
|
code.gitea.io/sdk/gitea v0.11.3/go.mod h1:z3uwDV/b9Ls47NGukYM9XhnHtqPh/J+t40lsUrR6JDY=
|
||||||
contrib.go.opencensus.io/exporter/aws v0.0.0-20181029163544-2befc13012d0/go.mod h1:uu1P0UCM/6RbsMrgPa98ll8ZcHM858i/AD06a9aLRCA=
|
contrib.go.opencensus.io/exporter/aws v0.0.0-20181029163544-2befc13012d0/go.mod h1:uu1P0UCM/6RbsMrgPa98ll8ZcHM858i/AD06a9aLRCA=
|
||||||
@@ -16,6 +35,7 @@ contrib.go.opencensus.io/exporter/ocagent v0.5.0/go.mod h1:ImxhfLRpxoYiSq891pBrL
|
|||||||
contrib.go.opencensus.io/exporter/stackdriver v0.12.1/go.mod h1:iwB6wGarfphGGe/e5CWqyUk/cLzKnWsOKPVW3no6OTw=
|
contrib.go.opencensus.io/exporter/stackdriver v0.12.1/go.mod h1:iwB6wGarfphGGe/e5CWqyUk/cLzKnWsOKPVW3no6OTw=
|
||||||
contrib.go.opencensus.io/integrations/ocsql v0.1.4/go.mod h1:8DsSdjz3F+APR+0z0WkU1aRorQCFfRxvqjUUPMbF3fE=
|
contrib.go.opencensus.io/integrations/ocsql v0.1.4/go.mod h1:8DsSdjz3F+APR+0z0WkU1aRorQCFfRxvqjUUPMbF3fE=
|
||||||
contrib.go.opencensus.io/resource v0.1.1/go.mod h1:F361eGI91LCmW1I/Saf+rX0+OFcigGlFvXwEGEnkRLA=
|
contrib.go.opencensus.io/resource v0.1.1/go.mod h1:F361eGI91LCmW1I/Saf+rX0+OFcigGlFvXwEGEnkRLA=
|
||||||
|
dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=
|
||||||
github.com/Azure/azure-amqp-common-go/v2 v2.1.0/go.mod h1:R8rea+gJRuJR6QxTir/XuEd+YuKoUiazDC/N96FiDEU=
|
github.com/Azure/azure-amqp-common-go/v2 v2.1.0/go.mod h1:R8rea+gJRuJR6QxTir/XuEd+YuKoUiazDC/N96FiDEU=
|
||||||
github.com/Azure/azure-pipeline-go v0.2.1 h1:OLBdZJ3yvOn2MezlWvbrBMTEUQC72zAftRZOMdj5HYo=
|
github.com/Azure/azure-pipeline-go v0.2.1 h1:OLBdZJ3yvOn2MezlWvbrBMTEUQC72zAftRZOMdj5HYo=
|
||||||
github.com/Azure/azure-pipeline-go v0.2.1/go.mod h1:UGSo8XybXnIGZ3epmeBw7Jdz+HiUVpqIlpz/HKHylF4=
|
github.com/Azure/azure-pipeline-go v0.2.1/go.mod h1:UGSo8XybXnIGZ3epmeBw7Jdz+HiUVpqIlpz/HKHylF4=
|
||||||
@@ -67,9 +87,14 @@ github.com/census-instrumentation/opencensus-proto v0.2.0/go.mod h1:f6KPmirojxKA
|
|||||||
github.com/census-instrumentation/opencensus-proto v0.2.1 h1:glEXhBS5PSLLv4IXzLA5yPRVX4bilULVyxxbrfOtDAk=
|
github.com/census-instrumentation/opencensus-proto v0.2.1 h1:glEXhBS5PSLLv4IXzLA5yPRVX4bilULVyxxbrfOtDAk=
|
||||||
github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
|
github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
|
||||||
github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc=
|
github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc=
|
||||||
|
github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI=
|
||||||
|
github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI=
|
||||||
|
github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=
|
||||||
github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
|
github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
|
||||||
github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f h1:WBZRG4aNOuI15bLRrCgN8fCq8E5Xuty6jGbmSNEvSsU=
|
github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f h1:WBZRG4aNOuI15bLRrCgN8fCq8E5Xuty6jGbmSNEvSsU=
|
||||||
github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=
|
github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=
|
||||||
|
github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403 h1:cqQfy1jclcSy/FwLjemeg3SR1yaINm74aQyupQ0Bl8M=
|
||||||
|
github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=
|
||||||
github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk=
|
github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk=
|
||||||
github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE=
|
github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE=
|
||||||
github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk=
|
github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk=
|
||||||
@@ -85,8 +110,11 @@ github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8
|
|||||||
github.com/dimchansky/utfbom v1.1.0 h1:FcM3g+nofKgUteL8dm/UpdRXNC9KmADgTpLKsu0TRo4=
|
github.com/dimchansky/utfbom v1.1.0 h1:FcM3g+nofKgUteL8dm/UpdRXNC9KmADgTpLKsu0TRo4=
|
||||||
github.com/dimchansky/utfbom v1.1.0/go.mod h1:rO41eb7gLfo8SF1jd9F8HplJm1Fewwi4mQvIirEdv+8=
|
github.com/dimchansky/utfbom v1.1.0/go.mod h1:rO41eb7gLfo8SF1jd9F8HplJm1Fewwi4mQvIirEdv+8=
|
||||||
github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
|
github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
|
||||||
|
github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
|
||||||
github.com/envoyproxy/go-control-plane v0.9.4 h1:rEvIZUSZ3fx39WIi3JkQqQBitGwpELBIYWeBVh6wn+E=
|
github.com/envoyproxy/go-control-plane v0.9.4 h1:rEvIZUSZ3fx39WIi3JkQqQBitGwpELBIYWeBVh6wn+E=
|
||||||
github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98=
|
github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98=
|
||||||
|
github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d h1:QyzYnTnPE15SQyUeqU6qLbWxMkwyAyu+vGksa0b7j00=
|
||||||
|
github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=
|
||||||
github.com/envoyproxy/protoc-gen-validate v0.1.0 h1:EQciDnbrYxy13PgWoY8AqoxGiPrpgBZ1R8UNe3ddc+A=
|
github.com/envoyproxy/protoc-gen-validate v0.1.0 h1:EQciDnbrYxy13PgWoY8AqoxGiPrpgBZ1R8UNe3ddc+A=
|
||||||
github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
|
github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
|
||||||
github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=
|
github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=
|
||||||
@@ -96,6 +124,9 @@ github.com/fortytw2/leaktest v1.2.0/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHqu
|
|||||||
github.com/fortytw2/leaktest v1.3.0/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHquHwclZch5g=
|
github.com/fortytw2/leaktest v1.3.0/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHquHwclZch5g=
|
||||||
github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
|
github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
|
||||||
github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
|
github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
|
||||||
|
github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=
|
||||||
|
github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
|
||||||
|
github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
|
||||||
github.com/go-ini/ini v1.25.4/go.mod h1:ByCAeIL28uOIIG0E3PJtZPDL8WnHpFKFOtgjp+3Ies8=
|
github.com/go-ini/ini v1.25.4/go.mod h1:ByCAeIL28uOIIG0E3PJtZPDL8WnHpFKFOtgjp+3Ies8=
|
||||||
github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
|
github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
|
||||||
github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE=
|
github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE=
|
||||||
@@ -108,15 +139,28 @@ github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfU
|
|||||||
github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/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 h1:ZgQEtGgCBiWRM39fZuwSd1LwSqqSW0hOdXCYYDX0R3I=
|
github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6 h1:ZgQEtGgCBiWRM39fZuwSd1LwSqqSW0hOdXCYYDX0R3I=
|
||||||
github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
|
github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
|
||||||
|
github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
|
||||||
|
github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e h1:1r7pUrabqp18hOBcwBwiTsbnFeTZHV9eER/QT5JVZxY=
|
||||||
|
github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
|
||||||
github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
|
github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
|
||||||
github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
|
github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
|
||||||
github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y=
|
github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y=
|
||||||
|
github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=
|
||||||
|
github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=
|
||||||
github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
|
github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
|
||||||
github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
|
github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
|
||||||
github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
|
github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
|
||||||
github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=
|
github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=
|
||||||
github.com/golang/protobuf v1.3.5 h1:F768QJ1E9tib+q5Sc8MkdJi1RxLTbRcTf8LJV56aRls=
|
github.com/golang/protobuf v1.3.5 h1:F768QJ1E9tib+q5Sc8MkdJi1RxLTbRcTf8LJV56aRls=
|
||||||
github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk=
|
github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk=
|
||||||
|
github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=
|
||||||
|
github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=
|
||||||
|
github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=
|
||||||
|
github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=
|
||||||
|
github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=
|
||||||
|
github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=
|
||||||
|
github.com/golang/protobuf v1.4.2 h1:+Z5KGCizgyZCbGh1KZqA0fcLLkwbsjIzS4aV2v7wJX0=
|
||||||
|
github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
|
||||||
github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
|
github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
|
||||||
github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
|
github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
|
||||||
github.com/google/go-cmp v0.2.0 h1:+dTQ8DZQJz0Mb/HjFlkptS1FeQ4cWSnN941F8aEG4SQ=
|
github.com/google/go-cmp v0.2.0 h1:+dTQ8DZQJz0Mb/HjFlkptS1FeQ4cWSnN941F8aEG4SQ=
|
||||||
@@ -126,6 +170,8 @@ github.com/google/go-cmp v0.3.1 h1:Xye71clBPdm5HgqGwUkwhbynsUJZhDbS20FvLhQ2izg=
|
|||||||
github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
|
github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
|
||||||
github.com/google/go-cmp v0.4.0 h1:xsAVV57WRhGj6kEIi8ReJzQlHHqcBYCElAvkovg3B/4=
|
github.com/google/go-cmp v0.4.0 h1:xsAVV57WRhGj6kEIi8ReJzQlHHqcBYCElAvkovg3B/4=
|
||||||
github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
||||||
|
github.com/google/go-cmp v0.5.0 h1:/QaMHBdZ26BB3SSst0Iwl10Epc+xhTquomWX0oZEB6w=
|
||||||
|
github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
||||||
github.com/google/go-github/v28 v28.1.1 h1:kORf5ekX5qwXO2mGzXXOjMe/g6ap8ahVe0sBEulhSxo=
|
github.com/google/go-github/v28 v28.1.1 h1:kORf5ekX5qwXO2mGzXXOjMe/g6ap8ahVe0sBEulhSxo=
|
||||||
github.com/google/go-github/v28 v28.1.1/go.mod h1:bsqJWQX05omyWVmc00nEUql9mhQyv38lDZ8kPZcQVoM=
|
github.com/google/go-github/v28 v28.1.1/go.mod h1:bsqJWQX05omyWVmc00nEUql9mhQyv38lDZ8kPZcQVoM=
|
||||||
github.com/google/go-querystring v1.0.0 h1:Xkwi/a1rcvNg1PPYe5vI8GbeBY/jrVuDX5ASuANWTrk=
|
github.com/google/go-querystring v1.0.0 h1:Xkwi/a1rcvNg1PPYe5vI8GbeBY/jrVuDX5ASuANWTrk=
|
||||||
@@ -136,12 +182,17 @@ github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXi
|
|||||||
github.com/google/martian v2.1.1-0.20190517191504-25dcb96d9e51+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs=
|
github.com/google/martian v2.1.1-0.20190517191504-25dcb96d9e51+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs=
|
||||||
github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=
|
github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=
|
||||||
github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=
|
github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=
|
||||||
|
github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
|
||||||
|
github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
|
||||||
|
github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
|
||||||
github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=
|
github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=
|
||||||
github.com/google/rpmpack v0.0.0-20191226140753-aa36bfddb3a0 h1:BW6OvS3kpT5UEPbCZ+KyX/OB4Ks9/MNMhWjqPPkZxsE=
|
github.com/google/rpmpack v0.0.0-20191226140753-aa36bfddb3a0 h1:BW6OvS3kpT5UEPbCZ+KyX/OB4Ks9/MNMhWjqPPkZxsE=
|
||||||
github.com/google/rpmpack v0.0.0-20191226140753-aa36bfddb3a0/go.mod h1:RaTPr0KUf2K7fnZYLNDrr8rxAamWs3iNywJLtQ2AzBg=
|
github.com/google/rpmpack v0.0.0-20191226140753-aa36bfddb3a0/go.mod h1:RaTPr0KUf2K7fnZYLNDrr8rxAamWs3iNywJLtQ2AzBg=
|
||||||
github.com/google/subcommands v1.0.1/go.mod h1:ZjhPrFU+Olkh9WazFPsl27BQ4UPiG37m3yTrtFlrHVk=
|
github.com/google/subcommands v1.0.1/go.mod h1:ZjhPrFU+Olkh9WazFPsl27BQ4UPiG37m3yTrtFlrHVk=
|
||||||
github.com/google/uuid v1.1.1 h1:Gkbcsh/GbpXz7lPftLA3P6TYMwjCLYm83jiFQZF/3gY=
|
github.com/google/uuid v1.1.1 h1:Gkbcsh/GbpXz7lPftLA3P6TYMwjCLYm83jiFQZF/3gY=
|
||||||
github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
|
github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
|
||||||
|
github.com/google/uuid v1.1.2 h1:EVhdT+1Kseyi1/pUmXKaFxYsDNy9RQYkMWRH68J/W7Y=
|
||||||
|
github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
|
||||||
github.com/google/wire v0.3.0 h1:imGQZGEVEHpje5056+K+cgdO72p0LQv2xIIFXNGUf60=
|
github.com/google/wire v0.3.0 h1:imGQZGEVEHpje5056+K+cgdO72p0LQv2xIIFXNGUf60=
|
||||||
github.com/google/wire v0.3.0/go.mod h1:i1DMg/Lu8Sz5yYl25iOdmc5CT5qusaa+zmRWs16741s=
|
github.com/google/wire v0.3.0/go.mod h1:i1DMg/Lu8Sz5yYl25iOdmc5CT5qusaa+zmRWs16741s=
|
||||||
github.com/googleapis/gax-go v2.0.2+incompatible h1:silFMLAnr330+NRuag/VjIGF7TLp/LBrV2CJKFLWEww=
|
github.com/googleapis/gax-go v2.0.2+incompatible h1:silFMLAnr330+NRuag/VjIGF7TLp/LBrV2CJKFLWEww=
|
||||||
@@ -173,6 +224,7 @@ github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ
|
|||||||
github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
|
github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
|
||||||
github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ=
|
github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ=
|
||||||
github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=
|
github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=
|
||||||
|
github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=
|
||||||
github.com/imdario/mergo v0.3.8/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA=
|
github.com/imdario/mergo v0.3.8/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA=
|
||||||
github.com/imdario/mergo v0.3.9 h1:UauaLniWCFHWd+Jp9oCEkTBj8VO/9DKg3PV3VCNMDIg=
|
github.com/imdario/mergo v0.3.9 h1:UauaLniWCFHWd+Jp9oCEkTBj8VO/9DKg3PV3VCNMDIg=
|
||||||
github.com/imdario/mergo v0.3.9/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA=
|
github.com/imdario/mergo v0.3.9/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA=
|
||||||
@@ -181,6 +233,8 @@ github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANyt
|
|||||||
github.com/jarcoal/httpmock v1.0.5/go.mod h1:ATjnClrvW/3tijVmpL/va5Z3aAyGvqU3gCT8nX0Txik=
|
github.com/jarcoal/httpmock v1.0.5/go.mod h1:ATjnClrvW/3tijVmpL/va5Z3aAyGvqU3gCT8nX0Txik=
|
||||||
github.com/jhump/protoreflect v1.6.1 h1:4/2yi5LyDPP7nN+Hiird1SAJ6YoxUm13/oxHGRnbPd8=
|
github.com/jhump/protoreflect v1.6.1 h1:4/2yi5LyDPP7nN+Hiird1SAJ6YoxUm13/oxHGRnbPd8=
|
||||||
github.com/jhump/protoreflect v1.6.1/go.mod h1:RZQ/lnuN+zqeRVpQigTwO6o0AJUkxbnSnpuG7toUTG4=
|
github.com/jhump/protoreflect v1.6.1/go.mod h1:RZQ/lnuN+zqeRVpQigTwO6o0AJUkxbnSnpuG7toUTG4=
|
||||||
|
github.com/jhump/protoreflect v1.8.2 h1:k2xE7wcUomeqwY0LDCYA16y4WWfyTcMx5mKhk0d4ua0=
|
||||||
|
github.com/jhump/protoreflect v1.8.2/go.mod h1:7GcYQDdMU/O/BBrl/cX6PNHpXh6cenjd8pneu5yW7Tg=
|
||||||
github.com/jmespath/go-jmespath v0.0.0-20160202185014-0b12d6b521d8/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k=
|
github.com/jmespath/go-jmespath v0.0.0-20160202185014-0b12d6b521d8/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k=
|
||||||
github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af h1:pmfjZENx5imkbgOkpRUYLnmbU7UEFbjtDA2hxJ1ichM=
|
github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af h1:pmfjZENx5imkbgOkpRUYLnmbU7UEFbjtDA2hxJ1ichM=
|
||||||
github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k=
|
github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k=
|
||||||
@@ -188,6 +242,7 @@ github.com/joho/godotenv v1.3.0/go.mod h1:7hK45KPybAkOC6peb+G5yklZfMxEjkZhHbwpqx
|
|||||||
github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo=
|
github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo=
|
||||||
github.com/jpillora/backoff v0.0.0-20180909062703-3050d21c67d7/go.mod h1:2iMrUgbbvHEiQClaW2NsSzMyGHqN+rDFqY705q49KG0=
|
github.com/jpillora/backoff v0.0.0-20180909062703-3050d21c67d7/go.mod h1:2iMrUgbbvHEiQClaW2NsSzMyGHqN+rDFqY705q49KG0=
|
||||||
github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU=
|
github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU=
|
||||||
|
github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk=
|
||||||
github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=
|
github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=
|
||||||
github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q=
|
github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q=
|
||||||
github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
|
github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
|
||||||
@@ -220,6 +275,8 @@ github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh
|
|||||||
github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
|
github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
|
||||||
github.com/nishanths/predeclared v0.0.0-20190419143655-18a43bb90ffc h1:0NtlnvxTh8fQsQm55+bkvrqgn0zcv+M4TF8otNCuYl4=
|
github.com/nishanths/predeclared v0.0.0-20190419143655-18a43bb90ffc h1:0NtlnvxTh8fQsQm55+bkvrqgn0zcv+M4TF8otNCuYl4=
|
||||||
github.com/nishanths/predeclared v0.0.0-20190419143655-18a43bb90ffc/go.mod h1:62PewwiQTlm/7Rj+cxVYqZvDIUc+JjZq6GHAC1fsObQ=
|
github.com/nishanths/predeclared v0.0.0-20190419143655-18a43bb90ffc/go.mod h1:62PewwiQTlm/7Rj+cxVYqZvDIUc+JjZq6GHAC1fsObQ=
|
||||||
|
github.com/nishanths/predeclared v0.0.0-20200524104333-86fad755b4d3 h1:3f0nxAmdj/VoCGN/ijdMy7bj6SBagaqYg1B0hu8clMA=
|
||||||
|
github.com/nishanths/predeclared v0.0.0-20200524104333-86fad755b4d3/go.mod h1:nt3d53pc1VYcphSCIaYAJtnPYnr3Zyn8fMq2wvPGPso=
|
||||||
github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U=
|
github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U=
|
||||||
github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
|
github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
|
||||||
github.com/onsi/gomega v1.5.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY=
|
github.com/onsi/gomega v1.5.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY=
|
||||||
@@ -282,13 +339,17 @@ github.com/xanzy/go-gitlab v0.31.0/go.mod h1:sPLojNBn68fMUWSxIJtdVVIP8uSBYqesTfD
|
|||||||
github.com/xi2/xz v0.0.0-20171230120015-48954b6210f8/go.mod h1:HUYIGzjTL3rfEspMxjDjgmT5uz5wzYJKVo23qUhYTos=
|
github.com/xi2/xz v0.0.0-20171230120015-48954b6210f8/go.mod h1:HUYIGzjTL3rfEspMxjDjgmT5uz5wzYJKVo23qUhYTos=
|
||||||
github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU=
|
github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU=
|
||||||
github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q=
|
github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q=
|
||||||
|
github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
|
||||||
github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
|
github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
|
||||||
|
github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
|
||||||
go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU=
|
go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU=
|
||||||
go.opencensus.io v0.15.0/go.mod h1:UffZAU+4sDEINUGP/B7UfBBkq4fqLu9zXAX7ke6CHW0=
|
go.opencensus.io v0.15.0/go.mod h1:UffZAU+4sDEINUGP/B7UfBBkq4fqLu9zXAX7ke6CHW0=
|
||||||
go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU=
|
go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU=
|
||||||
go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8=
|
go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8=
|
||||||
go.opencensus.io v0.22.2 h1:75k/FF0Q2YM8QYo07VPddOLBslDt1MZOdEslOHvmzAs=
|
go.opencensus.io v0.22.2 h1:75k/FF0Q2YM8QYo07VPddOLBslDt1MZOdEslOHvmzAs=
|
||||||
go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
|
go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
|
||||||
|
go.opencensus.io v0.22.3 h1:8sGtKOrtQqkN1bp2AtX+misvLIlOmsEsNd+9NIcPEm8=
|
||||||
|
go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
|
||||||
go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE=
|
go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE=
|
||||||
go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0=
|
go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0=
|
||||||
go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q=
|
go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q=
|
||||||
@@ -302,17 +363,40 @@ golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8U
|
|||||||
golang.org/x/crypto v0.0.0-20191002192127-34f69633bfdc/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
golang.org/x/crypto v0.0.0-20191002192127-34f69633bfdc/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
||||||
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550 h1:ObdrDkeb4kJdCP557AjRjq69pTHfNouLtWZG7j9rPN8=
|
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550 h1:ObdrDkeb4kJdCP557AjRjq69pTHfNouLtWZG7j9rPN8=
|
||||||
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
||||||
|
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9 h1:psW17arqaxU48Z5kZ0CQnkZWQJsqcURM6tKiBApRjXI=
|
||||||
|
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
|
||||||
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
|
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
|
||||||
|
golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
|
||||||
golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=
|
golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=
|
||||||
|
golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek=
|
||||||
|
golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY=
|
||||||
|
golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=
|
||||||
|
golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=
|
||||||
|
golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=
|
||||||
|
golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM=
|
||||||
|
golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU=
|
||||||
golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=
|
golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=
|
||||||
|
golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
|
||||||
golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
|
golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
|
||||||
golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=
|
golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=
|
||||||
golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
|
golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
|
||||||
golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
|
golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
|
||||||
golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
|
golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
|
||||||
|
golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
|
||||||
|
golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
|
||||||
|
golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs=
|
||||||
|
golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=
|
||||||
|
golang.org/x/lint v0.0.0-20200302205851-738671d3881b h1:Wh+f8QHJXR411sJR8/vRBTZ7YapZaRvUcLFFJhusH0k=
|
||||||
|
golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=
|
||||||
golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE=
|
golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE=
|
||||||
|
golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o=
|
||||||
golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=
|
golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=
|
||||||
|
golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY=
|
||||||
|
golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=
|
||||||
|
golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=
|
||||||
golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
|
golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
|
||||||
|
golang.org/x/mod v0.3.0 h1:RM4zey1++hCTbCVQfnWeKs9/IEsaBLA8vTkd0WVtmH4=
|
||||||
|
golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
|
||||||
golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||||
golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||||
golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||||
@@ -329,16 +413,25 @@ golang.org/x/net v0.0.0-20190522155817-f3200d17e092/go.mod h1:HSz+uSET+XFnRR8LxR
|
|||||||
golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks=
|
golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks=
|
||||||
golang.org/x/net v0.0.0-20190619014844-b5b0513f8c1b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
golang.org/x/net v0.0.0-20190619014844-b5b0513f8c1b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||||
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||||
|
golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||||
golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||||
|
golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||||
golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||||
|
golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||||
|
golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||||
golang.org/x/net v0.0.0-20200226121028-0de0cce0169b h1:0mm1VjtFUOIlE1SbDlwjYaDxZVDP2S5ou6y0gSgXHu8=
|
golang.org/x/net v0.0.0-20200226121028-0de0cce0169b h1:0mm1VjtFUOIlE1SbDlwjYaDxZVDP2S5ou6y0gSgXHu8=
|
||||||
golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||||
|
golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e h1:3G+cUijn7XD+S4eJFddp53Pv7+slrESplyjG25HgL+k=
|
||||||
|
golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
|
||||||
|
golang.org/x/net v0.0.0-20200625001655-4c5254603344 h1:vGXIOMxbNfDTk/aXCmfdLgkrSV+Z2tcbze+pEc3v5W4=
|
||||||
|
golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
|
||||||
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be h1:vEDujvNQGv4jgYKudGeI/+DAX4Jffq6hpD55MmoEvKs=
|
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be h1:vEDujvNQGv4jgYKudGeI/+DAX4Jffq6hpD55MmoEvKs=
|
||||||
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
|
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
|
||||||
golang.org/x/oauth2 v0.0.0-20181106182150-f42d05182288/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
|
golang.org/x/oauth2 v0.0.0-20181106182150-f42d05182288/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
|
||||||
golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
|
golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
|
||||||
golang.org/x/oauth2 v0.0.0-20190402181905-9f3314589c9a/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
|
golang.org/x/oauth2 v0.0.0-20190402181905-9f3314589c9a/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
|
||||||
golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
|
golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
|
||||||
|
golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
|
||||||
golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d h1:TzXSXBo42m9gQenoE3b9BGiEpg5IG2JkU5FkPIawgtw=
|
golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d h1:TzXSXBo42m9gQenoE3b9BGiEpg5IG2JkU5FkPIawgtw=
|
||||||
golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
|
golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
|
||||||
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
@@ -348,6 +441,10 @@ golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJ
|
|||||||
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e h1:vcxGaoTs7kV8m5Np9uUNQin4BrLOthgV7252N8V+FwY=
|
golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e h1:vcxGaoTs7kV8m5Np9uUNQin4BrLOthgV7252N8V+FwY=
|
||||||
golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
|
golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a h1:WXEvlFVvvGxCJLG6REjsT03iWnKLEWinaScsxF2Vm2o=
|
||||||
|
golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
|
golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208 h1:qwRHBd0NqMbJxfbotnDhm2ByMI1Shq4Y6oRJo21SGJA=
|
||||||
|
golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||||
golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||||
golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||||
@@ -363,8 +460,21 @@ golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7w
|
|||||||
golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20190620070143-6f217b454f45/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20190620070143-6f217b454f45/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20191026070338-33540a1f6037 h1:YyJpGZS1sBuBCzLAR1VEpK193GlqGZbnPFnPV/5Rsb4=
|
golang.org/x/sys v0.0.0-20191026070338-33540a1f6037 h1:YyJpGZS1sBuBCzLAR1VEpK193GlqGZbnPFnPV/5Rsb4=
|
||||||
golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/sys v0.0.0-20200331124033-c3d80250170d h1:nc5K6ox/4lTFbMVSL9WRR81ixkcwXThoiF6yf+R9scA=
|
||||||
|
golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
||||||
golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg=
|
golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg=
|
||||||
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
||||||
golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
||||||
@@ -386,11 +496,32 @@ golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBn
|
|||||||
golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
|
golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
|
||||||
golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
|
golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
|
||||||
golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
|
golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
|
||||||
|
golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
|
||||||
golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
|
golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
|
||||||
|
golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
|
||||||
|
golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
|
||||||
|
golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
|
||||||
|
golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
|
||||||
|
golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
|
||||||
golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
|
golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
|
||||||
|
golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
|
||||||
golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
|
golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
|
||||||
|
golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
|
||||||
|
golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
|
||||||
|
golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
|
||||||
|
golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
|
||||||
|
golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
|
||||||
|
golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
|
||||||
|
golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
|
||||||
|
golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
|
||||||
|
golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
|
||||||
|
golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8=
|
||||||
golang.org/x/tools v0.0.0-20200426102838-f3a5411a4c3b h1:zSzQJAznWxAh9fZxiPy2FZo+ZZEYoYFYYDYdOrU7AaM=
|
golang.org/x/tools v0.0.0-20200426102838-f3a5411a4c3b h1:zSzQJAznWxAh9fZxiPy2FZo+ZZEYoYFYYDYdOrU7AaM=
|
||||||
golang.org/x/tools v0.0.0-20200426102838-f3a5411a4c3b/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
|
golang.org/x/tools v0.0.0-20200426102838-f3a5411a4c3b/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
|
||||||
|
golang.org/x/tools v0.0.0-20200522201501-cb1345f3a375 h1:SjQ2+AKWgZLc1xej6WSzL+Dfs5Uyd5xcZH1mGC411IA=
|
||||||
|
golang.org/x/tools v0.0.0-20200522201501-cb1345f3a375/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
|
||||||
|
golang.org/x/tools v0.0.0-20200717024301-6ddee64345a6 h1:nULzSsKgihxFGLnQFv2T7lE5vIhOtg8ZPpJHapEt7o0=
|
||||||
|
golang.org/x/tools v0.0.0-20200717024301-6ddee64345a6/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
|
||||||
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||||
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||||
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4=
|
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4=
|
||||||
@@ -402,6 +533,14 @@ google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E
|
|||||||
google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=
|
google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=
|
||||||
google.golang.org/api v0.9.0 h1:jbyannxz0XFD3zdjgrSUsaJbgpH4eTrkdhRChkHPfO8=
|
google.golang.org/api v0.9.0 h1:jbyannxz0XFD3zdjgrSUsaJbgpH4eTrkdhRChkHPfO8=
|
||||||
google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=
|
google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=
|
||||||
|
google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=
|
||||||
|
google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=
|
||||||
|
google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=
|
||||||
|
google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
|
||||||
|
google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
|
||||||
|
google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
|
||||||
|
google.golang.org/api v0.29.0 h1:BaiDisFir8O4IJxvAabCGGkQ6yCJegNQqSVoYUNAnbk=
|
||||||
|
google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM=
|
||||||
google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
|
google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
|
||||||
google.golang.org/appengine v1.3.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
|
google.golang.org/appengine v1.3.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
|
||||||
google.golang.org/appengine v1.4.0 h1:/wp5JvzpHIxhs/dumFmF7BXTf3Z+dd4uXta4kVyO508=
|
google.golang.org/appengine v1.4.0 h1:/wp5JvzpHIxhs/dumFmF7BXTf3Z+dd4uXta4kVyO508=
|
||||||
@@ -422,6 +561,20 @@ google.golang.org/genproto v0.0.0-20190620144150-6af8c5fc6601/go.mod h1:z3L6/3dT
|
|||||||
google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=
|
google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=
|
||||||
google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55 h1:gSJIx1SDwno+2ElGhA4+qG2zF97qiUzTM+rQ0klBOcE=
|
google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55 h1:gSJIx1SDwno+2ElGhA4+qG2zF97qiUzTM+rQ0klBOcE=
|
||||||
google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=
|
google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=
|
||||||
|
google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8=
|
||||||
|
google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
|
||||||
|
google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
|
||||||
|
google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
|
||||||
|
google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
|
||||||
|
google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
|
||||||
|
google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
|
||||||
|
google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA=
|
||||||
|
google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
|
||||||
|
google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
|
||||||
|
google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940 h1:MRHtG0U6SnaUb+s+LhNE1qt1FQ1wlhqr5E4usBKC0uA=
|
||||||
|
google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
|
||||||
|
google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013 h1:+kGHl1aib/qcwaRi1CbqBZ1rk19r85MNUf8HaBghugY=
|
||||||
|
google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=
|
||||||
google.golang.org/grpc v1.8.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw=
|
google.golang.org/grpc v1.8.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw=
|
||||||
google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
|
google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
|
||||||
google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38=
|
google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38=
|
||||||
@@ -429,10 +582,28 @@ google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ij
|
|||||||
google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM=
|
google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM=
|
||||||
google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=
|
google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=
|
||||||
google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY=
|
google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY=
|
||||||
|
google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
|
||||||
|
google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
|
||||||
|
google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
|
||||||
|
google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60=
|
||||||
google.golang.org/grpc v1.29.0 h1:2pJjwYOdkZ9HlN4sWRYBg9ttH5bCOlsueaM+b/oYjwo=
|
google.golang.org/grpc v1.29.0 h1:2pJjwYOdkZ9HlN4sWRYBg9ttH5bCOlsueaM+b/oYjwo=
|
||||||
google.golang.org/grpc v1.29.0/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk=
|
google.golang.org/grpc v1.29.0/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk=
|
||||||
google.golang.org/grpc v1.30.0 h1:M5a8xTlYTxwMn5ZFkwhRabsygDY5G8TYLyQDBxJNAxE=
|
google.golang.org/grpc v1.30.0 h1:M5a8xTlYTxwMn5ZFkwhRabsygDY5G8TYLyQDBxJNAxE=
|
||||||
google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=
|
google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=
|
||||||
|
google.golang.org/grpc v1.31.0 h1:T7P4R73V3SSDPhH7WW7ATbfViLtmamH0DKrP3f9AuDI=
|
||||||
|
google.golang.org/grpc v1.37.0 h1:uSZWeQJX5j11bIQ4AJoj+McDBo29cY1MCoC1wO3ts+c=
|
||||||
|
google.golang.org/grpc v1.37.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM=
|
||||||
|
google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=
|
||||||
|
google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=
|
||||||
|
google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=
|
||||||
|
google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=
|
||||||
|
google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=
|
||||||
|
google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
|
||||||
|
google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
|
||||||
|
google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
|
||||||
|
google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=
|
||||||
|
google.golang.org/protobuf v1.25.1-0.20200805231151-a709e31e5d12 h1:OwhZOOMuf7leLaSCuxtQ9FW7ui2L2L6UKOtKAUqovUQ=
|
||||||
|
google.golang.org/protobuf v1.25.1-0.20200805231151-a709e31e5d12/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=
|
||||||
gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=
|
gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=
|
||||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||||
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||||
@@ -450,7 +621,12 @@ honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWh
|
|||||||
honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
|
honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
|
||||||
honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
|
honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
|
||||||
honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
|
honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
|
||||||
|
honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg=
|
||||||
honnef.co/go/tools v0.0.1-2020.1.3 h1:sXmLre5bzIR6ypkjXCDI3jHPssRhc8KD/Ome589sc3U=
|
honnef.co/go/tools v0.0.1-2020.1.3 h1:sXmLre5bzIR6ypkjXCDI3jHPssRhc8KD/Ome589sc3U=
|
||||||
honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=
|
honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=
|
||||||
|
honnef.co/go/tools v0.0.1-2020.1.4 h1:UoveltGrhghAA7ePc+e+QYDHXrBps2PqFZiHkGR/xK8=
|
||||||
|
honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=
|
||||||
pack.ag/amqp v0.11.2/go.mod h1:4/cbmt4EJXSKlG6LCfWHoqmN0uFdy5i/+YFz+fTfhV4=
|
pack.ag/amqp v0.11.2/go.mod h1:4/cbmt4EJXSKlG6LCfWHoqmN0uFdy5i/+YFz+fTfhV4=
|
||||||
rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8=
|
rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8=
|
||||||
|
rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0=
|
||||||
|
rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA=
|
||||||
|
|||||||
55
grpcurl.go
55
grpcurl.go
@@ -8,6 +8,7 @@ package grpcurl
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
|
"context"
|
||||||
"crypto/tls"
|
"crypto/tls"
|
||||||
"crypto/x509"
|
"crypto/x509"
|
||||||
"encoding/base64"
|
"encoding/base64"
|
||||||
@@ -20,19 +21,18 @@ import (
|
|||||||
"sort"
|
"sort"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"github.com/golang/protobuf/proto"
|
"github.com/golang/protobuf/proto" //lint:ignore SA1019 we have to import this because it appears in exported API
|
||||||
descpb "github.com/golang/protobuf/protoc-gen-go/descriptor"
|
|
||||||
"github.com/golang/protobuf/ptypes"
|
|
||||||
"github.com/golang/protobuf/ptypes/empty"
|
|
||||||
"github.com/golang/protobuf/ptypes/struct"
|
|
||||||
"github.com/jhump/protoreflect/desc"
|
"github.com/jhump/protoreflect/desc"
|
||||||
"github.com/jhump/protoreflect/desc/protoprint"
|
"github.com/jhump/protoreflect/desc/protoprint"
|
||||||
"github.com/jhump/protoreflect/dynamic"
|
"github.com/jhump/protoreflect/dynamic"
|
||||||
"golang.org/x/net/context"
|
|
||||||
"google.golang.org/grpc"
|
"google.golang.org/grpc"
|
||||||
"google.golang.org/grpc/credentials"
|
"google.golang.org/grpc/credentials"
|
||||||
"google.golang.org/grpc/metadata"
|
"google.golang.org/grpc/metadata"
|
||||||
_ "google.golang.org/grpc/xds"
|
protov2 "google.golang.org/protobuf/proto"
|
||||||
|
"google.golang.org/protobuf/types/descriptorpb"
|
||||||
|
"google.golang.org/protobuf/types/known/anypb"
|
||||||
|
"google.golang.org/protobuf/types/known/emptypb"
|
||||||
|
"google.golang.org/protobuf/types/known/structpb"
|
||||||
)
|
)
|
||||||
|
|
||||||
// ListServices uses the given descriptor source to return a sorted list of fully-qualified
|
// ListServices uses the given descriptor source to return a sorted list of fully-qualified
|
||||||
@@ -406,8 +406,9 @@ func makeTemplate(md *desc.MessageDescriptor, path []*desc.MessageDescriptor) pr
|
|||||||
case "google.protobuf.Any":
|
case "google.protobuf.Any":
|
||||||
// empty type URL is not allowed by JSON representation
|
// empty type URL is not allowed by JSON representation
|
||||||
// so we must give it a dummy type
|
// so we must give it a dummy type
|
||||||
msg, _ := ptypes.MarshalAny(&empty.Empty{})
|
var any anypb.Any
|
||||||
return msg
|
_ = anypb.MarshalFrom(&any, &emptypb.Empty{}, protov2.MarshalOptions{})
|
||||||
|
return &any
|
||||||
case "google.protobuf.Value":
|
case "google.protobuf.Value":
|
||||||
// unset kind is not allowed by JSON representation
|
// unset kind is not allowed by JSON representation
|
||||||
// so we must give it something
|
// so we must give it something
|
||||||
@@ -462,42 +463,42 @@ func makeTemplate(md *desc.MessageDescriptor, path []*desc.MessageDescriptor) pr
|
|||||||
for _, fd := range dm.GetMessageDescriptor().GetFields() {
|
for _, fd := range dm.GetMessageDescriptor().GetFields() {
|
||||||
if fd.IsRepeated() {
|
if fd.IsRepeated() {
|
||||||
switch fd.GetType() {
|
switch fd.GetType() {
|
||||||
case descpb.FieldDescriptorProto_TYPE_FIXED32,
|
case descriptorpb.FieldDescriptorProto_TYPE_FIXED32,
|
||||||
descpb.FieldDescriptorProto_TYPE_UINT32:
|
descriptorpb.FieldDescriptorProto_TYPE_UINT32:
|
||||||
dm.AddRepeatedField(fd, uint32(0))
|
dm.AddRepeatedField(fd, uint32(0))
|
||||||
|
|
||||||
case descpb.FieldDescriptorProto_TYPE_SFIXED32,
|
case descriptorpb.FieldDescriptorProto_TYPE_SFIXED32,
|
||||||
descpb.FieldDescriptorProto_TYPE_SINT32,
|
descriptorpb.FieldDescriptorProto_TYPE_SINT32,
|
||||||
descpb.FieldDescriptorProto_TYPE_INT32,
|
descriptorpb.FieldDescriptorProto_TYPE_INT32,
|
||||||
descpb.FieldDescriptorProto_TYPE_ENUM:
|
descriptorpb.FieldDescriptorProto_TYPE_ENUM:
|
||||||
dm.AddRepeatedField(fd, int32(0))
|
dm.AddRepeatedField(fd, int32(0))
|
||||||
|
|
||||||
case descpb.FieldDescriptorProto_TYPE_FIXED64,
|
case descriptorpb.FieldDescriptorProto_TYPE_FIXED64,
|
||||||
descpb.FieldDescriptorProto_TYPE_UINT64:
|
descriptorpb.FieldDescriptorProto_TYPE_UINT64:
|
||||||
dm.AddRepeatedField(fd, uint64(0))
|
dm.AddRepeatedField(fd, uint64(0))
|
||||||
|
|
||||||
case descpb.FieldDescriptorProto_TYPE_SFIXED64,
|
case descriptorpb.FieldDescriptorProto_TYPE_SFIXED64,
|
||||||
descpb.FieldDescriptorProto_TYPE_SINT64,
|
descriptorpb.FieldDescriptorProto_TYPE_SINT64,
|
||||||
descpb.FieldDescriptorProto_TYPE_INT64:
|
descriptorpb.FieldDescriptorProto_TYPE_INT64:
|
||||||
dm.AddRepeatedField(fd, int64(0))
|
dm.AddRepeatedField(fd, int64(0))
|
||||||
|
|
||||||
case descpb.FieldDescriptorProto_TYPE_STRING:
|
case descriptorpb.FieldDescriptorProto_TYPE_STRING:
|
||||||
dm.AddRepeatedField(fd, "")
|
dm.AddRepeatedField(fd, "")
|
||||||
|
|
||||||
case descpb.FieldDescriptorProto_TYPE_BYTES:
|
case descriptorpb.FieldDescriptorProto_TYPE_BYTES:
|
||||||
dm.AddRepeatedField(fd, []byte{})
|
dm.AddRepeatedField(fd, []byte{})
|
||||||
|
|
||||||
case descpb.FieldDescriptorProto_TYPE_BOOL:
|
case descriptorpb.FieldDescriptorProto_TYPE_BOOL:
|
||||||
dm.AddRepeatedField(fd, false)
|
dm.AddRepeatedField(fd, false)
|
||||||
|
|
||||||
case descpb.FieldDescriptorProto_TYPE_FLOAT:
|
case descriptorpb.FieldDescriptorProto_TYPE_FLOAT:
|
||||||
dm.AddRepeatedField(fd, float32(0))
|
dm.AddRepeatedField(fd, float32(0))
|
||||||
|
|
||||||
case descpb.FieldDescriptorProto_TYPE_DOUBLE:
|
case descriptorpb.FieldDescriptorProto_TYPE_DOUBLE:
|
||||||
dm.AddRepeatedField(fd, float64(0))
|
dm.AddRepeatedField(fd, float64(0))
|
||||||
|
|
||||||
case descpb.FieldDescriptorProto_TYPE_MESSAGE,
|
case descriptorpb.FieldDescriptorProto_TYPE_MESSAGE,
|
||||||
descpb.FieldDescriptorProto_TYPE_GROUP:
|
descriptorpb.FieldDescriptorProto_TYPE_GROUP:
|
||||||
dm.AddRepeatedField(fd, makeTemplate(fd.GetMessageType(), path))
|
dm.AddRepeatedField(fd, makeTemplate(fd.GetMessageType(), path))
|
||||||
}
|
}
|
||||||
} else if fd.GetMessageType() != nil {
|
} else if fd.GetMessageType() != nil {
|
||||||
|
|||||||
149
grpcurl_test.go
149
grpcurl_test.go
@@ -1,6 +1,7 @@
|
|||||||
package grpcurl_test
|
package grpcurl_test
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"context"
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"fmt"
|
"fmt"
|
||||||
"io"
|
"io"
|
||||||
@@ -11,22 +12,20 @@ import (
|
|||||||
"testing"
|
"testing"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/golang/protobuf/jsonpb"
|
"github.com/golang/protobuf/jsonpb" //lint:ignore SA1019 we have to import this because it appears in exported API
|
||||||
"github.com/golang/protobuf/proto"
|
"github.com/golang/protobuf/proto" //lint:ignore SA1019 we have to import this because it appears in exported API
|
||||||
"github.com/jhump/protoreflect/desc"
|
"github.com/jhump/protoreflect/desc"
|
||||||
"github.com/jhump/protoreflect/grpcreflect"
|
"github.com/jhump/protoreflect/grpcreflect"
|
||||||
"golang.org/x/net/context"
|
|
||||||
"google.golang.org/grpc"
|
"google.golang.org/grpc"
|
||||||
"google.golang.org/grpc/codes"
|
"google.golang.org/grpc/codes"
|
||||||
"google.golang.org/grpc/interop/grpc_testing"
|
|
||||||
"google.golang.org/grpc/metadata"
|
"google.golang.org/grpc/metadata"
|
||||||
"google.golang.org/grpc/reflection"
|
"google.golang.org/grpc/reflection"
|
||||||
reflectpb "google.golang.org/grpc/reflection/grpc_reflection_v1alpha"
|
reflectpb "google.golang.org/grpc/reflection/grpc_reflection_v1alpha"
|
||||||
"google.golang.org/grpc/status"
|
"google.golang.org/grpc/status"
|
||||||
|
|
||||||
. "github.com/fullstorydev/grpcurl"
|
. "github.com/fullstorydev/grpcurl"
|
||||||
grpcurl_testing "github.com/fullstorydev/grpcurl/testing"
|
grpcurl_testing "github.com/fullstorydev/grpcurl/internal/testing"
|
||||||
jsonpbtest "github.com/fullstorydev/grpcurl/testing/jsonpb_test_proto"
|
jsonpbtest "github.com/fullstorydev/grpcurl/internal/testing/jsonpb_test_proto"
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
@@ -52,18 +51,18 @@ type descSourceCase struct {
|
|||||||
|
|
||||||
func TestMain(m *testing.M) {
|
func TestMain(m *testing.M) {
|
||||||
var err error
|
var err error
|
||||||
sourceProtoset, err = DescriptorSourceFromProtoSets("testing/test.protoset")
|
sourceProtoset, err = DescriptorSourceFromProtoSets("internal/testing/test.protoset")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
panic(err)
|
panic(err)
|
||||||
}
|
}
|
||||||
sourceProtoFiles, err = DescriptorSourceFromProtoFiles(nil, "testing/test.proto")
|
sourceProtoFiles, err = DescriptorSourceFromProtoFiles([]string{"internal/testing"}, "test.proto")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
panic(err)
|
panic(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Create a server that includes the reflection service
|
// Create a server that includes the reflection service
|
||||||
svrReflect := grpc.NewServer()
|
svrReflect := grpc.NewServer()
|
||||||
grpc_testing.RegisterTestServiceServer(svrReflect, grpcurl_testing.TestServer{})
|
grpcurl_testing.RegisterTestServiceServer(svrReflect, grpcurl_testing.TestServer{})
|
||||||
reflection.Register(svrReflect)
|
reflection.Register(svrReflect)
|
||||||
var portReflect int
|
var portReflect int
|
||||||
if l, err := net.Listen("tcp", "127.0.0.1:0"); err != nil {
|
if l, err := net.Listen("tcp", "127.0.0.1:0"); err != nil {
|
||||||
@@ -89,7 +88,7 @@ func TestMain(m *testing.M) {
|
|||||||
|
|
||||||
// Also create a server that does *not* include the reflection service
|
// Also create a server that does *not* include the reflection service
|
||||||
svrProtoset := grpc.NewServer()
|
svrProtoset := grpc.NewServer()
|
||||||
grpc_testing.RegisterTestServiceServer(svrProtoset, grpcurl_testing.TestServer{})
|
grpcurl_testing.RegisterTestServiceServer(svrProtoset, grpcurl_testing.TestServer{})
|
||||||
var portProtoset int
|
var portProtoset int
|
||||||
if l, err := net.Listen("tcp", "127.0.0.1:0"); err != nil {
|
if l, err := net.Listen("tcp", "127.0.0.1:0"); err != nil {
|
||||||
panic(err)
|
panic(err)
|
||||||
@@ -141,7 +140,7 @@ func TestServerDoesNotSupportReflection(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func TestProtosetWithImports(t *testing.T) {
|
func TestProtosetWithImports(t *testing.T) {
|
||||||
sourceProtoset, err := DescriptorSourceFromProtoSets("testing/example.protoset")
|
sourceProtoset, err := DescriptorSourceFromProtoSets("internal/testing/example.protoset")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatalf("failed to load protoset: %v", err)
|
t.Fatalf("failed to load protoset: %v", err)
|
||||||
}
|
}
|
||||||
@@ -178,11 +177,11 @@ func doTestListServices(t *testing.T, source DescriptorSource, includeReflection
|
|||||||
var expected []string
|
var expected []string
|
||||||
if includeReflection {
|
if includeReflection {
|
||||||
// when using server reflection, we see the TestService as well as the ServerReflection service
|
// when using server reflection, we see the TestService as well as the ServerReflection service
|
||||||
expected = []string{"grpc.reflection.v1alpha.ServerReflection", "grpc.testing.TestService"}
|
expected = []string{"grpc.reflection.v1alpha.ServerReflection", "testing.TestService"}
|
||||||
} else {
|
} else {
|
||||||
// without reflection, we see all services defined in the same test.proto file, which is the
|
// without reflection, we see all services defined in the same test.proto file, which is the
|
||||||
// TestService as well as UnimplementedService
|
// TestService as well as UnimplementedService
|
||||||
expected = []string{"grpc.testing.TestService", "grpc.testing.UnimplementedService"}
|
expected = []string{"testing.TestService", "testing.UnimplementedService"}
|
||||||
}
|
}
|
||||||
if !reflect.DeepEqual(expected, names) {
|
if !reflect.DeepEqual(expected, names) {
|
||||||
t.Errorf("ListServices returned wrong results: wanted %v, got %v", expected, names)
|
t.Errorf("ListServices returned wrong results: wanted %v, got %v", expected, names)
|
||||||
@@ -198,17 +197,17 @@ func TestListMethods(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func doTestListMethods(t *testing.T, source DescriptorSource, includeReflection bool) {
|
func doTestListMethods(t *testing.T, source DescriptorSource, includeReflection bool) {
|
||||||
names, err := ListMethods(source, "grpc.testing.TestService")
|
names, err := ListMethods(source, "testing.TestService")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatalf("failed to list methods for TestService: %v", err)
|
t.Fatalf("failed to list methods for TestService: %v", err)
|
||||||
}
|
}
|
||||||
expected := []string{
|
expected := []string{
|
||||||
"grpc.testing.TestService.EmptyCall",
|
"testing.TestService.EmptyCall",
|
||||||
"grpc.testing.TestService.FullDuplexCall",
|
"testing.TestService.FullDuplexCall",
|
||||||
"grpc.testing.TestService.HalfDuplexCall",
|
"testing.TestService.HalfDuplexCall",
|
||||||
"grpc.testing.TestService.StreamingInputCall",
|
"testing.TestService.StreamingInputCall",
|
||||||
"grpc.testing.TestService.StreamingOutputCall",
|
"testing.TestService.StreamingOutputCall",
|
||||||
"grpc.testing.TestService.UnaryCall",
|
"testing.TestService.UnaryCall",
|
||||||
}
|
}
|
||||||
if !reflect.DeepEqual(expected, names) {
|
if !reflect.DeepEqual(expected, names) {
|
||||||
t.Errorf("ListMethods returned wrong results: wanted %v, got %v", expected, names)
|
t.Errorf("ListMethods returned wrong results: wanted %v, got %v", expected, names)
|
||||||
@@ -224,11 +223,11 @@ func doTestListMethods(t *testing.T, source DescriptorSource, includeReflection
|
|||||||
} else {
|
} else {
|
||||||
// without reflection, we see all services defined in the same test.proto file, which is the
|
// without reflection, we see all services defined in the same test.proto file, which is the
|
||||||
// TestService as well as UnimplementedService
|
// TestService as well as UnimplementedService
|
||||||
names, err = ListMethods(source, "grpc.testing.UnimplementedService")
|
names, err = ListMethods(source, "testing.UnimplementedService")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatalf("failed to list methods for ServerReflection: %v", err)
|
t.Fatalf("failed to list methods for ServerReflection: %v", err)
|
||||||
}
|
}
|
||||||
expected = []string{"grpc.testing.UnimplementedService.UnimplementedCall"}
|
expected = []string{"testing.UnimplementedService.UnimplementedCall"}
|
||||||
}
|
}
|
||||||
if !reflect.DeepEqual(expected, names) {
|
if !reflect.DeepEqual(expected, names) {
|
||||||
t.Errorf("ListMethods returned wrong results: wanted %v, got %v", expected, names)
|
t.Errorf("ListMethods returned wrong results: wanted %v, got %v", expected, names)
|
||||||
@@ -242,13 +241,13 @@ func doTestListMethods(t *testing.T, source DescriptorSource, includeReflection
|
|||||||
}
|
}
|
||||||
|
|
||||||
func TestGetAllFiles(t *testing.T) {
|
func TestGetAllFiles(t *testing.T) {
|
||||||
expectedFiles := []string{"testing/test.proto"}
|
expectedFiles := []string{"test.proto"}
|
||||||
// server reflection picks up filename from linked in Go package,
|
// server reflection picks up filename from linked in Go package,
|
||||||
// which indicates "grpc_testing/test.proto", not our local copy.
|
// which indicates "grpc_testing/test.proto", not our local copy.
|
||||||
expectedFilesWithReflection := [][]string{
|
expectedFilesWithReflection := [][]string{
|
||||||
{"grpc_reflection_v1alpha/reflection.proto", "grpc_testing/test.proto"},
|
{"grpc_reflection_v1alpha/reflection.proto", "test.proto"},
|
||||||
// depending on the version of grpc, the filenames could be prefixed with "interop/" and "reflection/"
|
// depending on the version of grpc, the filenames could be prefixed with "interop/" and "reflection/"
|
||||||
{"interop/grpc_testing/test.proto", "reflection/grpc_reflection_v1alpha/reflection.proto"},
|
{"reflection/grpc_reflection_v1alpha/reflection.proto", "test.proto"},
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, ds := range descSources {
|
for _, ds := range descSources {
|
||||||
@@ -279,11 +278,11 @@ func TestGetAllFiles(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// try cases with more complicated set of files
|
// try cases with more complicated set of files
|
||||||
otherSourceProtoset, err := DescriptorSourceFromProtoSets("testing/test.protoset", "testing/example.protoset")
|
otherSourceProtoset, err := DescriptorSourceFromProtoSets("internal/testing/test.protoset", "internal/testing/example.protoset")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatal(err.Error())
|
t.Fatal(err.Error())
|
||||||
}
|
}
|
||||||
otherSourceProtoFiles, err := DescriptorSourceFromProtoFiles(nil, "testing/test.proto", "testing/example.proto")
|
otherSourceProtoFiles, err := DescriptorSourceFromProtoFiles([]string{"internal/testing"}, "test.proto", "example.proto")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatal(err.Error())
|
t.Fatal(err.Error())
|
||||||
}
|
}
|
||||||
@@ -292,13 +291,13 @@ func TestGetAllFiles(t *testing.T) {
|
|||||||
{"proto[b]", otherSourceProtoFiles, false},
|
{"proto[b]", otherSourceProtoFiles, false},
|
||||||
}
|
}
|
||||||
expectedFiles = []string{
|
expectedFiles = []string{
|
||||||
|
"example.proto",
|
||||||
|
"example2.proto",
|
||||||
"google/protobuf/any.proto",
|
"google/protobuf/any.proto",
|
||||||
"google/protobuf/descriptor.proto",
|
"google/protobuf/descriptor.proto",
|
||||||
"google/protobuf/empty.proto",
|
"google/protobuf/empty.proto",
|
||||||
"google/protobuf/timestamp.proto",
|
"google/protobuf/timestamp.proto",
|
||||||
"testing/example.proto",
|
"test.proto",
|
||||||
"testing/example2.proto",
|
|
||||||
"testing/test.proto",
|
|
||||||
}
|
}
|
||||||
for _, ds := range otherDescSources {
|
for _, ds := range otherDescSources {
|
||||||
t.Run(ds.name, func(t *testing.T) {
|
t.Run(ds.name, func(t *testing.T) {
|
||||||
@@ -403,7 +402,7 @@ func TestDescribe(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func doTestDescribe(t *testing.T, source DescriptorSource) {
|
func doTestDescribe(t *testing.T, source DescriptorSource) {
|
||||||
sym := "grpc.testing.TestService.EmptyCall"
|
sym := "testing.TestService.EmptyCall"
|
||||||
dsc, err := source.FindSymbol(sym)
|
dsc, err := source.FindSymbol(sym)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatalf("failed to get descriptor for %q: %v", sym, err)
|
t.Fatalf("failed to get descriptor for %q: %v", sym, err)
|
||||||
@@ -414,14 +413,14 @@ func doTestDescribe(t *testing.T, source DescriptorSource) {
|
|||||||
txt := proto.MarshalTextString(dsc.AsProto())
|
txt := proto.MarshalTextString(dsc.AsProto())
|
||||||
expected :=
|
expected :=
|
||||||
`name: "EmptyCall"
|
`name: "EmptyCall"
|
||||||
input_type: ".grpc.testing.Empty"
|
input_type: ".testing.Empty"
|
||||||
output_type: ".grpc.testing.Empty"
|
output_type: ".testing.Empty"
|
||||||
`
|
`
|
||||||
if expected != txt {
|
if expected != txt {
|
||||||
t.Errorf("descriptor mismatch: expected %s, got %s", expected, txt)
|
t.Errorf("descriptor mismatch: expected %s, got %s", expected, txt)
|
||||||
}
|
}
|
||||||
|
|
||||||
sym = "grpc.testing.StreamingOutputCallResponse"
|
sym = "testing.StreamingOutputCallResponse"
|
||||||
dsc, err = source.FindSymbol(sym)
|
dsc, err = source.FindSymbol(sym)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatalf("failed to get descriptor for %q: %v", sym, err)
|
t.Fatalf("failed to get descriptor for %q: %v", sym, err)
|
||||||
@@ -437,7 +436,7 @@ field: <
|
|||||||
number: 1
|
number: 1
|
||||||
label: LABEL_OPTIONAL
|
label: LABEL_OPTIONAL
|
||||||
type: TYPE_MESSAGE
|
type: TYPE_MESSAGE
|
||||||
type_name: ".grpc.testing.Payload"
|
type_name: ".testing.Payload"
|
||||||
json_name: "payload"
|
json_name: "payload"
|
||||||
>
|
>
|
||||||
`
|
`
|
||||||
@@ -493,12 +492,12 @@ func TestUnary(t *testing.T) {
|
|||||||
func doTestUnary(t *testing.T, cc *grpc.ClientConn, source DescriptorSource) {
|
func doTestUnary(t *testing.T, cc *grpc.ClientConn, source DescriptorSource) {
|
||||||
// Success
|
// Success
|
||||||
h := &handler{reqMessages: []string{payload1}}
|
h := &handler{reqMessages: []string{payload1}}
|
||||||
err := InvokeRpc(context.Background(), source, cc, "grpc.testing.TestService/UnaryCall", makeHeaders(codes.OK), h, h.getRequestData)
|
err := InvokeRpc(context.Background(), source, cc, "testing.TestService/UnaryCall", makeHeaders(codes.OK), h, h.getRequestData)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatalf("unexpected error during RPC: %v", err)
|
t.Fatalf("unexpected error during RPC: %v", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
if h.check(t, "grpc.testing.TestService.UnaryCall", codes.OK, 1, 1) {
|
if h.check(t, "testing.TestService.UnaryCall", codes.OK, 1, 1) {
|
||||||
if h.respMessages[0] != payload1 {
|
if h.respMessages[0] != payload1 {
|
||||||
t.Errorf("unexpected response from RPC: expecting %s; got %s", payload1, h.respMessages[0])
|
t.Errorf("unexpected response from RPC: expecting %s; got %s", payload1, h.respMessages[0])
|
||||||
}
|
}
|
||||||
@@ -506,12 +505,12 @@ func doTestUnary(t *testing.T, cc *grpc.ClientConn, source DescriptorSource) {
|
|||||||
|
|
||||||
// Failure
|
// Failure
|
||||||
h = &handler{reqMessages: []string{payload1}}
|
h = &handler{reqMessages: []string{payload1}}
|
||||||
err = InvokeRpc(context.Background(), source, cc, "grpc.testing.TestService/UnaryCall", makeHeaders(codes.NotFound), h, h.getRequestData)
|
err = InvokeRpc(context.Background(), source, cc, "testing.TestService/UnaryCall", makeHeaders(codes.NotFound), h, h.getRequestData)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatalf("unexpected error during RPC: %v", err)
|
t.Fatalf("unexpected error during RPC: %v", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
h.check(t, "grpc.testing.TestService.UnaryCall", codes.NotFound, 1, 0)
|
h.check(t, "testing.TestService.UnaryCall", codes.NotFound, 1, 0)
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestClientStream(t *testing.T) {
|
func TestClientStream(t *testing.T) {
|
||||||
@@ -525,12 +524,12 @@ func TestClientStream(t *testing.T) {
|
|||||||
func doTestClientStream(t *testing.T, cc *grpc.ClientConn, source DescriptorSource) {
|
func doTestClientStream(t *testing.T, cc *grpc.ClientConn, source DescriptorSource) {
|
||||||
// Success
|
// Success
|
||||||
h := &handler{reqMessages: []string{payload1, payload2, payload3}}
|
h := &handler{reqMessages: []string{payload1, payload2, payload3}}
|
||||||
err := InvokeRpc(context.Background(), source, cc, "grpc.testing.TestService/StreamingInputCall", makeHeaders(codes.OK), h, h.getRequestData)
|
err := InvokeRpc(context.Background(), source, cc, "testing.TestService/StreamingInputCall", makeHeaders(codes.OK), h, h.getRequestData)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatalf("unexpected error during RPC: %v", err)
|
t.Fatalf("unexpected error during RPC: %v", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
if h.check(t, "grpc.testing.TestService.StreamingInputCall", codes.OK, 3, 1) {
|
if h.check(t, "testing.TestService.StreamingInputCall", codes.OK, 3, 1) {
|
||||||
expected :=
|
expected :=
|
||||||
`{
|
`{
|
||||||
"aggregatedPayloadSize": 61
|
"aggregatedPayloadSize": 61
|
||||||
@@ -542,21 +541,21 @@ func doTestClientStream(t *testing.T, cc *grpc.ClientConn, source DescriptorSour
|
|||||||
|
|
||||||
// Fail fast (server rejects as soon as possible)
|
// Fail fast (server rejects as soon as possible)
|
||||||
h = &handler{reqMessages: []string{payload1, payload2, payload3}}
|
h = &handler{reqMessages: []string{payload1, payload2, payload3}}
|
||||||
err = InvokeRpc(context.Background(), source, cc, "grpc.testing.TestService/StreamingInputCall", makeHeaders(codes.InvalidArgument), h, h.getRequestData)
|
err = InvokeRpc(context.Background(), source, cc, "testing.TestService/StreamingInputCall", makeHeaders(codes.InvalidArgument), h, h.getRequestData)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatalf("unexpected error during RPC: %v", err)
|
t.Fatalf("unexpected error during RPC: %v", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
h.check(t, "grpc.testing.TestService.StreamingInputCall", codes.InvalidArgument, -3, 0)
|
h.check(t, "testing.TestService.StreamingInputCall", codes.InvalidArgument, -3, 0)
|
||||||
|
|
||||||
// Fail late (server waits until stream is complete to reject)
|
// Fail late (server waits until stream is complete to reject)
|
||||||
h = &handler{reqMessages: []string{payload1, payload2, payload3}}
|
h = &handler{reqMessages: []string{payload1, payload2, payload3}}
|
||||||
err = InvokeRpc(context.Background(), source, cc, "grpc.testing.TestService/StreamingInputCall", makeHeaders(codes.Internal, true), h, h.getRequestData)
|
err = InvokeRpc(context.Background(), source, cc, "testing.TestService/StreamingInputCall", makeHeaders(codes.Internal, true), h, h.getRequestData)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatalf("unexpected error during RPC: %v", err)
|
t.Fatalf("unexpected error during RPC: %v", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
h.check(t, "grpc.testing.TestService.StreamingInputCall", codes.Internal, 3, 0)
|
h.check(t, "testing.TestService.StreamingInputCall", codes.Internal, 3, 0)
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestServerStream(t *testing.T) {
|
func TestServerStream(t *testing.T) {
|
||||||
@@ -568,9 +567,9 @@ func TestServerStream(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func doTestServerStream(t *testing.T, cc *grpc.ClientConn, source DescriptorSource) {
|
func doTestServerStream(t *testing.T, cc *grpc.ClientConn, source DescriptorSource) {
|
||||||
req := &grpc_testing.StreamingOutputCallRequest{
|
req := &grpcurl_testing.StreamingOutputCallRequest{
|
||||||
ResponseType: grpc_testing.PayloadType_COMPRESSABLE,
|
ResponseType: grpcurl_testing.PayloadType_COMPRESSABLE,
|
||||||
ResponseParameters: []*grpc_testing.ResponseParameters{
|
ResponseParameters: []*grpcurl_testing.ResponseParameters{
|
||||||
{Size: 10}, {Size: 20}, {Size: 30}, {Size: 40}, {Size: 50},
|
{Size: 10}, {Size: 20}, {Size: 30}, {Size: 40}, {Size: 50},
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
@@ -581,19 +580,19 @@ func doTestServerStream(t *testing.T, cc *grpc.ClientConn, source DescriptorSour
|
|||||||
|
|
||||||
// Success
|
// Success
|
||||||
h := &handler{reqMessages: []string{payload}}
|
h := &handler{reqMessages: []string{payload}}
|
||||||
err = InvokeRpc(context.Background(), source, cc, "grpc.testing.TestService/StreamingOutputCall", makeHeaders(codes.OK), h, h.getRequestData)
|
err = InvokeRpc(context.Background(), source, cc, "testing.TestService/StreamingOutputCall", makeHeaders(codes.OK), h, h.getRequestData)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatalf("unexpected error during RPC: %v", err)
|
t.Fatalf("unexpected error during RPC: %v", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
if h.check(t, "grpc.testing.TestService.StreamingOutputCall", codes.OK, 1, 5) {
|
if h.check(t, "testing.TestService.StreamingOutputCall", codes.OK, 1, 5) {
|
||||||
resp := &grpc_testing.StreamingOutputCallResponse{}
|
resp := &grpcurl_testing.StreamingOutputCallResponse{}
|
||||||
for i, msg := range h.respMessages {
|
for i, msg := range h.respMessages {
|
||||||
if err := jsonpb.UnmarshalString(msg, resp); err != nil {
|
if err := jsonpb.UnmarshalString(msg, resp); err != nil {
|
||||||
t.Errorf("failed to parse response %d: %v", i+1, err)
|
t.Errorf("failed to parse response %d: %v", i+1, err)
|
||||||
}
|
}
|
||||||
if resp.Payload.GetType() != grpc_testing.PayloadType_COMPRESSABLE {
|
if resp.Payload.GetType() != grpcurl_testing.PayloadType_COMPRESSABLE {
|
||||||
t.Errorf("response %d has wrong payload type; expecting %v, got %v", i, grpc_testing.PayloadType_COMPRESSABLE, resp.Payload.Type)
|
t.Errorf("response %d has wrong payload type; expecting %v, got %v", i, grpcurl_testing.PayloadType_COMPRESSABLE, resp.Payload.Type)
|
||||||
}
|
}
|
||||||
if len(resp.Payload.Body) != (i+1)*10 {
|
if len(resp.Payload.Body) != (i+1)*10 {
|
||||||
t.Errorf("response %d has wrong payload size; expecting %d, got %d", i, (i+1)*10, len(resp.Payload.Body))
|
t.Errorf("response %d has wrong payload size; expecting %d, got %d", i, (i+1)*10, len(resp.Payload.Body))
|
||||||
@@ -604,21 +603,21 @@ func doTestServerStream(t *testing.T, cc *grpc.ClientConn, source DescriptorSour
|
|||||||
|
|
||||||
// Fail fast (server rejects as soon as possible)
|
// Fail fast (server rejects as soon as possible)
|
||||||
h = &handler{reqMessages: []string{payload}}
|
h = &handler{reqMessages: []string{payload}}
|
||||||
err = InvokeRpc(context.Background(), source, cc, "grpc.testing.TestService/StreamingOutputCall", makeHeaders(codes.Aborted), h, h.getRequestData)
|
err = InvokeRpc(context.Background(), source, cc, "testing.TestService/StreamingOutputCall", makeHeaders(codes.Aborted), h, h.getRequestData)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatalf("unexpected error during RPC: %v", err)
|
t.Fatalf("unexpected error during RPC: %v", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
h.check(t, "grpc.testing.TestService.StreamingOutputCall", codes.Aborted, 1, 0)
|
h.check(t, "testing.TestService.StreamingOutputCall", codes.Aborted, 1, 0)
|
||||||
|
|
||||||
// Fail late (server waits until stream is complete to reject)
|
// Fail late (server waits until stream is complete to reject)
|
||||||
h = &handler{reqMessages: []string{payload}}
|
h = &handler{reqMessages: []string{payload}}
|
||||||
err = InvokeRpc(context.Background(), source, cc, "grpc.testing.TestService/StreamingOutputCall", makeHeaders(codes.AlreadyExists, true), h, h.getRequestData)
|
err = InvokeRpc(context.Background(), source, cc, "testing.TestService/StreamingOutputCall", makeHeaders(codes.AlreadyExists, true), h, h.getRequestData)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatalf("unexpected error during RPC: %v", err)
|
t.Fatalf("unexpected error during RPC: %v", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
h.check(t, "grpc.testing.TestService.StreamingOutputCall", codes.AlreadyExists, 1, 5)
|
h.check(t, "testing.TestService.StreamingOutputCall", codes.AlreadyExists, 1, 5)
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestHalfDuplexStream(t *testing.T) {
|
func TestHalfDuplexStream(t *testing.T) {
|
||||||
@@ -634,12 +633,12 @@ func doTestHalfDuplexStream(t *testing.T, cc *grpc.ClientConn, source Descriptor
|
|||||||
|
|
||||||
// Success
|
// Success
|
||||||
h := &handler{reqMessages: reqs}
|
h := &handler{reqMessages: reqs}
|
||||||
err := InvokeRpc(context.Background(), source, cc, "grpc.testing.TestService/HalfDuplexCall", makeHeaders(codes.OK), h, h.getRequestData)
|
err := InvokeRpc(context.Background(), source, cc, "testing.TestService/HalfDuplexCall", makeHeaders(codes.OK), h, h.getRequestData)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatalf("unexpected error during RPC: %v", err)
|
t.Fatalf("unexpected error during RPC: %v", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
if h.check(t, "grpc.testing.TestService.HalfDuplexCall", codes.OK, 3, 3) {
|
if h.check(t, "testing.TestService.HalfDuplexCall", codes.OK, 3, 3) {
|
||||||
for i, resp := range h.respMessages {
|
for i, resp := range h.respMessages {
|
||||||
if resp != reqs[i] {
|
if resp != reqs[i] {
|
||||||
t.Errorf("unexpected response %d from RPC:\nexpecting %q\ngot %q", i, reqs[i], resp)
|
t.Errorf("unexpected response %d from RPC:\nexpecting %q\ngot %q", i, reqs[i], resp)
|
||||||
@@ -649,21 +648,21 @@ func doTestHalfDuplexStream(t *testing.T, cc *grpc.ClientConn, source Descriptor
|
|||||||
|
|
||||||
// Fail fast (server rejects as soon as possible)
|
// Fail fast (server rejects as soon as possible)
|
||||||
h = &handler{reqMessages: reqs}
|
h = &handler{reqMessages: reqs}
|
||||||
err = InvokeRpc(context.Background(), source, cc, "grpc.testing.TestService/HalfDuplexCall", makeHeaders(codes.Canceled), h, h.getRequestData)
|
err = InvokeRpc(context.Background(), source, cc, "testing.TestService/HalfDuplexCall", makeHeaders(codes.Canceled), h, h.getRequestData)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatalf("unexpected error during RPC: %v", err)
|
t.Fatalf("unexpected error during RPC: %v", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
h.check(t, "grpc.testing.TestService.HalfDuplexCall", codes.Canceled, -3, 0)
|
h.check(t, "testing.TestService.HalfDuplexCall", codes.Canceled, -3, 0)
|
||||||
|
|
||||||
// Fail late (server waits until stream is complete to reject)
|
// Fail late (server waits until stream is complete to reject)
|
||||||
h = &handler{reqMessages: reqs}
|
h = &handler{reqMessages: reqs}
|
||||||
err = InvokeRpc(context.Background(), source, cc, "grpc.testing.TestService/HalfDuplexCall", makeHeaders(codes.DataLoss, true), h, h.getRequestData)
|
err = InvokeRpc(context.Background(), source, cc, "testing.TestService/HalfDuplexCall", makeHeaders(codes.DataLoss, true), h, h.getRequestData)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatalf("unexpected error during RPC: %v", err)
|
t.Fatalf("unexpected error during RPC: %v", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
h.check(t, "grpc.testing.TestService.HalfDuplexCall", codes.DataLoss, 3, 3)
|
h.check(t, "testing.TestService.HalfDuplexCall", codes.DataLoss, 3, 3)
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestFullDuplexStream(t *testing.T) {
|
func TestFullDuplexStream(t *testing.T) {
|
||||||
@@ -676,11 +675,11 @@ func TestFullDuplexStream(t *testing.T) {
|
|||||||
|
|
||||||
func doTestFullDuplexStream(t *testing.T, cc *grpc.ClientConn, source DescriptorSource) {
|
func doTestFullDuplexStream(t *testing.T, cc *grpc.ClientConn, source DescriptorSource) {
|
||||||
reqs := make([]string, 3)
|
reqs := make([]string, 3)
|
||||||
req := &grpc_testing.StreamingOutputCallRequest{
|
req := &grpcurl_testing.StreamingOutputCallRequest{
|
||||||
ResponseType: grpc_testing.PayloadType_RANDOM,
|
ResponseType: grpcurl_testing.PayloadType_RANDOM,
|
||||||
}
|
}
|
||||||
for i := range reqs {
|
for i := range reqs {
|
||||||
req.ResponseParameters = append(req.ResponseParameters, &grpc_testing.ResponseParameters{Size: int32((i + 1) * 10)})
|
req.ResponseParameters = append(req.ResponseParameters, &grpcurl_testing.ResponseParameters{Size: int32((i + 1) * 10)})
|
||||||
payload, err := (&jsonpb.Marshaler{}).MarshalToString(req)
|
payload, err := (&jsonpb.Marshaler{}).MarshalToString(req)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatalf("failed to construct request %d: %v", i, err)
|
t.Fatalf("failed to construct request %d: %v", i, err)
|
||||||
@@ -690,13 +689,13 @@ func doTestFullDuplexStream(t *testing.T, cc *grpc.ClientConn, source Descriptor
|
|||||||
|
|
||||||
// Success
|
// Success
|
||||||
h := &handler{reqMessages: reqs}
|
h := &handler{reqMessages: reqs}
|
||||||
err := InvokeRpc(context.Background(), source, cc, "grpc.testing.TestService/FullDuplexCall", makeHeaders(codes.OK), h, h.getRequestData)
|
err := InvokeRpc(context.Background(), source, cc, "testing.TestService/FullDuplexCall", makeHeaders(codes.OK), h, h.getRequestData)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatalf("unexpected error during RPC: %v", err)
|
t.Fatalf("unexpected error during RPC: %v", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
if h.check(t, "grpc.testing.TestService.FullDuplexCall", codes.OK, 3, 6) {
|
if h.check(t, "testing.TestService.FullDuplexCall", codes.OK, 3, 6) {
|
||||||
resp := &grpc_testing.StreamingOutputCallResponse{}
|
resp := &grpcurl_testing.StreamingOutputCallResponse{}
|
||||||
i := 0
|
i := 0
|
||||||
for j := 1; j < 3; j++ {
|
for j := 1; j < 3; j++ {
|
||||||
// three requests
|
// three requests
|
||||||
@@ -706,8 +705,8 @@ func doTestFullDuplexStream(t *testing.T, cc *grpc.ClientConn, source Descriptor
|
|||||||
if err := jsonpb.UnmarshalString(msg, resp); err != nil {
|
if err := jsonpb.UnmarshalString(msg, resp); err != nil {
|
||||||
t.Errorf("failed to parse response %d: %v", i+1, err)
|
t.Errorf("failed to parse response %d: %v", i+1, err)
|
||||||
}
|
}
|
||||||
if resp.Payload.GetType() != grpc_testing.PayloadType_RANDOM {
|
if resp.Payload.GetType() != grpcurl_testing.PayloadType_RANDOM {
|
||||||
t.Errorf("response %d has wrong payload type; expecting %v, got %v", i, grpc_testing.PayloadType_RANDOM, resp.Payload.Type)
|
t.Errorf("response %d has wrong payload type; expecting %v, got %v", i, grpcurl_testing.PayloadType_RANDOM, resp.Payload.Type)
|
||||||
}
|
}
|
||||||
if len(resp.Payload.Body) != (k+1)*10 {
|
if len(resp.Payload.Body) != (k+1)*10 {
|
||||||
t.Errorf("response %d has wrong payload size; expecting %d, got %d", i, (k+1)*10, len(resp.Payload.Body))
|
t.Errorf("response %d has wrong payload size; expecting %d, got %d", i, (k+1)*10, len(resp.Payload.Body))
|
||||||
@@ -721,21 +720,21 @@ func doTestFullDuplexStream(t *testing.T, cc *grpc.ClientConn, source Descriptor
|
|||||||
|
|
||||||
// Fail fast (server rejects as soon as possible)
|
// Fail fast (server rejects as soon as possible)
|
||||||
h = &handler{reqMessages: reqs}
|
h = &handler{reqMessages: reqs}
|
||||||
err = InvokeRpc(context.Background(), source, cc, "grpc.testing.TestService/FullDuplexCall", makeHeaders(codes.PermissionDenied), h, h.getRequestData)
|
err = InvokeRpc(context.Background(), source, cc, "testing.TestService/FullDuplexCall", makeHeaders(codes.PermissionDenied), h, h.getRequestData)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatalf("unexpected error during RPC: %v", err)
|
t.Fatalf("unexpected error during RPC: %v", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
h.check(t, "grpc.testing.TestService.FullDuplexCall", codes.PermissionDenied, -3, 0)
|
h.check(t, "testing.TestService.FullDuplexCall", codes.PermissionDenied, -3, 0)
|
||||||
|
|
||||||
// Fail late (server waits until stream is complete to reject)
|
// Fail late (server waits until stream is complete to reject)
|
||||||
h = &handler{reqMessages: reqs}
|
h = &handler{reqMessages: reqs}
|
||||||
err = InvokeRpc(context.Background(), source, cc, "grpc.testing.TestService/FullDuplexCall", makeHeaders(codes.ResourceExhausted, true), h, h.getRequestData)
|
err = InvokeRpc(context.Background(), source, cc, "testing.TestService/FullDuplexCall", makeHeaders(codes.ResourceExhausted, true), h, h.getRequestData)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatalf("unexpected error during RPC: %v", err)
|
t.Fatalf("unexpected error during RPC: %v", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
h.check(t, "grpc.testing.TestService.FullDuplexCall", codes.ResourceExhausted, 3, 6)
|
h.check(t, "testing.TestService.FullDuplexCall", codes.ResourceExhausted, 3, 6)
|
||||||
}
|
}
|
||||||
|
|
||||||
type handler struct {
|
type handler struct {
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"context"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"golang.org/x/net/context"
|
|
||||||
"google.golang.org/grpc/metadata"
|
"google.golang.org/grpc/metadata"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -1,12 +1,12 @@
|
|||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"context"
|
||||||
"fmt"
|
"fmt"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/golang/protobuf/ptypes"
|
"github.com/golang/protobuf/ptypes"
|
||||||
"github.com/golang/protobuf/ptypes/empty"
|
"github.com/golang/protobuf/ptypes/empty"
|
||||||
"golang.org/x/net/context"
|
|
||||||
"google.golang.org/grpc/codes"
|
"google.golang.org/grpc/codes"
|
||||||
"google.golang.org/grpc/status"
|
"google.golang.org/grpc/status"
|
||||||
)
|
)
|
||||||
1701
internal/testing/cmd/bankdemo/bank.pb.go
Normal file
1701
internal/testing/cmd/bankdemo/bank.pb.go
Normal file
File diff suppressed because it is too large
Load Diff
@@ -1,6 +1,6 @@
|
|||||||
syntax = "proto3";
|
syntax = "proto3";
|
||||||
|
|
||||||
option go_package = "main";
|
option go_package = ".;main";
|
||||||
|
|
||||||
import "google/protobuf/empty.proto";
|
import "google/protobuf/empty.proto";
|
||||||
import "google/protobuf/timestamp.proto";
|
import "google/protobuf/timestamp.proto";
|
||||||
@@ -1,14 +1,14 @@
|
|||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"context"
|
||||||
"fmt"
|
"fmt"
|
||||||
"io"
|
"io"
|
||||||
"sync"
|
"sync"
|
||||||
|
|
||||||
"github.com/golang/protobuf/ptypes"
|
|
||||||
"golang.org/x/net/context"
|
|
||||||
"google.golang.org/grpc/codes"
|
"google.golang.org/grpc/codes"
|
||||||
"google.golang.org/grpc/status"
|
"google.golang.org/grpc/status"
|
||||||
|
"google.golang.org/protobuf/types/known/timestamppb"
|
||||||
)
|
)
|
||||||
|
|
||||||
// chatServer implements the Support gRPC service, for providing
|
// chatServer implements the Support gRPC service, for providing
|
||||||
@@ -134,7 +134,7 @@ func (s *chatServer) ChatCustomer(stream Support_ChatCustomerServer) error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
entry := &ChatEntry{
|
entry := &ChatEntry{
|
||||||
Date: ptypes.TimestampNow(),
|
Date: timestamppb.Now(),
|
||||||
Entry: &ChatEntry_CustomerMsg{
|
Entry: &ChatEntry_CustomerMsg{
|
||||||
CustomerMsg: req.Msg,
|
CustomerMsg: req.Msg,
|
||||||
},
|
},
|
||||||
@@ -279,7 +279,7 @@ func (s *chatServer) ChatAgent(stream Support_ChatAgentServer) error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
entry := &ChatEntry{
|
entry := &ChatEntry{
|
||||||
Date: ptypes.TimestampNow(),
|
Date: timestamppb.Now(),
|
||||||
Entry: &ChatEntry_AgentMsg{
|
Entry: &ChatEntry_AgentMsg{
|
||||||
AgentMsg: &AgentMessage{
|
AgentMsg: &AgentMessage{
|
||||||
AgentName: agent,
|
AgentName: agent,
|
||||||
@@ -1,14 +1,13 @@
|
|||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"bytes"
|
|
||||||
"fmt"
|
"fmt"
|
||||||
"sync"
|
"sync"
|
||||||
|
|
||||||
"github.com/golang/protobuf/jsonpb"
|
|
||||||
"github.com/golang/protobuf/ptypes"
|
|
||||||
"google.golang.org/grpc/codes"
|
"google.golang.org/grpc/codes"
|
||||||
"google.golang.org/grpc/status"
|
"google.golang.org/grpc/status"
|
||||||
|
"google.golang.org/protobuf/encoding/protojson"
|
||||||
|
"google.golang.org/protobuf/types/known/timestamppb"
|
||||||
)
|
)
|
||||||
|
|
||||||
// In-memory database that is periodically saved to a JSON file.
|
// In-memory database that is periodically saved to a JSON file.
|
||||||
@@ -43,7 +42,7 @@ func (a *accounts) openAccount(customer string, accountType Account_Type, initia
|
|||||||
acct.Transactions = append(acct.Transactions, &Transaction{
|
acct.Transactions = append(acct.Transactions, &Transaction{
|
||||||
AccountNumber: num,
|
AccountNumber: num,
|
||||||
SeqNumber: 1,
|
SeqNumber: 1,
|
||||||
Date: ptypes.TimestampNow(),
|
Date: timestamppb.Now(),
|
||||||
AmountCents: initialBalanceCents,
|
AmountCents: initialBalanceCents,
|
||||||
Desc: "initial deposit",
|
Desc: "initial deposit",
|
||||||
})
|
})
|
||||||
@@ -130,7 +129,7 @@ func (a *account) newTransaction(amountCents int32, desc string) (newBalance int
|
|||||||
a.BalanceCents = bal
|
a.BalanceCents = bal
|
||||||
a.Transactions = append(a.Transactions, &Transaction{
|
a.Transactions = append(a.Transactions, &Transaction{
|
||||||
AccountNumber: a.AccountNumber,
|
AccountNumber: a.AccountNumber,
|
||||||
Date: ptypes.TimestampNow(),
|
Date: timestamppb.Now(),
|
||||||
AmountCents: amountCents,
|
AmountCents: amountCents,
|
||||||
SeqNumber: uint64(len(a.Transactions) + 1),
|
SeqNumber: uint64(len(a.Transactions) + 1),
|
||||||
Desc: desc,
|
Desc: desc,
|
||||||
@@ -139,16 +138,11 @@ func (a *account) newTransaction(amountCents int32, desc string) (newBalance int
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (t *Transaction) MarshalJSON() ([]byte, error) {
|
func (t *Transaction) MarshalJSON() ([]byte, error) {
|
||||||
var jsm jsonpb.Marshaler
|
return protojson.Marshal(t)
|
||||||
var buf bytes.Buffer
|
|
||||||
if err := jsm.Marshal(&buf, t); err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
return buf.Bytes(), nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (t *Transaction) UnmarshalJSON(b []byte) error {
|
func (t *Transaction) UnmarshalJSON(b []byte) error {
|
||||||
return jsonpb.Unmarshal(bytes.NewReader(b), t)
|
return protojson.Unmarshal(b, t)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (a *accounts) clone() *accounts {
|
func (a *accounts) clone() *accounts {
|
||||||
@@ -3,6 +3,7 @@ package main
|
|||||||
//go:generate protoc --go_out=plugins=grpc:./ bank.proto support.proto
|
//go:generate protoc --go_out=plugins=grpc:./ bank.proto support.proto
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"context"
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"flag"
|
"flag"
|
||||||
"fmt"
|
"fmt"
|
||||||
@@ -14,7 +15,6 @@ import (
|
|||||||
"syscall"
|
"syscall"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"golang.org/x/net/context"
|
|
||||||
"google.golang.org/grpc"
|
"google.golang.org/grpc"
|
||||||
"google.golang.org/grpc/grpclog"
|
"google.golang.org/grpc/grpclog"
|
||||||
"google.golang.org/grpc/peer"
|
"google.golang.org/grpc/peer"
|
||||||
1254
internal/testing/cmd/bankdemo/support.pb.go
Normal file
1254
internal/testing/cmd/bankdemo/support.pb.go
Normal file
File diff suppressed because it is too large
Load Diff
@@ -1,6 +1,6 @@
|
|||||||
syntax = "proto3";
|
syntax = "proto3";
|
||||||
|
|
||||||
option go_package = "main";
|
option go_package = ".;main";
|
||||||
|
|
||||||
import "google/protobuf/timestamp.proto";
|
import "google/protobuf/timestamp.proto";
|
||||||
|
|
||||||
@@ -2,6 +2,7 @@
|
|||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"context"
|
||||||
"flag"
|
"flag"
|
||||||
"fmt"
|
"fmt"
|
||||||
"net"
|
"net"
|
||||||
@@ -9,17 +10,15 @@ import (
|
|||||||
"sync/atomic"
|
"sync/atomic"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"golang.org/x/net/context"
|
|
||||||
"google.golang.org/grpc"
|
"google.golang.org/grpc"
|
||||||
"google.golang.org/grpc/codes"
|
"google.golang.org/grpc/codes"
|
||||||
"google.golang.org/grpc/grpclog"
|
"google.golang.org/grpc/grpclog"
|
||||||
"google.golang.org/grpc/interop/grpc_testing"
|
|
||||||
"google.golang.org/grpc/metadata"
|
"google.golang.org/grpc/metadata"
|
||||||
"google.golang.org/grpc/reflection"
|
"google.golang.org/grpc/reflection"
|
||||||
"google.golang.org/grpc/status"
|
"google.golang.org/grpc/status"
|
||||||
|
|
||||||
"github.com/fullstorydev/grpcurl"
|
"github.com/fullstorydev/grpcurl"
|
||||||
grpcurl_testing "github.com/fullstorydev/grpcurl/testing"
|
grpcurl_testing "github.com/fullstorydev/grpcurl/internal/testing"
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
@@ -96,7 +95,7 @@ func main() {
|
|||||||
|
|
||||||
svr := grpc.NewServer(opts...)
|
svr := grpc.NewServer(opts...)
|
||||||
|
|
||||||
grpc_testing.RegisterTestServiceServer(svr, grpcurl_testing.TestServer{})
|
grpcurl_testing.RegisterTestServiceServer(svr, grpcurl_testing.TestServer{})
|
||||||
if !*noreflect {
|
if !*noreflect {
|
||||||
reflection.Register(svr)
|
reflection.Register(svr)
|
||||||
}
|
}
|
||||||
@@ -3,7 +3,7 @@ syntax = "proto3";
|
|||||||
import "google/protobuf/descriptor.proto";
|
import "google/protobuf/descriptor.proto";
|
||||||
import "google/protobuf/empty.proto";
|
import "google/protobuf/empty.proto";
|
||||||
import "google/protobuf/timestamp.proto";
|
import "google/protobuf/timestamp.proto";
|
||||||
import "testing/example2.proto";
|
import "example2.proto";
|
||||||
|
|
||||||
message TestRequest {
|
message TestRequest {
|
||||||
repeated string file_names = 1;
|
repeated string file_names = 1;
|
||||||
Binary file not shown.
344
internal/testing/jsonpb_test_proto/test_objects.pb.go
Normal file
344
internal/testing/jsonpb_test_proto/test_objects.pb.go
Normal file
@@ -0,0 +1,344 @@
|
|||||||
|
// Code generated by protoc-gen-go. DO NOT EDIT.
|
||||||
|
// versions:
|
||||||
|
// protoc-gen-go v1.25.0-devel
|
||||||
|
// protoc v3.14.0
|
||||||
|
// source: test_objects.proto
|
||||||
|
|
||||||
|
package jsonpb
|
||||||
|
|
||||||
|
import (
|
||||||
|
proto "github.com/golang/protobuf/proto"
|
||||||
|
protoreflect "google.golang.org/protobuf/reflect/protoreflect"
|
||||||
|
protoimpl "google.golang.org/protobuf/runtime/protoimpl"
|
||||||
|
anypb "google.golang.org/protobuf/types/known/anypb"
|
||||||
|
durationpb "google.golang.org/protobuf/types/known/durationpb"
|
||||||
|
structpb "google.golang.org/protobuf/types/known/structpb"
|
||||||
|
timestamppb "google.golang.org/protobuf/types/known/timestamppb"
|
||||||
|
wrapperspb "google.golang.org/protobuf/types/known/wrapperspb"
|
||||||
|
reflect "reflect"
|
||||||
|
sync "sync"
|
||||||
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
// Verify that this generated code is sufficiently up-to-date.
|
||||||
|
_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
|
||||||
|
// Verify that runtime/protoimpl is sufficiently up-to-date.
|
||||||
|
_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
|
||||||
|
)
|
||||||
|
|
||||||
|
// This is a compile-time assertion that a sufficiently up-to-date version
|
||||||
|
// of the legacy proto package is being used.
|
||||||
|
const _ = proto.ProtoPackageIsVersion4
|
||||||
|
|
||||||
|
type KnownTypes struct {
|
||||||
|
state protoimpl.MessageState
|
||||||
|
sizeCache protoimpl.SizeCache
|
||||||
|
unknownFields protoimpl.UnknownFields
|
||||||
|
|
||||||
|
An *anypb.Any `protobuf:"bytes,14,opt,name=an" json:"an,omitempty"`
|
||||||
|
Dur *durationpb.Duration `protobuf:"bytes,1,opt,name=dur" json:"dur,omitempty"`
|
||||||
|
St *structpb.Struct `protobuf:"bytes,12,opt,name=st" json:"st,omitempty"`
|
||||||
|
Ts *timestamppb.Timestamp `protobuf:"bytes,2,opt,name=ts" json:"ts,omitempty"`
|
||||||
|
Lv *structpb.ListValue `protobuf:"bytes,15,opt,name=lv" json:"lv,omitempty"`
|
||||||
|
Val *structpb.Value `protobuf:"bytes,16,opt,name=val" json:"val,omitempty"`
|
||||||
|
Dbl *wrapperspb.DoubleValue `protobuf:"bytes,3,opt,name=dbl" json:"dbl,omitempty"`
|
||||||
|
Flt *wrapperspb.FloatValue `protobuf:"bytes,4,opt,name=flt" json:"flt,omitempty"`
|
||||||
|
I64 *wrapperspb.Int64Value `protobuf:"bytes,5,opt,name=i64" json:"i64,omitempty"`
|
||||||
|
U64 *wrapperspb.UInt64Value `protobuf:"bytes,6,opt,name=u64" json:"u64,omitempty"`
|
||||||
|
I32 *wrapperspb.Int32Value `protobuf:"bytes,7,opt,name=i32" json:"i32,omitempty"`
|
||||||
|
U32 *wrapperspb.UInt32Value `protobuf:"bytes,8,opt,name=u32" json:"u32,omitempty"`
|
||||||
|
Bool *wrapperspb.BoolValue `protobuf:"bytes,9,opt,name=bool" json:"bool,omitempty"`
|
||||||
|
Str *wrapperspb.StringValue `protobuf:"bytes,10,opt,name=str" json:"str,omitempty"`
|
||||||
|
Bytes *wrapperspb.BytesValue `protobuf:"bytes,11,opt,name=bytes" json:"bytes,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *KnownTypes) Reset() {
|
||||||
|
*x = KnownTypes{}
|
||||||
|
if protoimpl.UnsafeEnabled {
|
||||||
|
mi := &file_test_objects_proto_msgTypes[0]
|
||||||
|
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||||
|
ms.StoreMessageInfo(mi)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *KnownTypes) String() string {
|
||||||
|
return protoimpl.X.MessageStringOf(x)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (*KnownTypes) ProtoMessage() {}
|
||||||
|
|
||||||
|
func (x *KnownTypes) ProtoReflect() protoreflect.Message {
|
||||||
|
mi := &file_test_objects_proto_msgTypes[0]
|
||||||
|
if protoimpl.UnsafeEnabled && x != nil {
|
||||||
|
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||||
|
if ms.LoadMessageInfo() == nil {
|
||||||
|
ms.StoreMessageInfo(mi)
|
||||||
|
}
|
||||||
|
return ms
|
||||||
|
}
|
||||||
|
return mi.MessageOf(x)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Deprecated: Use KnownTypes.ProtoReflect.Descriptor instead.
|
||||||
|
func (*KnownTypes) Descriptor() ([]byte, []int) {
|
||||||
|
return file_test_objects_proto_rawDescGZIP(), []int{0}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *KnownTypes) GetAn() *anypb.Any {
|
||||||
|
if x != nil {
|
||||||
|
return x.An
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *KnownTypes) GetDur() *durationpb.Duration {
|
||||||
|
if x != nil {
|
||||||
|
return x.Dur
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *KnownTypes) GetSt() *structpb.Struct {
|
||||||
|
if x != nil {
|
||||||
|
return x.St
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *KnownTypes) GetTs() *timestamppb.Timestamp {
|
||||||
|
if x != nil {
|
||||||
|
return x.Ts
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *KnownTypes) GetLv() *structpb.ListValue {
|
||||||
|
if x != nil {
|
||||||
|
return x.Lv
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *KnownTypes) GetVal() *structpb.Value {
|
||||||
|
if x != nil {
|
||||||
|
return x.Val
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *KnownTypes) GetDbl() *wrapperspb.DoubleValue {
|
||||||
|
if x != nil {
|
||||||
|
return x.Dbl
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *KnownTypes) GetFlt() *wrapperspb.FloatValue {
|
||||||
|
if x != nil {
|
||||||
|
return x.Flt
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *KnownTypes) GetI64() *wrapperspb.Int64Value {
|
||||||
|
if x != nil {
|
||||||
|
return x.I64
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *KnownTypes) GetU64() *wrapperspb.UInt64Value {
|
||||||
|
if x != nil {
|
||||||
|
return x.U64
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *KnownTypes) GetI32() *wrapperspb.Int32Value {
|
||||||
|
if x != nil {
|
||||||
|
return x.I32
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *KnownTypes) GetU32() *wrapperspb.UInt32Value {
|
||||||
|
if x != nil {
|
||||||
|
return x.U32
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *KnownTypes) GetBool() *wrapperspb.BoolValue {
|
||||||
|
if x != nil {
|
||||||
|
return x.Bool
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *KnownTypes) GetStr() *wrapperspb.StringValue {
|
||||||
|
if x != nil {
|
||||||
|
return x.Str
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *KnownTypes) GetBytes() *wrapperspb.BytesValue {
|
||||||
|
if x != nil {
|
||||||
|
return x.Bytes
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
var File_test_objects_proto protoreflect.FileDescriptor
|
||||||
|
|
||||||
|
var file_test_objects_proto_rawDesc = []byte{
|
||||||
|
0x0a, 0x12, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2e, 0x70,
|
||||||
|
0x72, 0x6f, 0x74, 0x6f, 0x12, 0x06, 0x6a, 0x73, 0x6f, 0x6e, 0x70, 0x62, 0x1a, 0x19, 0x67, 0x6f,
|
||||||
|
0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x61, 0x6e,
|
||||||
|
0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f,
|
||||||
|
0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f,
|
||||||
|
0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1c, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f,
|
||||||
|
0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x2e,
|
||||||
|
0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72,
|
||||||
|
0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70,
|
||||||
|
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, 0x22, 0xba, 0x05, 0x0a, 0x0a, 0x4b, 0x6e, 0x6f, 0x77, 0x6e,
|
||||||
|
0x54, 0x79, 0x70, 0x65, 0x73, 0x12, 0x24, 0x0a, 0x02, 0x61, 0x6e, 0x18, 0x0e, 0x20, 0x01, 0x28,
|
||||||
|
0x0b, 0x32, 0x14, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,
|
||||||
|
0x62, 0x75, 0x66, 0x2e, 0x41, 0x6e, 0x79, 0x52, 0x02, 0x61, 0x6e, 0x12, 0x2b, 0x0a, 0x03, 0x64,
|
||||||
|
0x75, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c,
|
||||||
|
0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74,
|
||||||
|
0x69, 0x6f, 0x6e, 0x52, 0x03, 0x64, 0x75, 0x72, 0x12, 0x27, 0x0a, 0x02, 0x73, 0x74, 0x18, 0x0c,
|
||||||
|
0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72,
|
||||||
|
0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x02, 0x73,
|
||||||
|
0x74, 0x12, 0x2a, 0x0a, 0x02, 0x74, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e,
|
||||||
|
0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e,
|
||||||
|
0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x02, 0x74, 0x73, 0x12, 0x2a, 0x0a,
|
||||||
|
0x02, 0x6c, 0x76, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67,
|
||||||
|
0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4c, 0x69, 0x73, 0x74,
|
||||||
|
0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x02, 0x6c, 0x76, 0x12, 0x28, 0x0a, 0x03, 0x76, 0x61, 0x6c,
|
||||||
|
0x18, 0x10, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e,
|
||||||
|
0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x03,
|
||||||
|
0x76, 0x61, 0x6c, 0x12, 0x2e, 0x0a, 0x03, 0x64, 0x62, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b,
|
||||||
|
0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62,
|
||||||
|
0x75, 0x66, 0x2e, 0x44, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x03,
|
||||||
|
0x64, 0x62, 0x6c, 0x12, 0x2d, 0x0a, 0x03, 0x66, 0x6c, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b,
|
||||||
|
0x32, 0x1b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62,
|
||||||
|
0x75, 0x66, 0x2e, 0x46, 0x6c, 0x6f, 0x61, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x03, 0x66,
|
||||||
|
0x6c, 0x74, 0x12, 0x2d, 0x0a, 0x03, 0x69, 0x36, 0x34, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32,
|
||||||
|
0x1b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75,
|
||||||
|
0x66, 0x2e, 0x49, 0x6e, 0x74, 0x36, 0x34, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x03, 0x69, 0x36,
|
||||||
|
0x34, 0x12, 0x2e, 0x0a, 0x03, 0x75, 0x36, 0x34, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c,
|
||||||
|
0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66,
|
||||||
|
0x2e, 0x55, 0x49, 0x6e, 0x74, 0x36, 0x34, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x03, 0x75, 0x36,
|
||||||
|
0x34, 0x12, 0x2d, 0x0a, 0x03, 0x69, 0x33, 0x32, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b,
|
||||||
|
0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66,
|
||||||
|
0x2e, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x03, 0x69, 0x33, 0x32,
|
||||||
|
0x12, 0x2e, 0x0a, 0x03, 0x75, 0x33, 0x32, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e,
|
||||||
|
0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e,
|
||||||
|
0x55, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x03, 0x75, 0x33, 0x32,
|
||||||
|
0x12, 0x2e, 0x0a, 0x04, 0x62, 0x6f, 0x6f, 0x6c, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a,
|
||||||
|
0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66,
|
||||||
|
0x2e, 0x42, 0x6f, 0x6f, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x04, 0x62, 0x6f, 0x6f, 0x6c,
|
||||||
|
0x12, 0x2e, 0x0a, 0x03, 0x73, 0x74, 0x72, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e,
|
||||||
|
0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e,
|
||||||
|
0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x03, 0x73, 0x74, 0x72,
|
||||||
|
0x12, 0x31, 0x0a, 0x05, 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32,
|
||||||
|
0x1b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75,
|
||||||
|
0x66, 0x2e, 0x42, 0x79, 0x74, 0x65, 0x73, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x62, 0x79,
|
||||||
|
0x74, 0x65, 0x73, 0x42, 0x0a, 0x5a, 0x08, 0x2e, 0x3b, 0x6a, 0x73, 0x6f, 0x6e, 0x70, 0x62,
|
||||||
|
}
|
||||||
|
|
||||||
|
var (
|
||||||
|
file_test_objects_proto_rawDescOnce sync.Once
|
||||||
|
file_test_objects_proto_rawDescData = file_test_objects_proto_rawDesc
|
||||||
|
)
|
||||||
|
|
||||||
|
func file_test_objects_proto_rawDescGZIP() []byte {
|
||||||
|
file_test_objects_proto_rawDescOnce.Do(func() {
|
||||||
|
file_test_objects_proto_rawDescData = protoimpl.X.CompressGZIP(file_test_objects_proto_rawDescData)
|
||||||
|
})
|
||||||
|
return file_test_objects_proto_rawDescData
|
||||||
|
}
|
||||||
|
|
||||||
|
var file_test_objects_proto_msgTypes = make([]protoimpl.MessageInfo, 1)
|
||||||
|
var file_test_objects_proto_goTypes = []interface{}{
|
||||||
|
(*KnownTypes)(nil), // 0: jsonpb.KnownTypes
|
||||||
|
(*anypb.Any)(nil), // 1: google.protobuf.Any
|
||||||
|
(*durationpb.Duration)(nil), // 2: google.protobuf.Duration
|
||||||
|
(*structpb.Struct)(nil), // 3: google.protobuf.Struct
|
||||||
|
(*timestamppb.Timestamp)(nil), // 4: google.protobuf.Timestamp
|
||||||
|
(*structpb.ListValue)(nil), // 5: google.protobuf.ListValue
|
||||||
|
(*structpb.Value)(nil), // 6: google.protobuf.Value
|
||||||
|
(*wrapperspb.DoubleValue)(nil), // 7: google.protobuf.DoubleValue
|
||||||
|
(*wrapperspb.FloatValue)(nil), // 8: google.protobuf.FloatValue
|
||||||
|
(*wrapperspb.Int64Value)(nil), // 9: google.protobuf.Int64Value
|
||||||
|
(*wrapperspb.UInt64Value)(nil), // 10: google.protobuf.UInt64Value
|
||||||
|
(*wrapperspb.Int32Value)(nil), // 11: google.protobuf.Int32Value
|
||||||
|
(*wrapperspb.UInt32Value)(nil), // 12: google.protobuf.UInt32Value
|
||||||
|
(*wrapperspb.BoolValue)(nil), // 13: google.protobuf.BoolValue
|
||||||
|
(*wrapperspb.StringValue)(nil), // 14: google.protobuf.StringValue
|
||||||
|
(*wrapperspb.BytesValue)(nil), // 15: google.protobuf.BytesValue
|
||||||
|
}
|
||||||
|
var file_test_objects_proto_depIdxs = []int32{
|
||||||
|
1, // 0: jsonpb.KnownTypes.an:type_name -> google.protobuf.Any
|
||||||
|
2, // 1: jsonpb.KnownTypes.dur:type_name -> google.protobuf.Duration
|
||||||
|
3, // 2: jsonpb.KnownTypes.st:type_name -> google.protobuf.Struct
|
||||||
|
4, // 3: jsonpb.KnownTypes.ts:type_name -> google.protobuf.Timestamp
|
||||||
|
5, // 4: jsonpb.KnownTypes.lv:type_name -> google.protobuf.ListValue
|
||||||
|
6, // 5: jsonpb.KnownTypes.val:type_name -> google.protobuf.Value
|
||||||
|
7, // 6: jsonpb.KnownTypes.dbl:type_name -> google.protobuf.DoubleValue
|
||||||
|
8, // 7: jsonpb.KnownTypes.flt:type_name -> google.protobuf.FloatValue
|
||||||
|
9, // 8: jsonpb.KnownTypes.i64:type_name -> google.protobuf.Int64Value
|
||||||
|
10, // 9: jsonpb.KnownTypes.u64:type_name -> google.protobuf.UInt64Value
|
||||||
|
11, // 10: jsonpb.KnownTypes.i32:type_name -> google.protobuf.Int32Value
|
||||||
|
12, // 11: jsonpb.KnownTypes.u32:type_name -> google.protobuf.UInt32Value
|
||||||
|
13, // 12: jsonpb.KnownTypes.bool:type_name -> google.protobuf.BoolValue
|
||||||
|
14, // 13: jsonpb.KnownTypes.str:type_name -> google.protobuf.StringValue
|
||||||
|
15, // 14: jsonpb.KnownTypes.bytes:type_name -> google.protobuf.BytesValue
|
||||||
|
15, // [15:15] is the sub-list for method output_type
|
||||||
|
15, // [15:15] is the sub-list for method input_type
|
||||||
|
15, // [15:15] is the sub-list for extension type_name
|
||||||
|
15, // [15:15] is the sub-list for extension extendee
|
||||||
|
0, // [0:15] is the sub-list for field type_name
|
||||||
|
}
|
||||||
|
|
||||||
|
func init() { file_test_objects_proto_init() }
|
||||||
|
func file_test_objects_proto_init() {
|
||||||
|
if File_test_objects_proto != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if !protoimpl.UnsafeEnabled {
|
||||||
|
file_test_objects_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
|
||||||
|
switch v := v.(*KnownTypes); i {
|
||||||
|
case 0:
|
||||||
|
return &v.state
|
||||||
|
case 1:
|
||||||
|
return &v.sizeCache
|
||||||
|
case 2:
|
||||||
|
return &v.unknownFields
|
||||||
|
default:
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
type x struct{}
|
||||||
|
out := protoimpl.TypeBuilder{
|
||||||
|
File: protoimpl.DescBuilder{
|
||||||
|
GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
|
||||||
|
RawDescriptor: file_test_objects_proto_rawDesc,
|
||||||
|
NumEnums: 0,
|
||||||
|
NumMessages: 1,
|
||||||
|
NumExtensions: 0,
|
||||||
|
NumServices: 0,
|
||||||
|
},
|
||||||
|
GoTypes: file_test_objects_proto_goTypes,
|
||||||
|
DependencyIndexes: file_test_objects_proto_depIdxs,
|
||||||
|
MessageInfos: file_test_objects_proto_msgTypes,
|
||||||
|
}.Build()
|
||||||
|
File_test_objects_proto = out.File
|
||||||
|
file_test_objects_proto_rawDesc = nil
|
||||||
|
file_test_objects_proto_goTypes = nil
|
||||||
|
file_test_objects_proto_depIdxs = nil
|
||||||
|
}
|
||||||
30
internal/testing/jsonpb_test_proto/test_objects.proto
Normal file
30
internal/testing/jsonpb_test_proto/test_objects.proto
Normal file
@@ -0,0 +1,30 @@
|
|||||||
|
syntax = "proto2";
|
||||||
|
|
||||||
|
import "google/protobuf/any.proto";
|
||||||
|
import "google/protobuf/duration.proto";
|
||||||
|
import "google/protobuf/struct.proto";
|
||||||
|
import "google/protobuf/timestamp.proto";
|
||||||
|
import "google/protobuf/wrappers.proto";
|
||||||
|
|
||||||
|
package jsonpb;
|
||||||
|
|
||||||
|
option go_package=".;jsonpb";
|
||||||
|
|
||||||
|
message KnownTypes {
|
||||||
|
optional google.protobuf.Any an = 14;
|
||||||
|
optional google.protobuf.Duration dur = 1;
|
||||||
|
optional google.protobuf.Struct st = 12;
|
||||||
|
optional google.protobuf.Timestamp ts = 2;
|
||||||
|
optional google.protobuf.ListValue lv = 15;
|
||||||
|
optional google.protobuf.Value val = 16;
|
||||||
|
|
||||||
|
optional google.protobuf.DoubleValue dbl = 3;
|
||||||
|
optional google.protobuf.FloatValue flt = 4;
|
||||||
|
optional google.protobuf.Int64Value i64 = 5;
|
||||||
|
optional google.protobuf.UInt64Value u64 = 6;
|
||||||
|
optional google.protobuf.Int32Value i32 = 7;
|
||||||
|
optional google.protobuf.UInt32Value u32 = 8;
|
||||||
|
optional google.protobuf.BoolValue bool = 9;
|
||||||
|
optional google.protobuf.StringValue str = 10;
|
||||||
|
optional google.protobuf.BytesValue bytes = 11;
|
||||||
|
}
|
||||||
1522
internal/testing/test.pb.go
Normal file
1522
internal/testing/test.pb.go
Normal file
File diff suppressed because it is too large
Load Diff
@@ -18,7 +18,9 @@
|
|||||||
// of unary/streaming requests/responses.
|
// of unary/streaming requests/responses.
|
||||||
syntax = "proto3";
|
syntax = "proto3";
|
||||||
|
|
||||||
package grpc.testing;
|
package testing;
|
||||||
|
|
||||||
|
option go_package = ".;testing";
|
||||||
|
|
||||||
message Empty {}
|
message Empty {}
|
||||||
|
|
||||||
@@ -172,5 +174,5 @@ service TestService {
|
|||||||
// that case.
|
// that case.
|
||||||
service UnimplementedService {
|
service UnimplementedService {
|
||||||
// A call that no server should implement
|
// A call that no server should implement
|
||||||
rpc UnimplementedCall(grpc.testing.Empty) returns (grpc.testing.Empty);
|
rpc UnimplementedCall(Empty) returns (Empty);
|
||||||
}
|
}
|
||||||
BIN
internal/testing/test.protoset
Normal file
BIN
internal/testing/test.protoset
Normal file
Binary file not shown.
@@ -1,14 +1,17 @@
|
|||||||
package testing
|
package testing
|
||||||
|
|
||||||
|
//go:generate protoc --go_out=plugins=grpc:./ test.proto
|
||||||
|
//go:generate protoc --descriptor_set_out=./test.protoset test.proto
|
||||||
|
//go:generate protoc --descriptor_set_out=./example.protoset --include_imports example.proto
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"context"
|
||||||
"io"
|
"io"
|
||||||
"strconv"
|
"strconv"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"golang.org/x/net/context"
|
|
||||||
"google.golang.org/grpc"
|
"google.golang.org/grpc"
|
||||||
"google.golang.org/grpc/codes"
|
"google.golang.org/grpc/codes"
|
||||||
"google.golang.org/grpc/interop/grpc_testing"
|
|
||||||
"google.golang.org/grpc/metadata"
|
"google.golang.org/grpc/metadata"
|
||||||
"google.golang.org/grpc/status"
|
"google.golang.org/grpc/status"
|
||||||
|
|
||||||
@@ -19,7 +22,7 @@ import (
|
|||||||
type TestServer struct{}
|
type TestServer struct{}
|
||||||
|
|
||||||
// EmptyCall accepts one empty request and issues one empty response.
|
// EmptyCall accepts one empty request and issues one empty response.
|
||||||
func (TestServer) EmptyCall(ctx context.Context, req *grpc_testing.Empty) (*grpc_testing.Empty, error) {
|
func (TestServer) EmptyCall(ctx context.Context, req *Empty) (*Empty, error) {
|
||||||
headers, trailers, failEarly, failLate := processMetadata(ctx)
|
headers, trailers, failEarly, failLate := processMetadata(ctx)
|
||||||
grpc.SetHeader(ctx, headers)
|
grpc.SetHeader(ctx, headers)
|
||||||
grpc.SetTrailer(ctx, trailers)
|
grpc.SetTrailer(ctx, trailers)
|
||||||
@@ -35,7 +38,7 @@ func (TestServer) EmptyCall(ctx context.Context, req *grpc_testing.Empty) (*grpc
|
|||||||
|
|
||||||
// UnaryCall accepts one request and issues one response. The response includes
|
// UnaryCall accepts one request and issues one response. The response includes
|
||||||
// the client's payload as-is.
|
// the client's payload as-is.
|
||||||
func (TestServer) UnaryCall(ctx context.Context, req *grpc_testing.SimpleRequest) (*grpc_testing.SimpleResponse, error) {
|
func (TestServer) UnaryCall(ctx context.Context, req *SimpleRequest) (*SimpleResponse, error) {
|
||||||
headers, trailers, failEarly, failLate := processMetadata(ctx)
|
headers, trailers, failEarly, failLate := processMetadata(ctx)
|
||||||
grpc.SetHeader(ctx, headers)
|
grpc.SetHeader(ctx, headers)
|
||||||
grpc.SetTrailer(ctx, trailers)
|
grpc.SetTrailer(ctx, trailers)
|
||||||
@@ -46,7 +49,7 @@ func (TestServer) UnaryCall(ctx context.Context, req *grpc_testing.SimpleRequest
|
|||||||
return nil, status.Error(failLate, "fail")
|
return nil, status.Error(failLate, "fail")
|
||||||
}
|
}
|
||||||
|
|
||||||
return &grpc_testing.SimpleResponse{
|
return &SimpleResponse{
|
||||||
Payload: req.Payload,
|
Payload: req.Payload,
|
||||||
}, nil
|
}, nil
|
||||||
}
|
}
|
||||||
@@ -54,7 +57,7 @@ func (TestServer) UnaryCall(ctx context.Context, req *grpc_testing.SimpleRequest
|
|||||||
// StreamingOutputCall accepts one request and issues a sequence of responses
|
// StreamingOutputCall accepts one request and issues a sequence of responses
|
||||||
// (streamed download). The server returns the payload with client desired type
|
// (streamed download). The server returns the payload with client desired type
|
||||||
// and sizes as specified in the request's ResponseParameters.
|
// and sizes as specified in the request's ResponseParameters.
|
||||||
func (TestServer) StreamingOutputCall(req *grpc_testing.StreamingOutputCallRequest, str grpc_testing.TestService_StreamingOutputCallServer) error {
|
func (TestServer) StreamingOutputCall(req *StreamingOutputCallRequest, str TestService_StreamingOutputCallServer) error {
|
||||||
headers, trailers, failEarly, failLate := processMetadata(str.Context())
|
headers, trailers, failEarly, failLate := processMetadata(str.Context())
|
||||||
str.SetHeader(headers)
|
str.SetHeader(headers)
|
||||||
str.SetTrailer(trailers)
|
str.SetTrailer(trailers)
|
||||||
@@ -62,7 +65,7 @@ func (TestServer) StreamingOutputCall(req *grpc_testing.StreamingOutputCallReque
|
|||||||
return status.Error(failEarly, "fail")
|
return status.Error(failEarly, "fail")
|
||||||
}
|
}
|
||||||
|
|
||||||
rsp := &grpc_testing.StreamingOutputCallResponse{Payload: &grpc_testing.Payload{}}
|
rsp := &StreamingOutputCallResponse{Payload: &Payload{}}
|
||||||
for _, param := range req.ResponseParameters {
|
for _, param := range req.ResponseParameters {
|
||||||
if str.Context().Err() != nil {
|
if str.Context().Err() != nil {
|
||||||
return str.Context().Err()
|
return str.Context().Err()
|
||||||
@@ -92,7 +95,7 @@ func (TestServer) StreamingOutputCall(req *grpc_testing.StreamingOutputCallReque
|
|||||||
// StreamingInputCall accepts a sequence of requests and issues one response
|
// StreamingInputCall accepts a sequence of requests and issues one response
|
||||||
// (streamed upload). The server returns the aggregated size of client payloads
|
// (streamed upload). The server returns the aggregated size of client payloads
|
||||||
// as the result.
|
// as the result.
|
||||||
func (TestServer) StreamingInputCall(str grpc_testing.TestService_StreamingInputCallServer) error {
|
func (TestServer) StreamingInputCall(str TestService_StreamingInputCallServer) error {
|
||||||
headers, trailers, failEarly, failLate := processMetadata(str.Context())
|
headers, trailers, failEarly, failLate := processMetadata(str.Context())
|
||||||
str.SetHeader(headers)
|
str.SetHeader(headers)
|
||||||
str.SetTrailer(trailers)
|
str.SetTrailer(trailers)
|
||||||
@@ -114,7 +117,7 @@ func (TestServer) StreamingInputCall(str grpc_testing.TestService_StreamingInput
|
|||||||
sz += len(req.Payload.Body)
|
sz += len(req.Payload.Body)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if err := str.SendAndClose(&grpc_testing.StreamingInputCallResponse{AggregatedPayloadSize: int32(sz)}); err != nil {
|
if err := str.SendAndClose(&StreamingInputCallResponse{AggregatedPayloadSize: int32(sz)}); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -127,7 +130,7 @@ func (TestServer) StreamingInputCall(str grpc_testing.TestService_StreamingInput
|
|||||||
// FullDuplexCall accepts a sequence of requests with each request served by the
|
// FullDuplexCall accepts a sequence of requests with each request served by the
|
||||||
// server immediately. As one request could lead to multiple responses, this
|
// server immediately. As one request could lead to multiple responses, this
|
||||||
// interface demonstrates the idea of full duplexing.
|
// interface demonstrates the idea of full duplexing.
|
||||||
func (TestServer) FullDuplexCall(str grpc_testing.TestService_FullDuplexCallServer) error {
|
func (TestServer) FullDuplexCall(str TestService_FullDuplexCallServer) error {
|
||||||
headers, trailers, failEarly, failLate := processMetadata(str.Context())
|
headers, trailers, failEarly, failLate := processMetadata(str.Context())
|
||||||
str.SetHeader(headers)
|
str.SetHeader(headers)
|
||||||
str.SetTrailer(trailers)
|
str.SetTrailer(trailers)
|
||||||
@@ -135,7 +138,7 @@ func (TestServer) FullDuplexCall(str grpc_testing.TestService_FullDuplexCallServ
|
|||||||
return status.Error(failEarly, "fail")
|
return status.Error(failEarly, "fail")
|
||||||
}
|
}
|
||||||
|
|
||||||
rsp := &grpc_testing.StreamingOutputCallResponse{Payload: &grpc_testing.Payload{}}
|
rsp := &StreamingOutputCallResponse{Payload: &Payload{}}
|
||||||
for {
|
for {
|
||||||
if str.Context().Err() != nil {
|
if str.Context().Err() != nil {
|
||||||
return str.Context().Err()
|
return str.Context().Err()
|
||||||
@@ -170,7 +173,7 @@ func (TestServer) FullDuplexCall(str grpc_testing.TestService_FullDuplexCallServ
|
|||||||
// responses. The server buffers all the client requests and then serves them
|
// responses. The server buffers all the client requests and then serves them
|
||||||
// in order. A stream of responses is returned to the client once the client
|
// in order. A stream of responses is returned to the client once the client
|
||||||
// half-closes the stream.
|
// half-closes the stream.
|
||||||
func (TestServer) HalfDuplexCall(str grpc_testing.TestService_HalfDuplexCallServer) error {
|
func (TestServer) HalfDuplexCall(str TestService_HalfDuplexCallServer) error {
|
||||||
headers, trailers, failEarly, failLate := processMetadata(str.Context())
|
headers, trailers, failEarly, failLate := processMetadata(str.Context())
|
||||||
str.SetHeader(headers)
|
str.SetHeader(headers)
|
||||||
str.SetTrailer(trailers)
|
str.SetTrailer(trailers)
|
||||||
@@ -178,7 +181,7 @@ func (TestServer) HalfDuplexCall(str grpc_testing.TestService_HalfDuplexCallServ
|
|||||||
return status.Error(failEarly, "fail")
|
return status.Error(failEarly, "fail")
|
||||||
}
|
}
|
||||||
|
|
||||||
var reqs []*grpc_testing.StreamingOutputCallRequest
|
var reqs []*StreamingOutputCallRequest
|
||||||
for {
|
for {
|
||||||
if str.Context().Err() != nil {
|
if str.Context().Err() != nil {
|
||||||
return str.Context().Err()
|
return str.Context().Err()
|
||||||
@@ -192,7 +195,7 @@ func (TestServer) HalfDuplexCall(str grpc_testing.TestService_HalfDuplexCallServ
|
|||||||
reqs = append(reqs, req)
|
reqs = append(reqs, req)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
rsp := &grpc_testing.StreamingOutputCallResponse{}
|
rsp := &StreamingOutputCallResponse{}
|
||||||
for _, req := range reqs {
|
for _, req := range reqs {
|
||||||
rsp.Payload = req.Payload
|
rsp.Payload = req.Payload
|
||||||
if err := str.Send(rsp); err != nil {
|
if err := str.Send(rsp); err != nil {
|
||||||
@@ -251,4 +254,4 @@ func toCode(vals []string) codes.Code {
|
|||||||
return codes.Code(i)
|
return codes.Code(i)
|
||||||
}
|
}
|
||||||
|
|
||||||
var _ grpc_testing.TestServiceServer = TestServer{}
|
var _ TestServiceServer = TestServer{}
|
||||||
16
invoke.go
16
invoke.go
@@ -2,19 +2,19 @@ package grpcurl
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
|
"context"
|
||||||
"fmt"
|
"fmt"
|
||||||
"io"
|
"io"
|
||||||
"strings"
|
"strings"
|
||||||
"sync"
|
"sync"
|
||||||
"sync/atomic"
|
"sync/atomic"
|
||||||
|
|
||||||
"github.com/golang/protobuf/jsonpb"
|
"github.com/golang/protobuf/jsonpb" //lint:ignore SA1019 we have to import this because it appears in exported API
|
||||||
"github.com/golang/protobuf/proto"
|
"github.com/golang/protobuf/proto" //lint:ignore SA1019 we have to import this because it appears in exported API
|
||||||
"github.com/jhump/protoreflect/desc"
|
"github.com/jhump/protoreflect/desc"
|
||||||
"github.com/jhump/protoreflect/dynamic"
|
"github.com/jhump/protoreflect/dynamic"
|
||||||
"github.com/jhump/protoreflect/dynamic/grpcdynamic"
|
"github.com/jhump/protoreflect/dynamic/grpcdynamic"
|
||||||
"github.com/jhump/protoreflect/grpcreflect"
|
"github.com/jhump/protoreflect/grpcreflect"
|
||||||
"golang.org/x/net/context"
|
|
||||||
"google.golang.org/grpc"
|
"google.golang.org/grpc"
|
||||||
"google.golang.org/grpc/codes"
|
"google.golang.org/grpc/codes"
|
||||||
"google.golang.org/grpc/metadata"
|
"google.golang.org/grpc/metadata"
|
||||||
@@ -93,9 +93,17 @@ func InvokeRPC(ctx context.Context, source DescriptorSource, ch grpcdynamic.Chan
|
|||||||
if svc == "" || mth == "" {
|
if svc == "" || mth == "" {
|
||||||
return fmt.Errorf("given method name %q is not in expected format: 'service/method' or 'service.method'", methodName)
|
return fmt.Errorf("given method name %q is not in expected format: 'service/method' or 'service.method'", methodName)
|
||||||
}
|
}
|
||||||
|
|
||||||
dsc, err := source.FindSymbol(svc)
|
dsc, err := source.FindSymbol(svc)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
if isNotFoundError(err) {
|
// return a gRPC status error if hasStatus is true
|
||||||
|
errStatus, hasStatus := status.FromError(err)
|
||||||
|
switch {
|
||||||
|
case hasStatus && isNotFoundError(err):
|
||||||
|
return status.Errorf(errStatus.Code(), "target server does not expose service %q: %s", svc, errStatus.Message())
|
||||||
|
case hasStatus:
|
||||||
|
return status.Errorf(errStatus.Code(), "failed to query for service descriptor %q: %s", svc, errStatus.Message())
|
||||||
|
case isNotFoundError(err):
|
||||||
return fmt.Errorf("target server does not expose service %q", svc)
|
return fmt.Errorf("target server does not expose service %q", svc)
|
||||||
}
|
}
|
||||||
return fmt.Errorf("failed to query for service descriptor %q: %v", svc, err)
|
return fmt.Errorf("failed to query for service descriptor %q: %v", svc, err)
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -1,215 +0,0 @@
|
|||||||
// Code generated by protoc-gen-go. DO NOT EDIT.
|
|
||||||
// source: testing/jsonpb_test_proto/test_objects.proto
|
|
||||||
|
|
||||||
package jsonpb
|
|
||||||
|
|
||||||
import (
|
|
||||||
fmt "fmt"
|
|
||||||
proto "github.com/golang/protobuf/proto"
|
|
||||||
any "github.com/golang/protobuf/ptypes/any"
|
|
||||||
duration "github.com/golang/protobuf/ptypes/duration"
|
|
||||||
_struct "github.com/golang/protobuf/ptypes/struct"
|
|
||||||
timestamp "github.com/golang/protobuf/ptypes/timestamp"
|
|
||||||
wrappers "github.com/golang/protobuf/ptypes/wrappers"
|
|
||||||
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
|
|
||||||
|
|
||||||
type KnownTypes struct {
|
|
||||||
An *any.Any `protobuf:"bytes,14,opt,name=an" json:"an,omitempty"`
|
|
||||||
Dur *duration.Duration `protobuf:"bytes,1,opt,name=dur" json:"dur,omitempty"`
|
|
||||||
St *_struct.Struct `protobuf:"bytes,12,opt,name=st" json:"st,omitempty"`
|
|
||||||
Ts *timestamp.Timestamp `protobuf:"bytes,2,opt,name=ts" json:"ts,omitempty"`
|
|
||||||
Lv *_struct.ListValue `protobuf:"bytes,15,opt,name=lv" json:"lv,omitempty"`
|
|
||||||
Val *_struct.Value `protobuf:"bytes,16,opt,name=val" json:"val,omitempty"`
|
|
||||||
Dbl *wrappers.DoubleValue `protobuf:"bytes,3,opt,name=dbl" json:"dbl,omitempty"`
|
|
||||||
Flt *wrappers.FloatValue `protobuf:"bytes,4,opt,name=flt" json:"flt,omitempty"`
|
|
||||||
I64 *wrappers.Int64Value `protobuf:"bytes,5,opt,name=i64" json:"i64,omitempty"`
|
|
||||||
U64 *wrappers.UInt64Value `protobuf:"bytes,6,opt,name=u64" json:"u64,omitempty"`
|
|
||||||
I32 *wrappers.Int32Value `protobuf:"bytes,7,opt,name=i32" json:"i32,omitempty"`
|
|
||||||
U32 *wrappers.UInt32Value `protobuf:"bytes,8,opt,name=u32" json:"u32,omitempty"`
|
|
||||||
Bool *wrappers.BoolValue `protobuf:"bytes,9,opt,name=bool" json:"bool,omitempty"`
|
|
||||||
Str *wrappers.StringValue `protobuf:"bytes,10,opt,name=str" json:"str,omitempty"`
|
|
||||||
Bytes *wrappers.BytesValue `protobuf:"bytes,11,opt,name=bytes" json:"bytes,omitempty"`
|
|
||||||
XXX_NoUnkeyedLiteral struct{} `json:"-"`
|
|
||||||
XXX_unrecognized []byte `json:"-"`
|
|
||||||
XXX_sizecache int32 `json:"-"`
|
|
||||||
}
|
|
||||||
|
|
||||||
func (m *KnownTypes) Reset() { *m = KnownTypes{} }
|
|
||||||
func (m *KnownTypes) String() string { return proto.CompactTextString(m) }
|
|
||||||
func (*KnownTypes) ProtoMessage() {}
|
|
||||||
func (*KnownTypes) Descriptor() ([]byte, []int) {
|
|
||||||
return fileDescriptor_ab4422ec10550c41, []int{0}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (m *KnownTypes) XXX_Unmarshal(b []byte) error {
|
|
||||||
return xxx_messageInfo_KnownTypes.Unmarshal(m, b)
|
|
||||||
}
|
|
||||||
func (m *KnownTypes) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
|
|
||||||
return xxx_messageInfo_KnownTypes.Marshal(b, m, deterministic)
|
|
||||||
}
|
|
||||||
func (m *KnownTypes) XXX_Merge(src proto.Message) {
|
|
||||||
xxx_messageInfo_KnownTypes.Merge(m, src)
|
|
||||||
}
|
|
||||||
func (m *KnownTypes) XXX_Size() int {
|
|
||||||
return xxx_messageInfo_KnownTypes.Size(m)
|
|
||||||
}
|
|
||||||
func (m *KnownTypes) XXX_DiscardUnknown() {
|
|
||||||
xxx_messageInfo_KnownTypes.DiscardUnknown(m)
|
|
||||||
}
|
|
||||||
|
|
||||||
var xxx_messageInfo_KnownTypes proto.InternalMessageInfo
|
|
||||||
|
|
||||||
func (m *KnownTypes) GetAn() *any.Any {
|
|
||||||
if m != nil {
|
|
||||||
return m.An
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (m *KnownTypes) GetDur() *duration.Duration {
|
|
||||||
if m != nil {
|
|
||||||
return m.Dur
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (m *KnownTypes) GetSt() *_struct.Struct {
|
|
||||||
if m != nil {
|
|
||||||
return m.St
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (m *KnownTypes) GetTs() *timestamp.Timestamp {
|
|
||||||
if m != nil {
|
|
||||||
return m.Ts
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (m *KnownTypes) GetLv() *_struct.ListValue {
|
|
||||||
if m != nil {
|
|
||||||
return m.Lv
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (m *KnownTypes) GetVal() *_struct.Value {
|
|
||||||
if m != nil {
|
|
||||||
return m.Val
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (m *KnownTypes) GetDbl() *wrappers.DoubleValue {
|
|
||||||
if m != nil {
|
|
||||||
return m.Dbl
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (m *KnownTypes) GetFlt() *wrappers.FloatValue {
|
|
||||||
if m != nil {
|
|
||||||
return m.Flt
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (m *KnownTypes) GetI64() *wrappers.Int64Value {
|
|
||||||
if m != nil {
|
|
||||||
return m.I64
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (m *KnownTypes) GetU64() *wrappers.UInt64Value {
|
|
||||||
if m != nil {
|
|
||||||
return m.U64
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (m *KnownTypes) GetI32() *wrappers.Int32Value {
|
|
||||||
if m != nil {
|
|
||||||
return m.I32
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (m *KnownTypes) GetU32() *wrappers.UInt32Value {
|
|
||||||
if m != nil {
|
|
||||||
return m.U32
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (m *KnownTypes) GetBool() *wrappers.BoolValue {
|
|
||||||
if m != nil {
|
|
||||||
return m.Bool
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (m *KnownTypes) GetStr() *wrappers.StringValue {
|
|
||||||
if m != nil {
|
|
||||||
return m.Str
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (m *KnownTypes) GetBytes() *wrappers.BytesValue {
|
|
||||||
if m != nil {
|
|
||||||
return m.Bytes
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func init() {
|
|
||||||
proto.RegisterType((*KnownTypes)(nil), "jsonpb.KnownTypes")
|
|
||||||
}
|
|
||||||
|
|
||||||
func init() {
|
|
||||||
proto.RegisterFile("testing/jsonpb_test_proto/test_objects.proto", fileDescriptor_ab4422ec10550c41)
|
|
||||||
}
|
|
||||||
|
|
||||||
var fileDescriptor_ab4422ec10550c41 = []byte{
|
|
||||||
// 402 bytes of a gzipped FileDescriptorProto
|
|
||||||
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0xd0, 0xdf, 0x6b, 0xd5, 0x30,
|
|
||||||
0x14, 0x07, 0x70, 0x96, 0xee, 0x4e, 0xcd, 0x44, 0x25, 0x88, 0x66, 0xd7, 0xa1, 0x22, 0x82, 0xc3,
|
|
||||||
0x1f, 0x2d, 0xb6, 0xa5, 0xef, 0x0e, 0x11, 0x44, 0x9f, 0xba, 0xe9, 0xeb, 0x48, 0xd6, 0xac, 0x74,
|
|
||||||
0x64, 0x49, 0x49, 0x4e, 0xee, 0xe8, 0xbf, 0xe6, 0x5f, 0x27, 0x49, 0x73, 0x45, 0x6e, 0xc9, 0xde,
|
|
||||||
0xee, 0xcd, 0xf7, 0x73, 0xbe, 0x9c, 0x53, 0xfc, 0x11, 0x84, 0x85, 0x41, 0xf5, 0xc5, 0xb5, 0xd5,
|
|
||||||
0x6a, 0xe4, 0x17, 0xfe, 0xef, 0xc5, 0x68, 0x34, 0xe8, 0x22, 0xfc, 0xd4, 0xfc, 0x5a, 0x5c, 0x82,
|
|
||||||
0xcd, 0xc3, 0x13, 0x39, 0x98, 0xd5, 0xfa, 0xa8, 0xd7, 0xba, 0x97, 0xa2, 0x08, 0xaf, 0xdc, 0x5d,
|
|
||||||
0x15, 0x4c, 0x4d, 0x33, 0x59, 0xbf, 0xdc, 0x8d, 0x3a, 0x67, 0x18, 0x0c, 0x5a, 0xc5, 0xfc, 0x78,
|
|
||||||
0x37, 0xb7, 0x60, 0xdc, 0x25, 0xc4, 0xf4, 0xd5, 0x6e, 0x0a, 0xc3, 0x8d, 0xb0, 0xc0, 0x6e, 0xc6,
|
|
||||||
0x54, 0xfd, 0xad, 0x61, 0xe3, 0x28, 0x4c, 0xdc, 0xf0, 0xcd, 0x9f, 0x15, 0xc6, 0x3f, 0x94, 0xbe,
|
|
||||||
0x55, 0xe7, 0xd3, 0x28, 0x2c, 0x79, 0x8b, 0x11, 0x53, 0xf4, 0xd1, 0xeb, 0xbd, 0x93, 0xc3, 0xf2,
|
|
||||||
0x69, 0x3e, 0xcf, 0xe6, 0xdb, 0xd9, 0xfc, 0x8b, 0x9a, 0x5a, 0xc4, 0x14, 0xf9, 0x80, 0xb3, 0xce,
|
|
||||||
0x19, 0xba, 0x17, 0xd8, 0xd1, 0x82, 0x7d, 0x8d, 0x17, 0xb4, 0x5e, 0x91, 0x77, 0x18, 0x59, 0xa0,
|
|
||||||
0x0f, 0x83, 0x7d, 0xbe, 0xb0, 0x67, 0xe1, 0x9a, 0x16, 0x59, 0x20, 0xef, 0x31, 0x02, 0x4b, 0x51,
|
|
||||||
0x80, 0xeb, 0x05, 0x3c, 0xdf, 0x1e, 0xd6, 0x22, 0xb0, 0xde, 0xca, 0x0d, 0x7d, 0x9c, 0xb0, 0x3f,
|
|
||||||
0x07, 0x0b, 0xbf, 0x99, 0x74, 0xa2, 0x45, 0x72, 0x43, 0x4e, 0x70, 0xb6, 0x61, 0x92, 0x3e, 0x09,
|
|
||||||
0xf8, 0xd9, 0x02, 0xcf, 0xd0, 0x13, 0x92, 0xe3, 0xac, 0xe3, 0x92, 0x66, 0x41, 0x1e, 0x2f, 0xef,
|
|
||||||
0xd2, 0x8e, 0x4b, 0x11, 0x7d, 0xc7, 0x25, 0xf9, 0x84, 0xb3, 0x2b, 0x09, 0x74, 0x3f, 0xf8, 0x17,
|
|
||||||
0x0b, 0xff, 0x4d, 0x6a, 0x16, 0xf7, 0xf0, 0xce, 0xf3, 0xa1, 0xa9, 0xe9, 0x2a, 0xc1, 0xbf, 0x2b,
|
|
||||||
0x68, 0xea, 0xc8, 0x87, 0xa6, 0xf6, 0xdb, 0xb8, 0xa6, 0xa6, 0x07, 0x89, 0x6d, 0x7e, 0xfd, 0xef,
|
|
||||||
0x5d, 0x53, 0x87, 0xfa, 0xaa, 0xa4, 0xf7, 0xd2, 0xf5, 0x55, 0xb9, 0xad, 0xaf, 0xca, 0x50, 0x5f,
|
|
||||||
0x95, 0xf4, 0xfe, 0x1d, 0xf5, 0xff, 0xbc, 0x0b, 0x7e, 0x9f, 0x6b, 0x2d, 0xe9, 0x83, 0xc4, 0x47,
|
|
||||||
0x3f, 0xd5, 0x5a, 0xce, 0x3c, 0x38, 0xdf, 0x6f, 0xc1, 0x50, 0x9c, 0xe8, 0x3f, 0x03, 0x33, 0xa8,
|
|
||||||
0x3e, 0xf6, 0x5b, 0x30, 0xe4, 0x33, 0x5e, 0xf1, 0x09, 0x84, 0xa5, 0x87, 0x89, 0x03, 0x4e, 0x7d,
|
|
||||||
0x3a, 0x0f, 0xcc, 0xf2, 0x6f, 0x00, 0x00, 0x00, 0xff, 0xff, 0xab, 0x65, 0x99, 0x5a, 0x8d, 0x03,
|
|
||||||
0x00, 0x00,
|
|
||||||
}
|
|
||||||
@@ -1,59 +0,0 @@
|
|||||||
// Go support for Protocol Buffers - Google's data interchange format
|
|
||||||
//
|
|
||||||
// Copyright 2015 The Go Authors. All rights reserved.
|
|
||||||
// https://github.com/golang/protobuf
|
|
||||||
//
|
|
||||||
// Redistribution and use in source and binary forms, with or without
|
|
||||||
// modification, are permitted provided that the following conditions are
|
|
||||||
// met:
|
|
||||||
//
|
|
||||||
// * Redistributions of source code must retain the above copyright
|
|
||||||
// notice, this list of conditions and the following disclaimer.
|
|
||||||
// * Redistributions in binary form must reproduce the above
|
|
||||||
// copyright notice, this list of conditions and the following disclaimer
|
|
||||||
// in the documentation and/or other materials provided with the
|
|
||||||
// distribution.
|
|
||||||
// * Neither the name of Google Inc. nor the names of its
|
|
||||||
// contributors may be used to endorse or promote products derived from
|
|
||||||
// this software without specific prior written permission.
|
|
||||||
//
|
|
||||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
||||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
||||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
||||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
||||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
||||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
||||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
||||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
||||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
|
|
||||||
syntax = "proto2";
|
|
||||||
|
|
||||||
import "google/protobuf/any.proto";
|
|
||||||
import "google/protobuf/duration.proto";
|
|
||||||
import "google/protobuf/struct.proto";
|
|
||||||
import "google/protobuf/timestamp.proto";
|
|
||||||
import "google/protobuf/wrappers.proto";
|
|
||||||
|
|
||||||
package jsonpb;
|
|
||||||
|
|
||||||
message KnownTypes {
|
|
||||||
optional google.protobuf.Any an = 14;
|
|
||||||
optional google.protobuf.Duration dur = 1;
|
|
||||||
optional google.protobuf.Struct st = 12;
|
|
||||||
optional google.protobuf.Timestamp ts = 2;
|
|
||||||
optional google.protobuf.ListValue lv = 15;
|
|
||||||
optional google.protobuf.Value val = 16;
|
|
||||||
|
|
||||||
optional google.protobuf.DoubleValue dbl = 3;
|
|
||||||
optional google.protobuf.FloatValue flt = 4;
|
|
||||||
optional google.protobuf.Int64Value i64 = 5;
|
|
||||||
optional google.protobuf.UInt64Value u64 = 6;
|
|
||||||
optional google.protobuf.Int32Value i32 = 7;
|
|
||||||
optional google.protobuf.UInt32Value u32 = 8;
|
|
||||||
optional google.protobuf.BoolValue bool = 9;
|
|
||||||
optional google.protobuf.StringValue str = 10;
|
|
||||||
optional google.protobuf.BytesValue bytes = 11;
|
|
||||||
}
|
|
||||||
Binary file not shown.
@@ -1,19 +1,18 @@
|
|||||||
package grpcurl_test
|
package grpcurl_test
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"context"
|
||||||
"fmt"
|
"fmt"
|
||||||
"net"
|
"net"
|
||||||
"strings"
|
"strings"
|
||||||
"testing"
|
"testing"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"golang.org/x/net/context"
|
|
||||||
"google.golang.org/grpc"
|
"google.golang.org/grpc"
|
||||||
"google.golang.org/grpc/credentials"
|
"google.golang.org/grpc/credentials"
|
||||||
"google.golang.org/grpc/interop/grpc_testing"
|
|
||||||
|
|
||||||
. "github.com/fullstorydev/grpcurl"
|
. "github.com/fullstorydev/grpcurl"
|
||||||
grpcurl_testing "github.com/fullstorydev/grpcurl/testing"
|
grpcurl_testing "github.com/fullstorydev/grpcurl/internal/testing"
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestPlainText(t *testing.T) {
|
func TestPlainText(t *testing.T) {
|
||||||
@@ -27,11 +26,11 @@ func TestPlainText(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func TestBasicTLS(t *testing.T) {
|
func TestBasicTLS(t *testing.T) {
|
||||||
serverCreds, err := ServerTransportCredentials("", "testing/tls/server.crt", "testing/tls/server.key", false)
|
serverCreds, err := ServerTransportCredentials("", "internal/testing/tls/server.crt", "internal/testing/tls/server.key", false)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatalf("failed to create server creds: %v", err)
|
t.Fatalf("failed to create server creds: %v", err)
|
||||||
}
|
}
|
||||||
clientCreds, err := ClientTransportCredentials(false, "testing/tls/ca.crt", "", "")
|
clientCreds, err := ClientTransportCredentials(false, "internal/testing/tls/ca.crt", "", "")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatalf("failed to create server creds: %v", err)
|
t.Fatalf("failed to create server creds: %v", err)
|
||||||
}
|
}
|
||||||
@@ -46,7 +45,7 @@ func TestBasicTLS(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func TestInsecureClientTLS(t *testing.T) {
|
func TestInsecureClientTLS(t *testing.T) {
|
||||||
serverCreds, err := ServerTransportCredentials("", "testing/tls/server.crt", "testing/tls/server.key", false)
|
serverCreds, err := ServerTransportCredentials("", "internal/testing/tls/server.crt", "internal/testing/tls/server.key", false)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatalf("failed to create server creds: %v", err)
|
t.Fatalf("failed to create server creds: %v", err)
|
||||||
}
|
}
|
||||||
@@ -65,11 +64,11 @@ func TestInsecureClientTLS(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func TestClientCertTLS(t *testing.T) {
|
func TestClientCertTLS(t *testing.T) {
|
||||||
serverCreds, err := ServerTransportCredentials("testing/tls/ca.crt", "testing/tls/server.crt", "testing/tls/server.key", false)
|
serverCreds, err := ServerTransportCredentials("internal/testing/tls/ca.crt", "internal/testing/tls/server.crt", "internal/testing/tls/server.key", false)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatalf("failed to create server creds: %v", err)
|
t.Fatalf("failed to create server creds: %v", err)
|
||||||
}
|
}
|
||||||
clientCreds, err := ClientTransportCredentials(false, "testing/tls/ca.crt", "testing/tls/client.crt", "testing/tls/client.key")
|
clientCreds, err := ClientTransportCredentials(false, "internal/testing/tls/ca.crt", "internal/testing/tls/client.crt", "internal/testing/tls/client.key")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatalf("failed to create server creds: %v", err)
|
t.Fatalf("failed to create server creds: %v", err)
|
||||||
}
|
}
|
||||||
@@ -84,11 +83,11 @@ func TestClientCertTLS(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func TestRequireClientCertTLS(t *testing.T) {
|
func TestRequireClientCertTLS(t *testing.T) {
|
||||||
serverCreds, err := ServerTransportCredentials("testing/tls/ca.crt", "testing/tls/server.crt", "testing/tls/server.key", true)
|
serverCreds, err := ServerTransportCredentials("internal/testing/tls/ca.crt", "internal/testing/tls/server.crt", "internal/testing/tls/server.key", true)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatalf("failed to create server creds: %v", err)
|
t.Fatalf("failed to create server creds: %v", err)
|
||||||
}
|
}
|
||||||
clientCreds, err := ClientTransportCredentials(false, "testing/tls/ca.crt", "testing/tls/client.crt", "testing/tls/client.key")
|
clientCreds, err := ClientTransportCredentials(false, "internal/testing/tls/ca.crt", "internal/testing/tls/client.crt", "internal/testing/tls/client.key")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatalf("failed to create server creds: %v", err)
|
t.Fatalf("failed to create server creds: %v", err)
|
||||||
}
|
}
|
||||||
@@ -103,7 +102,7 @@ func TestRequireClientCertTLS(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func TestBrokenTLS_ClientPlainText(t *testing.T) {
|
func TestBrokenTLS_ClientPlainText(t *testing.T) {
|
||||||
serverCreds, err := ServerTransportCredentials("", "testing/tls/server.crt", "testing/tls/server.key", false)
|
serverCreds, err := ServerTransportCredentials("", "internal/testing/tls/server.crt", "internal/testing/tls/server.key", false)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatalf("failed to create server creds: %v", err)
|
t.Fatalf("failed to create server creds: %v", err)
|
||||||
}
|
}
|
||||||
@@ -148,8 +147,8 @@ func TestBrokenTLS_ClientPlainText(t *testing.T) {
|
|||||||
|
|
||||||
// but request fails because server closes connection upon seeing request
|
// but request fails because server closes connection upon seeing request
|
||||||
// bytes that are not a TLS handshake
|
// bytes that are not a TLS handshake
|
||||||
cl := grpc_testing.NewTestServiceClient(e.cc)
|
cl := grpcurl_testing.NewTestServiceClient(e.cc)
|
||||||
_, err = cl.UnaryCall(context.Background(), &grpc_testing.SimpleRequest{})
|
_, err = cl.UnaryCall(context.Background(), &grpcurl_testing.SimpleRequest{})
|
||||||
if err == nil {
|
if err == nil {
|
||||||
t.Fatal("expecting failure")
|
t.Fatal("expecting failure")
|
||||||
}
|
}
|
||||||
@@ -164,7 +163,7 @@ func TestBrokenTLS_ClientPlainText(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func TestBrokenTLS_ServerPlainText(t *testing.T) {
|
func TestBrokenTLS_ServerPlainText(t *testing.T) {
|
||||||
clientCreds, err := ClientTransportCredentials(false, "testing/tls/ca.crt", "", "")
|
clientCreds, err := ClientTransportCredentials(false, "internal/testing/tls/ca.crt", "", "")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatalf("failed to create server creds: %v", err)
|
t.Fatalf("failed to create server creds: %v", err)
|
||||||
}
|
}
|
||||||
@@ -180,11 +179,11 @@ func TestBrokenTLS_ServerPlainText(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func TestBrokenTLS_ServerUsesWrongCert(t *testing.T) {
|
func TestBrokenTLS_ServerUsesWrongCert(t *testing.T) {
|
||||||
serverCreds, err := ServerTransportCredentials("", "testing/tls/other.crt", "testing/tls/other.key", false)
|
serverCreds, err := ServerTransportCredentials("", "internal/testing/tls/other.crt", "internal/testing/tls/other.key", false)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatalf("failed to create server creds: %v", err)
|
t.Fatalf("failed to create server creds: %v", err)
|
||||||
}
|
}
|
||||||
clientCreds, err := ClientTransportCredentials(false, "testing/tls/ca.crt", "", "")
|
clientCreds, err := ClientTransportCredentials(false, "internal/testing/tls/ca.crt", "", "")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatalf("failed to create server creds: %v", err)
|
t.Fatalf("failed to create server creds: %v", err)
|
||||||
}
|
}
|
||||||
@@ -200,11 +199,11 @@ func TestBrokenTLS_ServerUsesWrongCert(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func TestBrokenTLS_ClientHasExpiredCert(t *testing.T) {
|
func TestBrokenTLS_ClientHasExpiredCert(t *testing.T) {
|
||||||
serverCreds, err := ServerTransportCredentials("testing/tls/ca.crt", "testing/tls/server.crt", "testing/tls/server.key", false)
|
serverCreds, err := ServerTransportCredentials("internal/testing/tls/ca.crt", "internal/testing/tls/server.crt", "internal/testing/tls/server.key", false)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatalf("failed to create server creds: %v", err)
|
t.Fatalf("failed to create server creds: %v", err)
|
||||||
}
|
}
|
||||||
clientCreds, err := ClientTransportCredentials(false, "testing/tls/ca.crt", "testing/tls/expired.crt", "testing/tls/expired.key")
|
clientCreds, err := ClientTransportCredentials(false, "internal/testing/tls/ca.crt", "internal/testing/tls/expired.crt", "internal/testing/tls/expired.key")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatalf("failed to create server creds: %v", err)
|
t.Fatalf("failed to create server creds: %v", err)
|
||||||
}
|
}
|
||||||
@@ -220,11 +219,11 @@ func TestBrokenTLS_ClientHasExpiredCert(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func TestBrokenTLS_ServerHasExpiredCert(t *testing.T) {
|
func TestBrokenTLS_ServerHasExpiredCert(t *testing.T) {
|
||||||
serverCreds, err := ServerTransportCredentials("", "testing/tls/expired.crt", "testing/tls/expired.key", false)
|
serverCreds, err := ServerTransportCredentials("", "internal/testing/tls/expired.crt", "internal/testing/tls/expired.key", false)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatalf("failed to create server creds: %v", err)
|
t.Fatalf("failed to create server creds: %v", err)
|
||||||
}
|
}
|
||||||
clientCreds, err := ClientTransportCredentials(false, "testing/tls/ca.crt", "", "")
|
clientCreds, err := ClientTransportCredentials(false, "internal/testing/tls/ca.crt", "", "")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatalf("failed to create server creds: %v", err)
|
t.Fatalf("failed to create server creds: %v", err)
|
||||||
}
|
}
|
||||||
@@ -240,11 +239,11 @@ func TestBrokenTLS_ServerHasExpiredCert(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func TestBrokenTLS_ClientNotTrusted(t *testing.T) {
|
func TestBrokenTLS_ClientNotTrusted(t *testing.T) {
|
||||||
serverCreds, err := ServerTransportCredentials("testing/tls/ca.crt", "testing/tls/server.crt", "testing/tls/server.key", true)
|
serverCreds, err := ServerTransportCredentials("internal/testing/tls/ca.crt", "internal/testing/tls/server.crt", "internal/testing/tls/server.key", true)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatalf("failed to create server creds: %v", err)
|
t.Fatalf("failed to create server creds: %v", err)
|
||||||
}
|
}
|
||||||
clientCreds, err := ClientTransportCredentials(false, "testing/tls/ca.crt", "testing/tls/wrong-client.crt", "testing/tls/wrong-client.key")
|
clientCreds, err := ClientTransportCredentials(false, "internal/testing/tls/ca.crt", "internal/testing/tls/wrong-client.crt", "internal/testing/tls/wrong-client.key")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatalf("failed to create server creds: %v", err)
|
t.Fatalf("failed to create server creds: %v", err)
|
||||||
}
|
}
|
||||||
@@ -260,11 +259,11 @@ func TestBrokenTLS_ClientNotTrusted(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func TestBrokenTLS_ServerNotTrusted(t *testing.T) {
|
func TestBrokenTLS_ServerNotTrusted(t *testing.T) {
|
||||||
serverCreds, err := ServerTransportCredentials("", "testing/tls/server.crt", "testing/tls/server.key", false)
|
serverCreds, err := ServerTransportCredentials("", "internal/testing/tls/server.crt", "internal/testing/tls/server.key", false)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatalf("failed to create server creds: %v", err)
|
t.Fatalf("failed to create server creds: %v", err)
|
||||||
}
|
}
|
||||||
clientCreds, err := ClientTransportCredentials(false, "", "testing/tls/client.crt", "testing/tls/client.key")
|
clientCreds, err := ClientTransportCredentials(false, "", "internal/testing/tls/client.crt", "internal/testing/tls/client.key")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatalf("failed to create server creds: %v", err)
|
t.Fatalf("failed to create server creds: %v", err)
|
||||||
}
|
}
|
||||||
@@ -280,11 +279,11 @@ func TestBrokenTLS_ServerNotTrusted(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func TestBrokenTLS_RequireClientCertButNonePresented(t *testing.T) {
|
func TestBrokenTLS_RequireClientCertButNonePresented(t *testing.T) {
|
||||||
serverCreds, err := ServerTransportCredentials("testing/tls/ca.crt", "testing/tls/server.crt", "testing/tls/server.key", true)
|
serverCreds, err := ServerTransportCredentials("internal/testing/tls/ca.crt", "internal/testing/tls/server.crt", "internal/testing/tls/server.key", true)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatalf("failed to create server creds: %v", err)
|
t.Fatalf("failed to create server creds: %v", err)
|
||||||
}
|
}
|
||||||
clientCreds, err := ClientTransportCredentials(false, "testing/tls/ca.crt", "", "")
|
clientCreds, err := ClientTransportCredentials(false, "internal/testing/tls/ca.crt", "", "")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatalf("failed to create server creds: %v", err)
|
t.Fatalf("failed to create server creds: %v", err)
|
||||||
}
|
}
|
||||||
@@ -300,10 +299,10 @@ func TestBrokenTLS_RequireClientCertButNonePresented(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func simpleTest(t *testing.T, cc *grpc.ClientConn) {
|
func simpleTest(t *testing.T, cc *grpc.ClientConn) {
|
||||||
cl := grpc_testing.NewTestServiceClient(cc)
|
cl := grpcurl_testing.NewTestServiceClient(cc)
|
||||||
ctx, cancel := context.WithTimeout(context.Background(), 3*time.Second)
|
ctx, cancel := context.WithTimeout(context.Background(), 3*time.Second)
|
||||||
defer cancel()
|
defer cancel()
|
||||||
_, err := cl.UnaryCall(ctx, &grpc_testing.SimpleRequest{}, grpc.WaitForReady(true))
|
_, err := cl.UnaryCall(ctx, &grpcurl_testing.SimpleRequest{}, grpc.WaitForReady(true))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Errorf("simple RPC failed: %v", err)
|
t.Errorf("simple RPC failed: %v", err)
|
||||||
}
|
}
|
||||||
@@ -323,7 +322,7 @@ func createTestServerAndClient(serverCreds, clientCreds credentials.TransportCre
|
|||||||
svrOpts = []grpc.ServerOption{grpc.Creds(serverCreds)}
|
svrOpts = []grpc.ServerOption{grpc.Creds(serverCreds)}
|
||||||
}
|
}
|
||||||
svr := grpc.NewServer(svrOpts...)
|
svr := grpc.NewServer(svrOpts...)
|
||||||
grpc_testing.RegisterTestServiceServer(svr, grpcurl_testing.TestServer{})
|
grpcurl_testing.RegisterTestServiceServer(svr, grpcurl_testing.TestServer{})
|
||||||
l, err := net.Listen("tcp", "127.0.0.1:0")
|
l, err := net.Listen("tcp", "127.0.0.1:0")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return e, err
|
return e, err
|
||||||
|
|||||||
Reference in New Issue
Block a user