Do not check status code for default response - #3322

Merged
wing328 merged 2 commits into
OpenAPITools:masterfrom
thiagoarrais:go-default-response
Oct 14, 2019
Merged

Do not check status code for default response#3322
wing328 merged 2 commits into
OpenAPITools:masterfrom
thiagoarrais:go-default-response

Conversation

@thiagoarrais

@thiagoarraisthiagoarrais commented Jul 9, 2019

Copy link
Copy Markdown
Contributor

PR checklist

  • Read the contribution guidelines.
  • Ran the shell script under ./bin/ to update Petstore sample so that CIs can verify the change. (For instance, only need to run ./bin/{LANG}-petstore.sh, ./bin/openapi3/{LANG}-petstore.sh if updating the {LANG} (e.g. php, ruby, python, etc) code generator or {LANG} client's mustache templates). Windows batch files can be found in .\bin\windows\. If contributing template-only or documentation-only changes which will change sample output, be sure to build the project first.
  • Filed the PR against the correct branch: master, 4.1.x, 5.0.x. Default: master.
  • Copied the technical committee to review the pull request if your PR is targeting a particular programming language.

Description of the PR

Fixes#3321 by not checking HTTP status when generating code for a default response.

Reviewers, please check review comments.

cc @antihax (2017/11) @bvwells (2017/12) @grokify (2018/07) @kemokemo (2018/09)

Comment threadmodules/openapi-generator/src/main/resources/go/api.mustache Outdated

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This counts on the fact that the wildcard response will be the last one. My (limited) testing confirmed this, but will that always be the case?

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ideally this should catch any error code so the error model is returned if one is specified. It may need to catch the default/wildcard in these cases.

If i remember correct, this should be an interface so it could be possible to make this completely generic without specifically checking each code?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ideally this should catch any error code so the error model is returned if one is specified. It may need to catch the default/wildcard in these cases.

My approach here was supressing the status code check for the default case so that it handles any error code. But that may overcatch if the wildcard response isn't the last one. Hence my original question.

If i remember correct, this should be an interface so it could be possible to make this completely generic without specifically checking each code?

Sorry, I don't understand. Are you suggesting removing that check completely and just trying to unmarshall the error model based on datatype?

@antihax

Copy link
Copy Markdown
Contributor

Can you regenerate the test client?

@thiagoarrais

thiagoarrais commented Jul 9, 2019

Copy link
Copy Markdown
ContributorAuthor

Done in 942f65f. I was saving that for when the PR got closer to finishing.

Comment threadmodules/openapi-generator/src/main/resources/go/api.mustache Outdated
@thiagoarrais

Copy link
Copy Markdown
ContributorAuthor

I'm getting this double return on the generated code:

// ...err=a.client.decode(&v, localVarBody, localVarHttpResponse.Header.Get("Content-Type"))
iferr!=nil {
newErr.error=err.Error()
returnlocalVarReturnValue, localVarHttpResponse, newErr
}
newErr.model=vreturnlocalVarReturnValue, localVarHttpResponse, newErrreturnlocalVarReturnValue, localVarHttpResponse, newErr
}

I'd like to avoid it, but my mustache-fu is weak. Any ideas?

@thiagoarrais

thiagoarrais commented Jul 30, 2019

Copy link
Copy Markdown
ContributorAuthor

I've rebased this to latest master and ported the change to go-experimental. I'll start seeking a solution to my previous question. Any blockers here besides that?

@wing328

Copy link
Copy Markdown
Member

cc @bkabrda for review as the change targets go-experimental

@bkabrda

Copy link
Copy Markdown
Contributor

Hmm, it's weird that this is something that happens only in the api_default.go and not the other api_*.go. I'm wondering whether it might be a general problem in openapi-generator that occurs for certain responses. I'll try to dig in a bit and see if I find out something.

@bkabrda

Copy link
Copy Markdown
Contributor

So my understanding of the issue is this:

  • Any wildcard response (that includes "4XX"-like responses and also "default") have code == 0.
  • Wildcard responses can be used alongside of other specific responses.
  • It's true that the go generated code won't work for any wildcard responses.

