[bug] Fix putFile request in sharepoint2019; Add storage.headObject

This commit is contained in:
Sergey Konovalov
2022-03-29 00:04:50 +03:00
committed by Sergey Konovalov
parent 40733dd283
commit fa1a646938
7 changed files with 37 additions and 8 deletions

View File

@ -39,6 +39,9 @@ var storage = require('./' + config.get('storage.name'));
function getStoragePath(strPath) {
return strPath.replace(/\\/g, '/');
}
exports.headObject = function(strPath) {
return storage.headObject(getStoragePath(strPath));
};
exports.getObject = function(strPath) {
return storage.getObject(getStoragePath(strPath));
};

View File

@ -85,6 +85,11 @@ function removeEmptyParent(strPath, done) {
}
}
exports.headObject = function(strPath) {
return utils.fsStat(getFilePath(strPath)).then(function(stats) {
return {ContentLength: stats.size};
});
};
exports.getObject = function(strPath) {
return utils.readFile(getFilePath(strPath));
};

View File

@ -127,6 +127,18 @@ function deleteObjectsHelp(aKeys) {
});
}
exports.headObject = function(strPath) {
return new Promise(function(resolve, reject) {
var params = {Bucket: cfgBucketName, Key: getFilePath(strPath)};
s3Client.headObject(params, function(err, data) {
if (err) {
reject(err);
} else {
resolve(data);
}
});
});
};
exports.getObject = function(strPath) {
return new Promise(function(resolve, reject) {
var params = {Bucket: cfgBucketName, Key: getFilePath(strPath)};

View File

@ -373,7 +373,7 @@ function downloadUrlPromiseWithoutRedirect(uri, optTimeout, optLimit, opt_Author
}
});
}
function postRequestPromise(uri, postData, postDataStream, optTimeout, opt_Authorization, opt_header) {
function postRequestPromise(uri, postData, postDataStream, postDataSize, optTimeout, opt_Authorization, opt_header) {
return new Promise(function(resolve, reject) {
//IRI to URI
uri = URI.serialize(URI.parse(uri));
@ -383,6 +383,14 @@ function postRequestPromise(uri, postData, postDataStream, optTimeout, opt_Autho
headers[cfgTokenOutboxHeader] = cfgTokenOutboxPrefix + opt_Authorization;
}
headers = opt_header || headers;
if (undefined !== postDataSize) {
//If no Content-Length is set, data will automatically be encoded in HTTP Chunked transfer encoding,
//so that server knows when the data ends. The Transfer-Encoding: chunked header is added.
//https://nodejs.org/api/http.html#requestwritechunk-encoding-callback
//issue with Transfer-Encoding: chunked wopi and sharepoint 2019
//https://community.alteryx.com/t5/Dev-Space/Download-Tool-amp-Microsoft-SharePoint-Chunked-Request-Error/td-p/735824
headers['Content-Length'] = postDataSize;
}
let connectionAndInactivity = optTimeout && optTimeout.connectionAndInactivity && ms(optTimeout.connectionAndInactivity);
var options = {uri: urlParsed, encoding: 'utf8', headers: headers, timeout: connectionAndInactivity};
if (postData) {

View File

@ -660,7 +660,7 @@ function* sendServerRequest(docId, uri, dataObject, opt_checkAndFixAuthorization
}
dataObject.setToken(bodyToken);
}
let postRes = yield utils.postRequestPromise(uri, JSON.stringify(dataObject), undefined, cfgCallbackRequestTimeout, auth);
let postRes = yield utils.postRequestPromise(uri, JSON.stringify(dataObject), undefined, undefined, cfgCallbackRequestTimeout, auth);
logger.debug('postData response: docId = %s;data = %s', docId, postRes.body);
return postRes.body;
}

View File

@ -1111,8 +1111,9 @@ function* commandSfcCallback(cmd, isSfcm, isEncrypted) {
}
function* processWopiPutFile(docId, wopiParams, savePathDoc, userLastChangeId, isModifiedByUser, isAutosave, isExitSave) {
let res = '{"error": 1}';
let metadata = yield storage.headObject(savePathDoc);
let streamObj = yield storage.createReadStream(savePathDoc);
let postRes = yield wopiClient.putFile(wopiParams, null, streamObj.readStream, userLastChangeId, isModifiedByUser, isAutosave, isExitSave);
let postRes = yield wopiClient.putFile(wopiParams, null, streamObj.readStream, metadata.ContentLength, userLastChangeId, isModifiedByUser, isAutosave, isExitSave);
if (postRes) {
if (postRes.body) {
try {

View File

@ -397,7 +397,7 @@ function getEditorHtml(req, res) {
}
});
}
function putFile(wopiParams, data, dataStream, userLastChangeId, isModifiedByUser, isAutosave, isExitSave) {
function putFile(wopiParams, data, dataStream, dataSize, userLastChangeId, isModifiedByUser, isAutosave, isExitSave) {
return co(function* () {
let postRes = null;
try {
@ -428,7 +428,7 @@ function putFile(wopiParams, data, dataStream, userLastChangeId, isModifiedByUse
}
logger.debug('wopi PutFile request uri=%s headers=%j', uri, headers);
postRes = yield utils.postRequestPromise(uri, data, dataStream, cfgCallbackRequestTimeout, undefined, headers);
postRes = yield utils.postRequestPromise(uri, data, dataStream, dataSize, cfgCallbackRequestTimeout, undefined, headers);
logger.debug('wopi PutFile response headers=%j', postRes.response.headers);
logger.debug('wopi PutFile response body:%s', postRes.body);
} else {
@ -467,7 +467,7 @@ function renameFile(wopiParams, name) {
fillStandardHeaders(headers, uri, userAuth.access_token);
logger.debug('wopi RenameFile request uri=%s headers=%j', uri, headers);
let postRes = yield utils.postRequestPromise(uri, undefined, undefined, cfgCallbackRequestTimeout, undefined, headers);
let postRes = yield utils.postRequestPromise(uri, undefined, undefined, undefined, cfgCallbackRequestTimeout, undefined, headers);
logger.debug('wopi RenameFile response headers=%j body=%s', postRes.response.headers, postRes.body);
if (postRes.body) {
res = JSON.parse(postRes.body);
@ -532,7 +532,7 @@ function lock(command, lockId, fileInfo, userAuth) {
let headers = {"X-WOPI-Override": command, "X-WOPI-Lock": lockId};
fillStandardHeaders(headers, uri, access_token);
logger.debug('wopi %s request uri=%s headers=%j', command, uri, headers);
let postRes = yield utils.postRequestPromise(uri, undefined, undefined, cfgCallbackRequestTimeout, undefined, headers);
let postRes = yield utils.postRequestPromise(uri, undefined, undefined, undefined, cfgCallbackRequestTimeout, undefined, headers);
logger.debug('wopi %s response headers=%j', command, postRes.response.headers);
} else {
logger.info('wopi %s SupportsLocks = false', command);
@ -567,7 +567,7 @@ function unlock(wopiParams) {
let headers = {"X-WOPI-Override": "UNLOCK", "X-WOPI-Lock": lockId};
fillStandardHeaders(headers, uri, access_token);
logger.debug('wopi Unlock request uri=%s headers=%j', uri, headers);
let postRes = yield utils.postRequestPromise(uri, undefined, undefined, cfgCallbackRequestTimeout, undefined, headers);
let postRes = yield utils.postRequestPromise(uri, undefined, undefined, undefined, cfgCallbackRequestTimeout, undefined, headers);
logger.debug('wopi Unlock response headers=%j', postRes.response.headers);
} else {
logger.info('wopi SupportsLocks = false');