webRequest模块的解读
Chrome Extension 的 webRequest模块的解读
文档在此:http://developer.chrome.com/trunk/extensions/webRequest.html
1,为了使用webRequest,首先需要在配置文件manifest.json中加入类似的内容:

{
“name": "My extension",
...
"permissions": {
"webRequest", "*://*.google.com"
},
....
}

这里的意思是说,只允许这个extension对*.google.com的域名使用webRequest,如果这个字符串替换为其它格式的,比如*://*,就可以支持所有的网站访问了。
2,webRequest的核心意思就是要伪造各种request,那么就不单单是写某个对象的数据这么简单,还需要选择合适的时机,在发送某种request之前伪造好它,或者在真实的request到来之后半路截获它,替换成假的然后再发出去。Life cycle of request就是描述这个事情的。
其中,onBeforeSendHeaders这个回调比较有用,文档中如此描述“这个事件将允许extensions添加、修改或删除request headers。简单的用法如下:
chrome.webRequest.onBeforeRequest.addListener(
callback, filter, opt_extraInfoSpec);
a,callback被调用时将被赋予包含request信息的一个参数。
b,filter参数是一个object,有这些key可用:
URLs:类似这种格式的字符串:*://www.google.co/foo*bar
Types:像main_frame或sub_frame,image这样的类型
TabID:tab的标识符
WindowID:window的标识符
3,因为可能多个extension都要玩webRequest,所以需要一套冲突处理机制。如果设置了新的request,刷新页面后是否设置继续有效,设置了之后什么时候有效,这些都是关于cache的问题。另外就是使用timestamp属性的问题,凡从timestamp取得的属性值,相互之间可以比较,但是如果和new Date().getTime()这种方式取得的值比较就不一定对了,需要加以注意。
4,例子
a,阻止所有发往www.evile.com的request
chrome.webRequest.onBeforeRequest.addListener(
function(details) {
return {cancel: details.url.indexOf("://www.evil.com/") != -1};
},
{urls: ["<all_urls>"]},
["blocking"]);
另一种方法,使用filter:
chrome.webRequest.onBeforeRequest.addListener(
function(details) { return {cancel: true}; },
{urls: ["*://www.evil.com/*"]},
["blocking"])
符合filter的都被cancel掉了。
b,从所有的request中删除User-Agent的header

chrome.webRequest.onBeforeSendHeaders.addListener(
function(details) {
for (var i = 0; i < details.requestHeaders.length; ++i) {
if (details.requestHeaders[i].name === 'User-Agent') {
details.requestHeaders.splice(i, 1);
break;
}
}
return {requestHeaders: details.requestHeaders};
},
{urls: ["<all_urls>"]},
["blocking", "requestHeaders"]);

5,各种API文档
a,RequestFilter:

RequestFilter = {
tabId: interger, //optional
//URL的数组,或者是匹配URL的pattern
urls: array_of_string,
//可选的值有:"main_frame", "sub_frame", "stylesheet", "script", "image", "object", "xmlhttprequest", "other"
types: array_of_enumerated_string, //optional
windowId: integer //optional
};
// 设置了blocking关键字的就用这个object来作为block的规则了
BolockingResponse = {
//为true的话request被cancel,在onBeforeRequest里面用哦
cancel: boolean, //optional
//只在onBeforeRequest事件中使用,用来掉包的关键属性!!!
redirectUrl: string, //option
//只用在onHeadersReceived事件里,在浏览器返给server时把header给掉包
responseHeaders: HttpHeaders //optional
//只在onBeforeSendHeaders事件中使用。是另一个用来掉包的关键属性!!!
requestHeaders: HttpHeaders //optional
//只在onAuthRequred事件中使用,当然也是用来掉包的
authCredentials: object //optional
};
HttpHeaders:HTTP headers组成的数组,数组每个元素都有自己的键值对,就是object了。这个得实际打印出来才知道。

b,onBeforeSendHeaders,在TCP连接建立之后和HTTP数据发送之前被调用的事件。调用方法:
chrome.webRequest.onBeforeSendHeaders.addListener(function(object details) {...});
其中,传给callback的参数details结构如下:

details = {
tabId: integer, //如果没有和tab关联则返回-1
parentFrameId: integer,
url: string,
timeStamp: double,
//0表示request是在main frame里发生的
frameId: integer,
requestId: string,
requestHeaders: HttpHeaders, // optional
type: enumerated_string, //value in: ["main_frame", "sub_frame", "stylesheet", "script", "image", "object", "xmlhttprequest", "other"]
method: string //标准HTTP方法
};

