summaryrefslogtreecommitdiff
path: root/src/node
diff options
context:
space:
mode:
authorMarcel Klehr <mklehr@gmx.net>2014-05-15 12:47:28 +0000
committerMarcel Klehr <mklehr@gmx.net>2014-05-15 12:47:28 +0000
commit19be8763c942746740b5cc8969c3791211500ecd (patch)
tree70d3fb55991cb328c343ba9cb638209db2763c55 /src/node
parentc63cb812e85db4dc25a98b7ca704bdbe80d11162 (diff)
downloadetherpad-lite-19be8763c942746740b5cc8969c3791211500ecd.zip
Fix race condition
Diffstat (limited to 'src/node')
-rw-r--r--src/node/handler/ExportHandler.js297
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);
- })
- }
+ }
+ );
};