From e6a1d3ffbc62224d200c2b914fcc4c3c0bc4bde3 Mon Sep 17 00:00:00 2001 From: Kimura Youichi Date: Tue, 11 Aug 2015 17:23:24 +0900 Subject: [PATCH] =?utf8?q?pbs.twimg.com=E3=81=B8=E3=81=AE=E6=8E=A5?= =?utf8?q?=E7=B6=9A=E3=81=ABIPv4=E3=82=92=E5=BC=B7=E5=88=B6=E3=81=99?= =?utf8?q?=E3=82=8B=E3=82=B3=E3=83=BC=E3=83=89=E3=81=8C=E6=84=8F=E5=9B=B3?= =?utf8?q?=E3=81=97=E3=81=9F=E5=8B=95=E4=BD=9C=E3=82=92=E3=81=97=E3=81=AA?= =?utf8?q?=E3=81=8B=E3=81=A3=E3=81=9F=E3=81=93=E3=81=A8=E3=81=AB=E5=AF=BE?= =?utf8?q?=E3=81=99=E3=82=8B=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- OpenTween/Connection/Networking.cs | 53 +++++++++++++++++++++++++------------- 1 file changed, 35 insertions(+), 18 deletions(-) diff --git a/OpenTween/Connection/Networking.cs b/OpenTween/Connection/Networking.cs index 86a1461c..334a58e4 100644 --- a/OpenTween/Connection/Networking.cs +++ b/OpenTween/Connection/Networking.cs @@ -70,24 +70,10 @@ namespace OpenTween.Connection if (forceIPv4 == value) return; - if (value) - { - BindIPEndPoint forceIPv4Delegate = (_, __, ___) => new IPEndPoint(IPAddress.Any, 0); - - ServicePointManager.FindServicePoint("http://pbs.twimg.com/", proxy) - .BindIPEndPointDelegate = forceIPv4Delegate; - ServicePointManager.FindServicePoint("https://pbs.twimg.com/", proxy) - .BindIPEndPointDelegate = forceIPv4Delegate; - } - else - { - ServicePointManager.FindServicePoint("http://pbs.twimg.com/", proxy) - .BindIPEndPointDelegate = null; - ServicePointManager.FindServicePoint("https://pbs.twimg.com/", proxy) - .BindIPEndPointDelegate = null; - } - forceIPv4 = value; + + // Network.Http を再作成させる + OnWebProxyChanged(EventArgs.Empty); } } @@ -167,7 +153,12 @@ namespace OpenTween.Connection handler.UseProxy = false; } - var client = new HttpClient(handler); + HttpClient client; + if (ForceIPv4) + client = new HttpClient(new ForceIPv4Handler(handler)); + else + client = new HttpClient(handler); + client.Timeout = Networking.DefaultTimeout; client.DefaultRequestHeaders.Add("User-Agent", Networking.GetUserAgentString()); @@ -201,6 +192,32 @@ namespace OpenTween.Connection if (WebProxyChanged != null) WebProxyChanged(null, e); } + + private class ForceIPv4Handler : DelegatingHandler + { + private readonly IPAddress ipv4Address; + + public ForceIPv4Handler(HttpMessageHandler innerHandler) + : base(innerHandler) + { + foreach (var address in Dns.GetHostAddresses("pbs.twimg.com")) + if (address.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork) + this.ipv4Address = address; + } + + protected override Task SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) + { + var requestUri = request.RequestUri; + if (requestUri.Host == "pbs.twimg.com") + { + var rewriteUriStr = requestUri.GetLeftPart(UriPartial.Scheme) + this.ipv4Address + requestUri.PathAndQuery; + request.RequestUri = new Uri(rewriteUriStr); + request.Headers.Host = "pbs.twimg.com"; + } + + return base.SendAsync(request, cancellationToken); + } + } } public enum ProxyType -- 2.11.0