コード例 #1
0
ファイル: SocketHttpServer.cs プロジェクト: zsybupt/corefxlab
 private static async Task ProcessConnection <TContext>(IHttpApplication <TContext> application, MemoryPool <byte> memoryPool, Socket socket)
 {
     using (var ns = new NetworkStream(socket))
     {
         using (var connection = new StreamPipeConnection(new PipeOptions(memoryPool), ns))
         {
             await ProcessClient(application, connection);
         }
     }
 }
コード例 #2
0
        protected override Task <IPipeConnection> GetConnection()
        {
            Socket s = new Socket(SocketType.Stream, ProtocolType.Tcp);

            s.Connect(new IPEndPoint(IPAddress.Loopback, 5000));

            var pipeConnection = new StreamPipeConnection(new PipeOptions(pool), new NetworkStream(s));

            return(Task.FromResult((IPipeConnection)pipeConnection));
        }
コード例 #3
0
ファイル: RedisPing.cs プロジェクト: mgravell/RedisPing
    static async Task DoTheThingViaTcpClient(string host, int port, string password, bool useTls, X509Certificate cert)
    {
        try
        {
            using (var pool = new MemoryPool())
                using (var client = new TcpClient())
                {
                    await Console.Out.WriteLineAsync(ShowDetails?$"connecting to {host}:{port}..." : "connecting to host");

                    await client.ConnectAsync(host, port);

                    Stream stream = client.GetStream();

                    if (useTls)
                    {
                        await Console.Out.WriteLineAsync($"authenticating host...");

                        LocalCertificateSelectionCallback certSelector = null;
                        if (cert != null)
                        {
                            certSelector = delegate { return(cert); };
                        }
                        RemoteCertificateValidationCallback serverValidator = delegate { return(true); }; // WCGW?
                        var ssl = new SslStream(stream, false, serverValidator, certSelector);
                        await ssl.AuthenticateAsClientAsync(host);

                        if (ssl.LocalCertificate != null)
                        {
                            Console.WriteLine($"Local cert: {ssl.LocalCertificate.Subject}");
                        }
                        stream = ssl;
                    }

                    using (var pipe = new StreamPipeConnection(new PipeOptions(pool), stream))
                    {
                        await ExecuteWithTimeout(pipe, password);
                    }
                }
        }
        catch (Exception ex)
        {
            while (ex != null)
            {
                await Console.Error.WriteLineAsync(ex.Message);

                ex = ex.InnerException;
            }
        }
    }
コード例 #4
0
        public async Task Run()
        {
            var pipeOptions = new PipeOptions(GetBufferPool());

            var consoleOutput = StreamPipeConnection.CreateWriter(pipeOptions, Console.OpenStandardOutput());
            var connection    = await GetConnection();

            while (true)
            {
                var buffer = connection.Output;
                var output = buffer;

                output.Append("GET / HTTP/1.1", SymbolTable.InvariantUtf8);
                output.Append("\r\n\r\n", SymbolTable.InvariantUtf8);
                await buffer.FlushAsync();

                // Write the client output to the console
                await CopyCompletedAsync(connection.Input, consoleOutput);

                await Task.Delay(1000);
            }
        }
