Path not resolving correctly if the URL contains space
DevyaJha opened this issue · 2 comments
Q&A (please complete the following information)
- OS: macOS
- Environment: Node.js v18.16.0
- Method of installation:npm
- Swagger-Client version: 3.27.9
- Swagger/OpenAPI version: [e.g. Swagger 2.0, OpenAPI 3.0]
Content & configuration
Describe the bug you're encountering
If the URL has spaces, then the path parameters are not resolved correctly.
To reproduce...
Steps to reproduce the behavior:
const Swagger = require('swagger-client')
const spec = {
host: 'swagger.io',
basePath: '/v1',
paths: {
'/accounts/{accountName}/resources/Task lists/operations/getTasks/{id}/orders/{order}/{itemId}': {
get: {
operationId: 'getMe',
parameters: [
{
"name": "accountName",
"in": "path",
"description": "Account name",
"required": true,
"schema": {
"type": "string"
}
},
{
in: 'path',
name: 'id',
type: 'number',
required: true,
},
{
in: 'path',
name: 'order',
type: 'number',
required: true,
},
{
in: 'path',
name: 'itemId',
type: 'number',
required: true,
},
],
},
},
},
};
const req = Swagger.buildRequest({
spec,
operationId: 'getMe',
parameters: { accountName: 'Account 1', id: '123', order: '456', itemId: '789' },
});
console.log('req ---- ', req)
Current behavior
req ---- {
url: 'http://swagger.io/v1/accounts/{accountName}/resources/Task lists/operations/getTasks/{id}/orders/{order}/{itemId}',
credentials: 'same-origin',
headers: {},
method: 'GET'
}
Expected behavior
Resolved req should be -
req ---- {
url: 'http://swagger.io/v1/accounts/Account%201/resources/Task lists/operations/getTasks/123/orders/456/789',
credentials: 'same-origin',
headers: {},
method: 'GET'
}
Screenshots
Additional context or thoughts
in my case I use bower-asset/swagger-ui , and in "v5.17.7" was bug
just update to v5.17.9
Hi everybody,
In latest versions of swagger-client we've utilized the spec compliant OpenAPI Path template parsing.
Here is what OpenAPI stipulates about path templating:
Path templating refers to the usage of template expressions, delimited by curly braces ({}), to mark a section of a URL path as replaceable using path parameters. link
This specifies that path template forms a relative URL reference. This is what OpenAPI stipulates about relative URL reference:
Unless specified otherwise, all properties that are URLs MAY be relative references as defined by RFC3986 link
This means that parsing of path template MUST be RFC3986 compliant and thus cannot contain unencoded empty string values. As the path template with empty space doesn't qualify as valid path template, it's not being resolved.
Having said that, we didn't introduce a regression, we fixed a bug that allowed to define path templates as invalid RFC3986. Now we don't allow it anymore.
To remedy specific situation as described in the description of this issue
/accounts/{accountName}/resources/Task lists/operations/getTasks/{id}/orders/{order}/{itemId}
needs to be replaced by
/accounts/{accountName}/resources/Task%20lists/operations/getTasks/{id}/orders/{order}/{itemId}