|
@@ -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'); });
|