OK, aquí está la buena manera de hacerlo. Por supuesto, puede ser un complemento.
Nunca se debe hacer este tipo de cosas por la piratería en el interior del núcleo del bailarín, que más bien siempre se debe considerar la implementación de un controlador de ruta para hacer el trabajo:
#!/usr/bin/env perl
use Dancer;
use File::Spec;
use Dancer::FileUtils 'read_file_content';
use Dancer::MIME;
use HTTP::Date;
# your routes here
# then the catchall route for
# serving static files
# better in config
my @public_dirs = qw(/tmp/test/foo /tmp/test/bar /tmp/test/baz);
get '/**' => sub {
my $path = request->path;
my $mime = Dancer::MIME->instance;
# security checks
return send_error("unauthrorized request", 403) if $path =~ /\0/;
return send_error("unauthrorized request", 403) if $path =~ /\.\./;
# decompose the path_info into a file path
my @path = split '/', $path;
for my $location (@public_dirs) {
my $file_path = File::Spec->catfile($location, @path);
next if ! -f $file_path;
my $content = read_file_content($file_path);
my $content_type = $mime->for_file($file_path);
my @stat = stat $file_path;
header 'Content-Type', $content_type;
header 'Content-Length', $stat[7];
header 'Last-Modified', HTTP::Date::time2str($stat[9]);
return $content;
}
pass;
};
start;
Un ejemplo de esta aplicación en ejecución:
$ mkdir -p /tmp/test/foo /tmp/test/bar /tmp/test/baz
$ echo 1 > /tmp/test/foo/foo.txt
$ echo 2 > /tmp/test/bar/bar.txt
$ echo 3 > /tmp/test/baz/baz.txt
$ ./bin/app.pl
$ curl -I http://0:3000/baz.txt
HTTP/1.0 200 OK
Content-Length: 2
Content-Type: text/plain
Last-Modified: Fri, 14 Oct 2011 11:28:03 GMT
X-Powered-By: Perl Dancer 1.3051
La idea es que ambos directorios deben permanecer separados. – bliof
@bliof Actualicé mi respuesta, puede intentar esto, pero mejor vaya con nginx. – yko
Estaba pensando en otra cosa. ¿Podría hacer 'foo' un complemento y usarlo en 'barra'? La verdadera pregunta es si un plugin de Dancer tiene la funcionalidad de una aplicación de bailarina. Me refiero a ¿podría mapear URL desde allí y cargar plantillas desde su carpeta 'vistas'?/Nunca he escrito un complemento/ – bliof