Browse Source

Fix "Headers already sent" issue after res.close()

Leszek Wiesner 3 years ago
parent
commit
4b51c3f082
1 changed files with 4 additions and 7 deletions
  1. 4 7
      distributor-node/src/services/server/controllers/public.ts

+ 4 - 7
distributor-node/src/services/server/controllers/public.ts

@@ -124,10 +124,6 @@ export class PublicApiController {
     const stream = this.content.createContinousReadStream(contentHash, {
       end: isRange ? rangeEnd || 0 : objectSize - 1,
     })
-    req.on('close', () => {
-      res.end()
-      stream.destroy()
-    })
     res.status(isRange ? 206 : 200)
     res.setHeader('accept-ranges', 'bytes')
     res.setHeader('x-data-source', 'local')
@@ -136,6 +132,10 @@ export class PublicApiController {
       res.setHeader('content-range', `bytes 0-${rangeEnd}/${objectSize}`)
     }
     stream.pipe(res)
+    req.on('close', () => {
+      stream.destroy()
+      res.destroy()
+    })
   }
 
   public async assetHead(req: express.Request<AssetRouteParams>, res: express.Response): Promise<void> {
@@ -180,9 +180,6 @@ export class PublicApiController {
     res: express.Response,
     next: express.NextFunction
   ): Promise<void> {
-    req.on('close', () => {
-      res.end()
-    })
     const objectId = req.params.objectId
     const contentHash = this.stateCache.getObjectContentHash(objectId)
     const pendingDownload = contentHash && this.stateCache.getPendingDownload(contentHash)