mirror of
https://github.com/ONLYOFFICE/server.git
synced 2026-02-10 18:05:07 +08:00
[bug] Fix putFile request in sharepoint2019; Add storage.headObject
This commit is contained in:
committed by
Sergey Konovalov
parent
40733dd283
commit
fa1a646938
@ -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));
|
||||
};
|
||||
|
||||
@ -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));
|
||||
};
|
||||
|
||||
@ -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)};
|
||||
|
||||
@ -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) {
|
||||
|
||||
@ -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;
|
||||
}
|
||||
|
||||
@ -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 {
|
||||
|
||||
@ -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');
|
||||
|
||||
Reference in New Issue
Block a user