From 97cdc243d3f9204c3e694ded02a359360342dfc0 Mon Sep 17 00:00:00 2001 From: Shane Kilkelly Date: Fri, 28 Aug 2015 11:45:16 +0100 Subject: [PATCH] Parse out the range header and set `start` and `end` properties on options. --- .../app/coffee/FileController.coffee | 33 +++++++++++++++---- .../unit/coffee/FileControllerTests.coffee | 16 ++++++++- 2 files changed, 41 insertions(+), 8 deletions(-) diff --git a/services/filestore/app/coffee/FileController.coffee b/services/filestore/app/coffee/FileController.coffee index 3b83e203fd..8517b3ca52 100644 --- a/services/filestore/app/coffee/FileController.coffee +++ b/services/filestore/app/coffee/FileController.coffee @@ -3,19 +3,41 @@ settings = require("settings-sharelatex") logger = require("logger-sharelatex") FileHandler = require("./FileHandler") metrics = require("metrics-sharelatex") +parseRange = require('range-parser') + oneDayInSeconds = 60 * 60 * 24 +maxSizeInBytes = 1024 * 1024 * 1024 # 1GB + + +get_range = (header) -> + parsed = parseRange(maxSizeInBytes, header) + range_type = parsed.type + range = parsed[0] + {start: range.start, end: range.end} module.exports = getFile: (req, res)-> - metrics.inc "getFile" {key, bucket} = req {format, style} = req.query + opts = { + key: key, + bucket: bucket, + format: format, + style: style, + start: null, + end: null + } + metrics.inc "getFile" + if req.headers.range? + range = get_range(req.headers.range) + opts.start = range.start + opts.end = range.end logger.log key:key, bucket:bucket, format:format, style:style, "reciving request to get file" - FileHandler.getFile bucket, key, {format:format,style:style}, (err, fileStream)-> + FileHandler.getFile bucket, key, opts, (err, fileStream)-> if err? logger.err err:err, key:key, bucket:bucket, format:format, style:style, "problem getting file" - if !res.finished and res?.send? + if !res.finished and res?.send? res.send 500 else if req.query.cacheWarm logger.log key:key, bucket:bucket, format:format, style:style, "request is only for cache warm so not sending stream" @@ -38,7 +60,7 @@ module.exports = oldFile_id = req.body.source.file_id logger.log key:key, bucket:bucket, oldProject_id:oldProject_id, oldFile_id:oldFile_id, "reciving request to copy file" PersistorManager.copyFile bucket, "#{oldProject_id}/#{oldFile_id}", key, (err)-> - if err? + if err? logger.log err:err, oldProject_id:oldProject_id, oldFile_id:oldFile_id, "something went wrong copying file" res.send 500 else @@ -54,6 +76,3 @@ module.exports = res.send 500 else res.send 204 - - - diff --git a/services/filestore/test/unit/coffee/FileControllerTests.coffee b/services/filestore/test/unit/coffee/FileControllerTests.coffee index ecf067976f..e27b8fb127 100644 --- a/services/filestore/test/unit/coffee/FileControllerTests.coffee +++ b/services/filestore/test/unit/coffee/FileControllerTests.coffee @@ -42,6 +42,7 @@ describe "FileController", -> params: project_id:@project_id file_id:@file_id + headers: {} @res = setHeader: -> @fileStream = {} @@ -70,6 +71,19 @@ describe "FileController", -> done() @controller.getFile @req, @res + describe "with a 'Range' header set", -> + + beforeEach -> + @req.headers.range = 'bytes=0-8' + + it "should pass 'start' and 'end' options to FileHandler", (done) -> + @FileHandler.getFile.callsArgWith(3, null, @fileStream) + @fileStream.pipe = (res)=> + expect(@FileHandler.getFile.lastCall.args[2].start).to.equal 0 + expect(@FileHandler.getFile.lastCall.args[2].end).to.equal 8 + done() + @controller.getFile @req, @res + describe "insertFile", -> it "should send bucket name key and res to PersistorManager", (done)-> @@ -101,7 +115,7 @@ describe "FileController", -> @res.send = (code)=> code.should.equal 500 done() - @controller.copyFile @req, @res + @controller.copyFile @req, @res describe "delete file", ->