Skip to content

Commit 7550981

Browse files
committed
Ensure that non-query parameters are never escaped
1 parent 9197266 commit 7550981

File tree

3 files changed

+52
-8
lines changed

3 files changed

+52
-8
lines changed

src/execute/oas3/parameter-builders.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ function query({req, value, parameter}) {
4343
key: k,
4444
value: v,
4545
style: 'deepObject',
46-
escape: !parameter.allowReserved,
46+
escape: parameter.allowReserved ? 'unsafe' : 'reserved',
4747
}),
4848
skipEncoding: true
4949
}
@@ -66,7 +66,7 @@ function query({req, value, parameter}) {
6666
key: k,
6767
value: v,
6868
style: parameter.style || 'form',
69-
escape: !parameter.allowReserved,
69+
escape: parameter.allowReserved ? 'unsafe' : 'reserved',
7070
}),
7171
skipEncoding: true
7272
}
@@ -79,7 +79,7 @@ function query({req, value, parameter}) {
7979
value,
8080
style: parameter.style || 'form',
8181
explode: typeof parameter.explode === 'undefined' ? true : parameter.explode,
82-
escape: !parameter.allowReserved,
82+
escape: parameter.allowReserved ? 'unsafe' : 'reserved',
8383
}),
8484
skipEncoding: true
8585
}

src/execute/oas3/style-serializer.js

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,20 +5,24 @@ const isRrc3986Unreserved = (char) => {
55
return (/^[a-z0-9\-._~]+$/i).test(char)
66
}
77

8-
function encodeDisallowedCharacters(str, {allowReserved}) {
8+
function encodeDisallowedCharacters(str, {escape}) {
99
if (typeof str === 'number') {
1010
str = str.toString()
1111
}
1212
if (typeof str !== 'string' || !str.length) {
1313
return str
1414
}
1515

16+
if (!escape) {
17+
return str
18+
}
19+
1620
return str.split('').map((char) => {
1721
if (isRrc3986Unreserved(char)) {
1822
return char
1923
}
2024

21-
if (isRfc3986Reserved(char) && allowReserved) {
25+
if (isRfc3986Reserved(char) && escape === 'unsafe') {
2226
return char
2327
}
2428

@@ -41,7 +45,7 @@ export default function (config) {
4145

4246
function encodeArray({key, value, style, explode, escape}) {
4347
const valueEncoder = str => encodeDisallowedCharacters(str, {
44-
allowReserved: !escape
48+
escape
4549
})
4650

4751
if (style === 'simple') {
@@ -79,7 +83,7 @@ function encodeArray({key, value, style, explode, escape}) {
7983

8084
function encodeObject({key, value, style, explode, escape}) {
8185
const valueEncoder = str => encodeDisallowedCharacters(str, {
82-
allowReserved: !escape
86+
escape
8387
})
8488

8589
const valueKeys = Object.keys(value)
@@ -136,7 +140,7 @@ function encodeObject({key, value, style, explode, escape}) {
136140

137141
function encodePrimitive({key, value, style, escape}) {
138142
const valueEncoder = str => encodeDisallowedCharacters(str, {
139-
allowReserved: !escape
143+
escape
140144
})
141145

142146
if (style === 'simple') {

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

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,46 @@ describe('OAS 3.0 - buildRequest w/ `style` & `explode` - header parameters', fu
9191
})
9292
})
9393

94+
it('should build a header parameter in simple/no-explode format with special characters', function () {
95+
// Given
96+
const spec = {
97+
openapi: '3.0.0',
98+
paths: {
99+
'/users': {
100+
get: {
101+
operationId: 'myOperation',
102+
parameters: [
103+
{
104+
name: 'X-MyHeader',
105+
in: 'header',
106+
style: 'simple',
107+
explode: false
108+
}
109+
]
110+
}
111+
}
112+
}
113+
}
114+
115+
// when
116+
const req = buildRequest({
117+
spec,
118+
operationId: 'myOperation',
119+
parameters: {
120+
'X-MyHeader': ' <>"%{}|\\^'
121+
}
122+
})
123+
124+
expect(req).toEqual({
125+
method: 'GET',
126+
url: '/users',
127+
credentials: 'same-origin',
128+
headers: {
129+
'X-MyHeader': ' <>"%{}|\\^'
130+
},
131+
})
132+
})
133+
94134
it('should build a header parameter in simple/explode format', function () {
95135
// Given
96136
const spec = {

0 commit comments

Comments
 (0)