コード例 #5
0
        private async Task OpenConnection(IDuplexPipe application, Uri url, TaskCompletionSource <object> startTcs, CancellationToken cancellationToken)
        {
            Log.StartReceive(_logger);

            var request = new HttpRequestMessage(HttpMethod.Get, url);

            SendUtils.PrepareHttpRequest(request, _httpOptions);
            request.Headers.Accept.Add(new MediaTypeWithQualityHeaderValue("text/event-stream"));

            HttpResponseMessage response;

            try
            {
                response = await _httpClient.SendAsync(request, HttpCompletionOption.ResponseHeadersRead, cancellationToken);

                response.EnsureSuccessStatusCode();
                startTcs.TrySetResult(null);
            }
            catch (Exception ex)
            {
                Log.TransportStopping(_logger);
                startTcs.TrySetException(ex);
                return;
            }

            using (var stream = await response.Content.ReadAsStreamAsync())
            {
                var pipeOptions    = new PipeOptions(pauseWriterThreshold: 0, resumeWriterThreshold: 0);
                var pipelineReader = StreamPipeConnection.CreateReader(pipeOptions, stream);
                var readCancellationRegistration = cancellationToken.Register(
                    reader => ((PipeReader)reader).CancelPendingRead(), pipelineReader);
                try
                {
                    while (true)
                    {
                        var result = await pipelineReader.ReadAsync();

                        var input = result.Buffer;
                        if (result.IsCanceled || (input.IsEmpty && result.IsCompleted))
                        {
                            Log.EventStreamEnded(_logger);
                            break;
                        }

                        var consumed = input.Start;
                        var examined = input.End;
                        try
                        {
                            Log.ParsingSSE(_logger, input.Length);
                            var parseResult = _parser.ParseMessage(input, out consumed, out examined, out var buffer);

                            switch (parseResult)
                            {
                            case ServerSentEventsMessageParser.ParseResult.Completed:
                                Log.MessageToApp(_logger, buffer.Length);
                                await _application.Output.WriteAsync(buffer);

                                _parser.Reset();
                                break;

                            case ServerSentEventsMessageParser.ParseResult.Incomplete:
                                if (result.IsCompleted)
                                {
                                    throw new FormatException("Incomplete message.");
                                }
                                break;
                            }
                        }
                        finally
                        {
                            pipelineReader.AdvanceTo(consumed, examined);
                        }
                    }
                }
                catch (OperationCanceledException)
                {
                    Log.ReceiveCanceled(_logger);
                }
                finally
                {
                    readCancellationRegistration.Dispose();
                    _transportCts.Cancel();
                    Log.ReceiveStopped(_logger);
                }
            }
        }
コード例 #6
0
        private async Task OpenConnection(Channel <byte[], SendMessage> application, Uri url, CancellationToken cancellationToken)
        {
            _logger.StartReceive();

            var request = new HttpRequestMessage(HttpMethod.Get, url);

            SendUtils.PrepareHttpRequest(request, _httpOptions);
            request.Headers.Accept.Add(new MediaTypeWithQualityHeaderValue("text/event-stream"));
            var response = await _httpClient.SendAsync(request, HttpCompletionOption.ResponseHeadersRead, cancellationToken);

            var stream = await response.Content.ReadAsStreamAsync();

            var pipelineReader = StreamPipeConnection.CreateReader(new PipeOptions(_memoryPool), stream);
            var readCancellationRegistration = cancellationToken.Register(
                reader => ((IPipeReader)reader).CancelPendingRead(), pipelineReader);

            try
            {
                while (true)
                {
                    var result = await pipelineReader.ReadAsync();

                    var input = result.Buffer;
                    if (result.IsCancelled || (input.IsEmpty && result.IsCompleted))
                    {
                        _logger.EventStreamEnded();
                        break;
                    }

                    var consumed = input.Start;
                    var examined = input.End;

                    try
                    {
                        var parseResult = _parser.ParseMessage(input, out consumed, out examined, out var buffer);

                        switch (parseResult)
                        {
                        case ServerSentEventsMessageParser.ParseResult.Completed:
                            _application.Writer.TryWrite(buffer);
                            _parser.Reset();
                            break;

                        case ServerSentEventsMessageParser.ParseResult.Incomplete:
                            if (result.IsCompleted)
                            {
                                throw new FormatException("Incomplete message.");
                            }
                            break;
                        }
                    }
                    finally
                    {
                        pipelineReader.Advance(consumed, examined);
                    }
                }
            }
            catch (OperationCanceledException)
            {
                _logger.ReceiveCanceled();
            }
            finally
            {
                readCancellationRegistration.Dispose();
                _transportCts.Cancel();
                stream.Dispose();
                _logger.ReceiveStopped();
            }
        }