public void HandleApplication( IRequest request, Stream inputStream, Stream outputStream, Action writeComplete, Action<string> setStatus, Action<IDictionary<string,string>> setHeaders ) { var userApplication = Router.GetApplicationFor( request ); var responseHelper = new ResponseHelper( Configuration ); var writer = new ResponseWriter( outputStream, writeComplete ); responseHelper.Initialize( ( status, headers, setup ) => { setStatus( status ); setHeaders( headers ); setup( writer.OnNext, writer.OnError, writer.OnComplete ); } ); request.Body = ( next, error, complete ) => { inputStream.QueueRead( next, error, complete ); return () => { }; }; request.Response = responseHelper; userApplication.Run( request.ToEnvironmentDictionary(), responseHelper.Respond, Console.WriteLine ); }
public void CreateApplication( SocketClient client, ArraySegment<byte> bytes ) { client.Application = Router.GetApplicationFor( client.Request ); var responseHelper = new ResponseHelper( Configuration ); var writer = new ResponseWriter( client.Socket, responseHelper.PendingWrite, () => RequestComplete( client ) ); responseHelper.Initialize( ( status, headers, setup ) => { writer.Begin( status, headers ); setup( writer.OnNext, writer.OnError, writer.OnComplete ); } ); client.Request.Body = ( next, error, complete ) => { client.Next = ( c, b ) => { if( b.Count == 0 ) client.ReadComplete(); else if( !next( b, () => ReadOrComplete( c ) ) ) ReadOrComplete( c ); }; client.ReadError = error; client.ReadComplete = () => { client.ReadComplete = () => { }; client.Next = ParseRequest; client.Request = new Request( ( remaining, canHaveBody ) => HandleRemainingBytes( client, remaining, canHaveBody ) ); complete(); }; return () => client.Socket.Close(); }; client.Request.Response = responseHelper; client.Application.Run( client.Request.ToEnvironmentDictionary(), responseHelper.Respond, Console.WriteLine ); client.Next( client, bytes ); }