Ejemplo n.º 1
0
        // 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();
        }
Ejemplo n.º 2
0
        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);
        }
Ejemplo n.º 3
0
        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);
        }