fix: data corruption in protocol.handle
(#41894)
This commit is contained in:
parent
46adb0a3a9
commit
4e8c28fdf0
3 changed files with 45 additions and 1 deletions
|
@ -1381,6 +1381,49 @@ describe('protocol module', () => {
|
|||
expect(body).to.equal(text);
|
||||
});
|
||||
|
||||
it('can receive stream request body asynchronously', async () => {
|
||||
let done: any;
|
||||
const requestReceived: Promise<Buffer[]> = new Promise(resolve => { done = resolve; });
|
||||
protocol.handle('http-like', async (req) => {
|
||||
const chunks = [];
|
||||
for await (const chunk of (req.body as any)) {
|
||||
chunks.push(chunk);
|
||||
}
|
||||
done(chunks);
|
||||
return new Response('ok');
|
||||
});
|
||||
defer(() => { protocol.unhandle('http-like'); });
|
||||
const w = new BrowserWindow({ show: false });
|
||||
w.loadURL('about:blank');
|
||||
const expectedHashChunks = await w.webContents.executeJavaScript(`
|
||||
const dataStream = () =>
|
||||
new ReadableStream({
|
||||
async start(controller) {
|
||||
for (let i = 0; i < 10; i++) { controller.enqueue(Array(1024 * 128).fill(+i).join("\\n")); }
|
||||
controller.close();
|
||||
},
|
||||
}).pipeThrough(new TextEncoderStream());
|
||||
fetch(
|
||||
new Request("http-like://host", {
|
||||
method: "POST",
|
||||
body: dataStream(),
|
||||
duplex: "half",
|
||||
})
|
||||
);
|
||||
(async () => {
|
||||
const chunks = []
|
||||
for await (const chunk of dataStream()) {
|
||||
chunks.push(chunk);
|
||||
}
|
||||
return chunks;
|
||||
})()
|
||||
`);
|
||||
const expectedHash = Buffer.from(await crypto.subtle.digest('SHA-256', Buffer.concat(expectedHashChunks))).toString('hex');
|
||||
const body = Buffer.concat(await requestReceived);
|
||||
const actualHash = Buffer.from(await crypto.subtle.digest('SHA-256', Buffer.from(body))).toString('hex');
|
||||
expect(actualHash).to.equal(expectedHash);
|
||||
});
|
||||
|
||||
it('can receive multi-part postData from loadURL', async () => {
|
||||
protocol.handle('test-scheme', (req) => new Response(req.body));
|
||||
defer(() => { protocol.unhandle('test-scheme'); });
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue