Browse Source

Pass start/end options down to the S3PersistorManager.

Test that those options cause a 'Range' header to be attached to the
request sent to S3.
Shane Kilkelly 11 years ago
parent
commit
76506ed91e

+ 1 - 0
services/filestore/app/coffee/FSPersistorManager.coffee

@@ -27,6 +27,7 @@ module.exports =
         return callback err
       @sendFile location, target, fsPath, callback
 
+  # opts may be {start: Number, end: Number}
   getFileStream: (location, name, opts, _callback = (err, res)->) ->
     callback = (args...) ->
       _callback(args...)

+ 6 - 1
services/filestore/app/coffee/S3PersistorManager.coffee

@@ -58,14 +58,19 @@ module.exports =
 				return callback(err)
 			@sendFile bucketName, key, fsPath, callback
 
+	# opts may be {start: Number, end: Number}
 	getFileStream: (bucketName, key, opts, callback = (err, res)->)->
+		opts = opts || {}
+		headers = {}
+		if opts.start? and opts.end?
+			headers['Range'] = "bytes=#{opts.start}-#{opts.end}"
 		callback = _.once callback
 		logger.log bucketName:bucketName, key:key, "getting file from s3"
 		s3Client = knox.createClient
 			key: settings.filestore.s3.key
 			secret: settings.filestore.s3.secret
 			bucket: bucketName
-		s3Stream = s3Client.get(key)
+		s3Stream = s3Client.get(key, headers)
 		s3Stream.end()
 		s3Stream.on 'response', (res) ->
 			callback null, res

+ 19 - 2
services/filestore/test/unit/coffee/S3PersistorManagerTests.coffee

@@ -42,17 +42,34 @@ describe "S3PersistorManagerTests", ->
 	describe "getFileStream", ->
 		beforeEach ->
 			@S3PersistorManager = SandboxedModule.require modulePath, requires: @requires
-
+			@opts = {}
 
 		it "should use correct key", (done)->
 			@stubbedKnoxClient.get.returns(
 				on:->
 				end:->
 			)
-			@S3PersistorManager.getFileStream @bucketName, @key, @fsPath, (err)=>
+			@S3PersistorManager.getFileStream @bucketName, @key, @opts, (err)=> # empty callback
 			@stubbedKnoxClient.get.calledWith(@key).should.equal true
 			done()
 
+		describe "with start and end options", ->
+			beforeEach ->
+				@opts =
+					start: 0
+					end: 8
+			it "should pass headers to the knox.Client.get()", (done) ->
+				@stubbedKnoxClient.get.returns(
+					on:->
+					end:->
+				)
+				@S3PersistorManager.getFileStream @bucketName, @key, @opts, (err)=> # empty callback
+				@stubbedKnoxClient.get.calledWith(@key, {'Range': 'bytes=0-8'}).should.equal true
+				done()
+
+
+
+
 	describe "sendFile", ->
 
 		beforeEach ->