Ejemplo n.º 1
0
        private async void Process()
        {
            try
            {
                while (_client.Connected)
                {
                    // TODO : Configuration.
                    var limitedStream = new LimitedStream(_stream, readLimit: 1024*1024, writeLimit: 1024*1024);
                    var streamReader = new StreamReader(limitedStream);
                    
                    var request = await _requestProvider.Provide(streamReader).ConfigureAwait(false);

                    if (request != null)
                    {
                        UpdateLastOperationTime();

                        var context = new HttpContext(request, _client.RemoteEndPoint);

                        Logger.InfoFormat("{1} : Got request {0}", request.Uri, _client.RemoteEndPoint);

                        await _requestHandler(context).ConfigureAwait(false);

                        if (context.Response != null)
                        {
                            var streamWriter = new StreamWriter(limitedStream);
                            await WriteResponse(context, streamWriter);
                        }

                        UpdateLastOperationTime();
                    }
                    else
                    {
                        _client.Close();
                    }
                }
            }
            catch (Exception e)
            {
                // Hate people who make bad calls.
                Logger.Warn(string.Format("Error while serving : {0}", _remoteEndPoint), e);
                _client.Close();
            }

            Logger.InfoFormat("Lost Client {0}", _remoteEndPoint);
        }
Ejemplo n.º 2
0
        private async void Process()
        {
            try
            {
                while (_client.Connected)
                {
                    // TODO : Extract read and write limit to configuration.
                    var requestStream = new LimitedStream(_stream, readLimit: 1024*1024, writeLimit: 1024*1024);
                    
                    var request = await _requestProvider.Provide(new HttpStreamReader(requestStream, Encoding.UTF8)).ConfigureAwait(false);

                    if (request != null)
                    {

                        var context = new HttpContext(request);

                        Logger.InfoFormat("{1} : Got request {0}", request.Uri, _client.RemoteEndPoint);

                        var getResponse = BuildHandlers(context)();

                        await getResponse.ConfigureAwait(false);

                        var response = context.Response;

                        if (response != null)
                        {
                            var streamWriter = new StreamWriter(requestStream);
                            // Headers
                            await response.WriteHeaders(streamWriter).ConfigureAwait(false);

                            // Cookies
                            if (context.Cookies.Touched)
                            {
                                await streamWriter.WriteAsync(context.Cookies.ToCookieData())
                                    .ConfigureAwait(false);
                                await streamWriter.FlushAsync().ConfigureAwait(false);
                            }

                            // Empty Line
                            await requestStream.WriteAsync(CrLfBuffer, 0, CrLfBuffer.Length).ConfigureAwait(false);

                            // Body
                            await response.WriteResponse(streamWriter).ConfigureAwait(false);

                            if (!request.Headers.KeepAliveConnection() || response.CloseConnection)
                            {
                                _client.Close();
                            }
                        }
                    }
                    else
                    {
                        _client.Close();
                    }
                }
            }
            catch (SocketException)
            {
            }
            catch (IOException)
            {
                // Socket exceptions on read will be re-thrown as IOException by BufferedStream
                // ALSO : LimitedStream throws IOException on limit exceed.
            }
            catch (Exception e)
            {
                // Hate people who make bad calls.
                Logger.Warn(string.Format("Error while serving : {0} : {1}{2}", _remoteEndPoint, Environment.NewLine, e));
                _client.Close();
            }

            Logger.InfoFormat("Lost Client {0}", _remoteEndPoint);
        }