我已经使用NPM Request包好几年了,尽管它已经被弃用了,但它总是能完美地满足我的需求,直到今天我还没有遇到任何问题…
我正在尝试与用户做一个常规的GET请求:通过身份验证的代理和一些额外的标头-同样的事情,我已经做了一千次在过去,但这一次的url是HTTP而不是HTTPS。
由于某种原因链接是HTTP它干扰了我的代理身份验证并且由于某种原因返回响应码407并且响应体显示一个错误:缓存访问被拒绝(ERR_CACHE_ACCESS_DENIED)。这就是我对该怎么办感到困惑的地方,因为我知道一个事实,我的代理身份验证不应该有任何问题,因为它是我多年来所做的相同的事情。
请求代码:
const request = require('request').defaults({
timeout: 30000,
gzip: true,
forever: true
});
cookieJar = request.jar();
proxyUrl = "http://proxyUsername:proxyPassword@proxyDomain:proxyPort";
request({
method: "GET",
url: "http://mylink.com",
proxy: proxyUrl,
jar: cookieJar,
headers: {
"Proxy-Authorization": new Buffer('proxyUsername:proxyPassword').toString('base64'),
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9",
"Accept-Language": "en-GB,en-US;q=0.9,en;q=0.8",
"Connection": "keep-alive",
"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6_8) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.112 Safari/537.36",
},
followAllRedirects: true
}, (err, resp, body) => {
if (err || resp.statusCode != 200) {
if (err) {
console.log(err);
} else {
console.log(resp.statusCode);
console.log(resp.body);
}
return;
}
console.log(resp.body);
});
响应体代码片段(状态码407):
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html><head>
<meta type="copyright" content="Copyright (C) 1996-2019 The Squid Software Foundation and contributors">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>ERROR: Cache Access Denied</title>
<style type="text/css"><!--
body
:lang(fa) { direction: rtl; font-size: 100%; font-family: Tahoma, Roya, sans-serif; float: right; }
:lang(he) { direction: rtl; }
--></style>
</head><body id=ERR_CACHE_ACCESS_DENIED>
<div id="titles">
<h1>ERROR</h1>
<h2>Cache Access Denied.</h2>
</div>
<hr>
...
<p>Sorry, you are not currently allowed to request http://mylink.com from this cache until you have authenticated yourself.</p>
...
其他注意事项:
- 我也连接到完全相同的代理在我的浏览器和去同一个网站,它的工作完美,所以它不是代理本身的问题。
- 如果我从请求中删除代理,它可以完美地工作,所以也许我已经为HTTP配置了错误的请求,这是我能想到的
现在,正如我所说的,这段代码可以完美地与任何HTTPS链接一起工作,所以这就是我难住的地方。任何帮助将不胜感激!
将Proxy-Authorization header更改为Proxy-Authenticate这似乎很有效。我不知道为什么HTTP需要这样做,但是你看,没有太多关于这件事的文档…