swagger-js
swagger-js copied to clipboard
SwaggerClient does not fail when openapi spec is malformed
Q&A (please complete the following information)
- OS: macOS
- Environment: Firefox, Chrome (all)
- Method of installation: yarn
- Swagger-Client version: 3.9.17
- Swagger/OpenAPI version: OpenAPI 3.0
Content & configuration
Swagger/OpenAPI definition. This is an example of the malformed document. It invalidated the whole client.
/revalidate:
get:
tags:
- rfc
summary: ...
description: ...
operationId: reused_operation_id
parameters:
- name: secret
in: query
description: ...
required: true
schema:
type: string
parameters: # <--- bad spec
- name: url
in: query
description: URL to revalidate
required: true
schema:
type: string
responses:
'200':
description: successful operation
content:
application/json:
schema:
$ref: '#/components/schemas/...'
security:
- rfc_xxx: []
Swagger-Client usage:
SwaggerClient({
url: process.env.NEXT_PUBLIC_OPENAPI_YAML
})
.then(
(client) => {
console.log('Client' + JSON.stringify(client, null, 4))
try {
let res = client.apis.rfc.calendarlist(opts, {})
console.log('calendarlist:res', res)
return res
} catch (err) {
console.log('calendarlist:err', err)
}
}
}
).then(
(response) => {
return response.body
}
).catch(
(err) => {
return {error: true, message:'...', payload: err ...}
}
)
Describe the bug you're encountering
When the yaml spec is incorrect/malformed/invalid (in my case I had 2 parameter sections by mistake), the client is created but is empty like this:
API-C:calendar:list:client generic.js:24:20
Client{
"url": "http://127.0.0.1:3000/rfc-v1.yaml",
"authorizations": {
"rfc_xxxx": "--expired--"
},
"spec": {},
"errors": [],
"apis": {}
}
So when I call client.apis.rfc.calendarlist(opts, {}) I get TypeError: client.apis.rfc is undefined.
To reproduce...
Steps to reproduce the behavior:
- Make your yaml file invalid
Expected behavior
If the yaml file could not be parsed correctly then SwaggerClient should never have entered the first then providing a broken (client), it should throw so it can be handled/logged in the catch.
I expect that the .then((client) =>{}) should not be called. The .catch((err)=>{}) should be called instead with a message about why the client could not be created.
Screenshots
Additional context or thoughts
If the client is not perfectly created then it should fail.
Additional information: if the (client) => {throw new Error('help!')} or TypeError from the failed client then .catch(err => { err is {} } which is unhelpful. The exception/error is consumed.
My workaround is:
.then(
(client) => {
// https://github.com/swagger-api/swagger-js/issues/2953
try {
return clientCall(client)
} catch (err) {
console.error(err)
throw err // exception is consumed but don't know what else to do with it!
}
}
).then(
(response) => {
/// normal stuff
}
).catch(
(err) => {
console.log('API-E:' + debug + ':error: ' + JSON.stringify(err, null, 4)) // err is always {}
if (err.response === undefined) {
return { error: true, type: 'CLIENT', message: 'Client side error', payload: null }
}
}
)
As you can see, there is a lot of stuff that shouldn't really be there and it has a bad code smell.
The same issue. Seems the client is ignoring if the OAS is malformed or invalid.