X-Git-Url: https://git.immae.eu/?a=blobdiff_plain;ds=sidebyside;f=server%2Fcontrollers%2Fobject-storage-proxy.ts;h=6bff05f14052d9237cd35cecbe65d35114cfc5b0;hb=09f3d81e0c8edebbe8f5698811ecfb165f942378;hp=aa853a383abbfdbe50c4ea672ad0a785023ffa21;hpb=b8598d40f650a31fe09a4a5426dcdc2c5c0d566c;p=github%2FChocobozzz%2FPeerTube.git diff --git a/server/controllers/object-storage-proxy.ts b/server/controllers/object-storage-proxy.ts index aa853a383..6bff05f14 100644 --- a/server/controllers/object-storage-proxy.ts +++ b/server/controllers/object-storage-proxy.ts @@ -15,6 +15,7 @@ import { } from '@server/middlewares' import { HttpStatusCode } from '@shared/models' import { buildReinjectVideoFileTokenQuery, doReinjectVideoFileToken } from './shared/m3u8-playlist' +import { GetObjectCommandOutput } from '@aws-sdk/client-s3' const objectStorageProxyRouter = express.Router() @@ -46,11 +47,13 @@ async function proxifyWebTorrent (req: express.Request, res: express.Response) { logger.debug('Proxifying WebTorrent file %s from object storage.', filename) try { - const stream = await getWebTorrentFileReadStream({ + const { response: s3Response, stream } = await getWebTorrentFileReadStream({ filename, rangeHeader: req.header('range') }) + setS3Headers(res, s3Response) + return stream.pipe(res) } catch (err) { return handleObjectStorageFailure(res, err) @@ -65,14 +68,16 @@ async function proxifyHLS (req: express.Request, res: express.Response) { logger.debug('Proxifying HLS file %s from object storage.', filename) try { - const stream = await getHLSFileReadStream({ + const { response: s3Response, stream } = await getHLSFileReadStream({ playlist: playlist.withVideo(video), filename, rangeHeader: req.header('range') }) + setS3Headers(res, s3Response) + const streamReplacer = filename.endsWith('.m3u8') && doReinjectVideoFileToken(req) - ? new StreamReplacer(line => injectQueryToPlaylistUrls(line, buildReinjectVideoFileTokenQuery(req))) + ? new StreamReplacer(line => injectQueryToPlaylistUrls(line, buildReinjectVideoFileTokenQuery(req, filename.endsWith('master.m3u8')))) : new PassThrough() return pipeline( @@ -102,3 +107,9 @@ function handleObjectStorageFailure (res: express.Response, err: Error) { type: err.name }) } + +function setS3Headers (res: express.Response, s3Response: GetObjectCommandOutput) { + if (s3Response.$metadata.httpStatusCode === HttpStatusCode.PARTIAL_CONTENT_206) { + res.status(HttpStatusCode.PARTIAL_CONTENT_206) + } +}