Beispiel #1
0
        private static async Task PongServer(IPipelineConnection connection)
        {
            while (true)
            {
                var result = await connection.Input.ReadAsync();

                var inputBuffer = result.Buffer;

                if (inputBuffer.IsEmpty && result.IsCompleted)
                {
                    connection.Input.Advance(inputBuffer.End);
                    break;
                }

                if (inputBuffer.Length < 4)
                {
                    connection.Input.Advance(inputBuffer.Start, inputBuffer.End);
                }
                else
                {
                    bool isPing = inputBuffer.Equals(_ping);
                    if (isPing)
                    {
                        await connection.Output.WriteAsync(_pong);
                    }
                    else
                    {
                        break;
                    }

                    connection.Input.Advance(inputBuffer.End);
                }
            }
        }
 public SecurePipelineConnection(IPipelineConnection pipeline, PipelineFactory factory, SecurePipelineListener listener)
 {
     _listener         = listener;
     _lowerConnection  = pipeline;
     _outputPipe       = factory.Create();
     _inputPipe        = factory.Create();
     _handshakePipe    = factory.Create();
     _handshakeOutpipe = factory.Create();
     StartReading();
 }
Beispiel #3
0
        static async Task <Tuple <int, int, int> > PingClient(IPipelineConnection connection, int messagesToSend)
        {
            int count = 0;
            var watch = Stopwatch.StartNew();
            int sendCount = 0, replyCount = 0;

            for (int i = 0; i < messagesToSend; i++)
            {
                await connection.Output.WriteAsync(_ping);

                sendCount++;

                bool havePong = false;
                while (true)
                {
                    var result = await connection.Input.ReadAsync();

                    var inputBuffer = result.Buffer;

                    if (inputBuffer.IsEmpty && result.IsCompleted)
                    {
                        connection.Input.Advance(inputBuffer.End);
                        break;
                    }
                    if (inputBuffer.Length < 4)
                    {
                        connection.Input.Advance(inputBuffer.Start, inputBuffer.End);
                    }
                    else
                    {
                        havePong = inputBuffer.Equals(_ping);
                        if (havePong)
                        {
                            count++;
                        }
                        connection.Input.Advance(inputBuffer.End);
                        break;
                    }
                }

                if (havePong)
                {
                    replyCount++;
                }
                else
                {
                    break;
                }
            }
            connection.Input.Complete();
            connection.Output.Complete();
            watch.Stop();

            return(Tuple.Create(sendCount, replyCount, (int)watch.ElapsedMilliseconds));
        }
Beispiel #4
0
        private async Task Echo(IPipelineConnection connection)
        {
            while (true)
            {
                var result = await connection.Input.ReadAsync();

                var request = result.Buffer;

                if (request.IsEmpty && result.IsCompleted)
                {
                    connection.Input.Advance(request.End);
                    break;
                }

                int len      = request.Length;
                var response = connection.Output.Alloc();
                response.Append(request);
                await response.FlushAsync();

                connection.Input.Advance(request.End);
            }
        }
Beispiel #5
0
        private static async Task ProcessClient <TContext>(IHttpApplication <TContext> application, IPipelineConnection pipelineConnection)
        {
            var connection = new HttpConnection <TContext>(application, pipelineConnection.Input, pipelineConnection.Output);

            await connection.ProcessAllRequests();
        }
Beispiel #6
0
 public void Initialize(IPipelineConnection connection)
 {
     _textOutput = new PipelineTextOutput(connection.Output, EncodingData.InvariantUtf8);
 }
Beispiel #7
0
 public static IPipelineConnection MakePipeline(IPipelineConnection connection)
 {
     // Do something fancy here to wrap the connection, SSL etc
     return(connection);
 }
Beispiel #8
0
 public static Stream GetStream(this IPipelineConnection connection)
 {
     return(new PipelineConnectionStream(connection));
 }
Beispiel #9
0
 public PipelineConnectionStream(IPipelineConnection connection)
 {
     _connection = connection;
 }
