From a387cabcfbd3c3d7fea61c955af3d75d41a7d5bc Mon Sep 17 00:00:00 2001 From: Daniel Moran Date: Thu, 10 Jun 2021 11:20:33 -0400 Subject: [PATCH] refactor: return full HTTP response for binary response bodies (#112) --- api/api_backup.gen.go | 65 +++---- api/api_bucket_schemas.gen.go | 97 ++++++----- api/api_buckets.gen.go | 66 ++++---- api/api_delete.gen.go | 10 +- api/api_health.gen.go | 15 +- api/api_organizations.gen.go | 103 +++++------- api/api_query.gen.go | 20 +-- api/api_query_test.go | 93 ---------- api/api_restore.gen.go | 42 ++--- api/api_setup.gen.go | 29 ++-- api/api_tasks.gen.go | 159 ++++++++---------- api/api_users.gen.go | 75 ++++----- api/api_write.gen.go | 10 +- api/contract/cli.yml | 2 +- api/contract/openapi | 2 +- .../overrides/paths/backup_metadata.yml | 40 +++++ api/gunzip.go | 34 ++++ api/gunzip_test.go | 75 +++++++++ api/templates/README.md | 4 +- api/templates/api.mustache | 31 ++-- clients/query/query.go | 8 +- clients/query/query_test.go | 44 ++++- internal/mock/api_query.gen.go | 6 +- 23 files changed, 518 insertions(+), 512 deletions(-) delete mode 100644 api/api_query_test.go create mode 100644 api/contract/overrides/paths/backup_metadata.yml create mode 100644 api/gunzip.go create mode 100644 api/gunzip_test.go diff --git a/api/api_backup.gen.go b/api/api_backup.gen.go index 4cc7f06..b7b4838 100644 --- a/api/api_backup.gen.go +++ b/api/api_backup.gen.go @@ -11,7 +11,6 @@ package api import ( - _gzip "compress/gzip" _context "context" _io "io" _ioutil "io/ioutil" @@ -37,9 +36,9 @@ type BackupApi interface { /* * GetBackupMetadataExecute executes the request - * @return MetadataBackup + * @return *os.File */ - GetBackupMetadataExecute(r ApiGetBackupMetadataRequest) (MetadataBackup, error) + GetBackupMetadataExecute(r ApiGetBackupMetadataRequest) (*_nethttp.Response, error) /* * GetBackupShardId Download snapshot of all TSM data in a shard @@ -53,7 +52,7 @@ type BackupApi interface { * GetBackupShardIdExecute executes the request * @return *os.File */ - GetBackupShardIdExecute(r ApiGetBackupShardIdRequest) (_io.ReadCloser, error) + GetBackupShardIdExecute(r ApiGetBackupShardIdRequest) (*_nethttp.Response, error) } // backupApiGzipReadCloser supports streaming gzip response-bodies directly from the server. @@ -98,7 +97,7 @@ func (r ApiGetBackupMetadataRequest) GetAcceptEncoding() *string { return r.acceptEncoding } -func (r ApiGetBackupMetadataRequest) Execute() (MetadataBackup, error) { +func (r ApiGetBackupMetadataRequest) Execute() (*_nethttp.Response, error) { return r.ApiService.GetBackupMetadataExecute(r) } @@ -116,16 +115,16 @@ func (a *BackupApiService) GetBackupMetadata(ctx _context.Context) ApiGetBackupM /* * Execute executes the request - * @return MetadataBackup + * @return *os.File */ -func (a *BackupApiService) GetBackupMetadataExecute(r ApiGetBackupMetadataRequest) (MetadataBackup, error) { +func (a *BackupApiService) GetBackupMetadataExecute(r ApiGetBackupMetadataRequest) (*_nethttp.Response, error) { var ( localVarHTTPMethod = _nethttp.MethodGet localVarPostBody interface{} localVarFormFileName string localVarFileName string localVarFileBytes []byte - localVarReturnValue MetadataBackup + localVarReturnValue *_nethttp.Response ) localBasePath, err := a.client.cfg.ServerURLWithContext(r.ctx, "BackupApiService.GetBackupMetadata") @@ -172,17 +171,12 @@ func (a *BackupApiService) GetBackupMetadataExecute(r ApiGetBackupMetadataReques return localVarReturnValue, err } - var body _io.ReadCloser = localVarHTTPResponse.Body - if localVarHTTPResponse.Header.Get("Content-Encoding") == "gzip" { - gzr, err := _gzip.NewReader(body) + if localVarHTTPResponse.StatusCode >= 300 { + body, err := GunzipIfNeeded(localVarHTTPResponse) if err != nil { body.Close() return localVarReturnValue, err } - body = &backupApiGzipReadCloser{underlying: body, gzip: gzr} - } - - if localVarHTTPResponse.StatusCode >= 300 { localVarBody, err := _ioutil.ReadAll(body) body.Close() if err != nil { @@ -202,19 +196,7 @@ func (a *BackupApiService) GetBackupMetadataExecute(r ApiGetBackupMetadataReques return localVarReturnValue, newErr } - localVarBody, err := _ioutil.ReadAll(body) - body.Close() - if err != nil { - return localVarReturnValue, err - } - err = a.client.decode(&localVarReturnValue, localVarBody, localVarHTTPResponse.Header.Get("Content-Type")) - if err != nil { - newErr := GenericOpenAPIError{ - body: localVarBody, - error: err.Error(), - } - return localVarReturnValue, newErr - } + localVarReturnValue = localVarHTTPResponse return localVarReturnValue, nil } @@ -260,7 +242,7 @@ func (r ApiGetBackupShardIdRequest) GetSince() *time.Time { return r.since } -func (r ApiGetBackupShardIdRequest) Execute() (_io.ReadCloser, error) { +func (r ApiGetBackupShardIdRequest) Execute() (*_nethttp.Response, error) { return r.ApiService.GetBackupShardIdExecute(r) } @@ -282,14 +264,14 @@ func (a *BackupApiService) GetBackupShardId(ctx _context.Context, shardID int64) * Execute executes the request * @return *os.File */ -func (a *BackupApiService) GetBackupShardIdExecute(r ApiGetBackupShardIdRequest) (_io.ReadCloser, error) { +func (a *BackupApiService) GetBackupShardIdExecute(r ApiGetBackupShardIdRequest) (*_nethttp.Response, error) { var ( localVarHTTPMethod = _nethttp.MethodGet localVarPostBody interface{} localVarFormFileName string localVarFileName string localVarFileBytes []byte - localVarReturnValue _io.ReadCloser + localVarReturnValue *_nethttp.Response ) localBasePath, err := a.client.cfg.ServerURLWithContext(r.ctx, "BackupApiService.GetBackupShardId") @@ -340,17 +322,12 @@ func (a *BackupApiService) GetBackupShardIdExecute(r ApiGetBackupShardIdRequest) return localVarReturnValue, err } - var body _io.ReadCloser = localVarHTTPResponse.Body - if localVarHTTPResponse.Header.Get("Content-Encoding") == "gzip" { - gzr, err := _gzip.NewReader(body) + if localVarHTTPResponse.StatusCode >= 300 { + body, err := GunzipIfNeeded(localVarHTTPResponse) if err != nil { body.Close() return localVarReturnValue, err } - body = &backupApiGzipReadCloser{underlying: body, gzip: gzr} - } - - if localVarHTTPResponse.StatusCode >= 300 { localVarBody, err := _ioutil.ReadAll(body) body.Close() if err != nil { @@ -360,6 +337,16 @@ func (a *BackupApiService) GetBackupShardIdExecute(r ApiGetBackupShardIdRequest) body: localVarBody, error: localVarHTTPResponse.Status, } + if localVarHTTPResponse.StatusCode == 404 { + var v Error + err = a.client.decode(&v, localVarBody, localVarHTTPResponse.Header.Get("Content-Type")) + if err != nil { + newErr.error = err.Error() + return localVarReturnValue, newErr + } + newErr.model = &v + return localVarReturnValue, newErr + } var v Error err = a.client.decode(&v, localVarBody, localVarHTTPResponse.Header.Get("Content-Type")) if err != nil { @@ -370,7 +357,7 @@ func (a *BackupApiService) GetBackupShardIdExecute(r ApiGetBackupShardIdRequest) return localVarReturnValue, newErr } - localVarReturnValue = body + localVarReturnValue = localVarHTTPResponse return localVarReturnValue, nil } diff --git a/api/api_bucket_schemas.gen.go b/api/api_bucket_schemas.gen.go index 543d24f..3ab815b 100644 --- a/api/api_bucket_schemas.gen.go +++ b/api/api_bucket_schemas.gen.go @@ -11,7 +11,6 @@ package api import ( - _gzip "compress/gzip" _context "context" _io "io" _ioutil "io/ioutil" @@ -28,9 +27,9 @@ var ( type BucketSchemasApi interface { /* - * CreateMeasurementSchema Create a new measurement schema for this bucket + * CreateMeasurementSchema Create a measurement schema for a bucket * @param ctx _context.Context - for authentication, logging, cancellation, deadlines, tracing, etc. Passed from http.Request or context.Background(). - * @param bucketID The ID of the bucket + * @param bucketID The identifier of the bucket. * @return ApiCreateMeasurementSchemaRequest */ CreateMeasurementSchema(ctx _context.Context, bucketID string) ApiCreateMeasurementSchemaRequest @@ -42,10 +41,10 @@ type BucketSchemasApi interface { CreateMeasurementSchemaExecute(r ApiCreateMeasurementSchemaRequest) (MeasurementSchema, error) /* - * GetMeasurementSchema Fetch schema information for a measurement + * GetMeasurementSchema Retrieve measurement schema information * @param ctx _context.Context - for authentication, logging, cancellation, deadlines, tracing, etc. Passed from http.Request or context.Background(). - * @param bucketID The ID of the bucket - * @param measurementID The ID of the measurement + * @param bucketID The identifier of the bucket. + * @param measurementID The identifier of the measurement. * @return ApiGetMeasurementSchemaRequest */ GetMeasurementSchema(ctx _context.Context, bucketID string, measurementID string) ApiGetMeasurementSchemaRequest @@ -57,9 +56,9 @@ type BucketSchemasApi interface { GetMeasurementSchemaExecute(r ApiGetMeasurementSchemaRequest) (MeasurementSchema, error) /* - * GetMeasurementSchemas Retrieve a list of measurement schemas defined for this bucket + * GetMeasurementSchemas List all measurement schemas of a bucket * @param ctx _context.Context - for authentication, logging, cancellation, deadlines, tracing, etc. Passed from http.Request or context.Background(). - * @param bucketID The ID of the bucket + * @param bucketID The identifier of the bucket. * @return ApiGetMeasurementSchemasRequest */ GetMeasurementSchemas(ctx _context.Context, bucketID string) ApiGetMeasurementSchemasRequest @@ -71,10 +70,10 @@ type BucketSchemasApi interface { GetMeasurementSchemasExecute(r ApiGetMeasurementSchemasRequest) (MeasurementSchemaList, error) /* - * UpdateMeasurementSchema Update existing measurement schema + * UpdateMeasurementSchema Update a measurement schema * @param ctx _context.Context - for authentication, logging, cancellation, deadlines, tracing, etc. Passed from http.Request or context.Background(). - * @param bucketID The ID of the bucket - * @param measurementID The ID of the measurement + * @param bucketID The identifier of the bucket. + * @param measurementID The identifier of the measurement. * @return ApiUpdateMeasurementSchemaRequest */ UpdateMeasurementSchema(ctx _context.Context, bucketID string, measurementID string) ApiUpdateMeasurementSchemaRequest @@ -151,9 +150,9 @@ func (r ApiCreateMeasurementSchemaRequest) Execute() (MeasurementSchema, error) } /* - * CreateMeasurementSchema Create a new measurement schema for this bucket + * CreateMeasurementSchema Create a measurement schema for a bucket * @param ctx _context.Context - for authentication, logging, cancellation, deadlines, tracing, etc. Passed from http.Request or context.Background(). - * @param bucketID The ID of the bucket + * @param bucketID The identifier of the bucket. * @return ApiCreateMeasurementSchemaRequest */ func (a *BucketSchemasApiService) CreateMeasurementSchema(ctx _context.Context, bucketID string) ApiCreateMeasurementSchemaRequest { @@ -225,17 +224,12 @@ func (a *BucketSchemasApiService) CreateMeasurementSchemaExecute(r ApiCreateMeas return localVarReturnValue, err } - var body _io.ReadCloser = localVarHTTPResponse.Body - if localVarHTTPResponse.Header.Get("Content-Encoding") == "gzip" { - gzr, err := _gzip.NewReader(body) + if localVarHTTPResponse.StatusCode >= 300 { + body, err := GunzipIfNeeded(localVarHTTPResponse) if err != nil { body.Close() return localVarReturnValue, err } - body = &bucketSchemasApiGzipReadCloser{underlying: body, gzip: gzr} - } - - if localVarHTTPResponse.StatusCode >= 300 { localVarBody, err := _ioutil.ReadAll(body) body.Close() if err != nil { @@ -257,6 +251,11 @@ func (a *BucketSchemasApiService) CreateMeasurementSchemaExecute(r ApiCreateMeas return localVarReturnValue, newErr } + body, err := GunzipIfNeeded(localVarHTTPResponse) + if err != nil { + body.Close() + return localVarReturnValue, err + } localVarBody, err := _ioutil.ReadAll(body) body.Close() if err != nil { @@ -320,10 +319,10 @@ func (r ApiGetMeasurementSchemaRequest) Execute() (MeasurementSchema, error) { } /* - * GetMeasurementSchema Fetch schema information for a measurement + * GetMeasurementSchema Retrieve measurement schema information * @param ctx _context.Context - for authentication, logging, cancellation, deadlines, tracing, etc. Passed from http.Request or context.Background(). - * @param bucketID The ID of the bucket - * @param measurementID The ID of the measurement + * @param bucketID The identifier of the bucket. + * @param measurementID The identifier of the measurement. * @return ApiGetMeasurementSchemaRequest */ func (a *BucketSchemasApiService) GetMeasurementSchema(ctx _context.Context, bucketID string, measurementID string) ApiGetMeasurementSchemaRequest { @@ -395,17 +394,12 @@ func (a *BucketSchemasApiService) GetMeasurementSchemaExecute(r ApiGetMeasuremen return localVarReturnValue, err } - var body _io.ReadCloser = localVarHTTPResponse.Body - if localVarHTTPResponse.Header.Get("Content-Encoding") == "gzip" { - gzr, err := _gzip.NewReader(body) + if localVarHTTPResponse.StatusCode >= 300 { + body, err := GunzipIfNeeded(localVarHTTPResponse) if err != nil { body.Close() return localVarReturnValue, err } - body = &bucketSchemasApiGzipReadCloser{underlying: body, gzip: gzr} - } - - if localVarHTTPResponse.StatusCode >= 300 { localVarBody, err := _ioutil.ReadAll(body) body.Close() if err != nil { @@ -418,6 +412,11 @@ func (a *BucketSchemasApiService) GetMeasurementSchemaExecute(r ApiGetMeasuremen return localVarReturnValue, newErr } + body, err := GunzipIfNeeded(localVarHTTPResponse) + if err != nil { + body.Close() + return localVarReturnValue, err + } localVarBody, err := _ioutil.ReadAll(body) body.Close() if err != nil { @@ -481,9 +480,9 @@ func (r ApiGetMeasurementSchemasRequest) Execute() (MeasurementSchemaList, error } /* - * GetMeasurementSchemas Retrieve a list of measurement schemas defined for this bucket + * GetMeasurementSchemas List all measurement schemas of a bucket * @param ctx _context.Context - for authentication, logging, cancellation, deadlines, tracing, etc. Passed from http.Request or context.Background(). - * @param bucketID The ID of the bucket + * @param bucketID The identifier of the bucket. * @return ApiGetMeasurementSchemasRequest */ func (a *BucketSchemasApiService) GetMeasurementSchemas(ctx _context.Context, bucketID string) ApiGetMeasurementSchemasRequest { @@ -556,17 +555,12 @@ func (a *BucketSchemasApiService) GetMeasurementSchemasExecute(r ApiGetMeasureme return localVarReturnValue, err } - var body _io.ReadCloser = localVarHTTPResponse.Body - if localVarHTTPResponse.Header.Get("Content-Encoding") == "gzip" { - gzr, err := _gzip.NewReader(body) + if localVarHTTPResponse.StatusCode >= 300 { + body, err := GunzipIfNeeded(localVarHTTPResponse) if err != nil { body.Close() return localVarReturnValue, err } - body = &bucketSchemasApiGzipReadCloser{underlying: body, gzip: gzr} - } - - if localVarHTTPResponse.StatusCode >= 300 { localVarBody, err := _ioutil.ReadAll(body) body.Close() if err != nil { @@ -588,6 +582,11 @@ func (a *BucketSchemasApiService) GetMeasurementSchemasExecute(r ApiGetMeasureme return localVarReturnValue, newErr } + body, err := GunzipIfNeeded(localVarHTTPResponse) + if err != nil { + body.Close() + return localVarReturnValue, err + } localVarBody, err := _ioutil.ReadAll(body) body.Close() if err != nil { @@ -660,10 +659,10 @@ func (r ApiUpdateMeasurementSchemaRequest) Execute() (MeasurementSchema, error) } /* - * UpdateMeasurementSchema Update existing measurement schema + * UpdateMeasurementSchema Update a measurement schema * @param ctx _context.Context - for authentication, logging, cancellation, deadlines, tracing, etc. Passed from http.Request or context.Background(). - * @param bucketID The ID of the bucket - * @param measurementID The ID of the measurement + * @param bucketID The identifier of the bucket. + * @param measurementID The identifier of the measurement. * @return ApiUpdateMeasurementSchemaRequest */ func (a *BucketSchemasApiService) UpdateMeasurementSchema(ctx _context.Context, bucketID string, measurementID string) ApiUpdateMeasurementSchemaRequest { @@ -737,17 +736,12 @@ func (a *BucketSchemasApiService) UpdateMeasurementSchemaExecute(r ApiUpdateMeas return localVarReturnValue, err } - var body _io.ReadCloser = localVarHTTPResponse.Body - if localVarHTTPResponse.Header.Get("Content-Encoding") == "gzip" { - gzr, err := _gzip.NewReader(body) + if localVarHTTPResponse.StatusCode >= 300 { + body, err := GunzipIfNeeded(localVarHTTPResponse) if err != nil { body.Close() return localVarReturnValue, err } - body = &bucketSchemasApiGzipReadCloser{underlying: body, gzip: gzr} - } - - if localVarHTTPResponse.StatusCode >= 300 { localVarBody, err := _ioutil.ReadAll(body) body.Close() if err != nil { @@ -769,6 +763,11 @@ func (a *BucketSchemasApiService) UpdateMeasurementSchemaExecute(r ApiUpdateMeas return localVarReturnValue, newErr } + body, err := GunzipIfNeeded(localVarHTTPResponse) + if err != nil { + body.Close() + return localVarReturnValue, err + } localVarBody, err := _ioutil.ReadAll(body) body.Close() if err != nil { diff --git a/api/api_buckets.gen.go b/api/api_buckets.gen.go index e5064fc..d9be99f 100644 --- a/api/api_buckets.gen.go +++ b/api/api_buckets.gen.go @@ -11,7 +11,6 @@ package api import ( - _gzip "compress/gzip" _context "context" _io "io" _ioutil "io/ioutil" @@ -209,17 +208,12 @@ func (a *BucketsApiService) DeleteBucketsIDExecute(r ApiDeleteBucketsIDRequest) return err } - var body _io.ReadCloser = localVarHTTPResponse.Body - if localVarHTTPResponse.Header.Get("Content-Encoding") == "gzip" { - gzr, err := _gzip.NewReader(body) + if localVarHTTPResponse.StatusCode >= 300 { + body, err := GunzipIfNeeded(localVarHTTPResponse) if err != nil { body.Close() return err } - body = &bucketsApiGzipReadCloser{underlying: body, gzip: gzr} - } - - if localVarHTTPResponse.StatusCode >= 300 { localVarBody, err := _ioutil.ReadAll(body) body.Close() if err != nil { @@ -421,17 +415,12 @@ func (a *BucketsApiService) GetBucketsExecute(r ApiGetBucketsRequest) (Buckets, return localVarReturnValue, err } - var body _io.ReadCloser = localVarHTTPResponse.Body - if localVarHTTPResponse.Header.Get("Content-Encoding") == "gzip" { - gzr, err := _gzip.NewReader(body) + if localVarHTTPResponse.StatusCode >= 300 { + body, err := GunzipIfNeeded(localVarHTTPResponse) if err != nil { body.Close() return localVarReturnValue, err } - body = &bucketsApiGzipReadCloser{underlying: body, gzip: gzr} - } - - if localVarHTTPResponse.StatusCode >= 300 { localVarBody, err := _ioutil.ReadAll(body) body.Close() if err != nil { @@ -451,6 +440,11 @@ func (a *BucketsApiService) GetBucketsExecute(r ApiGetBucketsRequest) (Buckets, return localVarReturnValue, newErr } + body, err := GunzipIfNeeded(localVarHTTPResponse) + if err != nil { + body.Close() + return localVarReturnValue, err + } localVarBody, err := _ioutil.ReadAll(body) body.Close() if err != nil { @@ -565,17 +559,12 @@ func (a *BucketsApiService) GetBucketsIDExecute(r ApiGetBucketsIDRequest) (Bucke return localVarReturnValue, err } - var body _io.ReadCloser = localVarHTTPResponse.Body - if localVarHTTPResponse.Header.Get("Content-Encoding") == "gzip" { - gzr, err := _gzip.NewReader(body) + if localVarHTTPResponse.StatusCode >= 300 { + body, err := GunzipIfNeeded(localVarHTTPResponse) if err != nil { body.Close() return localVarReturnValue, err } - body = &bucketsApiGzipReadCloser{underlying: body, gzip: gzr} - } - - if localVarHTTPResponse.StatusCode >= 300 { localVarBody, err := _ioutil.ReadAll(body) body.Close() if err != nil { @@ -595,6 +584,11 @@ func (a *BucketsApiService) GetBucketsIDExecute(r ApiGetBucketsIDRequest) (Bucke return localVarReturnValue, newErr } + body, err := GunzipIfNeeded(localVarHTTPResponse) + if err != nil { + body.Close() + return localVarReturnValue, err + } localVarBody, err := _ioutil.ReadAll(body) body.Close() if err != nil { @@ -723,17 +717,12 @@ func (a *BucketsApiService) PatchBucketsIDExecute(r ApiPatchBucketsIDRequest) (B return localVarReturnValue, err } - var body _io.ReadCloser = localVarHTTPResponse.Body - if localVarHTTPResponse.Header.Get("Content-Encoding") == "gzip" { - gzr, err := _gzip.NewReader(body) + if localVarHTTPResponse.StatusCode >= 300 { + body, err := GunzipIfNeeded(localVarHTTPResponse) if err != nil { body.Close() return localVarReturnValue, err } - body = &bucketsApiGzipReadCloser{underlying: body, gzip: gzr} - } - - if localVarHTTPResponse.StatusCode >= 300 { localVarBody, err := _ioutil.ReadAll(body) body.Close() if err != nil { @@ -753,6 +742,11 @@ func (a *BucketsApiService) PatchBucketsIDExecute(r ApiPatchBucketsIDRequest) (B return localVarReturnValue, newErr } + body, err := GunzipIfNeeded(localVarHTTPResponse) + if err != nil { + body.Close() + return localVarReturnValue, err + } localVarBody, err := _ioutil.ReadAll(body) body.Close() if err != nil { @@ -869,17 +863,12 @@ func (a *BucketsApiService) PostBucketsExecute(r ApiPostBucketsRequest) (Bucket, return localVarReturnValue, err } - var body _io.ReadCloser = localVarHTTPResponse.Body - if localVarHTTPResponse.Header.Get("Content-Encoding") == "gzip" { - gzr, err := _gzip.NewReader(body) + if localVarHTTPResponse.StatusCode >= 300 { + body, err := GunzipIfNeeded(localVarHTTPResponse) if err != nil { body.Close() return localVarReturnValue, err } - body = &bucketsApiGzipReadCloser{underlying: body, gzip: gzr} - } - - if localVarHTTPResponse.StatusCode >= 300 { localVarBody, err := _ioutil.ReadAll(body) body.Close() if err != nil { @@ -909,6 +898,11 @@ func (a *BucketsApiService) PostBucketsExecute(r ApiPostBucketsRequest) (Bucket, return localVarReturnValue, newErr } + body, err := GunzipIfNeeded(localVarHTTPResponse) + if err != nil { + body.Close() + return localVarReturnValue, err + } localVarBody, err := _ioutil.ReadAll(body) body.Close() if err != nil { diff --git a/api/api_delete.gen.go b/api/api_delete.gen.go index df6b760..b74795e 100644 --- a/api/api_delete.gen.go +++ b/api/api_delete.gen.go @@ -11,7 +11,6 @@ package api import ( - _gzip "compress/gzip" _context "context" _io "io" _ioutil "io/ioutil" @@ -203,17 +202,12 @@ func (a *DeleteApiService) PostDeleteExecute(r ApiPostDeleteRequest) error { return err } - var body _io.ReadCloser = localVarHTTPResponse.Body - if localVarHTTPResponse.Header.Get("Content-Encoding") == "gzip" { - gzr, err := _gzip.NewReader(body) + if localVarHTTPResponse.StatusCode >= 300 { + body, err := GunzipIfNeeded(localVarHTTPResponse) if err != nil { body.Close() return err } - body = &deleteApiGzipReadCloser{underlying: body, gzip: gzr} - } - - if localVarHTTPResponse.StatusCode >= 300 { localVarBody, err := _ioutil.ReadAll(body) body.Close() if err != nil { diff --git a/api/api_health.gen.go b/api/api_health.gen.go index 95c58b8..778988e 100644 --- a/api/api_health.gen.go +++ b/api/api_health.gen.go @@ -11,7 +11,6 @@ package api import ( - _gzip "compress/gzip" _context "context" _io "io" _ioutil "io/ioutil" @@ -144,17 +143,12 @@ func (a *HealthApiService) GetHealthExecute(r ApiGetHealthRequest) (HealthCheck, return localVarReturnValue, err } - var body _io.ReadCloser = localVarHTTPResponse.Body - if localVarHTTPResponse.Header.Get("Content-Encoding") == "gzip" { - gzr, err := _gzip.NewReader(body) + if localVarHTTPResponse.StatusCode >= 300 { + body, err := GunzipIfNeeded(localVarHTTPResponse) if err != nil { body.Close() return localVarReturnValue, err } - body = &healthApiGzipReadCloser{underlying: body, gzip: gzr} - } - - if localVarHTTPResponse.StatusCode >= 300 { localVarBody, err := _ioutil.ReadAll(body) body.Close() if err != nil { @@ -184,6 +178,11 @@ func (a *HealthApiService) GetHealthExecute(r ApiGetHealthRequest) (HealthCheck, return localVarReturnValue, newErr } + body, err := GunzipIfNeeded(localVarHTTPResponse) + if err != nil { + body.Close() + return localVarReturnValue, err + } localVarBody, err := _ioutil.ReadAll(body) body.Close() if err != nil { diff --git a/api/api_organizations.gen.go b/api/api_organizations.gen.go index 4cb475f..b936107 100644 --- a/api/api_organizations.gen.go +++ b/api/api_organizations.gen.go @@ -11,7 +11,6 @@ package api import ( - _gzip "compress/gzip" _context "context" _io "io" _ioutil "io/ioutil" @@ -251,17 +250,12 @@ func (a *OrganizationsApiService) DeleteOrgsIDExecute(r ApiDeleteOrgsIDRequest) return err } - var body _io.ReadCloser = localVarHTTPResponse.Body - if localVarHTTPResponse.Header.Get("Content-Encoding") == "gzip" { - gzr, err := _gzip.NewReader(body) + if localVarHTTPResponse.StatusCode >= 300 { + body, err := GunzipIfNeeded(localVarHTTPResponse) if err != nil { body.Close() return err } - body = &organizationsApiGzipReadCloser{underlying: body, gzip: gzr} - } - - if localVarHTTPResponse.StatusCode >= 300 { localVarBody, err := _ioutil.ReadAll(body) body.Close() if err != nil { @@ -401,17 +395,12 @@ func (a *OrganizationsApiService) DeleteOrgsIDMembersIDExecute(r ApiDeleteOrgsID return err } - var body _io.ReadCloser = localVarHTTPResponse.Body - if localVarHTTPResponse.Header.Get("Content-Encoding") == "gzip" { - gzr, err := _gzip.NewReader(body) + if localVarHTTPResponse.StatusCode >= 300 { + body, err := GunzipIfNeeded(localVarHTTPResponse) if err != nil { body.Close() return err } - body = &organizationsApiGzipReadCloser{underlying: body, gzip: gzr} - } - - if localVarHTTPResponse.StatusCode >= 300 { localVarBody, err := _ioutil.ReadAll(body) body.Close() if err != nil { @@ -591,17 +580,12 @@ func (a *OrganizationsApiService) GetOrgsExecute(r ApiGetOrgsRequest) (Organizat return localVarReturnValue, err } - var body _io.ReadCloser = localVarHTTPResponse.Body - if localVarHTTPResponse.Header.Get("Content-Encoding") == "gzip" { - gzr, err := _gzip.NewReader(body) + if localVarHTTPResponse.StatusCode >= 300 { + body, err := GunzipIfNeeded(localVarHTTPResponse) if err != nil { body.Close() return localVarReturnValue, err } - body = &organizationsApiGzipReadCloser{underlying: body, gzip: gzr} - } - - if localVarHTTPResponse.StatusCode >= 300 { localVarBody, err := _ioutil.ReadAll(body) body.Close() if err != nil { @@ -621,6 +605,11 @@ func (a *OrganizationsApiService) GetOrgsExecute(r ApiGetOrgsRequest) (Organizat return localVarReturnValue, newErr } + body, err := GunzipIfNeeded(localVarHTTPResponse) + if err != nil { + body.Close() + return localVarReturnValue, err + } localVarBody, err := _ioutil.ReadAll(body) body.Close() if err != nil { @@ -735,17 +724,12 @@ func (a *OrganizationsApiService) GetOrgsIDExecute(r ApiGetOrgsIDRequest) (Organ return localVarReturnValue, err } - var body _io.ReadCloser = localVarHTTPResponse.Body - if localVarHTTPResponse.Header.Get("Content-Encoding") == "gzip" { - gzr, err := _gzip.NewReader(body) + if localVarHTTPResponse.StatusCode >= 300 { + body, err := GunzipIfNeeded(localVarHTTPResponse) if err != nil { body.Close() return localVarReturnValue, err } - body = &organizationsApiGzipReadCloser{underlying: body, gzip: gzr} - } - - if localVarHTTPResponse.StatusCode >= 300 { localVarBody, err := _ioutil.ReadAll(body) body.Close() if err != nil { @@ -765,6 +749,11 @@ func (a *OrganizationsApiService) GetOrgsIDExecute(r ApiGetOrgsIDRequest) (Organ return localVarReturnValue, newErr } + body, err := GunzipIfNeeded(localVarHTTPResponse) + if err != nil { + body.Close() + return localVarReturnValue, err + } localVarBody, err := _ioutil.ReadAll(body) body.Close() if err != nil { @@ -879,17 +868,12 @@ func (a *OrganizationsApiService) GetOrgsIDMembersExecute(r ApiGetOrgsIDMembersR return localVarReturnValue, err } - var body _io.ReadCloser = localVarHTTPResponse.Body - if localVarHTTPResponse.Header.Get("Content-Encoding") == "gzip" { - gzr, err := _gzip.NewReader(body) + if localVarHTTPResponse.StatusCode >= 300 { + body, err := GunzipIfNeeded(localVarHTTPResponse) if err != nil { body.Close() return localVarReturnValue, err } - body = &organizationsApiGzipReadCloser{underlying: body, gzip: gzr} - } - - if localVarHTTPResponse.StatusCode >= 300 { localVarBody, err := _ioutil.ReadAll(body) body.Close() if err != nil { @@ -919,6 +903,11 @@ func (a *OrganizationsApiService) GetOrgsIDMembersExecute(r ApiGetOrgsIDMembersR return localVarReturnValue, newErr } + body, err := GunzipIfNeeded(localVarHTTPResponse) + if err != nil { + body.Close() + return localVarReturnValue, err + } localVarBody, err := _ioutil.ReadAll(body) body.Close() if err != nil { @@ -1047,17 +1036,12 @@ func (a *OrganizationsApiService) PatchOrgsIDExecute(r ApiPatchOrgsIDRequest) (O return localVarReturnValue, err } - var body _io.ReadCloser = localVarHTTPResponse.Body - if localVarHTTPResponse.Header.Get("Content-Encoding") == "gzip" { - gzr, err := _gzip.NewReader(body) + if localVarHTTPResponse.StatusCode >= 300 { + body, err := GunzipIfNeeded(localVarHTTPResponse) if err != nil { body.Close() return localVarReturnValue, err } - body = &organizationsApiGzipReadCloser{underlying: body, gzip: gzr} - } - - if localVarHTTPResponse.StatusCode >= 300 { localVarBody, err := _ioutil.ReadAll(body) body.Close() if err != nil { @@ -1077,6 +1061,11 @@ func (a *OrganizationsApiService) PatchOrgsIDExecute(r ApiPatchOrgsIDRequest) (O return localVarReturnValue, newErr } + body, err := GunzipIfNeeded(localVarHTTPResponse) + if err != nil { + body.Close() + return localVarReturnValue, err + } localVarBody, err := _ioutil.ReadAll(body) body.Close() if err != nil { @@ -1193,17 +1182,12 @@ func (a *OrganizationsApiService) PostOrgsExecute(r ApiPostOrgsRequest) (Organiz return localVarReturnValue, err } - var body _io.ReadCloser = localVarHTTPResponse.Body - if localVarHTTPResponse.Header.Get("Content-Encoding") == "gzip" { - gzr, err := _gzip.NewReader(body) + if localVarHTTPResponse.StatusCode >= 300 { + body, err := GunzipIfNeeded(localVarHTTPResponse) if err != nil { body.Close() return localVarReturnValue, err } - body = &organizationsApiGzipReadCloser{underlying: body, gzip: gzr} - } - - if localVarHTTPResponse.StatusCode >= 300 { localVarBody, err := _ioutil.ReadAll(body) body.Close() if err != nil { @@ -1223,6 +1207,11 @@ func (a *OrganizationsApiService) PostOrgsExecute(r ApiPostOrgsRequest) (Organiz return localVarReturnValue, newErr } + body, err := GunzipIfNeeded(localVarHTTPResponse) + if err != nil { + body.Close() + return localVarReturnValue, err + } localVarBody, err := _ioutil.ReadAll(body) body.Close() if err != nil { @@ -1351,17 +1340,12 @@ func (a *OrganizationsApiService) PostOrgsIDMembersExecute(r ApiPostOrgsIDMember return localVarReturnValue, err } - var body _io.ReadCloser = localVarHTTPResponse.Body - if localVarHTTPResponse.Header.Get("Content-Encoding") == "gzip" { - gzr, err := _gzip.NewReader(body) + if localVarHTTPResponse.StatusCode >= 300 { + body, err := GunzipIfNeeded(localVarHTTPResponse) if err != nil { body.Close() return localVarReturnValue, err } - body = &organizationsApiGzipReadCloser{underlying: body, gzip: gzr} - } - - if localVarHTTPResponse.StatusCode >= 300 { localVarBody, err := _ioutil.ReadAll(body) body.Close() if err != nil { @@ -1381,6 +1365,11 @@ func (a *OrganizationsApiService) PostOrgsIDMembersExecute(r ApiPostOrgsIDMember return localVarReturnValue, newErr } + body, err := GunzipIfNeeded(localVarHTTPResponse) + if err != nil { + body.Close() + return localVarReturnValue, err + } localVarBody, err := _ioutil.ReadAll(body) body.Close() if err != nil { diff --git a/api/api_query.gen.go b/api/api_query.gen.go index b324745..46e2c2f 100644 --- a/api/api_query.gen.go +++ b/api/api_query.gen.go @@ -11,7 +11,6 @@ package api import ( - _gzip "compress/gzip" _context "context" _io "io" _ioutil "io/ioutil" @@ -37,7 +36,7 @@ type QueryApi interface { * PostQueryExecute executes the request * @return *os.File */ - PostQueryExecute(r ApiPostQueryRequest) (_io.ReadCloser, error) + PostQueryExecute(r ApiPostQueryRequest) (*_nethttp.Response, error) } // queryApiGzipReadCloser supports streaming gzip response-bodies directly from the server. @@ -118,7 +117,7 @@ func (r ApiPostQueryRequest) GetQuery() *Query { return r.query } -func (r ApiPostQueryRequest) Execute() (_io.ReadCloser, error) { +func (r ApiPostQueryRequest) Execute() (*_nethttp.Response, error) { return r.ApiService.PostQueryExecute(r) } @@ -138,14 +137,14 @@ func (a *QueryApiService) PostQuery(ctx _context.Context) ApiPostQueryRequest { * Execute executes the request * @return *os.File */ -func (a *QueryApiService) PostQueryExecute(r ApiPostQueryRequest) (_io.ReadCloser, error) { +func (a *QueryApiService) PostQueryExecute(r ApiPostQueryRequest) (*_nethttp.Response, error) { var ( localVarHTTPMethod = _nethttp.MethodPost localVarPostBody interface{} localVarFormFileName string localVarFileName string localVarFileBytes []byte - localVarReturnValue _io.ReadCloser + localVarReturnValue *_nethttp.Response ) localBasePath, err := a.client.cfg.ServerURLWithContext(r.ctx, "QueryApiService.PostQuery") @@ -203,17 +202,12 @@ func (a *QueryApiService) PostQueryExecute(r ApiPostQueryRequest) (_io.ReadClose return localVarReturnValue, err } - var body _io.ReadCloser = localVarHTTPResponse.Body - if localVarHTTPResponse.Header.Get("Content-Encoding") == "gzip" { - gzr, err := _gzip.NewReader(body) + if localVarHTTPResponse.StatusCode >= 300 { + body, err := GunzipIfNeeded(localVarHTTPResponse) if err != nil { body.Close() return localVarReturnValue, err } - body = &queryApiGzipReadCloser{underlying: body, gzip: gzr} - } - - if localVarHTTPResponse.StatusCode >= 300 { localVarBody, err := _ioutil.ReadAll(body) body.Close() if err != nil { @@ -233,7 +227,7 @@ func (a *QueryApiService) PostQueryExecute(r ApiPostQueryRequest) (_io.ReadClose return localVarReturnValue, newErr } - localVarReturnValue = body + localVarReturnValue = localVarHTTPResponse return localVarReturnValue, nil } diff --git a/api/api_query_test.go b/api/api_query_test.go deleted file mode 100644 index 95494e2..0000000 --- a/api/api_query_test.go +++ /dev/null @@ -1,93 +0,0 @@ -package api_test - -import ( - "bytes" - "compress/gzip" - "context" - "io" - "net/http" - "net/http/httptest" - "testing" - - "github.com/influxdata/influx-cli/v2/api" - "github.com/stretchr/testify/require" -) - -var exampleResponse = `result,table,_start,_stop,_time,region,host,_value -mean,0,2018-05-08T20:50:00Z,2018-05-08T20:51:00Z,2018-05-08T20:50:00Z,east,A,15.43 -mean,0,2018-05-08T20:50:00Z,2018-05-08T20:51:00Z,2018-05-08T20:50:20Z,east,B,59.25 -mean,0,2018-05-08T20:50:00Z,2018-05-08T20:51:00Z,2018-05-08T20:50:40Z,east,C,52.62` - -func setupServer(t *testing.T) (*httptest.Server, api.QueryApi) { - t.Helper() - - server := httptest.NewServer(http.HandlerFunc(func(rw http.ResponseWriter, req *http.Request) { - isGzip := req.Header.Get("Accept-Encoding") == "gzip" - if isGzip { - rw.Header().Set("Content-Encoding", "gzip") - } - rw.WriteHeader(200) - - if isGzip { - buf := bytes.Buffer{} - gzw := gzip.NewWriter(&buf) - if _, err := gzw.Write([]byte(exampleResponse)); err != nil { - _ = gzw.Close() - t.Fatalf("unexpected error: %v", err) - } - require.NoError(t, gzw.Close()) - _, err := io.Copy(rw, &buf) - require.NoError(t, err) - } else { - _, err := rw.Write([]byte(exampleResponse)) - require.NoError(t, err) - } - })) - - config := api.NewConfiguration() - config.Scheme = "http" - config.Host = server.Listener.Addr().String() - client := api.NewAPIClient(config) - - return server, client.QueryApi -} - -func TestQuery_NoGzip(t *testing.T) { - t.Parallel() - - server, client := setupServer(t) - defer server.Close() - - resp, err := client.PostQuery(context.Background()). - AcceptEncoding("identity"). - Query(api.Query{}). - Execute() - require.NoError(t, err) - defer resp.Close() - - out := bytes.Buffer{} - _, err = io.Copy(&out, resp) - require.NoError(t, err) - - require.Equal(t, exampleResponse, out.String()) -} - -func TestQuery_Gzip(t *testing.T) { - t.Parallel() - - server, client := setupServer(t) - defer server.Close() - - resp, err := client.PostQuery(context.Background()). - AcceptEncoding("gzip"). - Query(api.Query{}). - Execute() - require.NoError(t, err) - defer resp.Close() - - out := bytes.Buffer{} - _, err = io.Copy(&out, resp) - require.NoError(t, err) - - require.Equal(t, exampleResponse, out.String()) -} diff --git a/api/api_restore.gen.go b/api/api_restore.gen.go index 841731b..63de194 100644 --- a/api/api_restore.gen.go +++ b/api/api_restore.gen.go @@ -11,7 +11,6 @@ package api import ( - _gzip "compress/gzip" _context "context" _io "io" _ioutil "io/ioutil" @@ -210,17 +209,12 @@ func (a *RestoreApiService) PostRestoreBucketMetadataIdExecute(r ApiPostRestoreB return localVarReturnValue, err } - var body _io.ReadCloser = localVarHTTPResponse.Body - if localVarHTTPResponse.Header.Get("Content-Encoding") == "gzip" { - gzr, err := _gzip.NewReader(body) + if localVarHTTPResponse.StatusCode >= 300 { + body, err := GunzipIfNeeded(localVarHTTPResponse) if err != nil { body.Close() return localVarReturnValue, err } - body = &restoreApiGzipReadCloser{underlying: body, gzip: gzr} - } - - if localVarHTTPResponse.StatusCode >= 300 { localVarBody, err := _ioutil.ReadAll(body) body.Close() if err != nil { @@ -240,6 +234,11 @@ func (a *RestoreApiService) PostRestoreBucketMetadataIdExecute(r ApiPostRestoreB return localVarReturnValue, newErr } + body, err := GunzipIfNeeded(localVarHTTPResponse) + if err != nil { + body.Close() + return localVarReturnValue, err + } localVarBody, err := _ioutil.ReadAll(body) body.Close() if err != nil { @@ -366,17 +365,12 @@ func (a *RestoreApiService) PostRestoreKVExecute(r ApiPostRestoreKVRequest) erro return err } - var body _io.ReadCloser = localVarHTTPResponse.Body - if localVarHTTPResponse.Header.Get("Content-Encoding") == "gzip" { - gzr, err := _gzip.NewReader(body) + if localVarHTTPResponse.StatusCode >= 300 { + body, err := GunzipIfNeeded(localVarHTTPResponse) if err != nil { body.Close() return err } - body = &restoreApiGzipReadCloser{underlying: body, gzip: gzr} - } - - if localVarHTTPResponse.StatusCode >= 300 { localVarBody, err := _ioutil.ReadAll(body) body.Close() if err != nil { @@ -508,17 +502,12 @@ func (a *RestoreApiService) PostRestoreSQLExecute(r ApiPostRestoreSQLRequest) er return err } - var body _io.ReadCloser = localVarHTTPResponse.Body - if localVarHTTPResponse.Header.Get("Content-Encoding") == "gzip" { - gzr, err := _gzip.NewReader(body) + if localVarHTTPResponse.StatusCode >= 300 { + body, err := GunzipIfNeeded(localVarHTTPResponse) if err != nil { body.Close() return err } - body = &restoreApiGzipReadCloser{underlying: body, gzip: gzr} - } - - if localVarHTTPResponse.StatusCode >= 300 { localVarBody, err := _ioutil.ReadAll(body) body.Close() if err != nil { @@ -662,17 +651,12 @@ func (a *RestoreApiService) PostRestoreShardIdExecute(r ApiPostRestoreShardIdReq return err } - var body _io.ReadCloser = localVarHTTPResponse.Body - if localVarHTTPResponse.Header.Get("Content-Encoding") == "gzip" { - gzr, err := _gzip.NewReader(body) + if localVarHTTPResponse.StatusCode >= 300 { + body, err := GunzipIfNeeded(localVarHTTPResponse) if err != nil { body.Close() return err } - body = &restoreApiGzipReadCloser{underlying: body, gzip: gzr} - } - - if localVarHTTPResponse.StatusCode >= 300 { localVarBody, err := _ioutil.ReadAll(body) body.Close() if err != nil { diff --git a/api/api_setup.gen.go b/api/api_setup.gen.go index b1fc6b4..1f0e43b 100644 --- a/api/api_setup.gen.go +++ b/api/api_setup.gen.go @@ -11,7 +11,6 @@ package api import ( - _gzip "compress/gzip" _context "context" _io "io" _ioutil "io/ioutil" @@ -160,17 +159,12 @@ func (a *SetupApiService) GetSetupExecute(r ApiGetSetupRequest) (InlineResponse2 return localVarReturnValue, err } - var body _io.ReadCloser = localVarHTTPResponse.Body - if localVarHTTPResponse.Header.Get("Content-Encoding") == "gzip" { - gzr, err := _gzip.NewReader(body) + if localVarHTTPResponse.StatusCode >= 300 { + body, err := GunzipIfNeeded(localVarHTTPResponse) if err != nil { body.Close() return localVarReturnValue, err } - body = &setupApiGzipReadCloser{underlying: body, gzip: gzr} - } - - if localVarHTTPResponse.StatusCode >= 300 { localVarBody, err := _ioutil.ReadAll(body) body.Close() if err != nil { @@ -183,6 +177,11 @@ func (a *SetupApiService) GetSetupExecute(r ApiGetSetupRequest) (InlineResponse2 return localVarReturnValue, newErr } + body, err := GunzipIfNeeded(localVarHTTPResponse) + if err != nil { + body.Close() + return localVarReturnValue, err + } localVarBody, err := _ioutil.ReadAll(body) body.Close() if err != nil { @@ -300,17 +299,12 @@ func (a *SetupApiService) PostSetupExecute(r ApiPostSetupRequest) (OnboardingRes return localVarReturnValue, err } - var body _io.ReadCloser = localVarHTTPResponse.Body - if localVarHTTPResponse.Header.Get("Content-Encoding") == "gzip" { - gzr, err := _gzip.NewReader(body) + if localVarHTTPResponse.StatusCode >= 300 { + body, err := GunzipIfNeeded(localVarHTTPResponse) if err != nil { body.Close() return localVarReturnValue, err } - body = &setupApiGzipReadCloser{underlying: body, gzip: gzr} - } - - if localVarHTTPResponse.StatusCode >= 300 { localVarBody, err := _ioutil.ReadAll(body) body.Close() if err != nil { @@ -330,6 +324,11 @@ func (a *SetupApiService) PostSetupExecute(r ApiPostSetupRequest) (OnboardingRes return localVarReturnValue, newErr } + body, err := GunzipIfNeeded(localVarHTTPResponse) + if err != nil { + body.Close() + return localVarReturnValue, err + } localVarBody, err := _ioutil.ReadAll(body) body.Close() if err != nil { diff --git a/api/api_tasks.gen.go b/api/api_tasks.gen.go index 99d1d8e..3ed9961 100644 --- a/api/api_tasks.gen.go +++ b/api/api_tasks.gen.go @@ -11,7 +11,6 @@ package api import ( - _gzip "compress/gzip" _context "context" _io "io" _ioutil "io/ioutil" @@ -314,17 +313,12 @@ func (a *TasksApiService) DeleteTasksIDExecute(r ApiDeleteTasksIDRequest) error return err } - var body _io.ReadCloser = localVarHTTPResponse.Body - if localVarHTTPResponse.Header.Get("Content-Encoding") == "gzip" { - gzr, err := _gzip.NewReader(body) + if localVarHTTPResponse.StatusCode >= 300 { + body, err := GunzipIfNeeded(localVarHTTPResponse) if err != nil { body.Close() return err } - body = &tasksApiGzipReadCloser{underlying: body, gzip: gzr} - } - - if localVarHTTPResponse.StatusCode >= 300 { localVarBody, err := _ioutil.ReadAll(body) body.Close() if err != nil { @@ -454,17 +448,12 @@ func (a *TasksApiService) DeleteTasksIDRunsIDExecute(r ApiDeleteTasksIDRunsIDReq return err } - var body _io.ReadCloser = localVarHTTPResponse.Body - if localVarHTTPResponse.Header.Get("Content-Encoding") == "gzip" { - gzr, err := _gzip.NewReader(body) + if localVarHTTPResponse.StatusCode >= 300 { + body, err := GunzipIfNeeded(localVarHTTPResponse) if err != nil { body.Close() return err } - body = &tasksApiGzipReadCloser{underlying: body, gzip: gzr} - } - - if localVarHTTPResponse.StatusCode >= 300 { localVarBody, err := _ioutil.ReadAll(body) body.Close() if err != nil { @@ -656,17 +645,12 @@ func (a *TasksApiService) GetTasksExecute(r ApiGetTasksRequest) (Tasks, error) { return localVarReturnValue, err } - var body _io.ReadCloser = localVarHTTPResponse.Body - if localVarHTTPResponse.Header.Get("Content-Encoding") == "gzip" { - gzr, err := _gzip.NewReader(body) + if localVarHTTPResponse.StatusCode >= 300 { + body, err := GunzipIfNeeded(localVarHTTPResponse) if err != nil { body.Close() return localVarReturnValue, err } - body = &tasksApiGzipReadCloser{underlying: body, gzip: gzr} - } - - if localVarHTTPResponse.StatusCode >= 300 { localVarBody, err := _ioutil.ReadAll(body) body.Close() if err != nil { @@ -686,6 +670,11 @@ func (a *TasksApiService) GetTasksExecute(r ApiGetTasksRequest) (Tasks, error) { return localVarReturnValue, newErr } + body, err := GunzipIfNeeded(localVarHTTPResponse) + if err != nil { + body.Close() + return localVarReturnValue, err + } localVarBody, err := _ioutil.ReadAll(body) body.Close() if err != nil { @@ -800,17 +789,12 @@ func (a *TasksApiService) GetTasksIDExecute(r ApiGetTasksIDRequest) (Task, error return localVarReturnValue, err } - var body _io.ReadCloser = localVarHTTPResponse.Body - if localVarHTTPResponse.Header.Get("Content-Encoding") == "gzip" { - gzr, err := _gzip.NewReader(body) + if localVarHTTPResponse.StatusCode >= 300 { + body, err := GunzipIfNeeded(localVarHTTPResponse) if err != nil { body.Close() return localVarReturnValue, err } - body = &tasksApiGzipReadCloser{underlying: body, gzip: gzr} - } - - if localVarHTTPResponse.StatusCode >= 300 { localVarBody, err := _ioutil.ReadAll(body) body.Close() if err != nil { @@ -830,6 +814,11 @@ func (a *TasksApiService) GetTasksIDExecute(r ApiGetTasksIDRequest) (Task, error return localVarReturnValue, newErr } + body, err := GunzipIfNeeded(localVarHTTPResponse) + if err != nil { + body.Close() + return localVarReturnValue, err + } localVarBody, err := _ioutil.ReadAll(body) body.Close() if err != nil { @@ -944,17 +933,12 @@ func (a *TasksApiService) GetTasksIDLogsExecute(r ApiGetTasksIDLogsRequest) (Log return localVarReturnValue, err } - var body _io.ReadCloser = localVarHTTPResponse.Body - if localVarHTTPResponse.Header.Get("Content-Encoding") == "gzip" { - gzr, err := _gzip.NewReader(body) + if localVarHTTPResponse.StatusCode >= 300 { + body, err := GunzipIfNeeded(localVarHTTPResponse) if err != nil { body.Close() return localVarReturnValue, err } - body = &tasksApiGzipReadCloser{underlying: body, gzip: gzr} - } - - if localVarHTTPResponse.StatusCode >= 300 { localVarBody, err := _ioutil.ReadAll(body) body.Close() if err != nil { @@ -974,6 +958,11 @@ func (a *TasksApiService) GetTasksIDLogsExecute(r ApiGetTasksIDLogsRequest) (Log return localVarReturnValue, newErr } + body, err := GunzipIfNeeded(localVarHTTPResponse) + if err != nil { + body.Close() + return localVarReturnValue, err + } localVarBody, err := _ioutil.ReadAll(body) body.Close() if err != nil { @@ -1136,17 +1125,12 @@ func (a *TasksApiService) GetTasksIDRunsExecute(r ApiGetTasksIDRunsRequest) (Run return localVarReturnValue, err } - var body _io.ReadCloser = localVarHTTPResponse.Body - if localVarHTTPResponse.Header.Get("Content-Encoding") == "gzip" { - gzr, err := _gzip.NewReader(body) + if localVarHTTPResponse.StatusCode >= 300 { + body, err := GunzipIfNeeded(localVarHTTPResponse) if err != nil { body.Close() return localVarReturnValue, err } - body = &tasksApiGzipReadCloser{underlying: body, gzip: gzr} - } - - if localVarHTTPResponse.StatusCode >= 300 { localVarBody, err := _ioutil.ReadAll(body) body.Close() if err != nil { @@ -1166,6 +1150,11 @@ func (a *TasksApiService) GetTasksIDRunsExecute(r ApiGetTasksIDRunsRequest) (Run return localVarReturnValue, newErr } + body, err := GunzipIfNeeded(localVarHTTPResponse) + if err != nil { + body.Close() + return localVarReturnValue, err + } localVarBody, err := _ioutil.ReadAll(body) body.Close() if err != nil { @@ -1292,17 +1281,12 @@ func (a *TasksApiService) GetTasksIDRunsIDExecute(r ApiGetTasksIDRunsIDRequest) return localVarReturnValue, err } - var body _io.ReadCloser = localVarHTTPResponse.Body - if localVarHTTPResponse.Header.Get("Content-Encoding") == "gzip" { - gzr, err := _gzip.NewReader(body) + if localVarHTTPResponse.StatusCode >= 300 { + body, err := GunzipIfNeeded(localVarHTTPResponse) if err != nil { body.Close() return localVarReturnValue, err } - body = &tasksApiGzipReadCloser{underlying: body, gzip: gzr} - } - - if localVarHTTPResponse.StatusCode >= 300 { localVarBody, err := _ioutil.ReadAll(body) body.Close() if err != nil { @@ -1322,6 +1306,11 @@ func (a *TasksApiService) GetTasksIDRunsIDExecute(r ApiGetTasksIDRunsIDRequest) return localVarReturnValue, newErr } + body, err := GunzipIfNeeded(localVarHTTPResponse) + if err != nil { + body.Close() + return localVarReturnValue, err + } localVarBody, err := _ioutil.ReadAll(body) body.Close() if err != nil { @@ -1448,17 +1437,12 @@ func (a *TasksApiService) GetTasksIDRunsIDLogsExecute(r ApiGetTasksIDRunsIDLogsR return localVarReturnValue, err } - var body _io.ReadCloser = localVarHTTPResponse.Body - if localVarHTTPResponse.Header.Get("Content-Encoding") == "gzip" { - gzr, err := _gzip.NewReader(body) + if localVarHTTPResponse.StatusCode >= 300 { + body, err := GunzipIfNeeded(localVarHTTPResponse) if err != nil { body.Close() return localVarReturnValue, err } - body = &tasksApiGzipReadCloser{underlying: body, gzip: gzr} - } - - if localVarHTTPResponse.StatusCode >= 300 { localVarBody, err := _ioutil.ReadAll(body) body.Close() if err != nil { @@ -1478,6 +1462,11 @@ func (a *TasksApiService) GetTasksIDRunsIDLogsExecute(r ApiGetTasksIDRunsIDLogsR return localVarReturnValue, newErr } + body, err := GunzipIfNeeded(localVarHTTPResponse) + if err != nil { + body.Close() + return localVarReturnValue, err + } localVarBody, err := _ioutil.ReadAll(body) body.Close() if err != nil { @@ -1607,17 +1596,12 @@ func (a *TasksApiService) PatchTasksIDExecute(r ApiPatchTasksIDRequest) (Task, e return localVarReturnValue, err } - var body _io.ReadCloser = localVarHTTPResponse.Body - if localVarHTTPResponse.Header.Get("Content-Encoding") == "gzip" { - gzr, err := _gzip.NewReader(body) + if localVarHTTPResponse.StatusCode >= 300 { + body, err := GunzipIfNeeded(localVarHTTPResponse) if err != nil { body.Close() return localVarReturnValue, err } - body = &tasksApiGzipReadCloser{underlying: body, gzip: gzr} - } - - if localVarHTTPResponse.StatusCode >= 300 { localVarBody, err := _ioutil.ReadAll(body) body.Close() if err != nil { @@ -1637,6 +1621,11 @@ func (a *TasksApiService) PatchTasksIDExecute(r ApiPatchTasksIDRequest) (Task, e return localVarReturnValue, newErr } + body, err := GunzipIfNeeded(localVarHTTPResponse) + if err != nil { + body.Close() + return localVarReturnValue, err + } localVarBody, err := _ioutil.ReadAll(body) body.Close() if err != nil { @@ -1753,17 +1742,12 @@ func (a *TasksApiService) PostTasksExecute(r ApiPostTasksRequest) (Task, error) return localVarReturnValue, err } - var body _io.ReadCloser = localVarHTTPResponse.Body - if localVarHTTPResponse.Header.Get("Content-Encoding") == "gzip" { - gzr, err := _gzip.NewReader(body) + if localVarHTTPResponse.StatusCode >= 300 { + body, err := GunzipIfNeeded(localVarHTTPResponse) if err != nil { body.Close() return localVarReturnValue, err } - body = &tasksApiGzipReadCloser{underlying: body, gzip: gzr} - } - - if localVarHTTPResponse.StatusCode >= 300 { localVarBody, err := _ioutil.ReadAll(body) body.Close() if err != nil { @@ -1783,6 +1767,11 @@ func (a *TasksApiService) PostTasksExecute(r ApiPostTasksRequest) (Task, error) return localVarReturnValue, newErr } + body, err := GunzipIfNeeded(localVarHTTPResponse) + if err != nil { + body.Close() + return localVarReturnValue, err + } localVarBody, err := _ioutil.ReadAll(body) body.Close() if err != nil { @@ -1908,17 +1897,12 @@ func (a *TasksApiService) PostTasksIDRunsExecute(r ApiPostTasksIDRunsRequest) (R return localVarReturnValue, err } - var body _io.ReadCloser = localVarHTTPResponse.Body - if localVarHTTPResponse.Header.Get("Content-Encoding") == "gzip" { - gzr, err := _gzip.NewReader(body) + if localVarHTTPResponse.StatusCode >= 300 { + body, err := GunzipIfNeeded(localVarHTTPResponse) if err != nil { body.Close() return localVarReturnValue, err } - body = &tasksApiGzipReadCloser{underlying: body, gzip: gzr} - } - - if localVarHTTPResponse.StatusCode >= 300 { localVarBody, err := _ioutil.ReadAll(body) body.Close() if err != nil { @@ -1938,6 +1922,11 @@ func (a *TasksApiService) PostTasksIDRunsExecute(r ApiPostTasksIDRunsRequest) (R return localVarReturnValue, newErr } + body, err := GunzipIfNeeded(localVarHTTPResponse) + if err != nil { + body.Close() + return localVarReturnValue, err + } localVarBody, err := _ioutil.ReadAll(body) body.Close() if err != nil { @@ -2075,17 +2064,12 @@ func (a *TasksApiService) PostTasksIDRunsIDRetryExecute(r ApiPostTasksIDRunsIDRe return localVarReturnValue, err } - var body _io.ReadCloser = localVarHTTPResponse.Body - if localVarHTTPResponse.Header.Get("Content-Encoding") == "gzip" { - gzr, err := _gzip.NewReader(body) + if localVarHTTPResponse.StatusCode >= 300 { + body, err := GunzipIfNeeded(localVarHTTPResponse) if err != nil { body.Close() return localVarReturnValue, err } - body = &tasksApiGzipReadCloser{underlying: body, gzip: gzr} - } - - if localVarHTTPResponse.StatusCode >= 300 { localVarBody, err := _ioutil.ReadAll(body) body.Close() if err != nil { @@ -2105,6 +2089,11 @@ func (a *TasksApiService) PostTasksIDRunsIDRetryExecute(r ApiPostTasksIDRunsIDRe return localVarReturnValue, newErr } + body, err := GunzipIfNeeded(localVarHTTPResponse) + if err != nil { + body.Close() + return localVarReturnValue, err + } localVarBody, err := _ioutil.ReadAll(body) body.Close() if err != nil { diff --git a/api/api_users.gen.go b/api/api_users.gen.go index 0319c41..a3b966b 100644 --- a/api/api_users.gen.go +++ b/api/api_users.gen.go @@ -11,7 +11,6 @@ package api import ( - _gzip "compress/gzip" _context "context" _io "io" _ioutil "io/ioutil" @@ -222,17 +221,12 @@ func (a *UsersApiService) DeleteUsersIDExecute(r ApiDeleteUsersIDRequest) error return err } - var body _io.ReadCloser = localVarHTTPResponse.Body - if localVarHTTPResponse.Header.Get("Content-Encoding") == "gzip" { - gzr, err := _gzip.NewReader(body) + if localVarHTTPResponse.StatusCode >= 300 { + body, err := GunzipIfNeeded(localVarHTTPResponse) if err != nil { body.Close() return err } - body = &usersApiGzipReadCloser{underlying: body, gzip: gzr} - } - - if localVarHTTPResponse.StatusCode >= 300 { localVarBody, err := _ioutil.ReadAll(body) body.Close() if err != nil { @@ -400,17 +394,12 @@ func (a *UsersApiService) GetUsersExecute(r ApiGetUsersRequest) (Users, error) { return localVarReturnValue, err } - var body _io.ReadCloser = localVarHTTPResponse.Body - if localVarHTTPResponse.Header.Get("Content-Encoding") == "gzip" { - gzr, err := _gzip.NewReader(body) + if localVarHTTPResponse.StatusCode >= 300 { + body, err := GunzipIfNeeded(localVarHTTPResponse) if err != nil { body.Close() return localVarReturnValue, err } - body = &usersApiGzipReadCloser{underlying: body, gzip: gzr} - } - - if localVarHTTPResponse.StatusCode >= 300 { localVarBody, err := _ioutil.ReadAll(body) body.Close() if err != nil { @@ -430,6 +419,11 @@ func (a *UsersApiService) GetUsersExecute(r ApiGetUsersRequest) (Users, error) { return localVarReturnValue, newErr } + body, err := GunzipIfNeeded(localVarHTTPResponse) + if err != nil { + body.Close() + return localVarReturnValue, err + } localVarBody, err := _ioutil.ReadAll(body) body.Close() if err != nil { @@ -544,17 +538,12 @@ func (a *UsersApiService) GetUsersIDExecute(r ApiGetUsersIDRequest) (UserRespons return localVarReturnValue, err } - var body _io.ReadCloser = localVarHTTPResponse.Body - if localVarHTTPResponse.Header.Get("Content-Encoding") == "gzip" { - gzr, err := _gzip.NewReader(body) + if localVarHTTPResponse.StatusCode >= 300 { + body, err := GunzipIfNeeded(localVarHTTPResponse) if err != nil { body.Close() return localVarReturnValue, err } - body = &usersApiGzipReadCloser{underlying: body, gzip: gzr} - } - - if localVarHTTPResponse.StatusCode >= 300 { localVarBody, err := _ioutil.ReadAll(body) body.Close() if err != nil { @@ -574,6 +563,11 @@ func (a *UsersApiService) GetUsersIDExecute(r ApiGetUsersIDRequest) (UserRespons return localVarReturnValue, newErr } + body, err := GunzipIfNeeded(localVarHTTPResponse) + if err != nil { + body.Close() + return localVarReturnValue, err + } localVarBody, err := _ioutil.ReadAll(body) body.Close() if err != nil { @@ -702,17 +696,12 @@ func (a *UsersApiService) PatchUsersIDExecute(r ApiPatchUsersIDRequest) (UserRes return localVarReturnValue, err } - var body _io.ReadCloser = localVarHTTPResponse.Body - if localVarHTTPResponse.Header.Get("Content-Encoding") == "gzip" { - gzr, err := _gzip.NewReader(body) + if localVarHTTPResponse.StatusCode >= 300 { + body, err := GunzipIfNeeded(localVarHTTPResponse) if err != nil { body.Close() return localVarReturnValue, err } - body = &usersApiGzipReadCloser{underlying: body, gzip: gzr} - } - - if localVarHTTPResponse.StatusCode >= 300 { localVarBody, err := _ioutil.ReadAll(body) body.Close() if err != nil { @@ -732,6 +721,11 @@ func (a *UsersApiService) PatchUsersIDExecute(r ApiPatchUsersIDRequest) (UserRes return localVarReturnValue, newErr } + body, err := GunzipIfNeeded(localVarHTTPResponse) + if err != nil { + body.Close() + return localVarReturnValue, err + } localVarBody, err := _ioutil.ReadAll(body) body.Close() if err != nil { @@ -848,17 +842,12 @@ func (a *UsersApiService) PostUsersExecute(r ApiPostUsersRequest) (UserResponse, return localVarReturnValue, err } - var body _io.ReadCloser = localVarHTTPResponse.Body - if localVarHTTPResponse.Header.Get("Content-Encoding") == "gzip" { - gzr, err := _gzip.NewReader(body) + if localVarHTTPResponse.StatusCode >= 300 { + body, err := GunzipIfNeeded(localVarHTTPResponse) if err != nil { body.Close() return localVarReturnValue, err } - body = &usersApiGzipReadCloser{underlying: body, gzip: gzr} - } - - if localVarHTTPResponse.StatusCode >= 300 { localVarBody, err := _ioutil.ReadAll(body) body.Close() if err != nil { @@ -878,6 +867,11 @@ func (a *UsersApiService) PostUsersExecute(r ApiPostUsersRequest) (UserResponse, return localVarReturnValue, newErr } + body, err := GunzipIfNeeded(localVarHTTPResponse) + if err != nil { + body.Close() + return localVarReturnValue, err + } localVarBody, err := _ioutil.ReadAll(body) body.Close() if err != nil { @@ -1004,17 +998,12 @@ func (a *UsersApiService) PostUsersIDPasswordExecute(r ApiPostUsersIDPasswordReq return err } - var body _io.ReadCloser = localVarHTTPResponse.Body - if localVarHTTPResponse.Header.Get("Content-Encoding") == "gzip" { - gzr, err := _gzip.NewReader(body) + if localVarHTTPResponse.StatusCode >= 300 { + body, err := GunzipIfNeeded(localVarHTTPResponse) if err != nil { body.Close() return err } - body = &usersApiGzipReadCloser{underlying: body, gzip: gzr} - } - - if localVarHTTPResponse.StatusCode >= 300 { localVarBody, err := _ioutil.ReadAll(body) body.Close() if err != nil { diff --git a/api/api_write.gen.go b/api/api_write.gen.go index 703ab1b..24cf086 100644 --- a/api/api_write.gen.go +++ b/api/api_write.gen.go @@ -11,7 +11,6 @@ package api import ( - _gzip "compress/gzip" _context "context" _io "io" _ioutil "io/ioutil" @@ -253,17 +252,12 @@ func (a *WriteApiService) PostWriteExecute(r ApiPostWriteRequest) error { return err } - var body _io.ReadCloser = localVarHTTPResponse.Body - if localVarHTTPResponse.Header.Get("Content-Encoding") == "gzip" { - gzr, err := _gzip.NewReader(body) + if localVarHTTPResponse.StatusCode >= 300 { + body, err := GunzipIfNeeded(localVarHTTPResponse) if err != nil { body.Close() return err } - body = &writeApiGzipReadCloser{underlying: body, gzip: gzr} - } - - if localVarHTTPResponse.StatusCode >= 300 { localVarBody, err := _ioutil.ReadAll(body) body.Close() if err != nil { diff --git a/api/contract/cli.yml b/api/contract/cli.yml index 5dd60d3..a90c3ba 100644 --- a/api/contract/cli.yml +++ b/api/contract/cli.yml @@ -54,7 +54,7 @@ paths: /tasks/{taskID}/runs/{runID}/logs: $ref: "./openapi/src/common/paths/tasks_taskID_runs_runID_logs.yml" /backup/metadata: - $ref: "./openapi/src/oss/paths/backup_metadata.yml" + $ref: "./overrides/paths/backup_metadata.yml" /backup/shards/{shardID}: $ref: "./openapi/src/oss/paths/backup_shards_shardID.yml" /restore/kv: diff --git a/api/contract/openapi b/api/contract/openapi index ebb70c5..f5b7af4 160000 --- a/api/contract/openapi +++ b/api/contract/openapi @@ -1 +1 @@ -Subproject commit ebb70c5c53d946fdff97c492edc21ac70ad00cfd +Subproject commit f5b7af45fce2cfd074ba97bcafe907cba5f66d7f diff --git a/api/contract/overrides/paths/backup_metadata.yml b/api/contract/overrides/paths/backup_metadata.yml new file mode 100644 index 0000000..34ef7a4 --- /dev/null +++ b/api/contract/overrides/paths/backup_metadata.yml @@ -0,0 +1,40 @@ +get: + operationId: GetBackupMetadata + tags: + - Backup + summary: Download snapshot of all metadata in the server + parameters: + - $ref: "../../openapi/src/common/parameters/TraceSpan.yml" + - in: header + name: Accept-Encoding + description: The Accept-Encoding request HTTP header advertises which content encoding, usually a compression algorithm, the client is able to understand. + schema: + type: string + description: Specifies that the query response in the body should be encoded with gzip or not encoded with identity. + default: identity + enum: + - gzip + - identity + responses: + "200": + description: Snapshot of metadata + headers: + Content-Encoding: + description: The Content-Encoding entity header is used to compress the media-type. When present, its value indicates which encodings were applied to the entity-body + schema: + type: string + description: Specifies that the response in the body is encoded with gzip or not encoded with identity. + default: identity + enum: + - gzip + - identity + content: + multipart/mixed: + schema: + # NOTE: This has a proper schema in the `openapi` repo, but our codegen isn't smart enough to handle + # multipart responses. Pretend it's a binary string here so we can decode the body ourselves. + type: string + format: binary + default: + description: Unexpected error + $ref: '../../openapi/src/common/responses/ServerError.yml' diff --git a/api/gunzip.go b/api/gunzip.go new file mode 100644 index 0000000..aaa5e93 --- /dev/null +++ b/api/gunzip.go @@ -0,0 +1,34 @@ +package api + +import ( + "compress/gzip" + "io" + "net/http" +) + +func GunzipIfNeeded(resp *http.Response) (io.ReadCloser, error) { + if resp.Header.Get("Content-Encoding") == "gzip" { + gzr, err := gzip.NewReader(resp.Body) + if err != nil { + return resp.Body, err + } + return &gunzipReadCloser{underlying: resp.Body, gunzip: gzr}, nil + } + return resp.Body, nil +} + +type gunzipReadCloser struct { + underlying io.ReadCloser + gunzip io.ReadCloser +} + +func (gzrc *gunzipReadCloser) Read(p []byte) (int, error) { + return gzrc.gunzip.Read(p) +} + +func (gzrc *gunzipReadCloser) Close() error { + if err := gzrc.gunzip.Close(); err != nil { + return err + } + return gzrc.underlying.Close() +} diff --git a/api/gunzip_test.go b/api/gunzip_test.go new file mode 100644 index 0000000..620ba98 --- /dev/null +++ b/api/gunzip_test.go @@ -0,0 +1,75 @@ +package api_test + +import ( + "compress/gzip" + "io" + "io/ioutil" + "net/http" + "strings" + "testing" + + "github.com/influxdata/influx-cli/v2/api" + "github.com/stretchr/testify/require" +) + +var exampleResponse = `result,table,_start,_stop,_time,region,host,_value +mean,0,2018-05-08T20:50:00Z,2018-05-08T20:51:00Z,2018-05-08T20:50:00Z,east,A,15.43 +mean,0,2018-05-08T20:50:00Z,2018-05-08T20:51:00Z,2018-05-08T20:50:20Z,east,B,59.25 +mean,0,2018-05-08T20:50:00Z,2018-05-08T20:51:00Z,2018-05-08T20:50:40Z,east,C,52.62` + +func TestGunzipIfNeeded(t *testing.T) { + t.Parallel() + + testCases := []struct { + name string + encoding string + getBody func(*testing.T) io.ReadCloser + }{ + { + name: "no gzip", + getBody: func(t *testing.T) io.ReadCloser { + return ioutil.NopCloser(strings.NewReader(exampleResponse)) + }, + }, + { + name: "gzip", + encoding: "gzip", + getBody: func(t *testing.T) io.ReadCloser { + pr, pw := io.Pipe() + gw := gzip.NewWriter(pw) + + go func() { + _, err := io.Copy(gw, strings.NewReader(exampleResponse)) + gw.Close() + pw.Close() + require.NoError(t, err) + }() + + return pr + }, + }, + } + + for _, tc := range testCases { + tc := tc + t.Run(tc.name, func(t *testing.T) { + t.Parallel() + + headers := http.Header{} + if tc.encoding != "" { + headers.Add("Content-Encoding", tc.encoding) + } + resp := http.Response{ + Header: headers, + Body: tc.getBody(t), + } + + raw, err := api.GunzipIfNeeded(&resp) + require.NoError(t, err) + defer raw.Close() + body, err := ioutil.ReadAll(raw) + require.NoError(t, err) + require.Equal(t, exampleResponse, string(body)) + }) + } +} diff --git a/api/templates/README.md b/api/templates/README.md index ae8200d..d3bd6b6 100644 --- a/api/templates/README.md +++ b/api/templates/README.md @@ -15,9 +15,9 @@ multiple locations. * Add `GetX()` methods for each request parameter `X`, for use in unit tests * Add checks for `isByteArray` to generate `[]byte` request fields instead of `*string` * Update creation of `GenericOpenAPIError` to track sub-error models by reference -* Add checks for `isResponseBinary` to directly return the response-body-reader, instead of +* Add checks for `isResponseBinary` to directly return the raw `*http.Response`, instead of pulling the entire body into memory and transforming it into an `*os.File` -* GUnzip response bodies when `Content-Encoding: gzip` is set +* GUnzip response bodies before unmarshalling when `Content-Encoding: gzip` is set * Remove `*http.Response`s from the return values of generated operations `client.mustache` diff --git a/api/templates/api.mustache b/api/templates/api.mustache index 6363c4c..b94a6dc 100644 --- a/api/templates/api.mustache +++ b/api/templates/api.mustache @@ -4,7 +4,6 @@ package {{packageName}} {{#operations}} import ( "bytes" - _gzip "compress/gzip" _context "context" _io "io" _ioutil "io/ioutil" @@ -38,7 +37,7 @@ type {{classname}} interface { * {{nickname}}Execute executes the request{{#returnType}} * @return {{{.}}}{{/returnType}} */ - {{nickname}}Execute(r {{#structPrefix}}{{&classname}}{{/structPrefix}}Api{{operationId}}Request) ({{#returnType}}{{#isResponseBinary}}_io.ReadCloser{{/isResponseBinary}}{{^isResponseBinary}}{{{returnType}}}{{/isResponseBinary}}, {{/returnType}}error) + {{nickname}}Execute(r {{#structPrefix}}{{&classname}}{{/structPrefix}}Api{{operationId}}Request) ({{#returnType}}{{#isResponseBinary}}*_nethttp.Response{{/isResponseBinary}}{{^isResponseBinary}}{{{returnType}}}{{/isResponseBinary}}, {{/returnType}}error) {{/operation}} } {{/generateInterfaces}} @@ -83,7 +82,7 @@ func (r {{#structPrefix}}{{&classname}}{{/structPrefix}}Api{{operationId}}Reques {{/allParams}} -func (r {{#structPrefix}}{{&classname}}{{/structPrefix}}Api{{operationId}}Request) Execute() ({{#returnType}}{{#isResponseBinary}}_io.ReadCloser{{/isResponseBinary}}{{^isResponseBinary}}{{{returnType}}}{{/isResponseBinary}}, {{/returnType}}error) { +func (r {{#structPrefix}}{{&classname}}{{/structPrefix}}Api{{operationId}}Request) Execute() ({{#returnType}}{{#isResponseBinary}}*_nethttp.Response{{/isResponseBinary}}{{^isResponseBinary}}{{{returnType}}}{{/isResponseBinary}}, {{/returnType}}error) { return r.ApiService.{{nickname}}Execute(r) } @@ -110,7 +109,7 @@ func (a *{{{classname}}}Service) {{{nickname}}}(ctx _context.Context{{#pathParam * Execute executes the request{{#returnType}} * @return {{{.}}}{{/returnType}} */ -func (a *{{{classname}}}Service) {{nickname}}Execute(r {{#structPrefix}}{{&classname}}{{/structPrefix}}Api{{operationId}}Request) ({{#returnType}}{{#isResponseBinary}}_io.ReadCloser{{/isResponseBinary}}{{^isResponseBinary}}{{{.}}}{{/isResponseBinary}}, {{/returnType}}error) { +func (a *{{{classname}}}Service) {{nickname}}Execute(r {{#structPrefix}}{{&classname}}{{/structPrefix}}Api{{operationId}}Request) ({{#returnType}}{{#isResponseBinary}}*_nethttp.Response{{/isResponseBinary}}{{^isResponseBinary}}{{{.}}}{{/isResponseBinary}}, {{/returnType}}error) { var ( localVarHTTPMethod = _nethttp.Method{{httpMethod}} localVarPostBody interface{} @@ -119,7 +118,7 @@ func (a *{{{classname}}}Service) {{nickname}}Execute(r {{#structPrefix}}{{&class localVarFileBytes []byte {{#returnType}} {{#isResponseBinary}} - localVarReturnValue _io.ReadCloser + localVarReturnValue *_nethttp.Response {{/isResponseBinary}} {{^isResponseBinary}} localVarReturnValue {{{returnType}}} @@ -350,17 +349,12 @@ func (a *{{{classname}}}Service) {{nickname}}Execute(r {{#structPrefix}}{{&class return {{#returnType}}localVarReturnValue, {{/returnType}}err } - var body _io.ReadCloser = localVarHTTPResponse.Body - if localVarHTTPResponse.Header.Get("Content-Encoding") == "gzip" { - gzr, err := _gzip.NewReader(body) - if err != nil { - body.Close() - return {{#returnType}}localVarReturnValue, {{/returnType}}err - } - body = &{{#lambda.camelcase}}{{classname}}{{/lambda.camelcase}}GzipReadCloser{underlying: body, gzip: gzr} - } - if localVarHTTPResponse.StatusCode >= 300 { + body, err := GunzipIfNeeded(localVarHTTPResponse) + if err != nil { + body.Close() + return {{#returnType}}localVarReturnValue, {{/returnType}}err + } localVarBody, err := _ioutil.ReadAll(body) body.Close() if err != nil { @@ -399,9 +393,14 @@ func (a *{{{classname}}}Service) {{nickname}}Execute(r {{#structPrefix}}{{&class {{#returnType}} {{#isResponseBinary}} - localVarReturnValue = body + localVarReturnValue = localVarHTTPResponse {{/isResponseBinary}} {{^isResponseBinary}} + body, err := GunzipIfNeeded(localVarHTTPResponse) + if err != nil { + body.Close() + return {{#returnType}}localVarReturnValue, {{/returnType}}err + } localVarBody, err := _ioutil.ReadAll(body) body.Close() if err != nil { diff --git a/clients/query/query.go b/clients/query/query.go index 350af50..ed31861 100644 --- a/clients/query/query.go +++ b/clients/query/query.go @@ -142,7 +142,11 @@ func (c Client) Query(ctx context.Context, params *Params) error { if err != nil { return fmt.Errorf("failed to execute query: %w", err) } - defer resp.Close() + respBody, err := api.GunzipIfNeeded(resp) + if err != nil { + return fmt.Errorf("failed to decode query response: %w", err) + } + defer respBody.Close() - return c.PrintQueryResults(resp, c.StdIO) + return c.PrintQueryResults(respBody, c.StdIO) } diff --git a/clients/query/query_test.go b/clients/query/query_test.go index 10fb405..22a3619 100644 --- a/clients/query/query_test.go +++ b/clients/query/query_test.go @@ -2,8 +2,11 @@ package query_test import ( "bytes" + "compress/gzip" "context" + "io" "io/ioutil" + "net/http" "strings" "testing" @@ -117,7 +120,7 @@ func TestQuery(t *testing.T) { assert.Equal(t, fakeQuery, *body) && assert.Equal(t, orgID.String(), *in.GetOrgID()) && assert.Nil(t, in.GetOrg()) - })).Return(ioutil.NopCloser(strings.NewReader(fakeResults)), nil) + })).Return(&http.Response{Body: ioutil.NopCloser(strings.NewReader(fakeResults))}, nil) }, }, { @@ -137,7 +140,7 @@ func TestQuery(t *testing.T) { assert.Equal(t, fakeQuery, *body) && assert.Equal(t, "my-org", *in.GetOrg()) && assert.Nil(t, in.GetOrgID()) - })).Return(ioutil.NopCloser(strings.NewReader(fakeResults)), nil) + })).Return(&http.Response{Body: ioutil.NopCloser(strings.NewReader(fakeResults))}, nil) }, }, { @@ -155,7 +158,7 @@ func TestQuery(t *testing.T) { assert.Equal(t, fakeQuery, *body) && assert.Equal(t, "default-org", *in.GetOrg()) && assert.Nil(t, in.GetOrgID()) - })).Return(ioutil.NopCloser(strings.NewReader(fakeResults)), nil) + })).Return(&http.Response{Body: ioutil.NopCloser(strings.NewReader(fakeResults))}, nil) }, }, { @@ -186,7 +189,40 @@ func TestQuery(t *testing.T) { assert.Equal(t, expectedBody, *body) && assert.Equal(t, "default-org", *in.GetOrg()) && assert.Nil(t, in.GetOrgID()) - })).Return(ioutil.NopCloser(strings.NewReader(fakeResults)), nil) + })).Return(&http.Response{Body: ioutil.NopCloser(strings.NewReader(fakeResults))}, nil) + }, + }, + { + name: "gzipped response", + params: query.Params{ + OrgParams: clients.OrgParams{ + OrgID: orgID, + }, + Query: fakeQuery.Query, + }, + configOrgName: "default-org", + registerExpectations: func(t *testing.T, queryApi *mock.MockQueryApi) { + queryApi.EXPECT().PostQuery(gomock.Any()).Return(api.ApiPostQueryRequest{ApiService: queryApi}) + queryApi.EXPECT().PostQueryExecute(tmock.MatchedBy(func(in api.ApiPostQueryRequest) bool { + body := in.GetQuery() + return assert.NotNil(t, body) && + assert.Equal(t, fakeQuery, *body) && + assert.Equal(t, orgID.String(), *in.GetOrgID()) && + assert.Nil(t, in.GetOrg()) + })).DoAndReturn(func(api.ApiPostQueryRequest) (*http.Response, error) { + pr, pw := io.Pipe() + gw := gzip.NewWriter(pw) + + go func() { + _, err := gw.Write([]byte(fakeResults)) + gw.Close() + pw.Close() + require.NoError(t, err) + }() + + resp := http.Response{Body: pr, Header: http.Header{"Content-Encoding": []string{"gzip"}}} + return &resp, nil + }) }, }, } diff --git a/internal/mock/api_query.gen.go b/internal/mock/api_query.gen.go index ef6af3f..5d1e44c 100644 --- a/internal/mock/api_query.gen.go +++ b/internal/mock/api_query.gen.go @@ -6,7 +6,7 @@ package mock import ( context "context" - io "io" + http "net/http" reflect "reflect" gomock "github.com/golang/mock/gomock" @@ -51,10 +51,10 @@ func (mr *MockQueryApiMockRecorder) PostQuery(arg0 interface{}) *gomock.Call { } // PostQueryExecute mocks base method. -func (m *MockQueryApi) PostQueryExecute(arg0 api.ApiPostQueryRequest) (io.ReadCloser, error) { +func (m *MockQueryApi) PostQueryExecute(arg0 api.ApiPostQueryRequest) (*http.Response, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "PostQueryExecute", arg0) - ret0, _ := ret[0].(io.ReadCloser) + ret0, _ := ret[0].(*http.Response) ret1, _ := ret[1].(error) return ret0, ret1 }