// Procesar HTTP. private static async void StartConnectionListener(HttpListener listener) { // Esperar por una conexion. Y Retornar al invocador mientras espera. HttpListenerContext context = await listener.GetContextAsync(); // El semaforo termina. Y permite que otro Listener pueda empezar. sem.Release(); // Hacer algo con la conexion abierta. // Loguear el Request var requestInfo = $@"{context.Request.RemoteEndPoint}-{context.Request.HttpMethod}-{context.Request.Url.AbsoluteUri}"; Logger.Log(requestInfo, context.Request.InputStream); // Como retornar archivos del servidor // Configurar una carpeta donde buscar archivos -> Appsettings.json // Analizar el URL para hacer match con los archivos de la carpeta byte[] encodedMessage = new byte[0]; Console.WriteLine($"LocalPath:{context.Request.Url.LocalPath}"); if (context.Request.Url.LocalPath == "/") { var fileManager = new FileManager(Options.Root); List <string> files = fileManager.GetAllFiles(); ICustomBuilder indexPageBuilder = new IndexPageBuilder(); string response = indexPageBuilder.Build(files); encodedMessage = Encoding.UTF8.GetBytes(response); context.Response.ContentLength64 = encodedMessage.Length; } else { try { var fileManager = new FileManager(Options.Root); // Devuelve el archivo del disco duro. encodedMessage = fileManager.GetFileByName(context.Request.Url.LocalPath); context.Response.ContentLength64 = encodedMessage.Length; } catch { // Lanzar error 404 } } // TODO: Actividad. // Hacer un Metodo estatico que Recibe el Context y datos, y Devuelve el context con un Response await context.Response.OutputStream.WriteAsync(encodedMessage, 0, encodedMessage.Length); context.Response.OutputStream.Close(); }
public byte[] AnalyzeRequest(HttpListenerRequest request) { // Hacer algo con la conexion abierta. // Loguear el Request var requestInfo = $@"{request.RemoteEndPoint}-{request.HttpMethod}-{request.Url.AbsoluteUri}"; Logger.Log(requestInfo, request.InputStream); // TODO: Revisar los Evaluadores de HTTP Headers List <IHttpHeaderEvaluator> listOfEvaluators = new List <IHttpHeaderEvaluator>() { new AcceptEvaluator(), new StudentEvaluator(), new AcceptDatetimeEvaluator(), }; // Como retornar archivos del servidor // Configurar una carpeta donde buscar archivos -> Appsettings.json // Analizar el URL para hacer match con los archivos de la carpeta byte[] encodedMessage = new byte[0]; // Devuelve un mensaje de error del servidor web // Si los headers fallan al evaluar try { foreach (var evaluator in listOfEvaluators) { evaluator.Evaluate(request.Headers); } foreach (var header in request.Headers) { HttpHeaderManager.ValidateHeaderName(header.ToString()); } Console.WriteLine($"LocalPath:{request.Url.LocalPath}"); ICustomBuilder indexPageBuilder = new IndexPageBuilder(); if (request.Url.LocalPath == "/") { var fileManager = new FileManager(Options.Root); List <string> files = fileManager.GetAllFiles(); List <string> directories = fileManager.GetAllDirectories(); List <string> all = new List <string>(); all = files.Concat(directories).ToList(); string response = indexPageBuilder.Build(all); encodedMessage = Encoding.UTF8.GetBytes(response); } else { try { var fileManager = new FileManager(Options.Root); // Devuelve el archivo del disco duro. encodedMessage = fileManager.GetFileByName(request.Url.LocalPath); } catch (FileNotFoundException ex) { string msg = ex.FileName; string responseNotFound = indexPageBuilder.PageNotFound(msg); encodedMessage = Encoding.UTF8.GetBytes(responseNotFound); //throw new FileNotFoundException("archivo no encontrado"); } catch (WebException ex) { var response = (HttpWebResponse)ex.Response; switch (response.StatusCode) { case HttpStatusCode.NotFound: string notfound = "<!DOCTYPE Html><html><head><title>" + response.StatusCode + "</title></head><body><h1>404 </h1> <h2>" + response.StatusDescription + "</h2></body></html>"; encodedMessage = Encoding.UTF8.GetBytes(notfound); break; case HttpStatusCode.InternalServerError: string internalError = "<!DOCTYPE Html><html><head><title>" + response.StatusCode + "</title></head><body><h1>404 </h1> <h2>" + response.StatusDescription + "</h2></body></html>"; encodedMessage = Encoding.UTF8.GetBytes(internalError); break; default: throw; } } } } catch (Exception ex) { OnRequestHeaderMissing(ex, new CustomArgs() { ErrorMessage = ex.Message + Environment.NewLine + ex.StackTrace }); encodedMessage = Encoding.UTF8.GetBytes(ex.Message + Environment.NewLine + ex.StackTrace); } return(encodedMessage); }
public byte[] AnalyzeRequest(System.Net.HttpListenerRequest request) { // Hacer algo con la conexion abierta. // Loguear el Request var requestInfo = $@"{request.RemoteEndPoint}-{request.HttpMethod}-{request.Url.AbsoluteUri}"; Logger.Log(requestInfo, request.InputStream); // TODO: Revisar los Evaluadores de HTTP Headers List <IHttpHeaderEvaluator> listOfEvaluators = new List <IHttpHeaderEvaluator>() { //new AcceptEvaluator(), //new StudentEvaluator(), //new AcceptDatetimeEvaluator(), }; // Como retornar archivos del servidor // Configurar una carpeta donde buscar archivos -> Appsettings.json // Analizar el URL para hacer match con los archivos de la carpeta byte[] encodedMessage = new byte[0]; // Devuelve un mensaje de error del servidor web // Si los headers fallan al evaluar try { foreach (var evaluator in listOfEvaluators) { evaluator.Evaluate(request.Headers); } /* * foreach (var header in context.Request.Headers) * { * HttpHeaderManager.ValidateHeaderName(header.ToString()); * } */ Console.WriteLine($"LocalPath:{request.Url.LocalPath}"); if (request.Url.LocalPath == "/") { var fileManager = new FileManager(Options.Root); List <string> files = fileManager.GetAllFiles(); ICustomBuilder indexPageBuilder = new IndexPageBuilder(); string response = indexPageBuilder.Build(files); encodedMessage = Encoding.UTF8.GetBytes(response); } else { try { var fileManager = new FileManager(Options.Root); // Devuelve el archivo del disco duro. encodedMessage = fileManager.GetFileByName(request.Url.LocalPath); } catch { // Lanzar error 404 } } } catch (Exception ex) { OnRequestHeaderMissing(ex, new CustomArgs() { ErrorMessage = ex.Message + Environment.NewLine + ex.StackTrace }); encodedMessage = Encoding.UTF8.GetBytes(ex.Message + Environment.NewLine + ex.StackTrace); } return(encodedMessage); }