Skip to content

Commit 3fe3f8a

Browse files
john3300shockey
andcommitted
improvement: URL-encode query parameter names (#1487)
* URL encode the query parameter name which can contain restricted characters like square brackets: [] * `paramName` -> `encodedParamName` Co-authored-by: kyle shockey <[email protected]>
1 parent 06e69c9 commit 3fe3f8a

File tree

2 files changed

+80
-2
lines changed

2 files changed

+80
-2
lines changed

src/execute/oas3/parameter-builders.js

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -87,9 +87,10 @@ export function query({req, value, parameter}) {
8787
})
8888
}
8989
else {
90-
req.query[parameter.name] = {
90+
const encodedParamName = encodeURIComponent(parameter.name)
91+
req.query[encodedParamName] = {
9192
value: stylize({
92-
key: parameter.name,
93+
key: encodedParamName,
9394
value,
9495
style: parameter.style || 'form',
9596
explode: typeof parameter.explode === 'undefined' ? true : parameter.explode,

test/oas3/execute/style-explode/query.js

Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -146,6 +146,83 @@ describe('OAS 3.0 - buildRequest w/ `style` & `explode` - query parameters', ()
146146
}
147147
)
148148

149+
test('should build a query parameter with escaped non-RFC3986 characters in parameter name',
150+
() => {
151+
// Given
152+
const spec = {
153+
openapi: '3.0.0',
154+
paths: {
155+
'/users': {
156+
get: {
157+
operationId: 'myOperation',
158+
parameters: [
159+
{
160+
name: 'id[role]',
161+
in: 'query'
162+
}
163+
]
164+
}
165+
}
166+
}
167+
}
168+
169+
// when
170+
const req = buildRequest({
171+
spec,
172+
operationId: 'myOperation',
173+
parameters: {
174+
'id[role]': 'admin'
175+
}
176+
})
177+
178+
expect(req).toEqual({
179+
method: 'GET',
180+
url: '/users?id%5Brole%5D=admin',
181+
credentials: 'same-origin',
182+
headers: {}
183+
})
184+
}
185+
)
186+
187+
test('should build an empty query parameter with escaped non-RFC3986 characters in parameter name',
188+
() => {
189+
// Given
190+
const spec = {
191+
openapi: '3.0.0',
192+
paths: {
193+
'/users': {
194+
get: {
195+
operationId: 'myOperation',
196+
parameters: [
197+
{
198+
name: 'id[role]',
199+
in: 'query',
200+
allowEmptyValue: true
201+
}
202+
]
203+
}
204+
}
205+
}
206+
}
207+
208+
// when
209+
const req = buildRequest({
210+
spec,
211+
operationId: 'myOperation',
212+
parameters: {
213+
'id[role]': ''
214+
}
215+
})
216+
217+
expect(req).toEqual({
218+
method: 'GET',
219+
url: '/users?id%5Brole%5D=',
220+
credentials: 'same-origin',
221+
headers: {}
222+
})
223+
}
224+
)
225+
149226
test('should build a query parameter in form/explode format', () => {
150227
// Given
151228
const spec = {

0 commit comments

Comments
 (0)