기여 목록 / 8511369
[network] Ignore SSE id fields containing U+0000
DevToolsfixdevtools/devtools-frontendIn Review
SSE parser에서 HTML Standard에 따라 U+0000을 포함한 id 필드를 무시하도록 수정했습니다.
문제 설명
기존 SSE parser는 id 값에 null 문자가 있는지 검사하지 않고 저장해,
유효하지 않은 값으로 이전 event ID를 덮어썼습니다.
해결 내용
id필드의 값에\0이 없을 때만 저장된 event ID를 갱신하도록 했습니다.- 정상
id:42뒤에 null 문자가 포함된id를 입력하는 테스트를 추가했습니다. - 두 이벤트가 모두 전달되고, 두 번째 이벤트도 ID
42와 자신의 data를 유지하는지 검증했습니다.
전체 코드 diff는 다음과 같습니다.
diff --git a/front_end/core/sdk/ServerSentEventsProtocol.test.ts b/front_end/core/sdk/ServerSentEventsProtocol.test.ts
index f61ff92..b9cee26 100644
--- a/front_end/core/sdk/ServerSentEventsProtocol.test.ts
+++ b/front_end/core/sdk/ServerSentEventsProtocol.test.ts
@@ -127,6 +127,17 @@
assert.strictEqual(events[1].data, 'bye');
});
+ it('ignores id fields containing a null character', async () => {
+ await enqueue('id:42\ndata:first\n\nid:bad\0id\ndata:second\n\n');
+
+ assert.lengthOf(events, 2);
+ assert.strictEqual(events[0].eventId, '42');
+ assert.strictEqual(events[0].data, 'first');
+
+ assert.strictEqual(events[1].eventId, '42');
+ assert.strictEqual(events[1].data, 'second');
+ });
+
it('ignores the retry field', async () => {
await enqueue('retry:9999\n\n');
diff --git a/front_end/core/sdk/ServerSentEventsProtocol.ts b/front_end/core/sdk/ServerSentEventsProtocol.ts
index ae569ed..6bfe539 100644
--- a/front_end/core/sdk/ServerSentEventsProtocol.ts
+++ b/front_end/core/sdk/ServerSentEventsProtocol.ts
@@ -95,8 +95,10 @@
this.#data += '\n';
}
if (fieldName === 'id') {
- // We should do a check here whether the id field contains "\0" and ignore it.
- this.#id = this.#line.substring(fieldValueStart);
+ const id = this.#line.substring(fieldValueStart);
+ if (!id.includes('\0')) {
+ this.#id = id;
+ }
}
// Ignore all other fields. Also ignore "retry", we won't forward that to the backend.
}테스트 방법
ServerSentEventsProtocol.test.ts에 회귀 테스트 1개를 추가했습니다.
Gerrit에서 patchset 3의 CQ 실행 통과를 확인했습니다. 현재 리뷰 중입니다.
배운 점
필드 값이 유효하지 않을 때는 해당 필드만 무시하고, 이전 상태와 이벤트의 다른 데이터를 유지하는지도 함께 검증해야 합니다.