当 http 获得分块响应时陷入无限重定向循环
Stuck in infinite redirect loop when http get an chunked response
我正在尝试使用 npm 模块请求获取以下 url https://extranet.ores.be/de/services/price-simulation 的 body。问题是,对于这个 link,我认为该模块无法正常工作。因为它不断失败并出现 maxRedirects reached 错误。我已经调试了 think 并且是的,因为对 url 的第一次调用是对位置 header 到相同 url 的响应,它执行无限循环。想法是,重定向似乎不是 firefox 或 chrome 的问题,......浏览器正在正确解决它。我错过了什么吗?或者也许是代理的问题?
以下是我的部分代码:
var proxiedRequest = request.defaults({proxy: "http://proxy.xxx.xxxxxxx.be:XXXX", maxRedirects : 5})
proxiedRequest.get(that.buildRequest(url.url), (error, response, body) => {
let html = null;
let status = null;
let failed = false;
if (!error && response.statusCode === 200 && (response.headers['content-type'].includes('text/html') || response.headers['content-type'].includes('application/xhtml+xml'))){
html = body;
} else if(!error && response.statusCode != 200) {
status = response.statusCode;
failed = true;
}else if(error) {
failed = true;
}
that.emit('getFinished', { html : html, status : status, error : error, failed : failed, url : url } );
})
buildRequest 方法:
this.buildRequest = function(url){
return {
url: url.href,
headers: {
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:54.0) Gecko/20100101 Firefox/54.0',
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
'Connection' : 'keep-alive',
'Accept-Encoding': this.selectAcceptEncodingHeader(url.protocol)
},
gzip: true,
deflate: true
}
}.bind(this);
this.selectAcceptEncodingHeader = function(protocol){
if(protocol === 'https:'){
return 'gzip, deflate, br';
}
return 'gzip, deflate';
}.bind(this);
我尝试使用 multipart,但它是用于请求,而不是响应。
有什么想法吗?提前致谢
浏览器正确处理给定的 url,因为 cookie 与来自节点的模块请求不同,默认情况下启用 cookie。
为您的代理请求试试这个:
var proxiedRequest = request.defaults({
proxy: "http://proxy.xxx.xxxxxxx.be:XXXX",
maxRedirects : 5,
jar: true // enable cookie
});
我正在尝试使用 npm 模块请求获取以下 url https://extranet.ores.be/de/services/price-simulation 的 body。问题是,对于这个 link,我认为该模块无法正常工作。因为它不断失败并出现 maxRedirects reached 错误。我已经调试了 think 并且是的,因为对 url 的第一次调用是对位置 header 到相同 url 的响应,它执行无限循环。想法是,重定向似乎不是 firefox 或 chrome 的问题,......浏览器正在正确解决它。我错过了什么吗?或者也许是代理的问题?
以下是我的部分代码:
var proxiedRequest = request.defaults({proxy: "http://proxy.xxx.xxxxxxx.be:XXXX", maxRedirects : 5})
proxiedRequest.get(that.buildRequest(url.url), (error, response, body) => {
let html = null;
let status = null;
let failed = false;
if (!error && response.statusCode === 200 && (response.headers['content-type'].includes('text/html') || response.headers['content-type'].includes('application/xhtml+xml'))){
html = body;
} else if(!error && response.statusCode != 200) {
status = response.statusCode;
failed = true;
}else if(error) {
failed = true;
}
that.emit('getFinished', { html : html, status : status, error : error, failed : failed, url : url } );
})
buildRequest 方法:
this.buildRequest = function(url){
return {
url: url.href,
headers: {
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:54.0) Gecko/20100101 Firefox/54.0',
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
'Connection' : 'keep-alive',
'Accept-Encoding': this.selectAcceptEncodingHeader(url.protocol)
},
gzip: true,
deflate: true
}
}.bind(this);
this.selectAcceptEncodingHeader = function(protocol){
if(protocol === 'https:'){
return 'gzip, deflate, br';
}
return 'gzip, deflate';
}.bind(this);
我尝试使用 multipart,但它是用于请求,而不是响应。
有什么想法吗?提前致谢
浏览器正确处理给定的 url,因为 cookie 与来自节点的模块请求不同,默认情况下启用 cookie。
为您的代理请求试试这个:
var proxiedRequest = request.defaults({
proxy: "http://proxy.xxx.xxxxxxx.be:XXXX",
maxRedirects : 5,
jar: true // enable cookie
});