Просмотр исходного кода

Parse out the range header and set `start` and `end` properties on options.

Shane Kilkelly 11 лет назад
Родитель
Сommit
97cdc243d3

+ 26 - 7
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
-
-
-

+ 15 - 1
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", ->