zoukankan      html  css  js  c++  java
  • FiddlerCoreAPI开发(一)源码分析

    1.前言

    前一段时间想利用fiddlercore截取本地HTTPS的流量做一些分析,按照样例代码的注释学习了一下,没搞清楚怎么实现,后来又在网上查了些资料,对HTTPS的处理提及很少,都没有解决我的问题,主要是HTTPS证书的问题,索性自己研究了一下,终于解决了问题。我会在下篇文章中分享下我的思路,本篇文章先简单分析下fiddlercore自带样例的代码,帮助刚接触fiddlercore的人快速入门,如果有说的不对的地方,欢迎批评指正。

    2.源码分析

    首先从官网下载FiddlerCoreAPI
    https://www.telerik.com/purchase/fiddlercore

    下载下来是一个安装文件,解压后有demo和FiddlerCoreAPI库,打开样例代码工程,开始分析。

    从主函数开始。

    List<Fiddler.Session> oAllSessions = new List<Fiddler.Session>();
    

    定义了一个fiddler的Session类的List,里面存放的是客户端和服务端的消息。

    Fiddler.FiddlerApplication.SetAppDisplayName("FiddlerCoreDemoApp");
    

    命名自己的应用程序。

    Fiddler.FiddlerApplication.OnNotification += delegate(object sender, NotificationEventArgs oNEA) { Console.WriteLine("** NotifyUser: " + oNEA.NotifyString); };
    Fiddler.FiddlerApplication.Log.OnLogString += delegate(object sender, LogEventArgs oLEA) { Console.WriteLine("** LogString: " + oLEA.LogString); };
    

    这两句,第一句绑定了用户通知事件的函数,具体什么时候触发没仔细研究,第二句绑定了FiddlerApplication.Log触发的事件(FiddlerCore自己的日志系统),后面打印内容都会用到,总之这两句就是把内容打印在控制台上。

    Fiddler.FiddlerApplication.BeforeRequest += delegate(Fiddler.Session oS)
    {
    	// Console.WriteLine("Before request for:	" + oS.fullUrl);
        oS.bBufferResponse = false;
        Monitor.Enter(oAllSessions);
        oAllSessions.Add(oS);
        Monitor.Exit(oAllSessions);
        
        if ((oS.oRequest.pipeClient.LocalPort == iSecureEndpointPort) && (oS.hostname == sSecureEndpointHostname))
        {
            oS.utilCreateResponseAndBypassServer();
            oS.oResponse.headers.SetStatus(200, "Ok");
            oS.oResponse["Content-Type"] = "text/html; charset=UTF-8";
            oS.oResponse["Cache-Control"] = "private, max-age=0";
            oS.utilSetResponseBody("<html><body>Request for httpS://" + sSecureEndpointHostname + ":" + iSecureEndpointPort.ToString() + " received. Your request was:<br /><plaintext>" + oS.oRequest.headers.ToString());
        }
    };
    

    BeforeRequest,顾名思义,就是在客户端发送请求后拦截之,在此函数中可以获取甚至修改请求的内容。

    oS.fullUrl为请求的URL。

    bBufferResponse这个属性,要设置成true才可以修改服务器响应的内容。

    接下来的if判断,是一个例子,如果你访问https://localhost:7777,他会拦截你的请求,并构造响应报文返回给你,服务端不会收到该请求。

    Fiddler.FiddlerApplication.Startup(iPort, oFCSF);
    

    开启FiddlerCore在指定端口的监听。

    oSecureEndpoint = FiddlerApplication.CreateProxyEndpoint(iSecureEndpointPort, true, sSecureEndpointHostname);
    

    建立在指定端口的HTTPS的监听,这个函数下篇文章中还会说到。

    至此,这个样例的主要代码就分析完了,它实现了简单的http请求截获和响应替换,剩余的代码都是些与用户的交互,这里不再赘述。

    3.注意

    前面代码执行完后,一定要调用Shutdown()函数关闭FiddlerCore应用,不然会导致浏览器还是通过Fiddler代理,上不了网。

    Fiddler.FiddlerApplication.Shutdown();
    

    在证书管理器中可以看到FiddlerCore安装了自己的证书。

    阅读样例代码的注释很有帮助,还有FiddlerCore的帮助文档,里面各个函数的功能说的很详细。

  • 相关阅读:
    java.net.DatagramPacket/java.net.DatagramSocket-UDP Socket编程
    新浪微博客户端(9)-实现版本新特性的ViewPager
    新浪微博客户端(8)-添加按钮到TabBar
    iOS-Auto property synthesis will not synthesize property 'delegate'; it will be implemented by its super
    新浪微博客户端(7)-通过转换坐标系来调整首页下拉菜单的位置
    新浪微博客户端(6)-创建首页下拉菜单
    TortoiseGit-创建分支、合并分支
    BZOJ2683: 简单题(cdq分治 树状数组)
    BZOJ3262: 陌上花开(cdq分治)
    BZOJ1901: Zju2112 Dynamic Rankings(整体二分 树状数组)
  • 原文地址:https://www.cnblogs.com/realwy/p/8075705.html
Copyright © 2011-2022 走看看