3

我试图修改 adblockplus 代码以进行测试。我正在修改代码以在 URL 上发送 http get 请求并从响应中获取最终 URL。我尝试使用下面的代码,但响应不包含标头响应中的 Location 字段。我在 Firefox 扩展中这样做,所以我认为跨域请求不会有任何问题。为什么我无法从响应中获取 Location 字段?有没有更好的方法来完成这项任务?

输入 URL - http://netspiderads3.indiatimes.com/ads.dll/clickthrough?msid=17796167&cid=3224&slotid=1203&nsRndNo=817685688

预期输出 - http://www.mensxp.com/

实际输出 - 位置:空

这是我正在使用的代码-

function geturl(url){
let req= Cc["@mozilla.org/xmlextras/xmlhttprequest;1"].createInstance(Ci.nsIXMLHttpRequest);
req.open("GET", url);
req.overrideMimeType("text/plain");
req.send(null);
req.onreadystatechange = function() {
if (req.readyState == 4) 
{ if (req.status == 200) 
  { try 
    {
       location = req.getResponseHeader("Location");
       console.log("Location is: " + location);
    }
    catch(e){
    console.log("Error reading the response: " + e.toString());
  }
 }
}

解决方案-

我终于找到了解决方案。我没有得到最终的回应。所以我将重定向限制设置为 0,现在我可以在标题中获取 Location 字段。这是我添加到代码中的内容-

if (request.channel instanceof Ci.nsIHttpChannel)
    request.channel.redirectionLimit = 0;
4

2 回答 2

1

实际上你必须检查readyState == 2,即 HEADERS_RECEIVED 状态

于 2013-04-12T15:31:38.973 回答
1

因为状态码 200 表示 OK,所以你的 try 块不会被执行。“位置”字段仅在重定向中退出,其状态码为 301 或 302。

该 url 响应 302,因此更改req.status == 200req.status == 302.

于 2013-04-12T09:31:01.500 回答