From 1b9ba77e8623adbf976f2b8f1ccf552f7452544c Mon Sep 17 00:00:00 2001 From: Scott Ganyo Date: Wed, 15 Mar 2023 10:47:43 -0700 Subject: [PATCH] derive and encode openapi version in mimetype (#1092) --- cmd/registry/cmd/upload/csv.go | 13 +++++++++++-- cmd/registry/cmd/upload/csv_test.go | 11 +++++++++++ .../cmd/upload/testdata/csv/multiple-specs.csv | 1 + 3 files changed, 23 insertions(+), 2 deletions(-) diff --git a/cmd/registry/cmd/upload/csv.go b/cmd/registry/cmd/upload/csv.go index 6566b011e..96d286cd2 100644 --- a/cmd/registry/cmd/upload/csv.go +++ b/cmd/registry/cmd/upload/csv.go @@ -30,6 +30,8 @@ import ( "github.com/apigee/registry/pkg/names" "github.com/apigee/registry/pkg/visitor" "github.com/apigee/registry/rpc" + oas2 "github.com/google/gnostic/openapiv2" + oas3 "github.com/google/gnostic/openapiv3" "github.com/spf13/cobra" "google.golang.org/grpc/codes" "google.golang.org/grpc/status" @@ -226,6 +228,14 @@ func (t uploadSpecTask) Run(ctx context.Context) error { return err } + oasVer := "unknown" + if doc, err := oas3.ParseDocument(contents); err == nil { + oasVer = doc.Openapi + } else if doc, err := oas2.ParseDocument(contents); err == nil { + oasVer = doc.Swagger + } + oasMimeType := mime.OpenAPIMimeType("+gzip", oasVer) + compressed, err := compress.GZippedBytes(contents) if err != nil { return err @@ -236,8 +246,7 @@ func (t uploadSpecTask) Run(ctx context.Context) error { Parent: specName.Parent(), ApiSpecId: specName.SpecID, ApiSpec: &rpc.ApiSpec{ - // TODO: How do we choose a mime type? - MimeType: mime.OpenAPIMimeType("+gzip", "3.0.0"), + MimeType: oasMimeType, Contents: compressed, }, }) diff --git a/cmd/registry/cmd/upload/csv_test.go b/cmd/registry/cmd/upload/csv_test.go index 59ab1b9d0..86c0cfe8f 100644 --- a/cmd/registry/cmd/upload/csv_test.go +++ b/cmd/registry/cmd/upload/csv_test.go @@ -32,6 +32,7 @@ import ( ) const ( + gzipOpenAPIv2 = "application/x.openapi+gzip;version=2.0" gzipOpenAPIv3 = "application/x.openapi+gzip;version=3.0.0" ) @@ -56,6 +57,11 @@ func TestUploadCSV(t *testing.T) { t.Fatalf("Setup: Failed to read spec contents: %s", err) } + swagger, err := os.ReadFile(filepath.Join("testdata", "openapi", "petstore", "2.0", "swagger.yaml")) + if err != nil { + t.Fatalf("Setup: Failed to read spec contents: %s", err) + } + const testProject = "csv-demo" const testParent = "projects/" + testProject + "/locations/global" tests := []struct { @@ -90,6 +96,11 @@ func TestUploadCSV(t *testing.T) { MimeType: gzipOpenAPIv3, Contents: datastoreGA, }, + { + Name: fmt.Sprintf("projects/%s/locations/global/apis/swagger/versions/v1/specs/openapi", testProject), + MimeType: gzipOpenAPIv2, + Contents: swagger, + }, }, }, { diff --git a/cmd/registry/cmd/upload/testdata/csv/multiple-specs.csv b/cmd/registry/cmd/upload/testdata/csv/multiple-specs.csv index 2519645c2..21bac9da6 100644 --- a/cmd/registry/cmd/upload/testdata/csv/multiple-specs.csv +++ b/cmd/registry/cmd/upload/testdata/csv/multiple-specs.csv @@ -3,3 +3,4 @@ cloudtasks,v2beta2,openapi,testdata/csv/cloudtasks/v2beta2/openapi.yaml cloudtasks,v2,openapi,testdata/csv/cloudtasks/v2/openapi.yaml datastore,v1beta1,openapi,testdata/csv/datastore/v1beta1/openapi.yaml datastore,v1,openapi,testdata/csv/datastore/v1/openapi.yaml +swagger,v1,openapi,testdata/openapi/petstore/2.0/swagger.yaml