Skip to content

Commit 5d85921

Browse files
committed
fix(mitm): clean invalid response characters
1 parent bac8c9d commit 5d85921

File tree

2 files changed

+24
-3
lines changed

2 files changed

+24
-3
lines changed

mitm/handlers/HeadersHandler.ts

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -96,9 +96,10 @@ export default class HeadersHandler {
9696
if (singleValueHttp2Headers.has(lowerHeaderName)) {
9797
headers[canonizedKey] = value[0];
9898
} else {
99-
headers[canonizedKey] = [...value];
99+
headers[canonizedKey] = [...value].filter(x => !checkInvalidHeaderChar(x));
100100
}
101101
} else {
102+
if (checkInvalidHeaderChar(value)) continue;
102103
headers[canonizedKey] = value;
103104
}
104105
}
@@ -206,6 +207,17 @@ export default class HeadersHandler {
206207
}
207208
}
208209

210+
const headerCharRegex = /[^\t\x20-\x7e\x80-\xff]/;
211+
/**
212+
* True if val contains an invalid field-vchar
213+
* field-value = *( field-content / obs-fold )
214+
* field-content = field-vchar [ 1*( SP / HTAB ) field-vchar ]
215+
* field-vchar = VCHAR / obs-text
216+
*/
217+
function checkInvalidHeaderChar(val): boolean {
218+
return headerCharRegex.test(val);
219+
}
220+
209221
const lowerCaseMap = new Map<string, string>();
210222

211223
function toLowerCase(header: string): string {

mitm/handlers/HttpRequestHandler.ts

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -202,12 +202,21 @@ export default class HttpRequestHandler extends BaseHttpHandler {
202202

203203
private writeResponseHead(): void {
204204
const context = this.context;
205-
const { serverToProxyResponse, proxyToClientResponse } = context;
205+
const { serverToProxyResponse, proxyToClientResponse, requestSession } = context;
206206

207207
proxyToClientResponse.statusCode = context.status;
208208
// write individually so we properly write header-lists
209209
for (const [key, value] of Object.entries(context.responseHeaders)) {
210-
proxyToClientResponse.setHeader(key, value);
210+
try {
211+
proxyToClientResponse.setHeader(key, value);
212+
} catch (error) {
213+
log.info(`MitmHttpRequest.writeResponseHeadError`, {
214+
sessionId: requestSession.sessionId,
215+
request: `${context.method}: ${context.url.href}`,
216+
error,
217+
header: [key, value],
218+
});
219+
}
211220
}
212221

213222
serverToProxyResponse.once('trailers', headers => {

0 commit comments

Comments
 (0)