CEF3:拦截http request请求和response响应(包括ajax请求和响应也能拦截到)
文章目录
- 前言
- 思路
- 代码
前言
笔者在项目开发中有需求,需要拦截 js中 发起的 http 请求和响应数据 写到文件中,方便给开发人员或者测试人员查看。笔者拿到这个需求第一反应是,cef肯定有这种接口可供我们使用,所以肯定能实现咯。这里笔者用的是cef2623版本。
思路
笔者百度了一下 大致可以在 CefRequestHandler的回调函数可以得到一些东西,一开始 笔者找到的最相近的方法是 下面这个函数OnResourceLoadComplete,既有request 又有response。
///// Called on the IO thread when a resource load has completed. |request| and// |response| represent the request and response respectively and cannot be// modified in this callback. |status| indicates the load completion status.// |received_content_length| is the number of response bytes actually read.////*--cef()--*/virtual void OnResourceLoadComplete(CefRefPtr<CefBrowser> browser,CefRefPtr<CefFrame> frame,CefRefPtr<CefRequest> request,CefRefPtr<CefResponse> response,URLRequestStatus status,int64 received_content_length) {}
结果空欢喜一场。我们可以通过request和response指针能 拿到请求头和请求体 和 响应头 响应状态码等 但就是得不到 响应体!
所以 百度不行,当然谷歌了呀。虽然没有得到具体代码提示,但是提示说在 示例程序中有,恍然大悟了 应该回归初心 ,有什么需求或者问题 都可以看cef示例工程。在cefclient有拦截request请求和响应的例子!
代码
笔者需求当然实现了,由于是项目代码 这里不便展示。就把cefclient 中怎么处理的给大家说说。
这里直接说答案,要想获取 http response的响应体,应该在这个回调函数里面做处理。下面处理是在cefclient示例工程的test_runner.cc文件中的这个函数。
CefRefPtr<CefResponseFilter> ClientHandler::GetResourceResponseFilter(CefRefPtr<CefBrowser> browser,CefRefPtr<CefFrame> frame,CefRefPtr<CefRequest> request,CefRefPtr<CefResponse> response) {CEF_REQUIRE_IO_THREAD();return test_runner::GetResourceResponseFilter(browser, frame, request,response);
}
大家继续跟代码,跟踪到response_filter_test.cc文件下的下面这函数。
CefRefPtr<CefResponseFilter> GetResourceResponseFilter(CefRefPtr<CefBrowser> browser,CefRefPtr<CefFrame> frame,CefRefPtr<CefRequest> request,CefRefPtr<CefResponse> response) {// Use the find/replace filter on the test URL.const std::string& url = request->GetURL();//if (url.find(kTestUrl) == 0)// return new FindReplaceResponseFilter();//if (url.find(kTestUrl) == 0)// return new PassThruResponseFilter();//if (MatchesFilterURL(url))// return new PassThruResponseFilter();int index2 = url.find("LCX");if ( index2 >= 0 )return new PassThruResponseFilter();return NULL;
}
笔者这里拦截的是url中带有LCX字母的http请求数据。这里最重要的就是下面这个类了。在Filter函数里面data_out参数里面就是 响应体的内容,如果响应体的数据非常大,Filter函数可能会被调用多次。请求头和请求体和响应头可以通过前面的request response指针获取到。
// Filter that writes out all of the contents unchanged.
class PassThruResponseFilter : public CefResponseFilter {public:PassThruResponseFilter() {}bool InitFilter() OVERRIDE {return true;}FilterStatus Filter(void* data_in,size_t data_in_size,size_t& data_in_read,void* data_out,size_t data_out_size,size_t& data_out_written) OVERRIDE {DCHECK((data_in_size == 0U && !data_in) || (data_in_size > 0U && data_in));DCHECK_EQ(data_in_read, 0U);DCHECK(data_out);DCHECK_GT(data_out_size, 0U);DCHECK_EQ(data_out_written, 0U);// All data will be read.data_in_read = data_in_size;// Write out the contents unchanged.data_out_written = std::min(data_in_read, data_out_size);if (data_out_written > 0)memcpy(data_out, data_in, data_out_written);return RESPONSE_FILTER_DONE;}private:IMPLEMENT_REFCOUNTING(PassThruResponseFilter);
};
下面用ajax发一个 http请求 我们自己打个断点测试一把。这里笔者 用一个带jquery的页面,在控制台发起一个get请求进行的测试。
CEF3:拦截http request请求和response响应(包括ajax请求和响应也能拦截到)相关推荐
- request请求和response响应时的乱码解决代码
request乱码 request.setCharacterEncoding("UTF-8"); response乱码 response.setCharacterEncoding( ...
- java无响应_Java HttpClient请求无响应解决方案
首先来看下多线程处理的流程: 在来看下:httpClient请求工具方法: public static String sendGetRequest(String reqURL, String deco ...
- shiro ajax权限拦截器,Shiro Ajax请求权限不满足,拦截后解决方案
Java模拟Http请求 Java模拟Http请求 使用的是org.apache.httpcomponents中的httpclient,因为post请求涉及到传输文件,所以需要使用httpmime这个 ...
- 对于苹果手机(ios)微信浏览器 ajax请求无法响应问题
最近在项目中遇到一个问题,ajax请求一切都是正常的,但是移到了 苹果手机上就出问题了,难了我好久都没发现问题所在,后来测试用get 方式发现 几乎是没有问题的!那么是哪里出了问题了!于是到ios 的 ...
- request转发,response重定向,异步请求json数据输出到页面
request转发: //转发到index.jsp页面request.getRequestDispatcher("index.jsp").forward(request, resp ...
- ajax返回的是流如何转换为pdf,如何在AJAX请求成功响应中返回PDF文件
我通过AJAX获得两个日期,开始和结束日期.我处理这两个日期的数据,生成一个报告,然后返回一个HttpResponse.PDF报告现在保存在我的主项目目录中.现在我得到了AJAX的回复.所以,现在我应 ...
- postman响应html,Postman工具——请求与响应(示例代码)
两个内容: Request 请求和 Response 响应,下面就开始了. 一.Request 请求 Request 请求,我们只介绍常用的四种:GET.POST.PUT.DELETE,其他类型的就不 ...
- jquery ajax和servlet,浅谈ajax在jquery中的请求和servlet中的响应
在jsp中,首先,你需要导入jquery的架包: 获取可返回站点的根路径: String path = request.getContextPath(); %> 在jquery中写ajax请求: ...
- Vue总结第七天~Promise网络请求和axios 网络模块
目录 一.Promise 异步请求(网络请求): 1.Promise是什么? 2.基本使用: 3.链式编程: 二.axios 网络模块 ✿ 更详细的可以看官网:Axios 中文文档 | Axios 中 ...
最新文章
- 使用Maven插件构建SpringBoot项目,生成Docker镜像push到DockerHub上
- 让vs中网站的sln文件使用相对路径的办法
- 让你的ASP.NET Core应用程序更安全
- 【数值分析】数值分析的微积分学基础
- Linux PHY几个状态的跟踪
- PAT-BASIC-1003-我要通过!
- BricsCAD 21 for Mac(CAD建模软件)多语言版
- 从零基础入门Tensorflow2.0 ----三、8. 自定义层次
- 未来教育c语言二级51套答案,未来教育版计算机二级C语言上机题库(含答案)
- 计算机组成原理——总线
- AutoCAD2020简体中文语言包
- Firefox 不知道如何打开此地址,因为协议 (javascrpit) 未和任何程序关联.
- 地图导航中的路径规划算法(综述)
- Pycharm 系统找不到指定的路径 报错!!
- 阿里云“网红运维工程师白金:做一个平凡的圆梦人
- NEXTCHIP概述-2
- 《概率论与数理统计》-第二章 随机变量及其分布-第一节 离散型随机变量及其分布-笔记
- windows 控制linux,windows远程控制linux的最佳方案
- can报文信号矩阵分析
- 转载:linux drm原理及应用
热门文章
- 易生信转录组培训第一期总结
- 第94课 函数的参数 《小学生C++编程入门》 例94.1
- anaconda moviepy_Anaconda和PyCharm的详细安装步骤~小白专用,手把手教学
- python实训报告50000_Python程序设计 实验报告五
- 电力笔记-30个行业专业词汇(Ⅰ期)
- Python笔记-CAPM(资本资产定价模型)例子
- C++笔记-初步窥探全局函数在Debug、Release的地址
- OpenCV文档阅读笔记-brief Creates a window官方解析及实例
- C++工作笔记-仿大佬“容器”风格
- 7.2图的存储结构(十字链表、邻接多重表、边集数组)