Skip to content

Commit 9023d88

Browse files
authored
Merge pull request #1115 from owenconti/bug/swagger-ui-3511
Change how parameter values are resolved
2 parents 87f31a4 + aa904d4 commit 9023d88

File tree

2 files changed

+107
-22
lines changed

2 files changed

+107
-22
lines changed

src/execute.js

Lines changed: 38 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,10 @@ const OperationNotFoundError = createError('OperationNotFoundError', function (m
1717
Object.assign(this, extra || {})
1818
})
1919

20+
const findParametersWithName = (name, parameters) => {
21+
return parameters.filter(p => p.name === name)
22+
}
23+
2024
// For stubbing in tests
2125
export const self = {
2226
buildRequest
@@ -118,34 +122,47 @@ export function buildRequest({
118122
req.headers.accept = responseContentType
119123
}
120124

121-
// Add values to request
122-
arrayOrEmpty(operation.parameters) // operation parameters
125+
const combinedParameters = []
126+
.concat(arrayOrEmpty(operation.parameters)) // operation parameters
123127
.concat(arrayOrEmpty(path.parameters)) // path parameters
124-
.forEach((parameter) => {
125-
const builder = parameterBuilders[parameter.in]
126-
let value
127128

128-
// REVIEW: OAS3: have any key names or parameter shapes changed?
129-
// Any new features that need to be plugged in here?
129+
// REVIEW: OAS3: have any key names or parameter shapes changed?
130+
// Any new features that need to be plugged in here?
130131

131-
if (parameter.in === 'body' && parameter.schema && parameter.schema.properties) {
132-
value = parameters
133-
}
134132

135-
value = parameter && parameter.name && parameters[parameter.name]
133+
// Add values to request
134+
combinedParameters.forEach((parameter) => {
135+
const builder = parameterBuilders[parameter.in]
136+
let value
136137

137-
if (typeof parameter.default !== 'undefined' && typeof value === 'undefined') {
138-
value = parameter.default
139-
}
138+
if (parameter.in === 'body' && parameter.schema && parameter.schema.properties) {
139+
value = parameters
140+
}
140141

141-
if (typeof value === 'undefined' && parameter.required && !parameter.allowEmptyValue) {
142-
throw new Error(`Required parameter ${parameter.name} is not provided`)
143-
}
142+
value = parameter && parameter.name && parameters[parameter.name]
144143

145-
if (builder) {
146-
builder({req, parameter, value, operation, spec, specIsOAS3})
147-
}
148-
})
144+
if (typeof value === 'undefined') {
145+
// check for `name-in` formatted key
146+
value = parameter && parameter.name && parameters[`${parameter.in}.${parameter.name}`]
147+
}
148+
else if (findParametersWithName(parameter.name, combinedParameters).length > 1) {
149+
// value came from `parameters[parameter.name]`
150+
// check to see if this is an ambiguous parameter
151+
console.warn(`Parameter '${parameter.name}' is ambiguous because the defined spec has more than one parameter with the name: '${parameter.name}' and the passed-in parameter values did not define an 'in' value.`)
152+
}
153+
154+
if (typeof parameter.default !== 'undefined' && typeof value === 'undefined') {
155+
value = parameter.default
156+
}
157+
158+
if (typeof value === 'undefined' && parameter.required && !parameter.allowEmptyValue) {
159+
throw new Error(`Required parameter ${parameter.name} is not provided`)
160+
}
161+
162+
if (builder) {
163+
builder({req, parameter, value, operation, spec})
164+
}
165+
})
149166

150167
const requestBodyDef = operation.requestBody || {}
151168
const requestBodyMediaTypes = Object.keys(requestBodyDef.content || {})
@@ -198,7 +215,6 @@ export function buildRequest({
198215
}
199216
}
200217

201-
202218
// Add securities, which are applicable
203219
// REVIEW: OAS3: what changed in securities?
204220
req = applySecurities({request: req, securities, operation, spec})

test/execute.js

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1348,6 +1348,75 @@ describe('execute', () => {
13481348
headers: { }
13491349
})
13501350
})
1351+
1352+
it('should fall back to `name-in` format when a parameter cannot be found', function () {
1353+
// Given
1354+
const spec = {
1355+
host: 'swagger.io',
1356+
basePath: '/v1',
1357+
paths: {
1358+
'/one': {
1359+
get: {
1360+
operationId: 'getMe',
1361+
parameters: [{
1362+
name: 'name',
1363+
in: 'query',
1364+
type: 'string'
1365+
}]
1366+
}
1367+
}
1368+
}
1369+
}
1370+
1371+
// When
1372+
const req = buildRequest({spec, operationId: 'getMe', parameters: {'query.name': 'john'}})
1373+
1374+
// Then
1375+
expect(req).toEqual({
1376+
url: 'http://swagger.io/v1/one?name=john',
1377+
method: 'GET',
1378+
credentials: 'same-origin',
1379+
headers: { }
1380+
})
1381+
})
1382+
1383+
it('should set all parameter options when given an ambiguous parameter value', function () {
1384+
// Given
1385+
const spec = {
1386+
host: 'swagger.io',
1387+
basePath: '/v1',
1388+
paths: {
1389+
'/one': {
1390+
get: {
1391+
operationId: 'getMe',
1392+
parameters: [{
1393+
name: 'name',
1394+
in: 'query',
1395+
type: 'string'
1396+
}, {
1397+
name: 'name',
1398+
in: 'formData',
1399+
type: 'string'
1400+
}]
1401+
}
1402+
}
1403+
}
1404+
}
1405+
1406+
// When
1407+
const req = buildRequest({spec, operationId: 'getMe', parameters: {name: 'john'}})
1408+
1409+
// Then
1410+
expect(req).toEqual({
1411+
url: 'http://swagger.io/v1/one?name=john',
1412+
method: 'GET',
1413+
credentials: 'same-origin',
1414+
headers: {
1415+
'Content-Type': 'application/x-www-form-urlencoded'
1416+
},
1417+
body: 'name=john'
1418+
})
1419+
})
13511420
})
13521421

13531422
describe('body', function () {

0 commit comments

Comments
 (0)