fix(attachments): Properly handle HTTP errors in addition to socket errors #2136

This commit is contained in:
Ben Gotow 2016-05-05 11:03:41 -07:00
parent bd063fd9c6
commit 0abec256cd

View file

@ -54,10 +54,26 @@ class Download
# initiate multiple downloads for the same file # initiate multiple downloads for the same file
return @promise if @promise return @promise if @promise
# Note: we must resolve or reject with `this`
@promise = new Promise (resolve, reject) => @promise = new Promise (resolve, reject) =>
stream = fs.createWriteStream(@targetPath) stream = fs.createWriteStream(@targetPath)
@state = State.Downloading @state = State.Downloading
onFailed = (err) =>
@request = null
stream.end()
@state = State.Failed
if fs.existsSync(@targetPath)
fs.unlinkSync(@targetPath)
reject(err)
onSuccess = =>
@request = null
stream.end()
@state = State.Finished
@percent = 100
resolve(@)
NylasAPI.makeRequest NylasAPI.makeRequest
json: false json: false
path: "/files/#{@fileId}/download" path: "/files/#{@fileId}/download"
@ -70,21 +86,19 @@ class Download
@percent = progress.percent @percent = progress.percent
@progressCallback() @progressCallback()
.on "error", (err) => # This is a /socket/ error event, not an HTTP error event. It fires
@request = null # when the conn is dropped, user if offline, but not on HTTP status codes.
@state = State.Failed # It is sometimes called in place of "end", not before or after.
stream.end() .on("error", onFailed)
if fs.existsSync(@targetPath)
fs.unlinkSync(@targetPath)
reject(@)
.on "end", => .on "end", =>
return if @state is State.Failed return if @state is State.Failed
@request = null
@state = State.Finished statusCode = @request.response?.statusCode
@percent = 100 if [200, 202, 204].includes(statusCode)
stream.end() onSuccess()
resolve(@) # Note: we must resolve with this else
onFailed(new Error("Server returned a #{statusCode}"))
.pipe(stream) .pipe(stream)