Browse Source

fix: stream protocols not completing (#21733)

Jeremy Apthorp 5 years ago
parent
commit
d68f17b32c
2 changed files with 22 additions and 0 deletions
  1. 3 0
      shell/browser/net/node_stream_loader.cc
  2. 19 0
      spec-main/api-protocol-spec.ts

+ 3 - 0
shell/browser/net/node_stream_loader.cc

@@ -102,6 +102,9 @@ void NodeStreamLoader::ReadMore() {
   if (!ret.ToLocal(&buffer) || !node::Buffer::HasInstance(buffer)) {
     readable_ = false;
     is_reading_ = false;
+    if (ended_) {
+      NotifyComplete(result_);
+    }
     return;
   }
 

+ 19 - 0
spec-main/api-protocol-spec.ts

@@ -392,6 +392,25 @@ describe('protocol module', () => {
       const r = await ajax(protocolName + '://fake-host')
       expect(r.data).to.have.lengthOf(data.length)
     })
+
+    it('can handle a stream completing while writing', async () => {
+      function dumbPassthrough () {
+        return new stream.Transform({
+          async transform (chunk, encoding, cb) {
+            cb(null, chunk)
+          }
+        })
+      }
+      await registerStreamProtocol(protocolName, (request, callback) => {
+        callback({
+          statusCode: 200,
+          headers: { 'Content-Type': 'text/plain' },
+          data: getStream(1024 * 1024, Buffer.alloc(1024 * 1024 * 2)).pipe(dumbPassthrough())
+        })
+      })
+      const r = await ajax(protocolName + '://fake-host')
+      expect(r.data).to.have.lengthOf(1024 * 1024 * 2)
+    })
   })
 
   describe('protocol.isProtocolHandled', () => {