However, I think the solution presented here is not entirely correct. The problem, I think, is that if there was e.g. also a 400 response defined, it could theoretically be listed after the default response in the responses array in the Java code. That would mean that not adding the if clause for wildcards would actually catch a 400 response instead of the more specific 400 response handler (which would have it's code generated after the default handler).

I guess the correct solution is to both:

  1. Do what this patch is doing.
  2. Make sure the Java code sorts the responses in order from the more specific ones to the less specific ones. E.g. for an endpoint with "default", "4XX" and "400" responses defined, they should be listed in order "400", "4XX", "default".

If the above problem is also in templates for other languages, having the responses sorted would also help all of them.

Does this sound reasonable?

@bkabrda

Copy link
Copy Markdown
Contributor

Minor clarification of the above comment: it seems that the wildcard response numbers such as "4XX" actually produce invalid code (at least for Go), as they're treated as numbers, so there will be literal 4XX put in the generated code. I think in addition to what I wrote above, we'll also need to mark these as wildcards and set their code to 0.

@thiagoarrais do you want to work on the points that I mentioned? I think I could find some time within ~1 week to get these fixed if you can't/don't want to work on them.

@thiagoarrais

thiagoarrais commented Jul 31, 2019

Copy link
Copy Markdown
ContributorAuthor

Make sure the Java code sorts the responses in order from the more specific ones to the less specific ones. E.g. for an endpoint with "default", "4XX" and "400" responses defined, they should be listed in order "400", "4XX", "default".

I can work on that, but I haven't looked into the Java code yet. Can you point me into the right direction?

Re: treating numbered wildcard responses ("4xx"): I'd prefer to keep this PR focused on literal default responses ("default").

@bkabrda

Copy link
Copy Markdown
Contributor

@thiagoarrais so you'll need to modify org.openapitools.codegen.DefaultCodegen. In the method fromResponse, you'll have to put r.code = 0 for the 4XX (and similar) wildcards - you can find the list of all possible wildcards at [1].

To modify the order of responses, you'll need to do sorting on op.responses in the fromOperation method (also on DefaultCodegen).

I'm somewhat new to openapi-generator myself, but I think this would be all that you need to do to get this done.

[1] https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.2.md#patterned-fields-1

@thiagoarrais

Copy link
Copy Markdown
ContributorAuthor

Once CI finishes this is done by me. The other wildcards (1xx, 2xx, and so on) needed a little more investigation and were left for a later PR. Please let me know if you need anything else.

@bkabrda

bkabrda commented Aug 1, 2019

Copy link
Copy Markdown
Contributor

Right, so even though we haven't reached a complete solution yet, we certainly improved the situation here, so 👍 for me to merge it. @thiagoarrais will you be interested in taking this further in a followup PR? I can work on it if you're not interested (I'd like to solve this now to get a complete solution to the problem).

@wing328 feel free to review, I have no further comments here.

@thiagoarrais

Copy link
Copy Markdown
ContributorAuthor

Can't work on that right now, but maybe in a near future. Maybe we can open an issue as a placeholder for whomever finds the time first?

@bkabrda

Copy link
Copy Markdown
Contributor

Once this is merged, I'll open a followup issue and work on it, time permitting.

@thiagoarraisthiagoarrais changed the title Do not check status code for default responseWIP: Do not check status code for default responseAug 7, 2019
@thiagoarrais

thiagoarrais commented Aug 7, 2019

Copy link
Copy Markdown
ContributorAuthor

Found some potential issues with this. Please avoid merging for the time being.

By the way: can't figure how to mark a PR as draft after it is already opened...

@thiagoarrais

thiagoarrais commented Aug 7, 2019

Copy link
Copy Markdown
ContributorAuthor

My problem seems to raise in OpenAPI 3 specs. Still digging, but it seems like the sorting code in DefaultCodeGen isn't getting run or isn't effective. Any ideas?

@thiagoarraisthiagoarrais changed the title WIP: Do not check status code for default responseDo not check status code for default responseAug 7, 2019
@thiagoarrais

Copy link
Copy Markdown
ContributorAuthor

OK. This is ready. I had switched the sorting comparation around.

@wing328wing328 modified the milestones: 4.1.0, 4.1.1Aug 9, 2019
@thiagoarrais

Copy link
Copy Markdown
ContributorAuthor

Can't tell if the Travis failure is related to the PR. Any pointers?

@thiagoarrais

Copy link
Copy Markdown
ContributorAuthor

@wing328: anything else needed for going forward with this?

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@thiagoarrais I notice that you've updated the test to replace 2xx with 4xx status code.

Does it mean the original "201" status code test fail?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

No. 422 just seemed more realistic. 201 is a success and more likely to be equated to the default case.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Changes in DefaultCodegen

cc @OpenAPITools/generator-core-team

@wing328wing328 modified the milestones: 4.1.1, 4.1.2Aug 26, 2019
@wing328wing328 modified the milestones: 4.1.2, 4.1.3Sep 11, 2019
@thiagoarrais

Copy link
Copy Markdown
ContributorAuthor

Squashed and rebased. Anything else needed for merging?

@thiagoarrais

thiagoarrais commented Sep 25, 2019

Copy link
Copy Markdown
ContributorAuthor

Folks, anything else that needs to be addressed here?

@wing328

Copy link
Copy Markdown
Member

@thiagoarrais Let me review by tomorrow ...

@wing328wing328 modified the milestones: 4.1.3, 4.2.0Oct 4, 2019
@wing328

Copy link
Copy Markdown
Member

Sorry for the delay. Please resolve the conflicts and I'll merge after that 🙏

@thiagoarrais

Copy link
Copy Markdown
ContributorAuthor

Hey, @wing328, no need to apologize. We all understand that.

Anyway... resolved conflicts and rebased. Should be good to go.

Because Circle CI said
> Please run 'bin/utils/ensure-up-to-date' locally and commit
> changes (UNCOMMITTED CHANGES ERROR)
@thiagoarrais

Copy link
Copy Markdown
ContributorAuthor

Ran update as requested by CircleCI. Regarding the Travis failure, I'm not sure it is related to this PR, since a similar build already ran successfully for my fork.

@wing328

Copy link
Copy Markdown
Member

CircleCI issue not related to this PR. Tests passed locally:

=== RUN TestUpdateUser
--- PASS: TestUpdateUser (0.33s)
=== RUN TestDeleteUser
--- PASS: TestDeleteUser (0.16s)
PASS
ok _/private/var/tmp/openapi-generator/samples/client/petstore/go	7.199s
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 01:20 min
[INFO] Finished at: 2019-10-15T01:28:26+08:00
[INFO] ------------------------------------------------------------------------

@wing328
wing328 merged commit cb2bf4d into OpenAPITools:masterOct 14, 2019
@wing328

Copy link
Copy Markdown
Member

@thiagoarrais PR merged into master. Thanks for your contribution.

@wing328

Copy link
Copy Markdown
Member

@thiagoarrais thanks for the PR, which has been included in v4.2.0 release: https://twitter.com/oas_generator/status/1189824932345069569

@thiagoarrais

Copy link
Copy Markdown
ContributorAuthor

Awesome! It's been a pleasure!

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[BUG][GO] default response not handled for error cases

4 participants

@thiagoarrais@antihax@wing328@bkabrda
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Do not check status code for default response - #3322

Merged
wing328 merged 2 commits into
OpenAPITools:masterfrom
thiagoarrais:go-default-response
Oct 14, 2019
Merged

Do not check status code for default response#3322
wing328 merged 2 commits into
OpenAPITools:masterfrom
thiagoarrais:go-default-response

Conversation

@thiagoarrais

@thiagoarraisthiagoarrais commented Jul 9, 2019

Copy link
Copy Markdown
Contributor

PR checklist

  • Read the contribution guidelines.
  • Ran the shell script under ./bin/ to update Petstore sample so that CIs can verify the change. (For instance, only need to run ./bin/{LANG}-petstore.sh, ./bin/openapi3/{LANG}-petstore.sh if updating the {LANG} (e.g. php, ruby, python, etc) code generator or {LANG} client's mustache templates). Windows batch files can be found in .\bin\windows\. If contributing template-only or documentation-only changes which will change sample output, be sure to build the project first.
  • Filed the PR against the correct branch: master, 4.1.x, 5.0.x. Default: master.
  • Copied the technical committee to review the pull request if your PR is targeting a particular programming language.

Description of the PR

Fixes#3321 by not checking HTTP status when generating code for a default response.

Reviewers, please check review comments.

cc @antihax (2017/11) @bvwells (2017/12) @grokify (2018/07) @kemokemo (2018/09)

Comment threadmodules/openapi-generator/src/main/resources/go/api.mustache Outdated

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This counts on the fact that the wildcard response will be the last one. My (limited) testing confirmed this, but will that always be the case?

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ideally this should catch any error code so the error model is returned if one is specified. It may need to catch the default/wildcard in these cases.

If i remember correct, this should be an interface so it could be possible to make this completely generic without specifically checking each code?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ideally this should catch any error code so the error model is returned if one is specified. It may need to catch the default/wildcard in these cases.

My approach here was supressing the status code check for the default case so that it handles any error code. But that may overcatch if the wildcard response isn't the last one. Hence my original question.

If i remember correct, this should be an interface so it could be possible to make this completely generic without specifically checking each code?

Sorry, I don't understand. Are you suggesting removing that check completely and just trying to unmarshall the error model based on datatype?

@antihax

Copy link
Copy Markdown
Contributor

Can you regenerate the test client?

@thiagoarrais

thiagoarrais commented Jul 9, 2019

Copy link
Copy Markdown
ContributorAuthor

Done in 942f65f. I was saving that for when the PR got closer to finishing.

Comment threadmodules/openapi-generator/src/main/resources/go/api.mustache Outdated
@thiagoarrais

Copy link
Copy Markdown
ContributorAuthor

I'm getting this double return on the generated code:

// ...err=a.client.decode(&v, localVarBody, localVarHttpResponse.Header.Get("Content-Type"))
iferr!=nil {
newErr.error=err.Error()
returnlocalVarReturnValue, localVarHttpResponse, newErr
}
newErr.model=vreturnlocalVarReturnValue, localVarHttpResponse, newErrreturnlocalVarReturnValue, localVarHttpResponse, newErr
}

I'd like to avoid it, but my mustache-fu is weak. Any ideas?

@thiagoarrais

thiagoarrais commented Jul 30, 2019

Copy link
Copy Markdown
ContributorAuthor

I've rebased this to latest master and ported the change to go-experimental. I'll start seeking a solution to my previous question. Any blockers here besides that?

@wing328

Copy link
Copy Markdown
Member

cc @bkabrda for review as the change targets go-experimental

@bkabrda

Copy link
Copy Markdown
Contributor

Hmm, it's weird that this is something that happens only in the api_default.go and not the other api_*.go. I'm wondering whether it might be a general problem in openapi-generator that occurs for certain responses. I'll try to dig in a bit and see if I find out something.

@bkabrda

Copy link
Copy Markdown
Contributor

So my understanding of the issue is this:

  • Any wildcard response (that includes "4XX"-like responses and also "default") have code == 0.
  • Wildcard responses can be used alongside of other specific responses.
  • It's true that the go generated code won't work for any wildcard responses.

However, I think the solution presented here is not entirely correct. The problem, I think, is that if there was e.g. also a 400 response defined, it could theoretically be listed after the default response in the responses array in the Java code. That would mean that not adding the if clause for wildcards would actually catch a 400 response instead of the more specific 400 response handler (which would have it's code generated after the default handler).

I guess the correct solution is to both:

  1. Do what this patch is doing.
  2. Make sure the Java code sorts the responses in order from the more specific ones to the less specific ones. E.g. for an endpoint with "default", "4XX" and "400" responses defined, they should be listed in order "400", "4XX", "default".

If the above problem is also in templates for other languages, having the responses sorted would also help all of them.

Does this sound reasonable?

@bkabrda

Copy link
Copy Markdown
Contributor

Minor clarification of the above comment: it seems that the wildcard response numbers such as "4XX" actually produce invalid code (at least for Go), as they're treated as numbers, so there will be literal 4XX put in the generated code. I think in addition to what I wrote above, we'll also need to mark these as wildcards and set their code to 0.

@thiagoarrais do you want to work on the points that I mentioned? I think I could find some time within ~1 week to get these fixed if you can't/don't want to work on them.

@thiagoarrais

thiagoarrais commented Jul 31, 2019

Copy link
Copy Markdown
ContributorAuthor

Make sure the Java code sorts the responses in order from the more specific ones to the less specific ones. E.g. for an endpoint with "default", "4XX" and "400" responses defined, they should be listed in order "400", "4XX", "default".

I can work on that, but I haven't looked into the Java code yet. Can you point me into the right direction?

Re: treating numbered wildcard responses ("4xx"): I'd prefer to keep this PR focused on literal default responses ("default").

@bkabrda

Copy link
Copy Markdown
Contributor

@thiagoarrais so you'll need to modify org.openapitools.codegen.DefaultCodegen. In the method fromResponse, you'll have to put r.code = 0 for the 4XX (and similar) wildcards - you can find the list of all possible wildcards at [1].

To modify the order of responses, you'll need to do sorting on op.responses in the fromOperation method (also on DefaultCodegen).

I'm somewhat new to openapi-generator myself, but I think this would be all that you need to do to get this done.

[1] https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.2.md#patterned-fields-1

@thiagoarrais

Copy link
Copy Markdown
ContributorAuthor

Once CI finishes this is done by me. The other wildcards (1xx, 2xx, and so on) needed a little more investigation and were left for a later PR. Please let me know if you need anything else.

@bkabrda

bkabrda commented Aug 1, 2019

Copy link
Copy Markdown
Contributor

Right, so even though we haven't reached a complete solution yet, we certainly improved the situation here, so 👍 for me to merge it. @thiagoarrais will you be interested in taking this further in a followup PR? I can work on it if you're not interested (I'd like to solve this now to get a complete solution to the problem).

@wing328 feel free to review, I have no further comments here.

@thiagoarrais

Copy link
Copy Markdown
ContributorAuthor

Can't work on that right now, but maybe in a near future. Maybe we can open an issue as a placeholder for whomever finds the time first?

@bkabrda

Copy link
Copy Markdown
Contributor

Once this is merged, I'll open a followup issue and work on it, time permitting.

@thiagoarraisthiagoarrais changed the title Do not check status code for default responseWIP: Do not check status code for default responseAug 7, 2019
@thiagoarrais

thiagoarrais commented Aug 7, 2019

Copy link
Copy Markdown
ContributorAuthor

Found some potential issues with this. Please avoid merging for the time being.

By the way: can't figure how to mark a PR as draft after it is already opened...

@thiagoarrais

thiagoarrais commented Aug 7, 2019

Copy link
Copy Markdown
ContributorAuthor

My problem seems to raise in OpenAPI 3 specs. Still digging, but it seems like the sorting code in DefaultCodeGen isn't getting run or isn't effective. Any ideas?

@thiagoarraisthiagoarrais changed the title WIP: Do not check status code for default responseDo not check status code for default responseAug 7, 2019
@thiagoarrais

Copy link
Copy Markdown
ContributorAuthor

OK. This is ready. I had switched the sorting comparation around.

@wing328wing328 modified the milestones: 4.1.0, 4.1.1Aug 9, 2019
@thiagoarrais

Copy link
Copy Markdown
ContributorAuthor

Can't tell if the Travis failure is related to the PR. Any pointers?

@thiagoarrais

Copy link
Copy Markdown
ContributorAuthor

@wing328: anything else needed for going forward with this?

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@thiagoarrais I notice that you've updated the test to replace 2xx with 4xx status code.

Does it mean the original "201" status code test fail?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

No. 422 just seemed more realistic. 201 is a success and more likely to be equated to the default case.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Changes in DefaultCodegen

cc @OpenAPITools/generator-core-team

@wing328wing328 modified the milestones: 4.1.1, 4.1.2Aug 26, 2019
@wing328wing328 modified the milestones: 4.1.2, 4.1.3Sep 11, 2019
@thiagoarrais

Copy link
Copy Markdown
ContributorAuthor

Squashed and rebased. Anything else needed for merging?

@thiagoarrais

thiagoarrais commented Sep 25, 2019

Copy link
Copy Markdown
ContributorAuthor

Folks, anything else that needs to be addressed here?

@wing328

Copy link
Copy Markdown
Member

@thiagoarrais Let me review by tomorrow ...

@wing328wing328 modified the milestones: 4.1.3, 4.2.0Oct 4, 2019
@wing328

Copy link
Copy Markdown
Member

Sorry for the delay. Please resolve the conflicts and I'll merge after that 🙏

@thiagoarrais

Copy link
Copy Markdown
ContributorAuthor

Hey, @wing328, no need to apologize. We all understand that.

Anyway... resolved conflicts and rebased. Should be good to go.

Because Circle CI said
> Please run 'bin/utils/ensure-up-to-date' locally and commit
> changes (UNCOMMITTED CHANGES ERROR)
@thiagoarrais

Copy link
Copy Markdown
ContributorAuthor

Ran update as requested by CircleCI. Regarding the Travis failure, I'm not sure it is related to this PR, since a similar build already ran successfully for my fork.

@wing328

Copy link
Copy Markdown
Member

CircleCI issue not related to this PR. Tests passed locally:

=== RUN TestUpdateUser
--- PASS: TestUpdateUser (0.33s)
=== RUN TestDeleteUser
--- PASS: TestDeleteUser (0.16s)
PASS
ok _/private/var/tmp/openapi-generator/samples/client/petstore/go	7.199s
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 01:20 min
[INFO] Finished at: 2019-10-15T01:28:26+08:00
[INFO] ------------------------------------------------------------------------

@wing328
wing328 merged commit cb2bf4d into OpenAPITools:masterOct 14, 2019
@wing328

Copy link
Copy Markdown
Member

@thiagoarrais PR merged into master. Thanks for your contribution.

@wing328

Copy link
Copy Markdown
Member

@thiagoarrais thanks for the PR, which has been included in v4.2.0 release: https://twitter.com/oas_generator/status/1189824932345069569

@thiagoarrais

Copy link
Copy Markdown
ContributorAuthor

Awesome! It's been a pleasure!

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[BUG][GO] default response not handled for error cases

4 participants

@thiagoarrais@antihax@wing328@bkabrda
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Do not check status code for default response - #3322

Merged
wing328 merged 2 commits into
OpenAPITools:masterfrom
thiagoarrais:go-default-response
Oct 14, 2019
Merged

Do not check status code for default response#3322
wing328 merged 2 commits into
OpenAPITools:masterfrom
thiagoarrais:go-default-response

Conversation

@thiagoarrais

@thiagoarraisthiagoarrais commented Jul 9, 2019

Copy link
Copy Markdown
Contributor

PR checklist

  • Read the contribution guidelines.
  • Ran the shell script under ./bin/ to update Petstore sample so that CIs can verify the change. (For instance, only need to run ./bin/{LANG}-petstore.sh, ./bin/openapi3/{LANG}-petstore.sh if updating the {LANG} (e.g. php, ruby, python, etc) code generator or {LANG} client's mustache templates). Windows batch files can be found in .\bin\windows\. If contributing template-only or documentation-only changes which will change sample output, be sure to build the project first.
  • Filed the PR against the correct branch: master, 4.1.x, 5.0.x. Default: master.
  • Copied the technical committee to review the pull request if your PR is targeting a particular programming language.

Description of the PR

Fixes#3321 by not checking HTTP status when generating code for a default response.

Reviewers, please check review comments.

cc @antihax (2017/11) @bvwells (2017/12) @grokify (2018/07) @kemokemo (2018/09)

Comment threadmodules/openapi-generator/src/main/resources/go/api.mustache Outdated

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This counts on the fact that the wildcard response will be the last one. My (limited) testing confirmed this, but will that always be the case?

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ideally this should catch any error code so the error model is returned if one is specified. It may need to catch the default/wildcard in these cases.

If i remember correct, this should be an interface so it could be possible to make this completely generic without specifically checking each code?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ideally this should catch any error code so the error model is returned if one is specified. It may need to catch the default/wildcard in these cases.

My approach here was supressing the status code check for the default case so that it handles any error code. But that may overcatch if the wildcard response isn't the last one. Hence my original question.

If i remember correct, this should be an interface so it could be possible to make this completely generic without specifically checking each code?

Sorry, I don't understand. Are you suggesting removing that check completely and just trying to unmarshall the error model based on datatype?

@antihax

Copy link
Copy Markdown
Contributor

Can you regenerate the test client?

@thiagoarrais

thiagoarrais commented Jul 9, 2019

Copy link
Copy Markdown
ContributorAuthor

Done in 942f65f. I was saving that for when the PR got closer to finishing.

Comment threadmodules/openapi-generator/src/main/resources/go/api.mustache Outdated
@thiagoarrais

Copy link
Copy Markdown
ContributorAuthor

I'm getting this double return on the generated code:

// ...err=a.client.decode(&v, localVarBody, localVarHttpResponse.Header.Get("Content-Type"))
iferr!=nil {
newErr.error=err.Error()
returnlocalVarReturnValue, localVarHttpResponse, newErr
}
newErr.model=vreturnlocalVarReturnValue, localVarHttpResponse, newErrreturnlocalVarReturnValue, localVarHttpResponse, newErr
}

I'd like to avoid it, but my mustache-fu is weak. Any ideas?

@thiagoarrais

thiagoarrais commented Jul 30, 2019

Copy link
Copy Markdown
ContributorAuthor

I've rebased this to latest master and ported the change to go-experimental. I'll start seeking a solution to my previous question. Any blockers here besides that?

@wing328

Copy link
Copy Markdown
Member

cc @bkabrda for review as the change targets go-experimental

@bkabrda

Copy link
Copy Markdown
Contributor

Hmm, it's weird that this is something that happens only in the api_default.go and not the other api_*.go. I'm wondering whether it might be a general problem in openapi-generator that occurs for certain responses. I'll try to dig in a bit and see if I find out something.

@bkabrda

Copy link
Copy Markdown
Contributor

So my understanding of the issue is this:

  • Any wildcard response (that includes "4XX"-like responses and also "default") have code == 0.
  • Wildcard responses can be used alongside of other specific responses.
  • It's true that the go generated code won't work for any wildcard responses.

However, I think the solution presented here is not entirely correct. The problem, I think, is that if there was e.g. also a 400 response defined, it could theoretically be listed after the default response in the responses array in the Java code. That would mean that not adding the if clause for wildcards would actually catch a 400 response instead of the more specific 400 response handler (which would have it's code generated after the default handler).

I guess the correct solution is to both:

  1. Do what this patch is doing.
  2. Make sure the Java code sorts the responses in order from the more specific ones to the less specific ones. E.g. for an endpoint with "default", "4XX" and "400" responses defined, they should be listed in order "400", "4XX", "default".

If the above problem is also in templates for other languages, having the responses sorted would also help all of them.

Does this sound reasonable?

@bkabrda

Copy link
Copy Markdown
Contributor

Minor clarification of the above comment: it seems that the wildcard response numbers such as "4XX" actually produce invalid code (at least for Go), as they're treated as numbers, so there will be literal 4XX put in the generated code. I think in addition to what I wrote above, we'll also need to mark these as wildcards and set their code to 0.

@thiagoarrais do you want to work on the points that I mentioned? I think I could find some time within ~1 week to get these fixed if you can't/don't want to work on them.

@thiagoarrais

thiagoarrais commented Jul 31, 2019

Copy link
Copy Markdown
ContributorAuthor

Make sure the Java code sorts the responses in order from the more specific ones to the less specific ones. E.g. for an endpoint with "default", "4XX" and "400" responses defined, they should be listed in order "400", "4XX", "default".

I can work on that, but I haven't looked into the Java code yet. Can you point me into the right direction?

Re: treating numbered wildcard responses ("4xx"): I'd prefer to keep this PR focused on literal default responses ("default").

@bkabrda

Copy link
Copy Markdown
Contributor

@thiagoarrais so you'll need to modify org.openapitools.codegen.DefaultCodegen. In the method fromResponse, you'll have to put r.code = 0 for the 4XX (and similar) wildcards - you can find the list of all possible wildcards at [1].

To modify the order of responses, you'll need to do sorting on op.responses in the fromOperation method (also on DefaultCodegen).

I'm somewhat new to openapi-generator myself, but I think this would be all that you need to do to get this done.

[1] https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.2.md#patterned-fields-1

@thiagoarrais

Copy link
Copy Markdown
ContributorAuthor

Once CI finishes this is done by me. The other wildcards (1xx, 2xx, and so on) needed a little more investigation and were left for a later PR. Please let me know if you need anything else.

@bkabrda

bkabrda commented Aug 1, 2019

Copy link
Copy Markdown
Contributor

Right, so even though we haven't reached a complete solution yet, we certainly improved the situation here, so 👍 for me to merge it. @thiagoarrais will you be interested in taking this further in a followup PR? I can work on it if you're not interested (I'd like to solve this now to get a complete solution to the problem).

@wing328 feel free to review, I have no further comments here.

@thiagoarrais

Copy link
Copy Markdown
ContributorAuthor

Can't work on that right now, but maybe in a near future. Maybe we can open an issue as a placeholder for whomever finds the time first?

@bkabrda

Copy link
Copy Markdown
Contributor

Once this is merged, I'll open a followup issue and work on it, time permitting.

@thiagoarraisthiagoarrais changed the title Do not check status code for default responseWIP: Do not check status code for default responseAug 7, 2019
@thiagoarrais

thiagoarrais commented Aug 7, 2019

Copy link
Copy Markdown
ContributorAuthor

Found some potential issues with this. Please avoid merging for the time being.

By the way: can't figure how to mark a PR as draft after it is already opened...

@thiagoarrais

thiagoarrais commented Aug 7, 2019

Copy link
Copy Markdown
ContributorAuthor

My problem seems to raise in OpenAPI 3 specs. Still digging, but it seems like the sorting code in DefaultCodeGen isn't getting run or isn't effective. Any ideas?

@thiagoarraisthiagoarrais changed the title WIP: Do not check status code for default responseDo not check status code for default responseAug 7, 2019
@thiagoarrais

Copy link
Copy Markdown
ContributorAuthor

OK. This is ready. I had switched the sorting comparation around.

@wing328wing328 modified the milestones: 4.1.0, 4.1.1Aug 9, 2019
@thiagoarrais

Copy link
Copy Markdown
ContributorAuthor

Can't tell if the Travis failure is related to the PR. Any pointers?

@thiagoarrais

Copy link
Copy Markdown
ContributorAuthor

@wing328: anything else needed for going forward with this?

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@thiagoarrais I notice that you've updated the test to replace 2xx with 4xx status code.

Does it mean the original "201" status code test fail?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

No. 422 just seemed more realistic. 201 is a success and more likely to be equated to the default case.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Changes in DefaultCodegen

cc @OpenAPITools/generator-core-team

@wing328wing328 modified the milestones: 4.1.1, 4.1.2Aug 26, 2019
@wing328wing328 modified the milestones: 4.1.2, 4.1.3Sep 11, 2019
@thiagoarrais

Copy link
Copy Markdown
ContributorAuthor

Squashed and rebased. Anything else needed for merging?

@thiagoarrais

thiagoarrais commented Sep 25, 2019

Copy link
Copy Markdown
ContributorAuthor

Folks, anything else that needs to be addressed here?

@wing328

Copy link
Copy Markdown
Member

@thiagoarrais Let me review by tomorrow ...

@wing328wing328 modified the milestones: 4.1.3, 4.2.0Oct 4, 2019
@wing328

Copy link
Copy Markdown
Member

Sorry for the delay. Please resolve the conflicts and I'll merge after that 🙏

@thiagoarrais

Copy link
Copy Markdown
ContributorAuthor

Hey, @wing328, no need to apologize. We all understand that.

Anyway... resolved conflicts and rebased. Should be good to go.

Because Circle CI said
> Please run 'bin/utils/ensure-up-to-date' locally and commit
> changes (UNCOMMITTED CHANGES ERROR)
@thiagoarrais

Copy link
Copy Markdown
ContributorAuthor

Ran update as requested by CircleCI. Regarding the Travis failure, I'm not sure it is related to this PR, since a similar build already ran successfully for my fork.

@wing328

Copy link
Copy Markdown
Member

CircleCI issue not related to this PR. Tests passed locally:

=== RUN TestUpdateUser
--- PASS: TestUpdateUser (0.33s)
=== RUN TestDeleteUser
--- PASS: TestDeleteUser (0.16s)
PASS
ok _/private/var/tmp/openapi-generator/samples/client/petstore/go	7.199s
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 01:20 min
[INFO] Finished at: 2019-10-15T01:28:26+08:00
[INFO] ------------------------------------------------------------------------

@wing328
wing328 merged commit cb2bf4d into OpenAPITools:masterOct 14, 2019
@wing328

Copy link
Copy Markdown
Member

@thiagoarrais PR merged into master. Thanks for your contribution.

@wing328

Copy link
Copy Markdown
Member

@thiagoarrais thanks for the PR, which has been included in v4.2.0 release: https://twitter.com/oas_generator/status/1189824932345069569

@thiagoarrais

Copy link
Copy Markdown
ContributorAuthor

Awesome! It's been a pleasure!

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[BUG][GO] default response not handled for error cases

4 participants

@thiagoarrais@antihax@wing328@bkabrda
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Do not check status code for default response - #3322

Merged
wing328 merged 2 commits into
OpenAPITools:masterfrom
thiagoarrais:go-default-response
Oct 14, 2019
Merged

Do not check status code for default response#3322
wing328 merged 2 commits into
OpenAPITools:masterfrom
thiagoarrais:go-default-response

Conversation

@thiagoarrais

@thiagoarraisthiagoarrais commented Jul 9, 2019

Copy link
Copy Markdown
Contributor

PR checklist

  • Read the contribution guidelines.
  • Ran the shell script under ./bin/ to update Petstore sample so that CIs can verify the change. (For instance, only need to run ./bin/{LANG}-petstore.sh, ./bin/openapi3/{LANG}-petstore.sh if updating the {LANG} (e.g. php, ruby, python, etc) code generator or {LANG} client's mustache templates). Windows batch files can be found in .\bin\windows\. If contributing template-only or documentation-only changes which will change sample output, be sure to build the project first.
  • Filed the PR against the correct branch: master, 4.1.x, 5.0.x. Default: master.
  • Copied the technical committee to review the pull request if your PR is targeting a particular programming language.

Description of the PR

Fixes#3321 by not checking HTTP status when generating code for a default response.

Reviewers, please check review comments.

cc @antihax (2017/11) @bvwells (2017/12) @grokify (2018/07) @kemokemo (2018/09)

Comment threadmodules/openapi-generator/src/main/resources/go/api.mustache Outdated

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This counts on the fact that the wildcard response will be the last one. My (limited) testing confirmed this, but will that always be the case?

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ideally this should catch any error code so the error model is returned if one is specified. It may need to catch the default/wildcard in these cases.

If i remember correct, this should be an interface so it could be possible to make this completely generic without specifically checking each code?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ideally this should catch any error code so the error model is returned if one is specified. It may need to catch the default/wildcard in these cases.

My approach here was supressing the status code check for the default case so that it handles any error code. But that may overcatch if the wildcard response isn't the last one. Hence my original question.

If i remember correct, this should be an interface so it could be possible to make this completely generic without specifically checking each code?

Sorry, I don't understand. Are you suggesting removing that check completely and just trying to unmarshall the error model based on datatype?

@antihax

Copy link
Copy Markdown
Contributor

Can you regenerate the test client?

@thiagoarrais

thiagoarrais commented Jul 9, 2019

Copy link
Copy Markdown
ContributorAuthor

Done in 942f65f. I was saving that for when the PR got closer to finishing.

Comment threadmodules/openapi-generator/src/main/resources/go/api.mustache Outdated
@thiagoarrais

Copy link
Copy Markdown
ContributorAuthor

I'm getting this double return on the generated code:

// ...err=a.client.decode(&v, localVarBody, localVarHttpResponse.Header.Get("Content-Type"))
iferr!=nil {
newErr.error=err.Error()
returnlocalVarReturnValue, localVarHttpResponse, newErr
}
newErr.model=vreturnlocalVarReturnValue, localVarHttpResponse, newErrreturnlocalVarReturnValue, localVarHttpResponse, newErr
}

I'd like to avoid it, but my mustache-fu is weak. Any ideas?

@thiagoarrais

thiagoarrais commented Jul 30, 2019

Copy link
Copy Markdown
ContributorAuthor

I've rebased this to latest master and ported the change to go-experimental. I'll start seeking a solution to my previous question. Any blockers here besides that?

@wing328

Copy link
Copy Markdown
Member

cc @bkabrda for review as the change targets go-experimental

@bkabrda

Copy link
Copy Markdown
Contributor

Hmm, it's weird that this is something that happens only in the api_default.go and not the other api_*.go. I'm wondering whether it might be a general problem in openapi-generator that occurs for certain responses. I'll try to dig in a bit and see if I find out something.

@bkabrda

Copy link
Copy Markdown
Contributor

So my understanding of the issue is this:

  • Any wildcard response (that includes "4XX"-like responses and also "default") have code == 0.
  • Wildcard responses can be used alongside of other specific responses.
  • It's true that the go generated code won't work for any wildcard responses.

However, I think the solution presented here is not entirely correct. The problem, I think, is that if there was e.g. also a 400 response defined, it could theoretically be listed after the default response in the responses array in the Java code. That would mean that not adding the if clause for wildcards would actually catch a 400 response instead of the more specific 400 response handler (which would have it's code generated after the default handler).

I guess the correct solution is to both:

  1. Do what this patch is doing.
  2. Make sure the Java code sorts the responses in order from the more specific ones to the less specific ones. E.g. for an endpoint with "default", "4XX" and "400" responses defined, they should be listed in order "400", "4XX", "default".

If the above problem is also in templates for other languages, having the responses sorted would also help all of them.

Does this sound reasonable?

@bkabrda

Copy link
Copy Markdown
Contributor

Minor clarification of the above comment: it seems that the wildcard response numbers such as "4XX" actually produce invalid code (at least for Go), as they're treated as numbers, so there will be literal 4XX put in the generated code. I think in addition to what I wrote above, we'll also need to mark these as wildcards and set their code to 0.

@thiagoarrais do you want to work on the points that I mentioned? I think I could find some time within ~1 week to get these fixed if you can't/don't want to work on them.

@thiagoarrais

thiagoarrais commented Jul 31, 2019

Copy link
Copy Markdown
ContributorAuthor

Make sure the Java code sorts the responses in order from the more specific ones to the less specific ones. E.g. for an endpoint with "default", "4XX" and "400" responses defined, they should be listed in order "400", "4XX", "default".

I can work on that, but I haven't looked into the Java code yet. Can you point me into the right direction?

Re: treating numbered wildcard responses ("4xx"): I'd prefer to keep this PR focused on literal default responses ("default").

@bkabrda

Copy link
Copy Markdown
Contributor

@thiagoarrais so you'll need to modify org.openapitools.codegen.DefaultCodegen. In the method fromResponse, you'll have to put r.code = 0 for the 4XX (and similar) wildcards - you can find the list of all possible wildcards at [1].

To modify the order of responses, you'll need to do sorting on op.responses in the fromOperation method (also on DefaultCodegen).

I'm somewhat new to openapi-generator myself, but I think this would be all that you need to do to get this done.

[1] https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.2.md#patterned-fields-1

@thiagoarrais

Copy link
Copy Markdown
ContributorAuthor

Once CI finishes this is done by me. The other wildcards (1xx, 2xx, and so on) needed a little more investigation and were left for a later PR. Please let me know if you need anything else.

@bkabrda

bkabrda commented Aug 1, 2019

Copy link
Copy Markdown
Contributor

Right, so even though we haven't reached a complete solution yet, we certainly improved the situation here, so 👍 for me to merge it. @thiagoarrais will you be interested in taking this further in a followup PR? I can work on it if you're not interested (I'd like to solve this now to get a complete solution to the problem).

@wing328 feel free to review, I have no further comments here.

@thiagoarrais

Copy link
Copy Markdown
ContributorAuthor

Can't work on that right now, but maybe in a near future. Maybe we can open an issue as a placeholder for whomever finds the time first?

@bkabrda

Copy link
Copy Markdown
Contributor

Once this is merged, I'll open a followup issue and work on it, time permitting.

@thiagoarraisthiagoarrais changed the title Do not check status code for default responseWIP: Do not check status code for default responseAug 7, 2019
@thiagoarrais

thiagoarrais commented Aug 7, 2019

Copy link
Copy Markdown
ContributorAuthor

Found some potential issues with this. Please avoid merging for the time being.

By the way: can't figure how to mark a PR as draft after it is already opened...

@thiagoarrais

thiagoarrais commented Aug 7, 2019

Copy link
Copy Markdown
ContributorAuthor

My problem seems to raise in OpenAPI 3 specs. Still digging, but it seems like the sorting code in DefaultCodeGen isn't getting run or isn't effective. Any ideas?

@thiagoarraisthiagoarrais changed the title WIP: Do not check status code for default responseDo not check status code for default responseAug 7, 2019
@thiagoarrais

Copy link
Copy Markdown
ContributorAuthor

OK. This is ready. I had switched the sorting comparation around.

@wing328wing328 modified the milestones: 4.1.0, 4.1.1Aug 9, 2019
@thiagoarrais

Copy link
Copy Markdown
ContributorAuthor

Can't tell if the Travis failure is related to the PR. Any pointers?

@thiagoarrais

Copy link
Copy Markdown
ContributorAuthor

@wing328: anything else needed for going forward with this?

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@thiagoarrais I notice that you've updated the test to replace 2xx with 4xx status code.

Does it mean the original "201" status code test fail?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

No. 422 just seemed more realistic. 201 is a success and more likely to be equated to the default case.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Changes in DefaultCodegen

cc @OpenAPITools/generator-core-team

@wing328wing328 modified the milestones: 4.1.1, 4.1.2Aug 26, 2019
@wing328wing328 modified the milestones: 4.1.2, 4.1.3Sep 11, 2019
@thiagoarrais

Copy link
Copy Markdown
ContributorAuthor

Squashed and rebased. Anything else needed for merging?

@thiagoarrais

thiagoarrais commented Sep 25, 2019

Copy link
Copy Markdown
ContributorAuthor

Folks, anything else that needs to be addressed here?

@wing328

Copy link
Copy Markdown
Member

@thiagoarrais Let me review by tomorrow ...

@wing328wing328 modified the milestones: 4.1.3, 4.2.0Oct 4, 2019
@wing328

Copy link
Copy Markdown
Member

Sorry for the delay. Please resolve the conflicts and I'll merge after that 🙏

@thiagoarrais

Copy link
Copy Markdown
ContributorAuthor

Hey, @wing328, no need to apologize. We all understand that.

Anyway... resolved conflicts and rebased. Should be good to go.

Because Circle CI said
> Please run 'bin/utils/ensure-up-to-date' locally and commit
> changes (UNCOMMITTED CHANGES ERROR)
@thiagoarrais

Copy link
Copy Markdown
ContributorAuthor

Ran update as requested by CircleCI. Regarding the Travis failure, I'm not sure it is related to this PR, since a similar build already ran successfully for my fork.

@wing328

Copy link
Copy Markdown
Member

CircleCI issue not related to this PR. Tests passed locally:

=== RUN TestUpdateUser
--- PASS: TestUpdateUser (0.33s)
=== RUN TestDeleteUser
--- PASS: TestDeleteUser (0.16s)
PASS
ok _/private/var/tmp/openapi-generator/samples/client/petstore/go	7.199s
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 01:20 min
[INFO] Finished at: 2019-10-15T01:28:26+08:00
[INFO] ------------------------------------------------------------------------

@wing328
wing328 merged commit cb2bf4d into OpenAPITools:masterOct 14, 2019
@wing328

Copy link
Copy Markdown
Member

@thiagoarrais PR merged into master. Thanks for your contribution.

@wing328

Copy link
Copy Markdown
Member

@thiagoarrais thanks for the PR, which has been included in v4.2.0 release: https://twitter.com/oas_generator/status/1189824932345069569

@thiagoarrais

Copy link
Copy Markdown
ContributorAuthor

Awesome! It's been a pleasure!

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[BUG][GO] default response not handled for error cases

4 participants

@thiagoarrais@antihax@wing328@bkabrda
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Do not check status code for default response - #3322

Merged
wing328 merged 2 commits into
OpenAPITools:masterfrom
thiagoarrais:go-default-response
Oct 14, 2019
Merged

Do not check status code for default response#3322
wing328 merged 2 commits into
OpenAPITools:masterfrom
thiagoarrais:go-default-response

Conversation

@thiagoarrais

@thiagoarraisthiagoarrais commented Jul 9, 2019

Copy link
Copy Markdown
Contributor

PR checklist

  • Read the contribution guidelines.
  • Ran the shell script under ./bin/ to update Petstore sample so that CIs can verify the change. (For instance, only need to run ./bin/{LANG}-petstore.sh, ./bin/openapi3/{LANG}-petstore.sh if updating the {LANG} (e.g. php, ruby, python, etc) code generator or {LANG} client's mustache templates). Windows batch files can be found in .\bin\windows\. If contributing template-only or documentation-only changes which will change sample output, be sure to build the project first.
  • Filed the PR against the correct branch: master, 4.1.x, 5.0.x. Default: master.
  • Copied the technical committee to review the pull request if your PR is targeting a particular programming language.

Description of the PR

Fixes#3321 by not checking HTTP status when generating code for a default response.

Reviewers, please check review comments.

cc @antihax (2017/11) @bvwells (2017/12) @grokify (2018/07) @kemokemo (2018/09)

Comment threadmodules/openapi-generator/src/main/resources/go/api.mustache Outdated

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This counts on the fact that the wildcard response will be the last one. My (limited) testing confirmed this, but will that always be the case?

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ideally this should catch any error code so the error model is returned if one is specified. It may need to catch the default/wildcard in these cases.

If i remember correct, this should be an interface so it could be possible to make this completely generic without specifically checking each code?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ideally this should catch any error code so the error model is returned if one is specified. It may need to catch the default/wildcard in these cases.

My approach here was supressing the status code check for the default case so that it handles any error code. But that may overcatch if the wildcard response isn't the last one. Hence my original question.

If i remember correct, this should be an interface so it could be possible to make this completely generic without specifically checking each code?

Sorry, I don't understand. Are you suggesting removing that check completely and just trying to unmarshall the error model based on datatype?

@antihax

Copy link
Copy Markdown
Contributor

Can you regenerate the test client?

@thiagoarrais

thiagoarrais commented Jul 9, 2019

Copy link
Copy Markdown
ContributorAuthor

Done in 942f65f. I was saving that for when the PR got closer to finishing.

Comment threadmodules/openapi-generator/src/main/resources/go/api.mustache Outdated
@thiagoarrais

Copy link
Copy Markdown
ContributorAuthor

I'm getting this double return on the generated code:

// ...err=a.client.decode(&v, localVarBody, localVarHttpResponse.Header.Get("Content-Type"))
iferr!=nil {
newErr.error=err.Error()
returnlocalVarReturnValue, localVarHttpResponse, newErr
}
newErr.model=vreturnlocalVarReturnValue, localVarHttpResponse, newErrreturnlocalVarReturnValue, localVarHttpResponse, newErr
}

I'd like to avoid it, but my mustache-fu is weak. Any ideas?

@thiagoarrais

thiagoarrais commented Jul 30, 2019

Copy link
Copy Markdown
ContributorAuthor

I've rebased this to latest master and ported the change to go-experimental. I'll start seeking a solution to my previous question. Any blockers here besides that?

@wing328

Copy link
Copy Markdown
Member

cc @bkabrda for review as the change targets go-experimental

@bkabrda

Copy link
Copy Markdown
Contributor

Hmm, it's weird that this is something that happens only in the api_default.go and not the other api_*.go. I'm wondering whether it might be a general problem in openapi-generator that occurs for certain responses. I'll try to dig in a bit and see if I find out something.

@bkabrda

Copy link
Copy Markdown
Contributor

So my understanding of the issue is this:

  • Any wildcard response (that includes "4XX"-like responses and also "default") have code == 0.
  • Wildcard responses can be used alongside of other specific responses.
  • It's true that the go generated code won't work for any wildcard responses.

However, I think the solution presented here is not entirely correct. The problem, I think, is that if there was e.g. also a 400 response defined, it could theoretically be listed after the default response in the responses array in the Java code. That would mean that not adding the if clause for wildcards would actually catch a 400 response instead of the more specific 400 response handler (which would have it's code generated after the default handler).

I guess the correct solution is to both:

  1. Do what this patch is doing.
  2. Make sure the Java code sorts the responses in order from the more specific ones to the less specific ones. E.g. for an endpoint with "default", "4XX" and "400" responses defined, they should be listed in order "400", "4XX", "default".

If the above problem is also in templates for other languages, having the responses sorted would also help all of them.

Does this sound reasonable?

@bkabrda

Copy link
Copy Markdown
Contributor

Minor clarification of the above comment: it seems that the wildcard response numbers such as "4XX" actually produce invalid code (at least for Go), as they're treated as numbers, so there will be literal 4XX put in the generated code. I think in addition to what I wrote above, we'll also need to mark these as wildcards and set their code to 0.

@thiagoarrais do you want to work on the points that I mentioned? I think I could find some time within ~1 week to get these fixed if you can't/don't want to work on them.

@thiagoarrais

thiagoarrais commented Jul 31, 2019

Copy link
Copy Markdown
ContributorAuthor

Make sure the Java code sorts the responses in order from the more specific ones to the less specific ones. E.g. for an endpoint with "default", "4XX" and "400" responses defined, they should be listed in order "400", "4XX", "default".

I can work on that, but I haven't looked into the Java code yet. Can you point me into the right direction?

Re: treating numbered wildcard responses ("4xx"): I'd prefer to keep this PR focused on literal default responses ("default").

@bkabrda

Copy link
Copy Markdown
Contributor

@thiagoarrais so you'll need to modify org.openapitools.codegen.DefaultCodegen. In the method fromResponse, you'll have to put r.code = 0 for the 4XX (and similar) wildcards - you can find the list of all possible wildcards at [1].

To modify the order of responses, you'll need to do sorting on op.responses in the fromOperation method (also on DefaultCodegen).

I'm somewhat new to openapi-generator myself, but I think this would be all that you need to do to get this done.

[1] https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.2.md#patterned-fields-1

@thiagoarrais

Copy link
Copy Markdown
ContributorAuthor

Once CI finishes this is done by me. The other wildcards (1xx, 2xx, and so on) needed a little more investigation and were left for a later PR. Please let me know if you need anything else.

@bkabrda

bkabrda commented Aug 1, 2019

Copy link
Copy Markdown
Contributor

Right, so even though we haven't reached a complete solution yet, we certainly improved the situation here, so 👍 for me to merge it. @thiagoarrais will you be interested in taking this further in a followup PR? I can work on it if you're not interested (I'd like to solve this now to get a complete solution to the problem).

@wing328 feel free to review, I have no further comments here.

@thiagoarrais

Copy link
Copy Markdown
ContributorAuthor

Can't work on that right now, but maybe in a near future. Maybe we can open an issue as a placeholder for whomever finds the time first?

@bkabrda

Copy link
Copy Markdown
Contributor

Once this is merged, I'll open a followup issue and work on it, time permitting.

@thiagoarraisthiagoarrais changed the title Do not check status code for default responseWIP: Do not check status code for default responseAug 7, 2019
@thiagoarrais

thiagoarrais commented Aug 7, 2019

Copy link
Copy Markdown
ContributorAuthor

Found some potential issues with this. Please avoid merging for the time being.

By the way: can't figure how to mark a PR as draft after it is already opened...

@thiagoarrais

thiagoarrais commented Aug 7, 2019

Copy link
Copy Markdown
ContributorAuthor

My problem seems to raise in OpenAPI 3 specs. Still digging, but it seems like the sorting code in DefaultCodeGen isn't getting run or isn't effective. Any ideas?

@thiagoarraisthiagoarrais changed the title WIP: Do not check status code for default responseDo not check status code for default responseAug 7, 2019
@thiagoarrais

Copy link
Copy Markdown
ContributorAuthor

OK. This is ready. I had switched the sorting comparation around.

@wing328wing328 modified the milestones: 4.1.0, 4.1.1Aug 9, 2019
@thiagoarrais

Copy link
Copy Markdown
ContributorAuthor

Can't tell if the Travis failure is related to the PR. Any pointers?

@thiagoarrais

Copy link
Copy Markdown
ContributorAuthor

@wing328: anything else needed for going forward with this?

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@thiagoarrais I notice that you've updated the test to replace 2xx with 4xx status code.

Does it mean the original "201" status code test fail?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

No. 422 just seemed more realistic. 201 is a success and more likely to be equated to the default case.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Changes in DefaultCodegen

cc @OpenAPITools/generator-core-team

@wing328wing328 modified the milestones: 4.1.1, 4.1.2Aug 26, 2019
@wing328wing328 modified the milestones: 4.1.2, 4.1.3Sep 11, 2019
@thiagoarrais

Copy link
Copy Markdown
ContributorAuthor

Squashed and rebased. Anything else needed for merging?

@thiagoarrais

thiagoarrais commented Sep 25, 2019

Copy link
Copy Markdown
ContributorAuthor

Folks, anything else that needs to be addressed here?

@wing328

Copy link
Copy Markdown
Member

@thiagoarrais Let me review by tomorrow ...

@wing328wing328 modified the milestones: 4.1.3, 4.2.0Oct 4, 2019
@wing328

Copy link
Copy Markdown
Member

Sorry for the delay. Please resolve the conflicts and I'll merge after that 🙏

@thiagoarrais

Copy link
Copy Markdown
ContributorAuthor

Hey, @wing328, no need to apologize. We all understand that.

Anyway... resolved conflicts and rebased. Should be good to go.

Because Circle CI said
> Please run 'bin/utils/ensure-up-to-date' locally and commit
> changes (UNCOMMITTED CHANGES ERROR)
@thiagoarrais

Copy link
Copy Markdown
ContributorAuthor

Ran update as requested by CircleCI. Regarding the Travis failure, I'm not sure it is related to this PR, since a similar build already ran successfully for my fork.

@wing328

Copy link
Copy Markdown
Member

CircleCI issue not related to this PR. Tests passed locally:

=== RUN TestUpdateUser
--- PASS: TestUpdateUser (0.33s)
=== RUN TestDeleteUser
--- PASS: TestDeleteUser (0.16s)
PASS
ok _/private/var/tmp/openapi-generator/samples/client/petstore/go	7.199s
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 01:20 min
[INFO] Finished at: 2019-10-15T01:28:26+08:00
[INFO] ------------------------------------------------------------------------

@wing328
wing328 merged commit cb2bf4d into OpenAPITools:masterOct 14, 2019
@wing328

Copy link
Copy Markdown
Member

@thiagoarrais PR merged into master. Thanks for your contribution.

@wing328

Copy link
Copy Markdown
Member

@thiagoarrais thanks for the PR, which has been included in v4.2.0 release: https://twitter.com/oas_generator/status/1189824932345069569

@thiagoarrais

Copy link
Copy Markdown
ContributorAuthor

Awesome! It's been a pleasure!

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[BUG][GO] default response not handled for error cases

4 participants

@thiagoarrais@antihax@wing328@bkabrda
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Do not check status code for default response - #3322

Merged
wing328 merged 2 commits into
OpenAPITools:masterfrom
thiagoarrais:go-default-response
Oct 14, 2019
Merged

Do not check status code for default response#3322
wing328 merged 2 commits into
OpenAPITools:masterfrom
thiagoarrais:go-default-response

Conversation

@thiagoarrais

@thiagoarraisthiagoarrais commented Jul 9, 2019

Copy link
Copy Markdown
Contributor

PR checklist

  • Read the contribution guidelines.
  • Ran the shell script under ./bin/ to update Petstore sample so that CIs can verify the change. (For instance, only need to run ./bin/{LANG}-petstore.sh, ./bin/openapi3/{LANG}-petstore.sh if updating the {LANG} (e.g. php, ruby, python, etc) code generator or {LANG} client's mustache templates). Windows batch files can be found in .\bin\windows\. If contributing template-only or documentation-only changes which will change sample output, be sure to build the project first.
  • Filed the PR against the correct branch: master, 4.1.x, 5.0.x. Default: master.
  • Copied the technical committee to review the pull request if your PR is targeting a particular programming language.

Description of the PR

Fixes#3321 by not checking HTTP status when generating code for a default response.

Reviewers, please check review comments.

cc @antihax (2017/11) @bvwells (2017/12) @grokify (2018/07) @kemokemo (2018/09)

Comment threadmodules/openapi-generator/src/main/resources/go/api.mustache Outdated

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This counts on the fact that the wildcard response will be the last one. My (limited) testing confirmed this, but will that always be the case?

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ideally this should catch any error code so the error model is returned if one is specified. It may need to catch the default/wildcard in these cases.

If i remember correct, this should be an interface so it could be possible to make this completely generic without specifically checking each code?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ideally this should catch any error code so the error model is returned if one is specified. It may need to catch the default/wildcard in these cases.

My approach here was supressing the status code check for the default case so that it handles any error code. But that may overcatch if the wildcard response isn't the last one. Hence my original question.

If i remember correct, this should be an interface so it could be possible to make this completely generic without specifically checking each code?

Sorry, I don't understand. Are you suggesting removing that check completely and just trying to unmarshall the error model based on datatype?

@antihax

Copy link
Copy Markdown
Contributor

Can you regenerate the test client?

@thiagoarrais

thiagoarrais commented Jul 9, 2019

Copy link
Copy Markdown
ContributorAuthor

Done in 942f65f. I was saving that for when the PR got closer to finishing.

Comment threadmodules/openapi-generator/src/main/resources/go/api.mustache Outdated
@thiagoarrais

Copy link
Copy Markdown
ContributorAuthor

I'm getting this double return on the generated code:

// ...err=a.client.decode(&v, localVarBody, localVarHttpResponse.Header.Get("Content-Type"))
iferr!=nil {
newErr.error=err.Error()
returnlocalVarReturnValue, localVarHttpResponse, newErr
}
newErr.model=vreturnlocalVarReturnValue, localVarHttpResponse, newErrreturnlocalVarReturnValue, localVarHttpResponse, newErr
}

I'd like to avoid it, but my mustache-fu is weak. Any ideas?

@thiagoarrais

thiagoarrais commented Jul 30, 2019

Copy link
Copy Markdown
ContributorAuthor

I've rebased this to latest master and ported the change to go-experimental. I'll start seeking a solution to my previous question. Any blockers here besides that?

@wing328

Copy link
Copy Markdown
Member

cc @bkabrda for review as the change targets go-experimental

@bkabrda

Copy link
Copy Markdown
Contributor

Hmm, it's weird that this is something that happens only in the api_default.go and not the other api_*.go. I'm wondering whether it might be a general problem in openapi-generator that occurs for certain responses. I'll try to dig in a bit and see if I find out something.

@bkabrda

Copy link
Copy Markdown
Contributor

So my understanding of the issue is this:

  • Any wildcard response (that includes "4XX"-like responses and also "default") have code == 0.
  • Wildcard responses can be used alongside of other specific responses.
  • It's true that the go generated code won't work for any wildcard responses.

However, I think the solution presented here is not entirely correct. The problem, I think, is that if there was e.g. also a 400 response defined, it could theoretically be listed after the default response in the responses array in the Java code. That would mean that not adding the if clause for wildcards would actually catch a 400 response instead of the more specific 400 response handler (which would have it's code generated after the default handler).

I guess the correct solution is to both:

  1. Do what this patch is doing.
  2. Make sure the Java code sorts the responses in order from the more specific ones to the less specific ones. E.g. for an endpoint with "default", "4XX" and "400" responses defined, they should be listed in order "400", "4XX", "default".

If the above problem is also in templates for other languages, having the responses sorted would also help all of them.

Does this sound reasonable?

@bkabrda

Copy link
Copy Markdown
Contributor

Minor clarification of the above comment: it seems that the wildcard response numbers such as "4XX" actually produce invalid code (at least for Go), as they're treated as numbers, so there will be literal 4XX put in the generated code. I think in addition to what I wrote above, we'll also need to mark these as wildcards and set their code to 0.

@thiagoarrais do you want to work on the points that I mentioned? I think I could find some time within ~1 week to get these fixed if you can't/don't want to work on them.

@thiagoarrais

thiagoarrais commented Jul 31, 2019

Copy link
Copy Markdown
ContributorAuthor

Make sure the Java code sorts the responses in order from the more specific ones to the less specific ones. E.g. for an endpoint with "default", "4XX" and "400" responses defined, they should be listed in order "400", "4XX", "default".

I can work on that, but I haven't looked into the Java code yet. Can you point me into the right direction?

Re: treating numbered wildcard responses ("4xx"): I'd prefer to keep this PR focused on literal default responses ("default").

@bkabrda

Copy link
Copy Markdown
Contributor

@thiagoarrais so you'll need to modify org.openapitools.codegen.DefaultCodegen. In the method fromResponse, you'll have to put r.code = 0 for the 4XX (and similar) wildcards - you can find the list of all possible wildcards at [1].

To modify the order of responses, you'll need to do sorting on op.responses in the fromOperation method (also on DefaultCodegen).

I'm somewhat new to openapi-generator myself, but I think this would be all that you need to do to get this done.

[1] https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.2.md#patterned-fields-1

@thiagoarrais

Copy link
Copy Markdown
ContributorAuthor

Once CI finishes this is done by me. The other wildcards (1xx, 2xx, and so on) needed a little more investigation and were left for a later PR. Please let me know if you need anything else.

@bkabrda

bkabrda commented Aug 1, 2019

Copy link
Copy Markdown
Contributor

Right, so even though we haven't reached a complete solution yet, we certainly improved the situation here, so 👍 for me to merge it. @thiagoarrais will you be interested in taking this further in a followup PR? I can work on it if you're not interested (I'd like to solve this now to get a complete solution to the problem).

@wing328 feel free to review, I have no further comments here.

@thiagoarrais

Copy link
Copy Markdown
ContributorAuthor

Can't work on that right now, but maybe in a near future. Maybe we can open an issue as a placeholder for whomever finds the time first?

@bkabrda

Copy link
Copy Markdown
Contributor

Once this is merged, I'll open a followup issue and work on it, time permitting.

@thiagoarraisthiagoarrais changed the title Do not check status code for default responseWIP: Do not check status code for default responseAug 7, 2019
@thiagoarrais

thiagoarrais commented Aug 7, 2019

Copy link
Copy Markdown
ContributorAuthor

Found some potential issues with this. Please avoid merging for the time being.

By the way: can't figure how to mark a PR as draft after it is already opened...

@thiagoarrais

thiagoarrais commented Aug 7, 2019

Copy link
Copy Markdown
ContributorAuthor

My problem seems to raise in OpenAPI 3 specs. Still digging, but it seems like the sorting code in DefaultCodeGen isn't getting run or isn't effective. Any ideas?

@thiagoarraisthiagoarrais changed the title WIP: Do not check status code for default responseDo not check status code for default responseAug 7, 2019
@thiagoarrais

Copy link
Copy Markdown
ContributorAuthor

OK. This is ready. I had switched the sorting comparation around.

@wing328wing328 modified the milestones: 4.1.0, 4.1.1Aug 9, 2019
@thiagoarrais

Copy link
Copy Markdown
ContributorAuthor

Can't tell if the Travis failure is related to the PR. Any pointers?

@thiagoarrais

Copy link
Copy Markdown
ContributorAuthor

@wing328: anything else needed for going forward with this?

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@thiagoarrais I notice that you've updated the test to replace 2xx with 4xx status code.

Does it mean the original "201" status code test fail?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

No. 422 just seemed more realistic. 201 is a success and more likely to be equated to the default case.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Changes in DefaultCodegen

cc @OpenAPITools/generator-core-team

@wing328wing328 modified the milestones: 4.1.1, 4.1.2Aug 26, 2019
@wing328wing328 modified the milestones: 4.1.2, 4.1.3Sep 11, 2019
@thiagoarrais

Copy link
Copy Markdown
ContributorAuthor

Squashed and rebased. Anything else needed for merging?

@thiagoarrais

thiagoarrais commented Sep 25, 2019

Copy link
Copy Markdown
ContributorAuthor

Folks, anything else that needs to be addressed here?

@wing328

Copy link
Copy Markdown
Member

@thiagoarrais Let me review by tomorrow ...

@wing328wing328 modified the milestones: 4.1.3, 4.2.0Oct 4, 2019
@wing328

Copy link
Copy Markdown
Member

Sorry for the delay. Please resolve the conflicts and I'll merge after that 🙏

@thiagoarrais

Copy link
Copy Markdown
ContributorAuthor

Hey, @wing328, no need to apologize. We all understand that.

Anyway... resolved conflicts and rebased. Should be good to go.

Because Circle CI said
> Please run 'bin/utils/ensure-up-to-date' locally and commit
> changes (UNCOMMITTED CHANGES ERROR)
@thiagoarrais

Copy link
Copy Markdown
ContributorAuthor

Ran update as requested by CircleCI. Regarding the Travis failure, I'm not sure it is related to this PR, since a similar build already ran successfully for my fork.

@wing328

Copy link
Copy Markdown
Member

CircleCI issue not related to this PR. Tests passed locally:

=== RUN TestUpdateUser
--- PASS: TestUpdateUser (0.33s)
=== RUN TestDeleteUser
--- PASS: TestDeleteUser (0.16s)
PASS
ok _/private/var/tmp/openapi-generator/samples/client/petstore/go	7.199s
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 01:20 min
[INFO] Finished at: 2019-10-15T01:28:26+08:00
[INFO] ------------------------------------------------------------------------

@wing328
wing328 merged commit cb2bf4d into OpenAPITools:masterOct 14, 2019
@wing328

Copy link
Copy Markdown
Member

@thiagoarrais PR merged into master. Thanks for your contribution.

@wing328

Copy link
Copy Markdown
Member

@thiagoarrais thanks for the PR, which has been included in v4.2.0 release: https://twitter.com/oas_generator/status/1189824932345069569

@thiagoarrais

Copy link
Copy Markdown
ContributorAuthor

Awesome! It's been a pleasure!

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[BUG][GO] default response not handled for error cases

4 participants

@thiagoarrais@antihax@wing328@bkabrda
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Do not check status code for default response - #3322

Merged
wing328 merged 2 commits into
OpenAPITools:masterfrom
thiagoarrais:go-default-response
Oct 14, 2019
Merged

Do not check status code for default response#3322
wing328 merged 2 commits into
OpenAPITools:masterfrom
thiagoarrais:go-default-response

Conversation

@thiagoarrais

@thiagoarraisthiagoarrais commented Jul 9, 2019

Copy link
Copy Markdown
Contributor

PR checklist

  • Read the contribution guidelines.
  • Ran the shell script under ./bin/ to update Petstore sample so that CIs can verify the change. (For instance, only need to run ./bin/{LANG}-petstore.sh, ./bin/openapi3/{LANG}-petstore.sh if updating the {LANG} (e.g. php, ruby, python, etc) code generator or {LANG} client's mustache templates). Windows batch files can be found in .\bin\windows\. If contributing template-only or documentation-only changes which will change sample output, be sure to build the project first.
  • Filed the PR against the correct branch: master, 4.1.x, 5.0.x. Default: master.
  • Copied the technical committee to review the pull request if your PR is targeting a particular programming language.

Description of the PR

Fixes#3321 by not checking HTTP status when generating code for a default response.

Reviewers, please check review comments.

cc @antihax (2017/11) @bvwells (2017/12) @grokify (2018/07) @kemokemo (2018/09)

Comment threadmodules/openapi-generator/src/main/resources/go/api.mustache Outdated

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This counts on the fact that the wildcard response will be the last one. My (limited) testing confirmed this, but will that always be the case?

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ideally this should catch any error code so the error model is returned if one is specified. It may need to catch the default/wildcard in these cases.

If i remember correct, this should be an interface so it could be possible to make this completely generic without specifically checking each code?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ideally this should catch any error code so the error model is returned if one is specified. It may need to catch the default/wildcard in these cases.

My approach here was supressing the status code check for the default case so that it handles any error code. But that may overcatch if the wildcard response isn't the last one. Hence my original question.

If i remember correct, this should be an interface so it could be possible to make this completely generic without specifically checking each code?

Sorry, I don't understand. Are you suggesting removing that check completely and just trying to unmarshall the error model based on datatype?

@antihax

Copy link
Copy Markdown
Contributor

Can you regenerate the test client?

@thiagoarrais

thiagoarrais commented Jul 9, 2019

Copy link
Copy Markdown
ContributorAuthor

Done in 942f65f. I was saving that for when the PR got closer to finishing.

Comment threadmodules/openapi-generator/src/main/resources/go/api.mustache Outdated
@thiagoarrais

Copy link
Copy Markdown
ContributorAuthor

I'm getting this double return on the generated code:

// ...err=a.client.decode(&v, localVarBody, localVarHttpResponse.Header.Get("Content-Type"))
iferr!=nil {
newErr.error=err.Error()
returnlocalVarReturnValue, localVarHttpResponse, newErr
}
newErr.model=vreturnlocalVarReturnValue, localVarHttpResponse, newErrreturnlocalVarReturnValue, localVarHttpResponse, newErr
}

I'd like to avoid it, but my mustache-fu is weak. Any ideas?

@thiagoarrais

thiagoarrais commented Jul 30, 2019

Copy link
Copy Markdown
ContributorAuthor

I've rebased this to latest master and ported the change to go-experimental. I'll start seeking a solution to my previous question. Any blockers here besides that?

@wing328

Copy link
Copy Markdown
Member

cc @bkabrda for review as the change targets go-experimental

@bkabrda

Copy link
Copy Markdown
Contributor

Hmm, it's weird that this is something that happens only in the api_default.go and not the other api_*.go. I'm wondering whether it might be a general problem in openapi-generator that occurs for certain responses. I'll try to dig in a bit and see if I find out something.

@bkabrda

Copy link
Copy Markdown
Contributor

So my understanding of the issue is this:

  • Any wildcard response (that includes "4XX"-like responses and also "default") have code == 0.
  • Wildcard responses can be used alongside of other specific responses.
  • It's true that the go generated code won't work for any wildcard responses.

However, I think the solution presented here is not entirely correct. The problem, I think, is that if there was e.g. also a 400 response defined, it could theoretically be listed after the default response in the responses array in the Java code. That would mean that not adding the if clause for wildcards would actually catch a 400 response instead of the more specific 400 response handler (which would have it's code generated after the default handler).

I guess the correct solution is to both:

  1. Do what this patch is doing.
  2. Make sure the Java code sorts the responses in order from the more specific ones to the less specific ones. E.g. for an endpoint with "default", "4XX" and "400" responses defined, they should be listed in order "400", "4XX", "default".

If the above problem is also in templates for other languages, having the responses sorted would also help all of them.

Does this sound reasonable?

@bkabrda

Copy link
Copy Markdown
Contributor

Minor clarification of the above comment: it seems that the wildcard response numbers such as "4XX" actually produce invalid code (at least for Go), as they're treated as numbers, so there will be literal 4XX put in the generated code. I think in addition to what I wrote above, we'll also need to mark these as wildcards and set their code to 0.

@thiagoarrais do you want to work on the points that I mentioned? I think I could find some time within ~1 week to get these fixed if you can't/don't want to work on them.

@thiagoarrais

thiagoarrais commented Jul 31, 2019

Copy link
Copy Markdown
ContributorAuthor

Make sure the Java code sorts the responses in order from the more specific ones to the less specific ones. E.g. for an endpoint with "default", "4XX" and "400" responses defined, they should be listed in order "400", "4XX", "default".

I can work on that, but I haven't looked into the Java code yet. Can you point me into the right direction?

Re: treating numbered wildcard responses ("4xx"): I'd prefer to keep this PR focused on literal default responses ("default").

@bkabrda

Copy link
Copy Markdown
Contributor

@thiagoarrais so you'll need to modify org.openapitools.codegen.DefaultCodegen. In the method fromResponse, you'll have to put r.code = 0 for the 4XX (and similar) wildcards - you can find the list of all possible wildcards at [1].

To modify the order of responses, you'll need to do sorting on op.responses in the fromOperation method (also on DefaultCodegen).

I'm somewhat new to openapi-generator myself, but I think this would be all that you need to do to get this done.

[1] https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.2.md#patterned-fields-1

@thiagoarrais

Copy link
Copy Markdown
ContributorAuthor

Once CI finishes this is done by me. The other wildcards (1xx, 2xx, and so on) needed a little more investigation and were left for a later PR. Please let me know if you need anything else.

@bkabrda

bkabrda commented Aug 1, 2019

Copy link
Copy Markdown
Contributor

Right, so even though we haven't reached a complete solution yet, we certainly improved the situation here, so 👍 for me to merge it. @thiagoarrais will you be interested in taking this further in a followup PR? I can work on it if you're not interested (I'd like to solve this now to get a complete solution to the problem).

@wing328 feel free to review, I have no further comments here.

@thiagoarrais

Copy link
Copy Markdown
ContributorAuthor

Can't work on that right now, but maybe in a near future. Maybe we can open an issue as a placeholder for whomever finds the time first?

@bkabrda

Copy link
Copy Markdown
Contributor

Once this is merged, I'll open a followup issue and work on it, time permitting.

@thiagoarraisthiagoarrais changed the title Do not check status code for default responseWIP: Do not check status code for default responseAug 7, 2019
@thiagoarrais

thiagoarrais commented Aug 7, 2019

Copy link
Copy Markdown
ContributorAuthor

Found some potential issues with this. Please avoid merging for the time being.

By the way: can't figure how to mark a PR as draft after it is already opened...

@thiagoarrais

thiagoarrais commented Aug 7, 2019

Copy link
Copy Markdown
ContributorAuthor

My problem seems to raise in OpenAPI 3 specs. Still digging, but it seems like the sorting code in DefaultCodeGen isn't getting run or isn't effective. Any ideas?

@thiagoarraisthiagoarrais changed the title WIP: Do not check status code for default responseDo not check status code for default responseAug 7, 2019
@thiagoarrais

Copy link
Copy Markdown
ContributorAuthor

OK. This is ready. I had switched the sorting comparation around.

@wing328wing328 modified the milestones: 4.1.0, 4.1.1Aug 9, 2019
@thiagoarrais

Copy link
Copy Markdown
ContributorAuthor

Can't tell if the Travis failure is related to the PR. Any pointers?

@thiagoarrais

Copy link
Copy Markdown
ContributorAuthor

@wing328: anything else needed for going forward with this?

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@thiagoarrais I notice that you've updated the test to replace 2xx with 4xx status code.

Does it mean the original "201" status code test fail?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

No. 422 just seemed more realistic. 201 is a success and more likely to be equated to the default case.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Changes in DefaultCodegen

cc @OpenAPITools/generator-core-team

@wing328wing328 modified the milestones: 4.1.1, 4.1.2Aug 26, 2019
@wing328wing328 modified the milestones: 4.1.2, 4.1.3Sep 11, 2019
@thiagoarrais

Copy link
Copy Markdown
ContributorAuthor

Squashed and rebased. Anything else needed for merging?

@thiagoarrais

thiagoarrais commented Sep 25, 2019

Copy link
Copy Markdown
ContributorAuthor

Folks, anything else that needs to be addressed here?

@wing328

Copy link
Copy Markdown
Member

@thiagoarrais Let me review by tomorrow ...

@wing328wing328 modified the milestones: 4.1.3, 4.2.0Oct 4, 2019
@wing328

Copy link
Copy Markdown
Member

Sorry for the delay. Please resolve the conflicts and I'll merge after that 🙏

@thiagoarrais

Copy link
Copy Markdown
ContributorAuthor

Hey, @wing328, no need to apologize. We all understand that.

Anyway... resolved conflicts and rebased. Should be good to go.

Because Circle CI said
> Please run 'bin/utils/ensure-up-to-date' locally and commit
> changes (UNCOMMITTED CHANGES ERROR)
@thiagoarrais

Copy link
Copy Markdown
ContributorAuthor

Ran update as requested by CircleCI. Regarding the Travis failure, I'm not sure it is related to this PR, since a similar build already ran successfully for my fork.

@wing328

Copy link
Copy Markdown
Member

CircleCI issue not related to this PR. Tests passed locally:

=== RUN TestUpdateUser
--- PASS: TestUpdateUser (0.33s)
=== RUN TestDeleteUser
--- PASS: TestDeleteUser (0.16s)
PASS
ok _/private/var/tmp/openapi-generator/samples/client/petstore/go	7.199s
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 01:20 min
[INFO] Finished at: 2019-10-15T01:28:26+08:00
[INFO] ------------------------------------------------------------------------

@wing328
wing328 merged commit cb2bf4d into OpenAPITools:masterOct 14, 2019
@wing328

Copy link
Copy Markdown
Member

@thiagoarrais PR merged into master. Thanks for your contribution.

@wing328

Copy link
Copy Markdown
Member

@thiagoarrais thanks for the PR, which has been included in v4.2.0 release: https://twitter.com/oas_generator/status/1189824932345069569

@thiagoarrais

Copy link
Copy Markdown
ContributorAuthor

Awesome! It's been a pleasure!

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[BUG][GO] default response not handled for error cases

4 participants

@thiagoarrais@antihax@wing328@bkabrda
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Do not check status code for default response - #3322

Merged
wing328 merged 2 commits into
OpenAPITools:masterfrom
thiagoarrais:go-default-response
Oct 14, 2019
Merged

Do not check status code for default response#3322
wing328 merged 2 commits into
OpenAPITools:masterfrom
thiagoarrais:go-default-response

Conversation

@thiagoarrais

@thiagoarraisthiagoarrais commented Jul 9, 2019

Copy link
Copy Markdown
Contributor

PR checklist

  • Read the contribution guidelines.
  • Ran the shell script under ./bin/ to update Petstore sample so that CIs can verify the change. (For instance, only need to run ./bin/{LANG}-petstore.sh, ./bin/openapi3/{LANG}-petstore.sh if updating the {LANG} (e.g. php, ruby, python, etc) code generator or {LANG} client's mustache templates). Windows batch files can be found in .\bin\windows\. If contributing template-only or documentation-only changes which will change sample output, be sure to build the project first.
  • Filed the PR against the correct branch: master, 4.1.x, 5.0.x. Default: master.
  • Copied the technical committee to review the pull request if your PR is targeting a particular programming language.

Description of the PR

Fixes#3321 by not checking HTTP status when generating code for a default response.

Reviewers, please check review comments.

cc @antihax (2017/11) @bvwells (2017/12) @grokify (2018/07) @kemokemo (2018/09)

Comment threadmodules/openapi-generator/src/main/resources/go/api.mustache Outdated

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This counts on the fact that the wildcard response will be the last one. My (limited) testing confirmed this, but will that always be the case?

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ideally this should catch any error code so the error model is returned if one is specified. It may need to catch the default/wildcard in these cases.

If i remember correct, this should be an interface so it could be possible to make this completely generic without specifically checking each code?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ideally this should catch any error code so the error model is returned if one is specified. It may need to catch the default/wildcard in these cases.

My approach here was supressing the status code check for the default case so that it handles any error code. But that may overcatch if the wildcard response isn't the last one. Hence my original question.

If i remember correct, this should be an interface so it could be possible to make this completely generic without specifically checking each code?

Sorry, I don't understand. Are you suggesting removing that check completely and just trying to unmarshall the error model based on datatype?

@antihax

Copy link
Copy Markdown
Contributor

Can you regenerate the test client?

@thiagoarrais

thiagoarrais commented Jul 9, 2019

Copy link
Copy Markdown
ContributorAuthor

Done in 942f65f. I was saving that for when the PR got closer to finishing.

Comment threadmodules/openapi-generator/src/main/resources/go/api.mustache Outdated
@thiagoarrais

Copy link
Copy Markdown
ContributorAuthor

I'm getting this double return on the generated code:

// ...err=a.client.decode(&v, localVarBody, localVarHttpResponse.Header.Get("Content-Type"))
iferr!=nil {
newErr.error=err.Error()
returnlocalVarReturnValue, localVarHttpResponse, newErr
}
newErr.model=vreturnlocalVarReturnValue, localVarHttpResponse, newErrreturnlocalVarReturnValue, localVarHttpResponse, newErr
}

I'd like to avoid it, but my mustache-fu is weak. Any ideas?

@thiagoarrais

thiagoarrais commented Jul 30, 2019

Copy link
Copy Markdown
ContributorAuthor

I've rebased this to latest master and ported the change to go-experimental. I'll start seeking a solution to my previous question. Any blockers here besides that?

@wing328

Copy link
Copy Markdown
Member

cc @bkabrda for review as the change targets go-experimental

@bkabrda

Copy link
Copy Markdown
Contributor

Hmm, it's weird that this is something that happens only in the api_default.go and not the other api_*.go. I'm wondering whether it might be a general problem in openapi-generator that occurs for certain responses. I'll try to dig in a bit and see if I find out something.

@bkabrda

Copy link
Copy Markdown
Contributor

So my understanding of the issue is this:

  • Any wildcard response (that includes "4XX"-like responses and also "default") have code == 0.
  • Wildcard responses can be used alongside of other specific responses.
  • It's true that the go generated code won't work for any wildcard responses.

However, I think the solution presented here is not entirely correct. The problem, I think, is that if there was e.g. also a 400 response defined, it could theoretically be listed after the default response in the responses array in the Java code. That would mean that not adding the if clause for wildcards would actually catch a 400 response instead of the more specific 400 response handler (which would have it's code generated after the default handler).

I guess the correct solution is to both:

  1. Do what this patch is doing.
  2. Make sure the Java code sorts the responses in order from the more specific ones to the less specific ones. E.g. for an endpoint with "default", "4XX" and "400" responses defined, they should be listed in order "400", "4XX", "default".

If the above problem is also in templates for other languages, having the responses sorted would also help all of them.

Does this sound reasonable?

@bkabrda

Copy link
Copy Markdown
Contributor

Minor clarification of the above comment: it seems that the wildcard response numbers such as "4XX" actually produce invalid code (at least for Go), as they're treated as numbers, so there will be literal 4XX put in the generated code. I think in addition to what I wrote above, we'll also need to mark these as wildcards and set their code to 0.

@thiagoarrais do you want to work on the points that I mentioned? I think I could find some time within ~1 week to get these fixed if you can't/don't want to work on them.

@thiagoarrais

thiagoarrais commented Jul 31, 2019

Copy link
Copy Markdown
ContributorAuthor

Make sure the Java code sorts the responses in order from the more specific ones to the less specific ones. E.g. for an endpoint with "default", "4XX" and "400" responses defined, they should be listed in order "400", "4XX", "default".

I can work on that, but I haven't looked into the Java code yet. Can you point me into the right direction?

Re: treating numbered wildcard responses ("4xx"): I'd prefer to keep this PR focused on literal default responses ("default").

@bkabrda

Copy link
Copy Markdown
Contributor

@thiagoarrais so you'll need to modify org.openapitools.codegen.DefaultCodegen. In the method fromResponse, you'll have to put r.code = 0 for the 4XX (and similar) wildcards - you can find the list of all possible wildcards at [1].

To modify the order of responses, you'll need to do sorting on op.responses in the fromOperation method (also on DefaultCodegen).

I'm somewhat new to openapi-generator myself, but I think this would be all that you need to do to get this done.

[1] https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.2.md#patterned-fields-1

@thiagoarrais

Copy link
Copy Markdown
ContributorAuthor

Once CI finishes this is done by me. The other wildcards (1xx, 2xx, and so on) needed a little more investigation and were left for a later PR. Please let me know if you need anything else.

@bkabrda

bkabrda commented Aug 1, 2019

Copy link
Copy Markdown
Contributor

Right, so even though we haven't reached a complete solution yet, we certainly improved the situation here, so 👍 for me to merge it. @thiagoarrais will you be interested in taking this further in a followup PR? I can work on it if you're not interested (I'd like to solve this now to get a complete solution to the problem).

@wing328 feel free to review, I have no further comments here.

@thiagoarrais

Copy link
Copy Markdown
ContributorAuthor

Can't work on that right now, but maybe in a near future. Maybe we can open an issue as a placeholder for whomever finds the time first?

@bkabrda

Copy link
Copy Markdown
Contributor

Once this is merged, I'll open a followup issue and work on it, time permitting.

@thiagoarraisthiagoarrais changed the title Do not check status code for default responseWIP: Do not check status code for default responseAug 7, 2019
@thiagoarrais

thiagoarrais commented Aug 7, 2019

Copy link
Copy Markdown
ContributorAuthor

Found some potential issues with this. Please avoid merging for the time being.

By the way: can't figure how to mark a PR as draft after it is already opened...

@thiagoarrais

thiagoarrais commented Aug 7, 2019

Copy link
Copy Markdown
ContributorAuthor

My problem seems to raise in OpenAPI 3 specs. Still digging, but it seems like the sorting code in DefaultCodeGen isn't getting run or isn't effective. Any ideas?

@thiagoarraisthiagoarrais changed the title WIP: Do not check status code for default responseDo not check status code for default responseAug 7, 2019
@thiagoarrais

Copy link
Copy Markdown
ContributorAuthor

OK. This is ready. I had switched the sorting comparation around.

@wing328wing328 modified the milestones: 4.1.0, 4.1.1Aug 9, 2019
@thiagoarrais

Copy link
Copy Markdown
ContributorAuthor

Can't tell if the Travis failure is related to the PR. Any pointers?

@thiagoarrais

Copy link
Copy Markdown
ContributorAuthor

@wing328: anything else needed for going forward with this?

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@thiagoarrais I notice that you've updated the test to replace 2xx with 4xx status code.

Does it mean the original "201" status code test fail?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

No. 422 just seemed more realistic. 201 is a success and more likely to be equated to the default case.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Changes in DefaultCodegen

cc @OpenAPITools/generator-core-team

@wing328wing328 modified the milestones: 4.1.1, 4.1.2Aug 26, 2019
@wing328wing328 modified the milestones: 4.1.2, 4.1.3Sep 11, 2019
@thiagoarrais

Copy link
Copy Markdown
ContributorAuthor

Squashed and rebased. Anything else needed for merging?

@thiagoarrais

thiagoarrais commented Sep 25, 2019

Copy link
Copy Markdown
ContributorAuthor

Folks, anything else that needs to be addressed here?

@wing328

Copy link
Copy Markdown
Member

@thiagoarrais Let me review by tomorrow ...

@wing328wing328 modified the milestones: 4.1.3, 4.2.0Oct 4, 2019
@wing328

Copy link
Copy Markdown
Member

Sorry for the delay. Please resolve the conflicts and I'll merge after that 🙏

@thiagoarrais

Copy link
Copy Markdown
ContributorAuthor

Hey, @wing328, no need to apologize. We all understand that.

Anyway... resolved conflicts and rebased. Should be good to go.

Because Circle CI said
> Please run 'bin/utils/ensure-up-to-date' locally and commit
> changes (UNCOMMITTED CHANGES ERROR)
@thiagoarrais

Copy link
Copy Markdown
ContributorAuthor

Ran update as requested by CircleCI. Regarding the Travis failure, I'm not sure it is related to this PR, since a similar build already ran successfully for my fork.

@wing328

Copy link
Copy Markdown
Member

CircleCI issue not related to this PR. Tests passed locally:

=== RUN TestUpdateUser
--- PASS: TestUpdateUser (0.33s)
=== RUN TestDeleteUser
--- PASS: TestDeleteUser (0.16s)
PASS
ok _/private/var/tmp/openapi-generator/samples/client/petstore/go	7.199s
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 01:20 min
[INFO] Finished at: 2019-10-15T01:28:26+08:00
[INFO] ------------------------------------------------------------------------

@wing328
wing328 merged commit cb2bf4d into OpenAPITools:masterOct 14, 2019
@wing328

Copy link
Copy Markdown
Member

@thiagoarrais PR merged into master. Thanks for your contribution.

@wing328

Copy link
Copy Markdown
Member

@thiagoarrais thanks for the PR, which has been included in v4.2.0 release: https://twitter.com/oas_generator/status/1189824932345069569

@thiagoarrais

Copy link
Copy Markdown
ContributorAuthor

Awesome! It's been a pleasure!

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[BUG][GO] default response not handled for error cases

4 participants

@thiagoarrais@antihax@wing328@bkabrda