mirror of
https://github.com/ONLYOFFICE/server.git
synced 2026-02-10 18:05:07 +08:00
проблема с download ссылок, которые возвращают статус:302(redirect)
git-svn-id: svn://192.168.3.15/activex/AVS/Sources/TeamlabOffice/trunk/nodeJSProjects@64601 954022d7-b5bf-4e40-9824-e11837661b57
This commit is contained in:
committed by
Alexander.Trofimov
parent
39c9dd9c39
commit
ec4ad562e7
File diff suppressed because one or more lines are too long
@ -53,6 +53,7 @@
|
||||
"fonts_route": "OfficeWeb/sdk/Fonts/",
|
||||
"limits_tempfile_upload": 104857600,
|
||||
"limits_image_size": 26214400,
|
||||
"limits_image_download_timeout": 120,
|
||||
"editor_settings_autosave_enable": "true",
|
||||
"editor_settings_autosave_mininterval": 300,
|
||||
"editor_settings_coauthoring_url": "",
|
||||
|
||||
@ -8,12 +8,13 @@
|
||||
"amqplib": "^0.3.2",
|
||||
"aws-sdk": "^2.1.33",
|
||||
"cfb": "^0.10.3",
|
||||
"config": "^1.15.0",
|
||||
"log4js": "0.6.26",
|
||||
"mime": "^1.3.4",
|
||||
"mkdirp": "^0.5.1",
|
||||
"node-statsd": "^0.1.1",
|
||||
"node-zip": "^1.1.1",
|
||||
"xml2js": "^0.4.12",
|
||||
"config": "^1.15.0"
|
||||
"request": "^2.61.0",
|
||||
"xml2js": "^0.4.12"
|
||||
}
|
||||
}
|
||||
|
||||
@ -1,8 +1,7 @@
|
||||
var fs = require('fs');
|
||||
var path = require('path');
|
||||
var http = require('http');
|
||||
var https = require('https');
|
||||
var url = require('url');
|
||||
var request = require('request');
|
||||
var constants = require('./constants');
|
||||
|
||||
var ANDROID_SAFE_FILENAME = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ._-+,@£$€!½§~\'=()[]{}0123456789';
|
||||
@ -150,56 +149,33 @@ exports.getContentDisposition = function(filename, useragent) {
|
||||
}
|
||||
return contentDisposition;
|
||||
};
|
||||
function promiseHttpsGet(uri, optTimeout) {
|
||||
return new Promise(function(resolve, reject) {
|
||||
var urlParsed = url.parse(uri);
|
||||
var proto = (urlParsed.protocol === 'https:') ? https : http;
|
||||
var request = proto.get(uri, function(res) {
|
||||
resolve({request: request, response: res});
|
||||
});
|
||||
request.on('error', function(e) {
|
||||
reject(e);
|
||||
});
|
||||
if (optTimeout) {
|
||||
request.setTimeout(optTimeout * 1000, function() {
|
||||
request.abort();
|
||||
});
|
||||
function downloadUrlPromise(uri, optTimeout, optLimit) {
|
||||
return new Promise(function (resolve, reject) {
|
||||
//todo может стоит делать url.parse, а потом с каждой частью отдельно работать
|
||||
//для ссылок с руссикими буквами приходит 404
|
||||
if (!containsAllAsciiNP(uri)) {
|
||||
uri = encodeURI(uri);
|
||||
}
|
||||
var urlParsed = url.parse(uri);
|
||||
if (urlParsed.protocol === 'https:') {
|
||||
//TODO: Check how to correct handle a ssl link
|
||||
urlParsed.rejectUnauthorized = false;
|
||||
}
|
||||
var options = {uri: urlParsed, encoding: null, timeout: optTimeout};
|
||||
request.get(options, function (err, response, body) {
|
||||
if (err) {
|
||||
reject(err);
|
||||
} else {
|
||||
if (response.statusCode == 200 && (!optLimit || body.length < optLimit)) {
|
||||
resolve(body);
|
||||
} else {
|
||||
reject(new Error('Error statusCode:' + response.statusCode + ' or contentLength:' + body.length));
|
||||
}
|
||||
}
|
||||
})
|
||||
});
|
||||
}
|
||||
function promiseReadResponse(request, response, optLimit) {
|
||||
return new Promise(function(resolve, reject) {
|
||||
var bufs = [];
|
||||
var realByteSize = 0;
|
||||
response.on('data', function(chunk) {
|
||||
realByteSize += chunk.length;
|
||||
if (realByteSize <= optLimit) {
|
||||
bufs.push(chunk);
|
||||
} else {
|
||||
request.abort();
|
||||
}
|
||||
});
|
||||
response.on('end', function() {
|
||||
if (request.aborted) {
|
||||
reject(new Error('Error request.aborted'));
|
||||
} else {
|
||||
resolve(Buffer.concat(bufs));
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
||||
exports.downloadUrl = function*(uri, optTimeout, optLimit) {
|
||||
var getRes = yield promiseHttpsGet(uri, optTimeout);
|
||||
var contentLength = 0;
|
||||
if (getRes.response.headers['content-length']) {
|
||||
contentLength = getRes.response.headers['content-length'] - 0;
|
||||
}
|
||||
if (200 === getRes.response.statusCode && contentLength <= optLimit) {
|
||||
return yield promiseReadResponse(getRes.request, getRes.response, optLimit);
|
||||
} else {
|
||||
throw new Error('Error statusCode or contentLength');
|
||||
}
|
||||
};
|
||||
exports.downloadUrlPromise = downloadUrlPromise;
|
||||
exports.mapAscServerErrorToOldError = function(error) {
|
||||
var res = -1;
|
||||
switch (error) {
|
||||
@ -358,9 +334,10 @@ exports.promiseRedis = function(client, func) {
|
||||
exports.containsAllAscii = function(str) {
|
||||
return /^[\000-\177]*$/.test(str);
|
||||
};
|
||||
exports.containsAllAsciiNP = function(str) {
|
||||
function containsAllAsciiNP(str) {
|
||||
return /^[\040-\176]*$/.test(str);//non-printing characters
|
||||
};
|
||||
}
|
||||
exports.containsAllAsciiNP = containsAllAsciiNP;
|
||||
function getBaseUrl(protocol, hostHeader, forwardedProtoHeader, forwardedHostHeader) {
|
||||
var url = '';
|
||||
if (forwardedProtoHeader) {
|
||||
|
||||
@ -2,8 +2,6 @@
|
||||
var os = require('os');
|
||||
var path = require('path');
|
||||
var fs = require('fs');
|
||||
var http = require('http');
|
||||
var https = require('https');
|
||||
var url = require('url');
|
||||
var childProcess = require('child_process');
|
||||
var config = require('config');
|
||||
@ -120,66 +118,9 @@ function getTempDir() {
|
||||
fs.mkdirSync(resultDir);
|
||||
return {temp: newTemp, source: sourceDir, result: resultDir};
|
||||
}
|
||||
function promiseHttpsGet(uri) {
|
||||
return new Promise(function(resolve, reject) {
|
||||
//todo может стоит делать url.parse, а потом с каждой частью отдельно работать
|
||||
if (!utils.containsAllAsciiNP(uri)) {
|
||||
uri = encodeURI(uri);
|
||||
}
|
||||
var urlParsed = url.parse(uri);
|
||||
var proto;
|
||||
if (urlParsed.protocol === 'https:') {
|
||||
proto = https;
|
||||
//TODO: Check how to correct handle a ssl link
|
||||
urlParsed.rejectUnauthorized = false;
|
||||
} else {
|
||||
proto = http;
|
||||
}
|
||||
var request = proto.get(urlParsed, function(res) {
|
||||
resolve({request: request, response: res});
|
||||
});
|
||||
request.on('error', function(e) {
|
||||
reject(e);
|
||||
});
|
||||
request.setTimeout(cfgDownloadTimeout * 1000, function() {
|
||||
request.abort();
|
||||
});
|
||||
});
|
||||
}
|
||||
function promiseReadResponse(request, response, file) {
|
||||
return new Promise(function(resolve, reject) {
|
||||
var realByteSize = 0;
|
||||
response.on('data', function(chunk) {
|
||||
realByteSize += chunk.length;
|
||||
if (realByteSize <= cfgMaxDownloadBytes) {
|
||||
file.write(chunk);
|
||||
} else {
|
||||
request.abort();
|
||||
}
|
||||
});
|
||||
response.on('end', function() {
|
||||
file.end(function() {
|
||||
if (request.aborted) {
|
||||
reject(new Error('Error statusCode or contentLength'));
|
||||
} else {
|
||||
resolve(realByteSize);
|
||||
}
|
||||
});
|
||||
});
|
||||
});
|
||||
}
|
||||
function* downloadFile(uri, fileFrom) {
|
||||
var getRes = yield promiseHttpsGet(uri);
|
||||
var contentLength = 0;
|
||||
if (getRes.response.headers['content-length']) {
|
||||
contentLength = getRes.response.headers['content-length'] - 0;
|
||||
}
|
||||
if (200 === getRes.response.statusCode && contentLength <= cfgMaxDownloadBytes) {
|
||||
var file = yield utils.promiseCreateWriteStream(fileFrom);
|
||||
yield promiseReadResponse(getRes.request, getRes.response, file);
|
||||
} else {
|
||||
throw new Error('Error statusCode:' + getRes.response.statusCode + ' or contentLength:' + contentLength);
|
||||
}
|
||||
var data = yield utils.downloadUrlPromise(uri, cfgDownloadTimeout * 1000, cfgMaxDownloadBytes);
|
||||
fs.writeFileSync(fileFrom, data);
|
||||
}
|
||||
function promiseGetChanges(key) {
|
||||
return new Promise(function(resolve, reject) {
|
||||
|
||||
Reference in New Issue
Block a user