check size of zip files

This commit is contained in:
Henry Oswald 2016-03-12 12:38:21 +00:00
parent da242d90e6
commit 6664b67fba
2 changed files with 54 additions and 21 deletions

View file

@ -4,12 +4,31 @@ metrics = require "../../infrastructure/Metrics"
fs = require "fs" fs = require "fs"
Path = require "path" Path = require "path"
ONE_MEG = 1024 * 1024
module.exports = ArchiveManager = module.exports = ArchiveManager =
extractZipArchive: (source, destination, _callback = (err) ->) -> extractZipArchive: (source, destination, _callback = (err) ->) ->
callback = (args...) -> callback = (args...) ->
_callback(args...) _callback(args...)
_callback = () -> _callback = () ->
child.exec "unzip -l #{source} | tail -n 1", (err, result)->
if err?
logger.err err:err, "error checking size of zip file"
return callback(err)
totalSizeInBytes = result.trim()?.split(" ")?[0]
if !totalSizeInBytes?
logger.err source:source, "error getting bytes of zip"
return callback(new Error("something went wrong"))
if totalSizeInBytes > ONE_MEG * 300
logger.log source:source, totalSizeInBytes:totalSizeInBytes, "zip file too large"
return callback(new Error("zip_too_large"))
timer = new metrics.Timer("unzipDirectory") timer = new metrics.Timer("unzipDirectory")
logger.log source: source, destination: destination, "unzipping file" logger.log source: source, destination: destination, "unzipping file"

View file

@ -15,6 +15,7 @@ describe "ArchiveManager", ->
@process.stderr = new events.EventEmitter @process.stderr = new events.EventEmitter
@child = @child =
spawn: sinon.stub().returns(@process) spawn: sinon.stub().returns(@process)
exec: sinon.stub().callsArgWith(1, null, " 109042 2 files")
@metrics = @metrics =
Timer: class Timer Timer: class Timer
done: sinon.stub() done: sinon.stub()
@ -58,6 +59,19 @@ describe "ArchiveManager", ->
it "should log out the error", -> it "should log out the error", ->
@logger.error.called.should.equal true @logger.error.called.should.equal true
describe "with a zip that is too large", ->
beforeEach (done) ->
@child.exec = sinon.stub().callsArgWith(1, null, " 10000000000009042 2 files")
@ArchiveManager.extractZipArchive @source, @destination, (error) =>
@callback(error)
done()
it "should return the callback with an error", ->
@callback.calledWithExactly(new Error("zip_too_large")).should.equal true
it "should not call spawn", ->
@child.spawn.called.should.equal false
describe "with an error on the process", -> describe "with an error on the process", ->
beforeEach (done) -> beforeEach (done) ->
@ArchiveManager.extractZipArchive @source, @destination, (error) => @ArchiveManager.extractZipArchive @source, @destination, (error) =>