主にプログラミング関連のメモ帳 ♪(✿╹ヮ╹)ノ
書いてあるコードは自己責任でご自由にどうぞ。記事本文の無断転載は禁止です。
2016/07/02
前からちまちまいじってる CefSharp の続きです。
私は CefSharp.WPF 以外は触ってないので、一応それでの話ということで。
前も言ったように、 CefSharp は Chromium を .NET でいじるやつです。
Chromium なので、 Developer Tools みたいなのも実装可能です。
そして、 Developer Tools には、 HTTPS 通信を含んだ、通信内容を見ることが可能です。
ということで、 CefSharp で HTTP(S) 通信を覗いてみます。
通信の中身をみるのは、 ResourceHandler
を登録することで、行うことができます。
ということで、早速実装。 まずは、適当な場所に ChromiumWebBrowser を埋め込みます。
<UserControl x:Class="WpfApplication02.BrowserHost"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:behaviors="clr-namespace:WpfApplication02.Behaviors"
xmlns:cefSharp="clr-namespace:CefSharp.Wpf;assembly=CefSharp.Wpf"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
d:DesignHeight="300"
d:DesignWidth="300"
mc:Ignorable="d">
<Grid>
<cefSharp:ChromiumWebBrowser HorizontalAlignment="Center"
VerticalAlignment="Center"
RenderOptions.BitmapScalingMode="Linear">
<i:Interaction.Behaviors>
<behaviors:CaptureHttpRequestBehavior />
</i:Interaction.Behaviors>
</cefSharp:ChromiumWebBrowser>
</Grid>
</UserControl>
次に、 ResourceHandler
は Binding できないので、 Behavior でくっつけてあげます。
internal class CaptureHttpRequestBehavior : Behavior<ChromiumWebBrowser>
{
#region Overrides of Behavior
protected override void OnAttached()
{
base.OnAttached();
AssociatedObject.ResourceHandlerFactory = new HttpResourceHandlerFactory();
}
#endregion
}
で、 IResourceHandlerFactory
を実装したやつ。
internal class HttpResourceHandlerFactory : IResourceHandlerFactory
{
#region Implementation of IResourceHandlerFactory
public IResourceHandler GetResourceHandler(IWebBrowser browserControl, IBrowser browser, IFrame frame,
IRequest request)
{
return new HttpResourceHandler();
}
public bool HasHandlers => true;
#endregion
}
GetResourceHandler
にて null
を返せばデフォルト動作となるので、
例えば特定のドメインだけ適用させるといったことも可能です。
するとしたらこんな感じ。
return request.Url.StartsWith("https://twitter.com") ? new HttpResourceHandler() : null;
Twitter へのアクセスの場合は適用させて、それ以外はスルーといったような。
最後に、 IResourceHandler
。
internal class HttpResourceHandler : ResourceHandler
{
#region Overrides of ResourceHandler
public override bool ProcessRequestAsync(IRequest request, ICallback callback)
{
// ここに
return true;
}
#endregion
}
あとは、 ProcessRequestAsync
にて、 HttpClient
だとかで IRequest
に設定されている
リクエストを実行し、レスポンスをいじるなりすれば OK です。
まぁ動作を見てみると、キャプチャと言うよりは、プロキシみたいな感じになっていますが、
こうすれば、 HTTP リクエストの中身も(結果的には)見れますよーということで。