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); }
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); }