Beispiel #10
0
        public static async Task HandleConnection(IPipelineConnection connection)
        {
            var httpParser = new HttpRequestParser();

            while (true)
            {
                // Wait for data
                var result = await connection.Input.ReadAsync();

                var input = result.Buffer;
                Console.WriteLine("Http data received");
                try
                {
                    if (input.IsEmpty && result.IsCompleted)
                    {
                        // No more data
                        break;
                    }

                    // Parse the input http request
                    var parseResult = httpParser.ParseRequest(ref input);

                    switch (parseResult)
                    {
                    case HttpRequestParser.ParseResult.Incomplete:
                        Console.WriteLine("Incomplete parsed");
                        if (result.IsCompleted)
                        {
                            // Didn't get the whole request and the connection ended
                            throw new EndOfStreamException();
                        }
                        // Need more data
                        continue;

                    case HttpRequestParser.ParseResult.Complete:
                        Console.WriteLine("Parsing completed");
                        break;

                    case HttpRequestParser.ParseResult.BadRequest:
                        Console.WriteLine("Parsing bad request");
                        throw new Exception();

                    default:
                        break;
                    }


                    //// Writing directly to pooled buffers
                    //var output = connection.Output.Alloc();
                    //var formatter = new OutputFormatter<WritableBuffer>(output, EncodingData.InvariantUtf8);
                    //formatter.Append("HTTP/1.1 200 OK");
                    //formatter.Append("\r\nContent-Length: 13");
                    //formatter.Append("\r\nContent-Type: text/plain");
                    //formatter.Append("\r\n\r\n");
                    //formatter.Append("Hello, World!");
                    //await output.FlushAsync();
                    if (httpParser.Method.Length == 3 && httpParser.Method.StartsWith(_getMethod))
                    {
                        var path      = httpParser.Path.GetUtf8String();
                        var cacheItem = _cache.GetCacheItem(path);
                        if (cacheItem != null)
                        {
                            var output    = connection.Output.Alloc();
                            var formatter = new OutputFormatter <WritableBuffer>(output, EncodingData.InvariantUtf8);
                            formatter.Append("HTTP/1.1 200 OK");
                            formatter.Append("\r\nContent-Length: ");
                            formatter.Append(cacheItem.Content.Length);
                            formatter.Append("\r\nContent-Type: ");
                            output.Write(cacheItem.ContentType);
                            formatter.Append("\r\n\r\n");
                            output.Write(cacheItem.Content);
                            Console.WriteLine($"{path}-HTTP / 1.1 200 OK");
                            await output.FlushAsync();
                        }
                        else
                        {
                            var output    = connection.Output.Alloc();
                            var formatter = new OutputFormatter <WritableBuffer>(output, EncodingData.InvariantUtf8);
                            formatter.Append("HTTP/1.1 404 NOT FOUND");
                            formatter.Append("\r\nContent-Length: 0");
                            formatter.Append("\r\n\r\n");
                            Console.WriteLine($"{path}-HTTP / 1.1 404 NOT FOUND");
                            await output.FlushAsync();
                        }
                    }
                    else
                    {
                        var output    = connection.Output.Alloc();
                        var formatter = new OutputFormatter <WritableBuffer>(output, EncodingData.InvariantUtf8);
                        formatter.Append("HTTP/1.1 404 NOT FOUND");
                        formatter.Append("\r\nContent-Length: 0");
                        formatter.Append("\r\n\r\n");
                        await output.FlushAsync();
                    }
                    if (httpParser.RequestHeaders["Connection"] == "close")
                    {
                        connection.Output.Complete();
                    }
                    httpParser.Reset();
                }
                finally
                {
                    // Consume the input
                    connection.Input.Advance(input.Start, input.End);
                }
            }
        }
Beispiel #11
0
        private async Task Echo(IPipelineConnection connection)
        {
            while (true)
            {
                var result = await connection.Input.ReadAsync();
                var request = result.Buffer;

                if (request.IsEmpty && result.IsCompleted)
                {
                    connection.Input.Advance(request.End);
                    break;
                }

                int len = request.Length;
                var response = connection.Output.Alloc();
                response.Append(request);
                await response.FlushAsync();
                connection.Input.Advance(request.End);
            }
        }
Beispiel #12
0
        private static async Task PongServer(IPipelineConnection connection)
        {
            while (true)
            {
                var result = await connection.Input.ReadAsync();
                var inputBuffer = result.Buffer;

                if (inputBuffer.IsEmpty && result.IsCompleted)
                {
                    connection.Input.Advance(inputBuffer.End);
                    break;
                }

                if (inputBuffer.Length < 4)
                {
                    connection.Input.Advance(inputBuffer.Start, inputBuffer.End);
                }
                else
                {
                    bool isPing = inputBuffer.Equals(_ping);
                    if (isPing)
                    {
                        await connection.Output.WriteAsync(_pong);
                    }
                    else
                    {
                        break;
                    }

                    connection.Input.Advance(inputBuffer.End);
                }
            }
        }
Beispiel #13
0
        static async Task<Tuple<int, int, int>> PingClient(IPipelineConnection connection, int messagesToSend)
        {
            int count = 0;
            var watch = Stopwatch.StartNew();
            int sendCount = 0, replyCount = 0;
            for (int i = 0; i < messagesToSend; i++)
            {
                await connection.Output.WriteAsync(_ping);
                sendCount++;

                bool havePong = false;
                while (true)
                {
                    var result = await connection.Input.ReadAsync();
                    var inputBuffer = result.Buffer;

                    if (inputBuffer.IsEmpty && result.IsCompleted)
                    {
                        connection.Input.Advance(inputBuffer.End);
                        break;
                    }
                    if (inputBuffer.Length < 4)
                    {
                        connection.Input.Advance(inputBuffer.Start, inputBuffer.End);
                    }
                    else
                    {
                        havePong = inputBuffer.Equals(_ping);
                        if (havePong)
                        {
                            count++;
                        }
                        connection.Input.Advance(inputBuffer.End);
                        break;
                    }
                }

                if (havePong)
                {
                    replyCount++;
                }
                else
                {
                    break;
                }
            }
            connection.Input.Complete();
            connection.Output.Complete();
            watch.Stop();

            return Tuple.Create(sendCount, replyCount, (int)watch.ElapsedMilliseconds);

        }
Beispiel #14
0
 public SecurePipelineConnection CreateSecureClientPipeline(IPipelineConnection pipeline)
 {
     return(new SecurePipelineConnection(pipeline, _factory, this));
 }