예제 #1
0
        private static HttpHandlerContext CalculateHandlerContext(GrpcChannelOptions channelOptions)
        {
            if (channelOptions.HttpHandler == null)
            {
                // No way to know what handler a HttpClient is using so assume custom.
                var type = channelOptions.HttpClient == null
                    ? HttpHandlerType.SocketsHttpHandler
                    : HttpHandlerType.Custom;

                return(new HttpHandlerContext(type));
            }

            if (HttpRequestHelpers.HasHttpHandlerType(channelOptions.HttpHandler, "System.Net.Http.WinHttpHandler"))
            {
                return(new HttpHandlerContext(HttpHandlerType.WinHttpHandler));
            }
            if (HttpRequestHelpers.HasHttpHandlerType(channelOptions.HttpHandler, "System.Net.Http.SocketsHttpHandler"))
            {
                HttpHandlerType type;
                TimeSpan?       connectTimeout;

#if NET5_0_OR_GREATER
                var socketsHttpHandler = HttpRequestHelpers.GetHttpHandlerType <SocketsHttpHandler>(channelOptions.HttpHandler) !;

                type           = HttpHandlerType.SocketsHttpHandler;
                connectTimeout = socketsHttpHandler.ConnectTimeout;

                // Check if the SocketsHttpHandler is being shared by channels.
                // It has already been setup by another channel (i.e. ConnectCallback is set) then
                // additional channels can use advanced connectivity features.
                if (!BalancerHttpHandler.IsSocketsHttpHandlerSetup(socketsHttpHandler))
                {
                    // Someone has already configured the handler callback.
                    // This channel can't support advanced connectivity features.
                    if (socketsHttpHandler.ConnectCallback != null)
                    {
                        type           = HttpHandlerType.Custom;
                        connectTimeout = null;
                    }
                }
#else
                type           = HttpHandlerType.SocketsHttpHandler;
                connectTimeout = null;
#endif
                return(new HttpHandlerContext(type, connectTimeout));
            }
            if (HttpRequestHelpers.GetHttpHandlerType <HttpClientHandler>(channelOptions.HttpHandler) != null)
            {
                return(new HttpHandlerContext(HttpHandlerType.HttpClientHandler));
            }

            return(new HttpHandlerContext(HttpHandlerType.Custom));
        }
예제 #2
0
        public BalancerHttpHandler(HttpMessageHandler innerHandler, ConnectionManager manager)
            : base(innerHandler)
        {
            _manager = manager;

#if NET5_0_OR_GREATER
            var socketsHttpHandler = HttpRequestHelpers.GetHttpHandlerType <SocketsHttpHandler>(innerHandler);
            if (socketsHttpHandler != null)
            {
                socketsHttpHandler.ConnectCallback = OnConnect;
            }
#endif
        }
예제 #3
0
        public BalancerHttpHandler(HttpMessageHandler innerHandler, HttpHandlerType httpHandlerType, ConnectionManager manager)
            : base(innerHandler)
        {
            _manager = manager;

#if NET5_0_OR_GREATER
            if (httpHandlerType == HttpHandlerType.SocketsHttpHandler)
            {
                var socketsHttpHandler = HttpRequestHelpers.GetHttpHandlerType <SocketsHttpHandler>(innerHandler);
                CompatibilityHelpers.Assert(socketsHttpHandler != null, "Should have handler with this handler type.");

                socketsHttpHandler.ConnectCallback = OnConnect;
            }
#endif
        }