首页 > 开发chrome extension时如何获取到请求的Host信息并增加Authorization字段

开发chrome extension时如何获取到请求的Host信息并增加Authorization字段

已经在manifest.json申请了webRequestwebRequestBlocking两个权限
拦截请求尝试读请求头部的Host信息代码如下

chrome.webRequest.onBeforeSendHeaders.addListener(function(details) {
  var headers = details.requestHeaders;
  for(var i = 0, l = headers.length; i < l; ++i) {
    if( headers[i].name == 'Host' && console.log(headers[i].name) && headers[i].value == '10.201.76.233:8080' ) {
      // something
      break;
    }
  }

  return {requestHeaders: headers};
}, requestFilter, ['requestHeaders','blocking']);

但是details.requestHeaders并没有包含Host的信息。
请教各位,如何才能获取到每次请求的Host信息?
或是如何确定本次的请求的Host10.201.76.231:8080

===update===
使用公子的方法解决了上面的问题了,但还存在后续问题

  chrome.webRequest.onBeforeRequest.addListener(
    var headers = details.requestHeaders;  
    headers.push({
      name: 'Authorization',
      value: 'Bearer3988275f-34fe-4e95-8452-506741adf184'
    });  
  return {requestHeaders: headers};
      ["http://10.201.76.231:8080/*"], 
      ['blocking', 'requestHeaders']
  );

目的是增加Authorization信息,代码并没有报错,但是最终结果并没有把Authorization信息加上去。


我自己来回答问题的第一部分,关键在于chrome.webRequest.onBeforeRequest.addListener的回调函数中如何判别是否Host,是否一定要和Host比较,这里我用的是Request URL信息,Request URL并不是Request Header的内容,当时两者有关联,如:
Request URL: http://10.201.76.233:8080/app-manage/api/...
Host: 10.201.76.233:8080

因此我的回调函数大概是这样子的:

chrome.webRequest.onBeforeSendHeaders.addListener(function(details) {
  if(details.url.indexOf("10.201.76.233") != -1) {
    // do something
  }

}, requestFilter, ['requestHeaders','blocking']);

如果你要为多个host增加Authorization的请求头信息,那么你可以将多个host存储起来,然后在回调函数判别,例如:

// 1. 利用正则表达式将details.url截取剩下 10.201.76.233:8080的格式
// 2. 取出多个host组成的数组或其他结构
// 3. hostList.indexOf(newUrl) != -1;如果成立就为本次请求增加Authorization头信息

问题的第二部分也解决了,虽然官方提到修改Authorization头部信息是不被支持的,参照这里
我做的修改是在manifest.json加入了<all_urls>的权限。


https://developer.chrome.com/extensions/webRequest ,文档中明确指出了以下头信息不会被传递进来:

如果是想要限制请求的 host 的话可以使用 onBeforeSendHeaders 的第二个参数 filter

  chrome.webRequest.onBeforeRequest.addListener(
      callback, 
      ["http://10.201.76.231:8080/*"], 
      ['blocking', 'requestHeaders']
  );
【热门文章】
【热门文章】