pusher / pusher-websocket-dotnet

Pusher Channels Client Library for .NET
MIT License
112 stars 113 forks source link

Add proxy support #75

Closed kenjiuno closed 4 years ago

kenjiuno commented 5 years ago

This PR will add PusherOptions.ProxyFactory property so that we can specify proxy server manually.

I'm pending some PRs on SuperSocket.ClientEngine project which provides HttpConnectProxy I want to use.

Fix #11

kenjiuno commented 4 years ago

Better implementation so that it can find proxy server automatically:

    pusher = new Pusher(applicationKey, new PusherOptions()
    {
        Authorizer = ...,
        Encrypted = true,
        ProxyFactory = (uri) =>
        {
            var proxyUri = UseProxy
                ? ProxyDetector.Detect(uri)
                : null;
            var proxy = (proxyUri != null)
                ? new HttpConnectProxy(new DnsEndPoint(proxyUri.Host, proxyUri.Port))
                : null;

            return proxy;
        },
    });
    static class ProxyDetector
    {
        public static Uri Detect(string uri)
        {
            UriBuilder urib = new UriBuilder(uri);
            switch (urib.Scheme)
            {
                case "ws":
                    urib.Port = 80;
                    urib.Scheme = "http";
                    break;
                case "wss":
                    urib.Port = 443;
                    urib.Scheme = "https";
                    break;
            }

            Uri uriTarget = urib.Uri;
            Uri uriProxy = System.Net.HttpWebRequest.DefaultWebProxy.GetProxy(uriTarget);
            if (uriProxy != null && uriProxy != uriTarget)
            {
                return uriProxy;
            }
            return null;
        }
    }