Como hacer un mini web server con rack

Autor: Gastón Ramos
Publicado: Thu Mar 23 11:51:30 ART 2017
[ Home ] - [ Blog ]

Desde hace algunos años (desde el año 2007 aproximadamente) mantengo mi página web gastonramos.com.ar es un sitio obviamente personal que tiene algunas cosas sobre mí donde muestro un poco lo que hago, no es un página que requiera muchas actualizaciones, lo que más se actualiza es la parte de mi portfolio por este motivo decidí utilizar una tecnología revolucionaria que se llama html, sí! soy un romántico, escribo el html en mi editor de texto y absolutamente nada más, así que poner a andar mi página web en un servidor nuevo es muy sencillo, sólo necesito un servidor web de mi preferencia, que en mi caso es Nginx. Pero bueno el caso es que ahora también estoy manteniendo la página web de la empresa que también está escrita en html, pero como esta página tiene un blog (que es de dónde estás leyendo esto) supongo que se me va a complicar seguir escribiendo html, me gustaría al menos tener la posibilidad de usar algo así como partials, es decir incluir partes comunes en todas las páginas, además también me gustaría tener mi propio contador de visitas. Si bien todavía no estoy seguro de agregar complejidad a esta página web, empecé a escribir una mini app en rack para hacer un prototipo de lo que supuestamente necesito.

La idea es hacer un app rack para servir archivos html por el momento pero que además tengan la posibilidad de incluir otros archivos dentro (partials) así que lo que voy a hacer es usar alguna lib de plantillas para ruby, como Erb o Mote, así que sin más acá la primer versión de lo que escribí, por ahora lo único que hace es servir archivos html estáticos.

Continuará...


class WebTon
  def call(env)
    @env = env

    self.path_find.each do |f|
      return [ 200, {'Content-Type' => 'text/html'},
               [ File.read(f) ] ] if File.exist? f
    end

    [ 404, {}, ["NOT FOUND"]]
  end

  def path_find
    return ['./index.html', './index.htm'] if @env['PATH_INFO'] == "/"

    if File.extname( @env['PATH_INFO'] ).empty?
      [ ".#{@env['PATH_INFO']}", ".#{@env['PATH_INFO']}/index.html",
        ".#{@env['PATH_INFO']}/index.htm"]
    else
      [ ".#{@env['PATH_INFO']}" ]
    end
  end
end

Rack::Handler::WEBrick.run WebTon.new