Example #1
0
        private async Task <IChannel> GetChannelAsync()
        {
            if (_channel is null)
            {
                _channel = await _bootstrap.ConnectAsync(_endPoint).ConfigureAwait(false);

                if (_connectionUpgradeHandler != null)
                {
                    var request = new DefaultFullHttpRequest(DNHttpVersion.Http11, HttpConnect, $"{Host}:{_uri.Port}");
                    if (_authenticationString != null)
                    {
                        request.Headers.Add(HttpHeaderNames.ProxyAuthorization, _authenticationString);
                    }
                    _ = _channel.WriteAndFlushAsync(request);
                    await _connectionUpgradeHandler.HandshakeTask.ConfigureAwait(false);

                    _connectionUpgradeHandler = null;
                    _requestSetupFunc         = null;
                }
            }
            return(_channel);
        }
Example #2
0
        private void InitDotNetty()
        {
            _responseHandler = new HttpResponseHandler();

            if (_proxyCredentials != null)
            {
                NetworkCredential credential = _proxyCredentials.GetCredential(_uri, "Basic");

                //TODO 除了Basic的其它实现
                string authString = !string.IsNullOrEmpty(credential.Domain) ?
                                    credential.Domain + "\\" + credential.UserName + ":" + credential.Password :
                                    credential.UserName + ":" + credential.Password;

                _authenticationString = new StringCharSequence($"Basic {Convert.ToBase64String(Encoding.UTF8.GetBytes(authString))}");

                _requestSetupFunc = request =>
                                    request.Headers.Remove(HttpHeaderNames.ProxyAuthorization).Add(HttpHeaderNames.ProxyAuthorization, _authenticationString);
            }

            _group     = new SingleThreadEventLoop();
            _bootstrap = new Bootstrap();
            _bootstrap
            .Group(_group)
            .Option(ChannelOption.TcpNodelay, true)
            .Option(ChannelOption.SoKeepalive, true)
            .Option(ChannelOption.Allocator, new UnpooledByteBufferAllocator())
            .Channel <TcpSocketChannel>()
            .Handler(new ActionChannelInitializer <IChannel>(channel =>
            {
                IChannelPipeline pipeline = channel.Pipeline;

                var aggregatorHandler = new HttpObjectAggregator(_maxLength);
                var codecHandler      = new HttpClientCodec(4096, 8192, 8192, false, false, _useProxy);

                if (IsHttps)
                {
                    if (_proxyUri is null)
                    {
                        pipeline.AddTlsHandler(Host, _certificateValidationCallback);
                        pipeline.AddLast(DotNettyHandlerNames.Codec, codecHandler);
                        pipeline.AddLast(DotNettyHandlerNames.Aggregator, aggregatorHandler);
                    }
                    else
                    {
                        pipeline.AddLast(DotNettyHandlerNames.Codec, codecHandler);
                        pipeline.AddLast(DotNettyHandlerNames.Aggregator, aggregatorHandler);
                        _connectionUpgradeHandler = new ConnectionUpgradeHandler(Host, _certificateValidationCallback);
                        pipeline.AddLast(DotNettyHandlerNames.ConnectionUpgrade, _connectionUpgradeHandler);
                    }
                }
                else
                {
                    pipeline.AddLast(DotNettyHandlerNames.Codec, codecHandler);
                    pipeline.AddLast(DotNettyHandlerNames.Aggregator, aggregatorHandler);
                }

                pipeline.AddLast(DotNettyHandlerNames.Response, _responseHandler);

                _dotNettyPipelineSetupCallback?.Invoke(pipeline);
            }));

            _dotNettyBootstrapSetupCallback?.Invoke(_bootstrap);
        }