b625d21 10 years ago
1 contributor
50 lines | 1.334kb
<%
  my $path = param('Path');
  my $user = param('user');
  my $project = param('project');

  # Protect directory traversal
  if ($path =~ m#\.\.#) {
    $self->render_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 = Mojo::Asset::File->new(path => "$rep_home/$user/$project.git/info/refs");
  my $content = $file->slurp;
  if (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;
  }
%>