diff --git a/format.go b/format.go index 862789a..13bfdc8 100644 --- a/format.go +++ b/format.go @@ -189,10 +189,14 @@ const ( ) func anyResolver(source DescriptorSource) (jsonpb.AnyResolver, error) { - files, err := GetAllFiles(source) - if err != nil { - return nil, err - } + // TODO: instead of pro-actively downloading file descriptors to + // build a dynamic resolver, it would be better if the resolver + // impl was lazy, and simply downloaded the descriptors as needed + // when asked to resolve a particular type URL + + // best effort: build resolver with whatever files we can + // load, ignoring any errors + files, _ := GetAllFiles(source) var er dynamic.ExtensionRegistry for _, fd := range files { diff --git a/format_test.go b/format_test.go index e1d4ca9..30be9e2 100644 --- a/format_test.go +++ b/format_test.go @@ -14,7 +14,7 @@ import ( "google.golang.org/grpc/metadata" ) -func TestRequestFactory(t *testing.T) { +func TestRequestParser(t *testing.T) { source, err := DescriptorSourceFromProtoSets("testing/example.protoset") if err != nil { t.Fatalf("failed to create descriptor source: %v", err) diff --git a/grpcurl.go b/grpcurl.go index 990761d..d21bd4c 100644 --- a/grpcurl.go +++ b/grpcurl.go @@ -55,37 +55,40 @@ func GetAllFiles(source DescriptorSource) ([]*desc.FileDescriptor, error) { var files []*desc.FileDescriptor srcFiles, ok := source.(sourceWithFiles) + // If an error occurs, we still try to load as many files as we can, so that + // caller can decide whether to ignore error or not. + var firstError error if ok { - var err error - files, err = srcFiles.GetAllFiles() - if err != nil { - return nil, err - } + files, firstError = srcFiles.GetAllFiles() } else { // Source does not implement GetAllFiles method, so use ListServices // and grab files from there. - allFiles := map[string]*desc.FileDescriptor{} svcNames, err := source.ListServices() if err != nil { - return nil, err - } - for _, name := range svcNames { - d, err := source.FindSymbol(name) - if err != nil { - return nil, err + firstError = err + } else { + allFiles := map[string]*desc.FileDescriptor{} + for _, name := range svcNames { + d, err := source.FindSymbol(name) + if err != nil { + if firstError == nil { + firstError = err + } + } else { + addAllFilesToSet(d.GetFile(), allFiles) + } + } + files = make([]*desc.FileDescriptor, len(allFiles)) + i := 0 + for _, fd := range allFiles { + files[i] = fd + i++ } - addAllFilesToSet(d.GetFile(), allFiles) - } - files = make([]*desc.FileDescriptor, len(allFiles)) - i := 0 - for _, fd := range allFiles { - files[i] = fd - i++ } } sort.Sort(filesByName(files)) - return files, nil + return files, firstError } type filesByName []*desc.FileDescriptor