diff options
author | Marcel Klehr <mklehr@gmx.net> | 2014-05-15 12:47:28 +0000 |
---|---|---|
committer | Marcel Klehr <mklehr@gmx.net> | 2014-05-15 12:47:28 +0000 |
commit | 19be8763c942746740b5cc8969c3791211500ecd (patch) | |
tree | 70d3fb55991cb328c343ba9cb638209db2763c55 /src/node | |
parent | c63cb812e85db4dc25a98b7ca704bdbe80d11162 (diff) | |
download | etherpad-lite-19be8763c942746740b5cc8969c3791211500ecd.zip |
Fix race condition
Diffstat (limited to 'src/node')
-rw-r--r-- | src/node/handler/ExportHandler.js | 297 |
1 files changed, 149 insertions, 148 deletions
diff --git a/src/node/handler/ExportHandler.js b/src/node/handler/ExportHandler.js index 3eb53408..a748d3f2 100644 --- a/src/node/handler/ExportHandler.js +++ b/src/node/handler/ExportHandler.js @@ -53,178 +53,179 @@ exports.doExport = function(req, res, padId, type) function(err, hookFileName){ // if fileName is set then set it to the padId, note that fileName is returned as an array. if(hookFileName) fileName = hookFileName; - } - ); - - //tell the browser that this is a downloadable file - res.attachment(fileName + "." + type); - - //if this is a plain text export, we can do this directly - // We have to over engineer this because tabs are stored as attributes and not plain text - if(type == "txt") - { - var txt; - var randNum; - var srcFile, destFile; - async.series([ - //render the txt document - function(callback) - { - exporttxt.getPadTXTDocument(padId, req.params.rev, false, function(err, _txt) - { - if(ERR(err, callback)) return; - txt = _txt; - callback(); - }); - }, - //decide what to do with the txt export - function(callback) - { - //if this is a txt export, we can send this from here directly - res.send(txt); - callback("stop"); - }, - //send the convert job to abiword - function(callback) + //tell the browser that this is a downloadable file + res.attachment(fileName + "." + type); + + //if this is a plain text export, we can do this directly + // We have to over engineer this because tabs are stored as attributes and not plain text + + if(type == "txt") { - //ensure html can be collected by the garbage collector - txt = null; - - destFile = tempDirectory + "/etherpad_export_" + randNum + "." + type; - abiword.convertFile(srcFile, destFile, type, callback); - }, - //send the file - function(callback) - { - res.sendfile(destFile, null, callback); - }, - //clean up temporary files - function(callback) - { - async.parallel([ + var txt; + var randNum; + var srcFile, destFile; + + async.series([ + //render the txt document function(callback) { - fs.unlink(srcFile, callback); + exporttxt.getPadTXTDocument(padId, req.params.rev, false, function(err, _txt) + { + if(ERR(err, callback)) return; + txt = _txt; + callback(); + }); }, + //decide what to do with the txt export function(callback) { - //100ms delay to accomidate for slow windows fs - if(os.type().indexOf("Windows") > -1) - { - setTimeout(function() + //if this is a txt export, we can send this from here directly + res.send(txt); + callback("stop"); + }, + //send the convert job to abiword + function(callback) + { + //ensure html can be collected by the garbage collector + txt = null; + + destFile = tempDirectory + "/etherpad_export_" + randNum + "." + type; + abiword.convertFile(srcFile, destFile, type, callback); + }, + //send the file + function(callback) + { + res.sendfile(destFile, null, callback); + }, + //clean up temporary files + function(callback) + { + async.parallel([ + function(callback) { - fs.unlink(destFile, callback); - }, 100); - } - else - { - fs.unlink(destFile, callback); - } + fs.unlink(srcFile, callback); + }, + function(callback) + { + //100ms delay to accomidate for slow windows fs + if(os.type().indexOf("Windows") > -1) + { + setTimeout(function() + { + fs.unlink(destFile, callback); + }, 100); + } + else + { + fs.unlink(destFile, callback); + } + } + ], callback); } - ], callback); + ], function(err) + { + if(err && err != "stop") ERR(err); + }) } - ], function(err) - { - if(err && err != "stop") ERR(err); - }) - } - else if(type == 'dokuwiki') - { - var randNum; - var srcFile, destFile; - - async.series([ - //render the dokuwiki document - function(callback) + else if(type == 'dokuwiki') { - exportdokuwiki.getPadDokuWikiDocument(padId, req.params.rev, function(err, dokuwiki) + var randNum; + var srcFile, destFile; + + async.series([ + //render the dokuwiki document + function(callback) + { + exportdokuwiki.getPadDokuWikiDocument(padId, req.params.rev, function(err, dokuwiki) + { + res.send(dokuwiki); + callback("stop"); + }); + }, + ], function(err) { - res.send(dokuwiki); - callback("stop"); + if(err && err != "stop") throw err; }); - }, - ], function(err) - { - if(err && err != "stop") throw err; - }); - } - else - { - var html; - var randNum; - var srcFile, destFile; - - async.series([ - //render the html document - function(callback) - { - exporthtml.getPadHTMLDocument(padId, req.params.rev, false, function(err, _html) - { - if(ERR(err, callback)) return; - html = _html; - callback(); - }); - }, - //decide what to do with the html export - function(callback) - { - //if this is a html export, we can send this from here directly - if(type == "html") - { - res.send(html); - callback("stop"); - } - else //write the html export to a file - { - randNum = Math.floor(Math.random()*0xFFFFFFFF); - srcFile = tempDirectory + "/etherpad_export_" + randNum + ".html"; - fs.writeFile(srcFile, html, callback); - } - }, - //send the convert job to abiword - function(callback) - { - //ensure html can be collected by the garbage collector - html = null; - - destFile = tempDirectory + "/etherpad_export_" + randNum + "." + type; - abiword.convertFile(srcFile, destFile, type, callback); - }, - //send the file - function(callback) - { - res.sendfile(destFile, null, callback); - }, - //clean up temporary files - function(callback) + } + else { - async.parallel([ + var html; + var randNum; + var srcFile, destFile; + + async.series([ + //render the html document function(callback) { - fs.unlink(srcFile, callback); + exporthtml.getPadHTMLDocument(padId, req.params.rev, false, function(err, _html) + { + if(ERR(err, callback)) return; + html = _html; + callback(); + }); }, + //decide what to do with the html export function(callback) { - //100ms delay to accomidate for slow windows fs - if(os.type().indexOf("Windows") > -1) + //if this is a html export, we can send this from here directly + if(type == "html") { - setTimeout(function() - { - fs.unlink(destFile, callback); - }, 100); + res.send(html); + callback("stop"); } - else + else //write the html export to a file { - fs.unlink(destFile, callback); + randNum = Math.floor(Math.random()*0xFFFFFFFF); + srcFile = tempDirectory + "/etherpad_export_" + randNum + ".html"; + fs.writeFile(srcFile, html, callback); } + }, + //send the convert job to abiword + function(callback) + { + //ensure html can be collected by the garbage collector + html = null; + + destFile = tempDirectory + "/etherpad_export_" + randNum + "." + type; + abiword.convertFile(srcFile, destFile, type, callback); + }, + //send the file + function(callback) + { + res.sendfile(destFile, null, callback); + }, + //clean up temporary files + function(callback) + { + async.parallel([ + function(callback) + { + fs.unlink(srcFile, callback); + }, + function(callback) + { + //100ms delay to accomidate for slow windows fs + if(os.type().indexOf("Windows") > -1) + { + setTimeout(function() + { + fs.unlink(destFile, callback); + }, 100); + } + else + { + fs.unlink(destFile, callback); + } + } + ], callback); } - ], callback); + ], function(err) + { + if(err && err != "stop") ERR(err); + }) } - ], function(err) - { - if(err && err != "stop") ERR(err); - }) - } + } + ); }; |