Skip to content

Commit bbdf672

Browse files
authored
fix(golang): don't return http responses (#241)
would require http response body closing boilerplate code after each SDK API call
1 parent 9936c10 commit bbdf672

File tree

2 files changed

+67
-26
lines changed

2 files changed

+67
-26
lines changed

languages/golang/templates/api.mustache

Lines changed: 64 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,9 @@ type {{classname}} interface {
4646
{{#isDeprecated}}
4747
// Deprecated
4848
{{/isDeprecated}}
49-
{{nickname}}Execute(r {{#structPrefix}}{{&classname}}{{/structPrefix}}{{^structPrefix}}Api{{/structPrefix}}{{operationId}}Request) ({{#returnType}}{{^isArray}}{{^returnTypeIsPrimitive}}{{^isResponseFile}}*{{/isResponseFile}}{{/returnTypeIsPrimitive}}{{/isArray}}{{{.}}}, {{/returnType}}*http.Response, error)
49+
{{! TEMPLATE CUSTOMIZATION - BEGIN - don't return http response - would require closing after each SDK API call to prevent resource leaks }}
50+
{{nickname}}Execute(r {{#structPrefix}}{{&classname}}{{/structPrefix}}{{^structPrefix}}Api{{/structPrefix}}{{operationId}}Request) ({{#returnType}}{{^isArray}}{{^returnTypeIsPrimitive}}{{^isResponseFile}}*{{/isResponseFile}}{{/returnTypeIsPrimitive}}{{/isArray}}{{{.}}}, {{/returnType}} error)
51+
{{! TEMPLATE CUSTOMIZATION - END - don't return http response - would require closing after each SDK API call to prevent resource leaks }}
5052
{{/operation}}
5153
}
5254
{{/generateInterfaces}}
@@ -81,7 +83,9 @@ func (r {{#structPrefix}}{{&classname}}{{/structPrefix}}{{^structPrefix}}Api{{/s
8183

8284
{{/isPathParam}}
8385
{{/allParams}}
84-
func (r {{#structPrefix}}{{&classname}}{{/structPrefix}}{{^structPrefix}}Api{{/structPrefix}}{{operationId}}Request) Execute() ({{#returnType}}{{^isArray}}{{^returnTypeIsPrimitive}}{{^isResponseFile}}*{{/isResponseFile}}{{/returnTypeIsPrimitive}}{{/isArray}}{{{.}}}, {{/returnType}}*http.Response, error) {
86+
{{! TEMPLATE CUSTOMIZATION - BEGIN - don't return http response - would require closing after each SDK API call to prevent resource leaks }}
87+
func (r {{#structPrefix}}{{&classname}}{{/structPrefix}}{{^structPrefix}}Api{{/structPrefix}}{{operationId}}Request) Execute() ({{#returnType}}{{^isArray}}{{^returnTypeIsPrimitive}}{{^isResponseFile}}*{{/isResponseFile}}{{/returnTypeIsPrimitive}}{{/isArray}}{{{.}}}, {{/returnType}} error) {
88+
{{! TEMPLATE CUSTOMIZATION - END - don't return http response - would require closing after each SDK API call to prevent resource leaks }}
8589
return r.ApiService.{{nickname}}Execute(r)
8690
}
8791

@@ -115,7 +119,9 @@ func (a *{{{classname}}}Service) {{{nickname}}}(ctx context.Context{{#pathParams
115119
{{#isDeprecated}}
116120
// Deprecated
117121
{{/isDeprecated}}
118-
func (a *{{{classname}}}Service) {{nickname}}Execute(r {{#structPrefix}}{{&classname}}{{/structPrefix}}{{^structPrefix}}Api{{/structPrefix}}{{operationId}}Request) ({{#returnType}}{{^isArray}}{{^returnTypeIsPrimitive}}{{^isResponseFile}}*{{/isResponseFile}}{{/returnTypeIsPrimitive}}{{/isArray}}{{{.}}}, {{/returnType}}*http.Response, error) {
122+
{{! TEMPLATE CUSTOMIZATION - BEGIN - don't return http response - would require closing after each SDK API call to prevent resource leaks }}
123+
func (a *{{{classname}}}Service) {{nickname}}Execute(r {{#structPrefix}}{{&classname}}{{/structPrefix}}{{^structPrefix}}Api{{/structPrefix}}{{operationId}}Request) ({{#returnType}}{{^isArray}}{{^returnTypeIsPrimitive}}{{^isResponseFile}}*{{/isResponseFile}}{{/returnTypeIsPrimitive}}{{/isArray}}{{{.}}}, {{/returnType}} error) {
124+
{{! TEMPLATE CUSTOMIZATION - END - don't return http response - would require closing after each SDK API call to prevent resource leaks }}
119125
var (
120126
localVarHTTPMethod = http.Method{{httpMethod}}
121127
localVarPostBody interface{}
@@ -128,7 +134,7 @@ func (a *{{{classname}}}Service) {{nickname}}Execute(r {{#structPrefix}}{{&class
128134
localBasePath, err := a.client.cfg.ServerURLWithContext(r.ctx, "{{{classname}}}Service.{{{nickname}}}")
129135
if err != nil {
130136
{{! TEMPLATE CUSTOMIZATION - BEGIN - use the GenericOpenAPIError struct from the core module instead of the one generated by OpenAPI generator by default }}
131-
return {{#returnType}}localVarReturnValue, {{/returnType}}nil, &oapierror.GenericOpenAPIError{ErrorMessage: err.Error()}
137+
return {{#returnType}}localVarReturnValue, {{/returnType}} &oapierror.GenericOpenAPIError{ErrorMessage: err.Error()}
132138
{{! TEMPLATE CUSTOMIZATION - END - use the GenericOpenAPIError struct from the core module instead of the one generated by OpenAPI generator by default }}
133139
}
134140

@@ -142,27 +148,37 @@ func (a *{{{classname}}}Service) {{nickname}}Execute(r {{#structPrefix}}{{&class
142148
{{#required}}
143149
{{^isPathParam}}
144150
if r.{{paramName}} == nil {
145-
return {{#returnType}}localVarReturnValue, {{/returnType}}nil, reportError("{{paramName}} is required and must be specified")
151+
{{! TEMPLATE CUSTOMIZATION - BEGIN - don't return http response - would require closing after each SDK API call to prevent resource leaks }}
152+
return {{#returnType}}localVarReturnValue, {{/returnType}} reportError("{{paramName}} is required and must be specified")
153+
{{! TEMPLATE CUSTOMIZATION - END - don't return http response - would require closing after each SDK API call to prevent resource leaks }}
146154
}
147155
{{/isPathParam}}
148156
{{#minItems}}
149157
if len({{^isPathParam}}*{{/isPathParam}}r.{{paramName}}) < {{minItems}} {
150-
return {{#returnType}}localVarReturnValue, {{/returnType}}nil, reportError("{{paramName}} must have at least {{minItems}} elements")
158+
{{! TEMPLATE CUSTOMIZATION - BEGIN - don't return http response - would require closing after each SDK API call to prevent resource leaks }}
159+
return {{#returnType}}localVarReturnValue, {{/returnType}} reportError("{{paramName}} must have at least {{minItems}} elements")
160+
{{! TEMPLATE CUSTOMIZATION - END - don't return http response - would require closing after each SDK API call to prevent resource leaks }}
151161
}
152162
{{/minItems}}
153163
{{#maxItems}}
154164
if len({{^isPathParam}}*{{/isPathParam}}r.{{paramName}}) > {{maxItems}} {
155-
return {{#returnType}}localVarReturnValue, {{/returnType}}nil, reportError("{{paramName}} must have less than {{maxItems}} elements")
165+
{{! TEMPLATE CUSTOMIZATION - BEGIN - don't return http response - would require closing after each SDK API call to prevent resource leaks }}
166+
return {{#returnType}}localVarReturnValue, {{/returnType}} reportError("{{paramName}} must have less than {{maxItems}} elements")
167+
{{! TEMPLATE CUSTOMIZATION - END - don't return http response - would require closing after each SDK API call to prevent resource leaks }}
156168
}
157169
{{/maxItems}}
158170
{{#minLength}}
159171
if strlen({{^isPathParam}}*{{/isPathParam}}r.{{paramName}}) < {{minLength}} {
160-
return {{#returnType}}localVarReturnValue, {{/returnType}}nil, reportError("{{paramName}} must have at least {{minLength}} elements")
172+
{{! TEMPLATE CUSTOMIZATION - BEGIN - don't return http response - would require closing after each SDK API call to prevent resource leaks }}
173+
return {{#returnType}}localVarReturnValue, {{/returnType}} reportError("{{paramName}} must have at least {{minLength}} elements")
174+
{{! TEMPLATE CUSTOMIZATION - END - don't return http response - would require closing after each SDK API call to prevent resource leaks }}
161175
}
162176
{{/minLength}}
163177
{{#maxLength}}
164178
if strlen({{^isPathParam}}*{{/isPathParam}}r.{{paramName}}) > {{maxLength}} {
165-
return {{#returnType}}localVarReturnValue, {{/returnType}}nil, reportError("{{paramName}} must have less than {{maxLength}} elements")
179+
{{! TEMPLATE CUSTOMIZATION - BEGIN - don't return http response - would require closing after each SDK API call to prevent resource leaks }}
180+
return {{#returnType}}localVarReturnValue, {{/returnType}} reportError("{{paramName}} must have less than {{maxLength}} elements")
181+
{{! TEMPLATE CUSTOMIZATION - END - don't return http response - would require closing after each SDK API call to prevent resource leaks }}
166182
}
167183
{{/maxLength}}
168184
{{#minimum}}
@@ -173,7 +189,9 @@ func (a *{{{classname}}}Service) {{nickname}}Execute(r {{#structPrefix}}{{&class
173189
{{^isString}}
174190
if {{^isPathParam}}*{{/isPathParam}}r.{{paramName}} < {{minimum}} {
175191
{{/isString}}
176-
return {{#returnType}}localVarReturnValue, {{/returnType}}nil, reportError("{{paramName}} must be greater than {{minimum}}")
192+
{{! TEMPLATE CUSTOMIZATION - BEGIN - don't return http response - would require closing after each SDK API call to prevent resource leaks }}
193+
return {{#returnType}}localVarReturnValue, {{/returnType}} reportError("{{paramName}} must be greater than {{minimum}}")
194+
{{! TEMPLATE CUSTOMIZATION - END - don't return http response - would require closing after each SDK API call to prevent resource leaks }}
177195
}
178196
{{/minimum}}
179197
{{#maximum}}
@@ -184,7 +202,9 @@ func (a *{{{classname}}}Service) {{nickname}}Execute(r {{#structPrefix}}{{&class
184202
{{^isString}}
185203
if {{^isPathParam}}*{{/isPathParam}}r.{{paramName}} > {{maximum}} {
186204
{{/isString}}
187-
return {{#returnType}}localVarReturnValue, {{/returnType}}nil, reportError("{{paramName}} must be less than {{maximum}}")
205+
{{! TEMPLATE CUSTOMIZATION - BEGIN - don't return http response - would require closing after each SDK API call to prevent resource leaks }}
206+
return {{#returnType}}localVarReturnValue, {{/returnType}} reportError("{{paramName}} must be less than {{maximum}}")
207+
{{! TEMPLATE CUSTOMIZATION - END - don't return http response - would require closing after each SDK API call to prevent resource leaks }}
188208
}
189209
{{/maximum}}
190210
{{/required}}
@@ -319,7 +339,9 @@ func (a *{{{classname}}}Service) {{nickname}}Execute(r {{#structPrefix}}{{&class
319339
if r.{{paramName}} != nil {
320340
paramJson, err := parameterToJson(*r.{{paramName}})
321341
if err != nil {
322-
return {{#returnType}}localVarReturnValue, {{/returnType}}nil, err
342+
{{! TEMPLATE CUSTOMIZATION - BEGIN - don't return http response - would require closing after each SDK API call to prevent resource leaks }}
343+
return {{#returnType}}localVarReturnValue, {{/returnType}} err
344+
{{! TEMPLATE CUSTOMIZATION - END - don't return http response - would require closing after each SDK API call to prevent resource leaks }}
323345
}
324346
localVarFormParams.Add("{{{baseName}}}", paramJson)
325347
}
@@ -374,7 +396,9 @@ func (a *{{{classname}}}Service) {{nickname}}Execute(r {{#structPrefix}}{{&class
374396
{{/authMethods}}
375397
req, err := a.client.prepareRequest(r.ctx, localVarPath, localVarHTTPMethod, localVarPostBody, localVarHeaderParams, localVarQueryParams, localVarFormParams, formFiles)
376398
if err != nil {
377-
return {{#returnType}}localVarReturnValue, {{/returnType}}nil, err
399+
{{! TEMPLATE CUSTOMIZATION - BEGIN - don't return http response - would require closing after each SDK API call to prevent resource leaks }}
400+
return {{#returnType}}localVarReturnValue, {{/returnType}} err
401+
{{! TEMPLATE CUSTOMIZATION - END - don't return http response - would require closing after each SDK API call to prevent resource leaks }}
378402
}
379403

380404
{{! TEMPLATE CUSTOMIZATION - BEGIN - capture http request and response in ctx }}
@@ -392,21 +416,27 @@ func (a *{{{classname}}}Service) {{nickname}}Execute(r {{#structPrefix}}{{&class
392416
}
393417
{{! TEMPLATE CUSTOMIZATION - END - capture http request and response in ctx }}
394418
if err != nil || localVarHTTPResponse == nil {
395-
return {{#returnType}}localVarReturnValue, {{/returnType}}localVarHTTPResponse, err
419+
{{! TEMPLATE CUSTOMIZATION - BEGIN - don't return http response - would require closing after each SDK API call to prevent resource leaks }}
420+
return {{#returnType}}localVarReturnValue, {{/returnType}} err
421+
{{! TEMPLATE CUSTOMIZATION - END - don't return http response - would require closing after each SDK API call to prevent resource leaks }}
396422
}
397423

398424
localVarBody, err := io.ReadAll(localVarHTTPResponse.Body)
399425
localVarHTTPResponse.Body.Close()
400426
localVarHTTPResponse.Body = io.NopCloser(bytes.NewBuffer(localVarBody))
401427
if err != nil {
402-
return {{#returnType}}localVarReturnValue, {{/returnType}}localVarHTTPResponse, err
428+
{{! TEMPLATE CUSTOMIZATION - BEGIN - don't return http response - would require closing after each SDK API call to prevent resource leaks }}
429+
return {{#returnType}}localVarReturnValue, {{/returnType}} err
430+
{{! TEMPLATE CUSTOMIZATION - END - don't return http response - would require closing after each SDK API call to prevent resource leaks }}
403431
}
404432

405433
{{#withCustomMiddlewareFunction}}
406434
if a.client.cfg.ResponseMiddleware != nil {
407435
err = a.client.cfg.ResponseMiddleware(localVarHTTPResponse, localVarBody)
408436
if err != nil {
409-
return {{#returnType}}localVarReturnValue, {{/returnType}}localVarHTTPResponse, err
437+
{{! TEMPLATE CUSTOMIZATION - BEGIN - don't return http response - would require closing after each SDK API call to prevent resource leaks }}
438+
return {{#returnType}}localVarReturnValue, {{/returnType}} err
439+
{{! TEMPLATE CUSTOMIZATION - END - don't return http response - would require closing after each SDK API call to prevent resource leaks }}
410440
}
411441
}
412442

@@ -445,14 +475,20 @@ func (a *{{{classname}}}Service) {{nickname}}Execute(r {{#structPrefix}}{{&class
445475
{{! TEMPLATE CUSTOMIZATION - BEGIN - use the GenericOpenAPIError struct from the core module instead of the one generated by OpenAPI generator by default }}
446476
newErr.ErrorMessage = err.Error()
447477
{{! TEMPLATE CUSTOMIZATION - END - use the GenericOpenAPIError struct from the core module instead of the one generated by OpenAPI generator by default }}
448-
return {{#returnType}}localVarReturnValue, {{/returnType}}localVarHTTPResponse, newErr
478+
{{! TEMPLATE CUSTOMIZATION - BEGIN - don't return http response - would require closing after each SDK API call to prevent resource leaks }}
479+
return {{#returnType}}localVarReturnValue, {{/returnType}} newErr
480+
{{! TEMPLATE CUSTOMIZATION - END - don't return http response - would require closing after each SDK API call to prevent resource leaks }}
449481
}
450482
{{! TEMPLATE CUSTOMIZATION - BEGIN - use the GenericOpenAPIError struct from the core module instead of the one generated by OpenAPI generator by default }}
451483
newErr.ErrorMessage = oapierror.FormatErrorMessage(localVarHTTPResponse.Status, &v)
452484
newErr.Model = v
453-
return {{#returnType}}localVarReturnValue, {{/returnType}}localVarHTTPResponse, newErr
485+
{{! TEMPLATE CUSTOMIZATION - BEGIN - don't return http response - would require closing after each SDK API call to prevent resource leaks }}
486+
return {{#returnType}}localVarReturnValue, {{/returnType}} newErr
487+
{{! TEMPLATE CUSTOMIZATION - END - don't return http response - would require closing after each SDK API call to prevent resource leaks }}
454488
{{^-last}}
455-
return {{#returnType}}localVarReturnValue, {{/returnType}}localVarHTTPResponse, newErr
489+
{{! TEMPLATE CUSTOMIZATION - BEGIN - don't return http response - would require closing after each SDK API call to prevent resource leaks }}
490+
return {{#returnType}}localVarReturnValue, {{/returnType}} newErr
491+
{{! TEMPLATE CUSTOMIZATION - END - don't return http response - would require closing after each SDK API call to prevent resource leaks }}
456492
{{/-last}}
457493
{{^wildcard}}
458494
}
@@ -461,7 +497,9 @@ func (a *{{{classname}}}Service) {{nickname}}Execute(r {{#structPrefix}}{{&class
461497
{{/is1xx}}
462498
{{/dataType}}
463499
{{/responses}}
464-
return {{#returnType}}localVarReturnValue, {{/returnType}}localVarHTTPResponse, newErr
500+
{{! TEMPLATE CUSTOMIZATION - BEGIN - don't return http response - would require closing after each SDK API call to prevent resource leaks }}
501+
return {{#returnType}}localVarReturnValue, {{/returnType}} newErr
502+
{{! TEMPLATE CUSTOMIZATION - END - don't return http response - would require closing after each SDK API call to prevent resource leaks }}
465503
}
466504

467505
{{#returnType}}
@@ -474,11 +512,15 @@ func (a *{{{classname}}}Service) {{nickname}}Execute(r {{#structPrefix}}{{&class
474512
ErrorMessage: err.Error(),
475513
}
476514
{{! TEMPLATE CUSTOMIZATION - END - use the GenericOpenAPIError struct from the core module instead of the one generated by OpenAPI generator by default }}
477-
return {{#returnType}}localVarReturnValue, {{/returnType}}localVarHTTPResponse, newErr
515+
{{! TEMPLATE CUSTOMIZATION - BEGIN - don't return http response - would require closing after each SDK API call to prevent resource leaks }}
516+
return {{#returnType}}localVarReturnValue, {{/returnType}} newErr
517+
{{! TEMPLATE CUSTOMIZATION - END - don't return http response - would require closing after each SDK API call to prevent resource leaks }}
478518
}
479519

480520
{{/returnType}}
481-
return {{#returnType}}localVarReturnValue, {{/returnType}}localVarHTTPResponse, nil
521+
{{! TEMPLATE CUSTOMIZATION - BEGIN - don't return http response - would require closing after each SDK API call to prevent resource leaks }}
522+
return {{#returnType}}localVarReturnValue, {{/returnType}} nil
523+
{{! TEMPLATE CUSTOMIZATION - END - don't return http response - would require closing after each SDK API call to prevent resource leaks }}
482524
}
483525
{{/operation}}
484526
{{/operations}}

languages/golang/templates/custom/api_mock.mustache

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ package {{packageName}}
44
{{#operations}}
55
import (
66
"context"
7-
"net/http"
87
)
98

109
// assert the implementation matches the interface
@@ -15,7 +14,7 @@ var _ {{classname}} = &{{classname}}ServiceMock{}
1514
type {{classname}}ServiceMock struct {
1615
{{#operation}}
1716
// {{#isDeprecated}}Deprecated: {{/isDeprecated}}{{nickname}}ExecuteMock can be populated to implement the behavior of the {{nickname}}Execute function of this mock
18-
{{nickname}}ExecuteMock *func(r {{#structPrefix}}{{&classname}}{{/structPrefix}}{{^structPrefix}}Api{{/structPrefix}}{{operationId}}Request) ({{#returnType}}{{^isArray}}{{^returnTypeIsPrimitive}}{{^isResponseFile}}*{{/isResponseFile}}{{/returnTypeIsPrimitive}}{{/isArray}}{{{.}}}, {{/returnType}}*http.Response, error)
17+
{{nickname}}ExecuteMock *func(r {{#structPrefix}}{{&classname}}{{/structPrefix}}{{^structPrefix}}Api{{/structPrefix}}{{operationId}}Request) ({{#returnType}}{{^isArray}}{{^returnTypeIsPrimitive}}{{^isResponseFile}}*{{/isResponseFile}}{{/returnTypeIsPrimitive}}{{/isArray}}{{{.}}}, {{/returnType}} error)
1918
{{/operation}}
2019
}
2120

@@ -34,12 +33,12 @@ func (a {{{classname}}}ServiceMock) {{{nickname}}}(ctx context.Context{{#pathPar
3433
}
3534

3635
// {{#isDeprecated}}Deprecated: {{/isDeprecated}}{{nickname}}Execute is a no-op by default and will return only return nil values. Behavior can be controlled by populating the {{nickname}}ExecuteMock field in the {{classname}}ServiceMock struct.
37-
func (a {{{classname}}}ServiceMock) {{nickname}}Execute(r {{#structPrefix}}{{&classname}}{{/structPrefix}}{{^structPrefix}}Api{{/structPrefix}}{{operationId}}Request) ({{#returnType}}{{^isArray}}{{^returnTypeIsPrimitive}}{{^isResponseFile}}*{{/isResponseFile}}{{/returnTypeIsPrimitive}}{{/isArray}}{{{.}}}, {{/returnType}}*http.Response, error) {
36+
func (a {{{classname}}}ServiceMock) {{nickname}}Execute(r {{#structPrefix}}{{&classname}}{{/structPrefix}}{{^structPrefix}}Api{{/structPrefix}}{{operationId}}Request) ({{#returnType}}{{^isArray}}{{^returnTypeIsPrimitive}}{{^isResponseFile}}*{{/isResponseFile}}{{/returnTypeIsPrimitive}}{{/isArray}}{{{.}}}, {{/returnType}} error) {
3837
if a.{{nickname}}ExecuteMock == nil {
3938
{{#returnType}}
4039
var localVarReturnValue {{^isArray}}{{^returnTypeIsPrimitive}}{{^isResponseFile}}*{{/isResponseFile}}{{/returnTypeIsPrimitive}}{{/isArray}}{{{.}}}
4140
{{/returnType}}
42-
return {{#returnType}}localVarReturnValue, {{/returnType}}&http.Response{}, nil
41+
return {{#returnType}}localVarReturnValue, {{/returnType}}nil
4342
}
4443

4544
return (*a.{{nickname}}ExecuteMock)(r)

0 commit comments

Comments
 (0)