проблема с 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:
Sergey.Konovalov
2015-09-09 14:51:36 +00:00
committed by Alexander.Trofimov
parent 39c9dd9c39
commit ec4ad562e7
5 changed files with 35 additions and 115 deletions

File diff suppressed because one or more lines are too long

View File

@ -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": "",

View File

@ -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"
}
}

View File

@ -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) {

View File

@ -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) {