其它事件大同小异,调用callback时传入的参数也都是details这个结构,只是某些字段会有不同的值。
6,总结:webRequest的API非常容易使用,基本上就是第四部分里三个例子的样式。当然, 要想更好地使用,还需要Http Request的一些基础知识,想伪造的话起码要知道应该伪造成什么样子才合适。
转:http://www.zengguanglik.com.cn/2014/1/20/00080.html
webRequest模块的解读的更多相关文章
- Chrome Extension 的 webRequest模块的解读
Chrome Extension 的 webRequest模块的解读 文档在此:http://developer.chrome.com/trunk/extensions/webRequest.ht ...
- FreeSWITCH 加载模块过程解读
今天来学习FreeSWITCH 加载模块过程. 哪些模块需要编译,是由源码下的 modules.conf 文件决定的. 哪些模块在程序启动时自动加载,是由 freeswitch/conf/autolo ...
- #6 ipdb模块源代码解读
前言 好久不见,大家最近可好
- Django权限和认证模块的解读
from rest_framework.views import APIView 找到APIView中的dispatch方法 class MyAuth: def authenticate(self): ...
- 三分钟解读springmvc依赖
长期以来都在写SSM框架的项目,却未能深入理解框架的搭建原理,而只是浅薄的理解前辈的架构,然后不断套用,项目做过几个,但框架的内涵却没有把握.小编打算今天从SpringMVC的依赖分析做起,一步步进行 ...
- SocketServer模块,hmac模块验证client合法性
hmac模块: 1.模块初识: import hmac # h = hmac.new() #括号里要给它连个bytes类型,一个是自定义的secret_key,一个是你想进行加密的bytes # 密文 ...
- Spring框架jar包分类(转)
转自:http://www.cnblogs.com/JSONBEAN/p/6364038.html 长期以来都在写SSM框架的项目,却未能深入理解框架的搭建原理,而只是浅薄的理解前辈的架构,然后不断套 ...
- Chrome插件开发(二)
作为一个前端开发者,我们经常需要和各种各样的接口打交道,很多时候我们的开发环境的域和接口所在的域是不同的,比如我们本地开发环境运行域是localhost,但接口所在的域是www.xx.com,这个时候 ...
- Certified Scrum Master CSM 中文资料大全
课程概览 本课程由中国唯一一位获CST认证培训师及LeSS-Friendly Scrum Trainer双重认证讲师,丰富一线实战经验的Scrum教练讲授:姜信宝 BoB Jiang. 敏捷变革中心是 ...
随机推荐
- Ubuntu 14.04 Unity 启动器加入最小化点击功能
对于14.04之前的版本请勿尝试: 参开文章: http://askubuntu.com/questions/36433/can-i-use-the-unity-launcher-icon-to-mi ...
- Appium解锁九宫格(TouchAction)
TouchAction 1.源码可以在这个路径找到:Lib\site-packages\appium\webdriver\common\touch_action.py class TouchActio ...
- C/C++复杂类型声明
曾经碰到过让你迷惑不解.类似于int * (* (*fp1) (int) ) [10];这样的变量声明吗?本文将由易到难,一步一步教会你如何理解这种复杂的C/C++声明. 我们将从每天都能碰到的较 ...
- xtu数据结构 B. Get Many Persimmon Trees
B. Get Many Persimmon Trees Time Limit: 1000ms Memory Limit: 30000KB 64-bit integer IO format: %lld ...
- 学习iis工作原理
文章:IIs工作原理 文章:Asp.Net 构架(Http Handler 介绍) - Part.2
- 谈Elasticsearch下分布式存储的数据分布
对于一个分布式存储系统来说,数据是分散存储在多个节点上的.如何让数据均衡的分布在不同节点上,来保证其高可用性?所谓均衡,是指系统中每个节点的负载是均匀的,并且在发现有不均匀的情况或者有节点增加/删除 ...
- 使用sudo,mvn command not found
一个简单的解决办法是,编辑你当前用户的 .bashrc 文件,添加下面这行内容: alias sudo="sudo env PATH=$PATH" 因为系统预装的 sudo 在编译 ...
- excel打乱各行的顺序,实现无序随机排列
由于公司做活动,经常会发些激活码过来,为了让激活码能够充分使用,经常要打乱激活码的顺序,百度了下,看了下网上的介绍,还不错,挺实用,记录下来. 具体方法如下: 1.将文本里的内容复制到Excel里的任 ...
- vba比较日期大小,定义日期;vba让excel保存
Private Sub CommandButton1_Click()Dim i, j As IntegerDim a As Datea = #10/1/2013#j = 2i = 2' If Wor ...
- 2017 ACM/ICPC Asia Regional Xian Online 记录
题目链接 Xian