1 contributor
<%
my $path = param('Path');
my $user = param('user');
my $project = param('project');
# Protect directory traversal
if ($path =~ m#\.\.#) {
$self->reply->exception('Invalid URL');
return;
}
# Content type
my $content_type;
if ($path eq 'HEAD'
|| $path eq 'objects/info/alternates'
|| $path eq 'objects/info/http-alternates'
)
{
$content_type = 'text/plain';
}
elsif ($path eq 'objects/info/packs') {
$content_type = 'text/plain; charset=UTF-8';
}
elsif ($path =~ m#^objects/[0-9a-f]{2}/[0-9a-f]{38}$#) {
$content_type = 'application/x-git-loose-object';
}
elsif ($path =~ m#^objects/pack/pack-[0-9a-f]{40}\.pack$#) {
$content_type = 'application/x-git-packed-objects';
}
elsif ($path =~ m#^objects/pack/pack-[0-9a-f]{40}\.idx$#) {
$content_type = 'application/x-git-packed-objects-toc';
}
my $rep_home = app->git->rep_home;
my $file = "$rep_home/$user/$project.git/$path";
if (-f $file) {
my $asset = Mojo::Asset::File->new(path => $file);
my $content = $asset->slurp;
$content = '' unless defined $content;
$self->res->headers->content_type($content_type);
$self->res->headers->content_length(length $content);
$self->res->body($content);
$self->res->code(200);
$self->rendered;
return;
}
else {
$self->res->code(404);
$self->rendered;
return;
}
%>