Un Servidor Http Mínimo en C#

Published on Author lopezLeave a comment

Hace dos meses, escribí un post implementando un servidor HTTP mínimo en Java:

Un Servidor Http Mínimo en Java

En estos días, comencé a explorar node.js. Quiero implementar un servidor mínimo en AjSharp que mapee pedidos entrantes a funciones dinámincas, a la node.js/javascript. Pero antes de eso, quiero una implementación pura y mínima en C#. Podría usar TcpListener (similar al ServerSocket de Java) , como en el proyecto del 2001:

Create your own Web Server using C#

Pero en .NET, tenemos un web listener mínimo en la clase System.Net.HttpListener. Ver:

HttpListener for dummies: a simple “HTTP Request” reflector

Así, que usando esa clase, escribí un código de consola, mínimo:

class Program
{
    static string rootDirectory;
    static void Main(string[] args)
    {
        rootDirectory = args[0];
        HttpListener listener = new HttpListener();
        for (int k = 1; k < args.Length; k++)
            listener.Prefixes.Add(args[k]);
        listener.Start();
        while (true)
        {
            HttpListenerContext context = listener.GetContext();
            Process(context);
        }
    }
    private static void Process(HttpListenerContext context)
    {
        string filename = context.Request.Url.AbsolutePath;
        Console.WriteLine(filename);
        filename = filename.Substring(1);
        if (string.IsNullOrEmpty(filename))
            filename = "index.html";
        filename = Path.Combine(rootDirectory, filename);
        Stream input = new FileStream(filename, FileMode.Open);
        byte[] buffer = new byte[1024*16];
        int nbytes;
        while ((nbytes = input.Read(buffer, 0, buffer.Length)) > 0)
            context.Response.OutputStream.Write(buffer, 0, nbytes);
        input.Close();
        context.Response.OutputStream.Close();
    }
}

El web server retorna el contenido de archivos estáticos, desde un directorio raíz. El primer parámetro es el directorio raíz, y el resto de los parámetros son los patrones a escuchar:

El resultado, usando archivos estáticos que tengo en directorio de documentación de Tomcat:

La salida por consola:

Próximos pasos: usar este código en AjSharp. O extenderlo para soportar un pool de threads, o atender llamadas como /run/<comandoaejecutar> en el servidor.

Nos leemos!

Angel “Java” Lopez

http://www.ajlopez.com

http://twitter.com/ajlopez

Leave a Reply

Your email address will not be published. Required fields are marked *