Fixed file upload to agent when websocket compression is used.
This commit is contained in:
parent
4c2018245b
commit
c1d7021498
|
@ -1219,8 +1219,8 @@ function createMeshCore(agent) {
|
||||||
*/
|
*/
|
||||||
|
|
||||||
// If there is a upload or download active on this connection, close the file
|
// If there is a upload or download active on this connection, close the file
|
||||||
if (this.httprequest.uploadFile) { fs.closeSync(this.httprequest.uploadFile); this.httprequest.uploadFile = undefined; }
|
if (this.httprequest.uploadFile) { fs.closeSync(this.httprequest.uploadFile); delete this.httprequest.uploadFile; }
|
||||||
if (this.httprequest.downloadFile) { fs.closeSync(this.httprequest.downloadFile); this.httprequest.downloadFile = undefined; }
|
if (this.httprequest.downloadFile) { fs.closeSync(this.httprequest.downloadFile); delete this.httprequest.downloadFile; }
|
||||||
|
|
||||||
// Clean up WebRTC
|
// Clean up WebRTC
|
||||||
if (this.webrtc != null) {
|
if (this.webrtc != null) {
|
||||||
|
@ -1244,8 +1244,16 @@ function createMeshCore(agent) {
|
||||||
// If this is upload data, save it to file
|
// If this is upload data, save it to file
|
||||||
if (this.httprequest.uploadFile) {
|
if (this.httprequest.uploadFile) {
|
||||||
if (typeof data == 'object') {
|
if (typeof data == 'object') {
|
||||||
try { fs.writeSync(this.httprequest.uploadFile, data); } catch (e) { this.write(new Buffer(JSON.stringify({ action: 'uploaderror' }))); return; } // Write to the file, if there is a problem, error out.
|
// Save the data to file being uploaded.
|
||||||
this.write(new Buffer(JSON.stringify({ action: 'uploadack', reqid: this.httprequest.uploadFileid }))); // Ask for more data
|
if (this.httprequest.uploadFile) {
|
||||||
|
try { fs.writeSync(this.httprequest.uploadFile, data); } catch (e) { sendConsoleText('FileSave ERROR'); this.write(new Buffer(JSON.stringify({ action: 'uploaderror' }))); return; } // Write to the file, if there is a problem, error out.
|
||||||
|
this.write(new Buffer(JSON.stringify({ action: 'uploadack', reqid: this.httprequest.uploadFileid }))); // Ask for more data.
|
||||||
|
}
|
||||||
|
} else if (typeof data == 'string') {
|
||||||
|
// Close the file and confirm. We need to make this added round trip since websocket deflate compression can cause the last message before a websocket close to not be received.
|
||||||
|
if (this.httprequest.uploadFile) { fs.closeSync(this.httprequest.uploadFile); delete this.httprequest.uploadFile; }
|
||||||
|
this.write(new Buffer(JSON.stringify({ action: 'uploaddone', reqid: this.httprequest.uploadFileid }))); // Indicate that we closed the file.
|
||||||
|
this.end();
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -2044,7 +2052,7 @@ function createMeshCore(agent) {
|
||||||
*/
|
*/
|
||||||
case 'upload': {
|
case 'upload': {
|
||||||
// Upload a file, browser to agent
|
// Upload a file, browser to agent
|
||||||
if (this.httprequest.uploadFile != undefined) { fs.closeSync(this.httprequest.uploadFile); this.httprequest.uploadFile = undefined; }
|
if (this.httprequest.uploadFile != null) { fs.closeSync(this.httprequest.uploadFile); delete this.httprequest.uploadFile; }
|
||||||
if (cmd.path == undefined) break;
|
if (cmd.path == undefined) break;
|
||||||
var filepath = cmd.name ? obj.path.join(cmd.path, cmd.name) : cmd.path;
|
var filepath = cmd.name ? obj.path.join(cmd.path, cmd.name) : cmd.path;
|
||||||
MeshServerLog('Upload: \"' + filepath + '\"', this.httprequest);
|
MeshServerLog('Upload: \"' + filepath + '\"', this.httprequest);
|
||||||
|
|
|
@ -785,7 +785,7 @@ module.exports.CreateMeshUser = function (parent, db, ws, req, args, domain, use
|
||||||
|
|
||||||
switch (cmd) {
|
switch (cmd) {
|
||||||
case 'help': {
|
case 'help': {
|
||||||
var fin = '', f = '', availcommands = 'help,info,versions,args,resetserver,showconfig,usersessions,closeusersessions,tasklimiter,setmaxtasks,cores,migrationagents,agentstats,webstats,mpsstats,swarmstats,acceleratorsstats,updatecheck,serverupdate,nodeconfig,heapdump,relays,autobackup,backupconfig,dupagents,dispatchtable,badlogins,showpaths,le,lecheck,leevents,dbstats,sms,amtacm,certhashes,watchdog';
|
var fin = '', f = '', availcommands = 'help,info,versions,args,resetserver,usersessions,closeusersessions,tasklimiter,setmaxtasks,cores,migrationagents,agentstats,webstats,mpsstats,swarmstats,acceleratorsstats,updatecheck,serverupdate,nodeconfig,heapdump,relays,autobackup,backupconfig,dupagents,dispatchtable,badlogins,showpaths,le,lecheck,leevents,dbstats,sms,amtacm,certhashes,watchdog';
|
||||||
if (parent.parent.config.settings.heapdump === true) { availcommands += ',heapdump'; }
|
if (parent.parent.config.settings.heapdump === true) { availcommands += ',heapdump'; }
|
||||||
availcommands = availcommands.split(',').sort();
|
availcommands = availcommands.split(',').sort();
|
||||||
while (availcommands.length > 0) { if (f.length > 80) { fin += (f + ',\r\n'); f = ''; } f += (((f != '') ? ', ' : ' ') + availcommands.shift()); }
|
while (availcommands.length > 0) { if (f.length > 80) { fin += (f + ',\r\n'); f = ''; } f += (((f != '') ? ', ' : ' ') + availcommands.shift()); }
|
||||||
|
|
|
@ -7961,7 +7961,6 @@
|
||||||
function p13uploadReconnect() {
|
function p13uploadReconnect() {
|
||||||
uploadFile.ws = CreateAgentRedirect(meshserver, CreateRemoteFiles(p13gotUploadData), serverPublicNamePort, authCookie, authRelayCookie, domainUrl);
|
uploadFile.ws = CreateAgentRedirect(meshserver, CreateRemoteFiles(p13gotUploadData), serverPublicNamePort, authCookie, authRelayCookie, domainUrl);
|
||||||
uploadFile.ws.attemptWebRTC = false;
|
uploadFile.ws.attemptWebRTC = false;
|
||||||
uploadFile.ws.ctrlMsgAllowed = false;
|
|
||||||
uploadFile.ws.onStateChanged = onFileUploadStateChange;
|
uploadFile.ws.onStateChanged = onFileUploadStateChange;
|
||||||
uploadFile.ws.Start(filesNode._id);
|
uploadFile.ws.Start(filesNode._id);
|
||||||
}
|
}
|
||||||
|
@ -8016,6 +8015,9 @@
|
||||||
for (var i = 0; i < 8; i++) { p13uploadNextPart(true); } // Send 8 more blocks of 4 k to full the websocket.
|
for (var i = 0; i < 8; i++) { p13uploadNextPart(true); } // Send 8 more blocks of 4 k to full the websocket.
|
||||||
} else if (cmd.action == 'uploadack') {
|
} else if (cmd.action == 'uploadack') {
|
||||||
p13uploadNextPart(false);
|
p13uploadNextPart(false);
|
||||||
|
} else if (cmd.action == 'uploaddone') {
|
||||||
|
if (uploadFile.ws != null) { uploadFile.ws.Stop(); uploadFile.ws = null; }
|
||||||
|
if (uploadFile.xfiles.length > uploadFile.xfilePtr + 1) { p13uploadReconnect(); } else { p13uploadFileCancel(); }
|
||||||
} else if (cmd.action == 'uploaderror') {
|
} else if (cmd.action == 'uploaderror') {
|
||||||
p13uploadFileCancel();
|
p13uploadFileCancel();
|
||||||
}
|
}
|
||||||
|
@ -8025,12 +8027,11 @@
|
||||||
function p13uploadNextPart(dataPriming) {
|
function p13uploadNextPart(dataPriming) {
|
||||||
var data = uploadFile.xdata;
|
var data = uploadFile.xdata;
|
||||||
var start = uploadFile.xptr;
|
var start = uploadFile.xptr;
|
||||||
var end = uploadFile.xptr + 4096;
|
if (start >= data.byteLength) {
|
||||||
if (end > data.byteLength) { if (dataPriming == true) { return; } end = data.byteLength; }
|
uploadFile.ws.sendCtrlMsg('{"ctrlChannel":"102938","type":"close"}');
|
||||||
if (start == data.byteLength) {
|
|
||||||
if (uploadFile.ws != null) { uploadFile.ws.Stop(); uploadFile.ws = null; }
|
|
||||||
if (uploadFile.xfiles.length > uploadFile.xfilePtr + 1) { p13uploadReconnect(); } else { p13uploadFileCancel(); }
|
|
||||||
} else {
|
} else {
|
||||||
|
var end = uploadFile.xptr + 16384;
|
||||||
|
if (end > data.byteLength) { if (dataPriming == true) { return; } end = data.byteLength; }
|
||||||
var datapart = data.slice(start, end);
|
var datapart = data.slice(start, end);
|
||||||
uploadFile.ws.send(datapart);
|
uploadFile.ws.send(datapart);
|
||||||
uploadFile.xptr = end;
|
uploadFile.xptr = end;
|
||||||
|
|
Loading…
Reference in New Issue