cefsharp 攔截所有請求 解決chunked導致數據接收不完整的問題


攔截請求需要實現兩個接口

  1. IRequestHandler 對請求進行自定義處理
  2. IResponseFilter 對response進行處理
    cef官方文檔

實現了IRequestHandler 以后需要給瀏覽器綁定
例:

broswer.RequestHandler = new CEFRequestHandler();

tips:

  1. 在request中的GetResourceResponseFilter方法進行檢測
public IResponseFilter GetResourceResponseFilter(IWebBrowser browserControl, IBrowser browser, IFrame frame, IRequest request, IResponse response)
{
    var url = new Uri(request.Url);
    if (url.AbsoluteUri.Contains("http://www.baidu.com"))
    {
        //自定義的IResponseFilter,這里是按照官方文檔的示例
        var filter = CEFFilterManger.CreateFilter(request.Identifier.ToString());
        return filter;
    }
    return null;
}

IResponseFilter

public abstract class CEFResponseHandle : IResponseFilter
    {
        public string URI { get; set; }
        public List<byte> dataAll = new List<byte>();

        public string DataStr
        {
            get
            {
                return Encoding.UTF8.GetString(dataAll.ToArray());
            }
        }

       
        public void Dispose()
        {
        }

        public abstract void Invoke();

        public FilterStatus Filter(Stream dataIn, out long dataInRead, Stream dataOut, out long dataOutWritten)
        {
            try
            {

                if (dataIn == null || dataIn.Length == 0)
                {
                    dataInRead = 0;
                    dataOutWritten = 0;

                    //string resultResponse = System.Text.Encoding.UTF8.GetString(dataAll.ToArray());

                    //try
                    //{
                    //    JsonOper.ToObject<Dictionary<string, object>>(DataStr);
                    //}
                    //catch (Exception e)
                    //{
                    //    return FilterStatus.NeedMoreData;
                    //}

                    return FilterStatus.Done;
                }
                //解決Transfer-Encoding: chunked數據不全的問題
                if (dataIn.Length > dataOut.Length)
                {
                    var data = new byte[dataOut.Length];
                    dataIn.Seek(0, SeekOrigin.Begin);
                    dataIn.Read(data, 0, data.Length);
                    dataOut.Write(data, 0, data.Length);

                    dataInRead = dataOut.Length;
                    dataOutWritten = dataOut.Length;

                    dataAll.AddRange(data);
                }
                else
                {
                    dataInRead = dataIn.Length;
                    dataOutWritten = Math.Min(dataInRead, dataOut.Length);

                    dataIn.CopyTo(dataOut);
                    dataIn.Seek(0, SeekOrigin.Begin);
                    byte[] bs = new byte[dataIn.Length];
                    dataIn.Read(bs, 0, bs.Length);
                    dataAll.AddRange(bs);

                    dataInRead = dataIn.Length;
                    dataOutWritten = dataIn.Length;
                }

                return FilterStatus.NeedMoreData;
            }
            catch (Exception ex)
            {
                dataInRead = dataIn.Length;
                dataOutWritten = dataIn.Length;

                return FilterStatus.Done;
            }
        }


        public bool InitFilter()
        {
            return true;
        }
    }


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM