App-phoebe
view release on metacpan or search on metacpan
lib/App/Phoebe/Web.pm view on Meta::CPAN
sub serve_history_via_http {
my $stream = shift;
my $host = shift;
my $space = shift;
my $id = shift;
my $n = shift;
$log->info("Serve history for $id via HTTP");
$stream->write("HTTP/1.1 200 OK\r\n");
$stream->write("Content-Type: text/html\r\n");
$stream->write("\r\n");
$stream->write("<!DOCTYPE html>\n");
$stream->write("<html>\n");
$stream->write("<head>\n");
$stream->write("<meta charset=\"utf-8\">\n");
$stream->write(encode_utf8 "<title>Page history for " . quote_html($id) . "</title>\n");
$stream->write("<link type=\"text/css\" rel=\"stylesheet\" href=\"/default.css\"/>\n");
$stream->write("<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n");
$stream->write("</head>\n");
$stream->write("<body>\n");
$stream->write(encode_utf8 "<h1>Page history for " . quote_html($id) . "</h1>\n");
my $dir = wiki_dir($host, $space);
my $log = "$dir/changes.log";
if (not -e $log) {
$stream->write("<p>No changes.\n");
return;
}
$stream->write("<p>Showing up to $n changes.\n");
my $fh = File::ReadBackwards->new($log);
my $first = 1;
my $more = changes($stream,
$n,
sub { $stream->write(encode_utf8 "<h2>" . shift . "</h2>\n") },
sub { $stream->write(encode_utf8 "<p>" . shift . " by " . colourize_html($stream, shift) . "\n") },
sub {
my ($host, $space, $title, $id) = @_;
$stream->write(encode_utf8 "<br> â " . link_html($stream, $host, $space, $title, $id) . "\n");
},
sub { "<br> â $_[0]" },
sub {
READ:
return unless $_ = decode_utf8($fh->readline);
chomp;
my ($ts, $id_log, $revision, $code) = split(/\x1f/);
goto READ if $id_log ne $id;
$ts, $id_log, $revision, $code, $host, $space, 0 });
return unless $more;
$stream->write("<p>" . link_html($stream, $host, $space, "More...", "history/" . uri_escape_utf8($id) . "/" . 10 * $n) . "\n");
}
sub serve_file_via_http {
my $stream = shift;
my $host = shift;
my $space = shift;
my $id = shift;
my $revision = shift;
$log->info("Serve file $id");
my $dir = wiki_dir($host, $space);
my $file = "$dir/file/$id";
my $meta = "$dir/meta/$id";
if (not -f $file) {
$stream->write("HTTP/1.1 404 Error\r\n");
$stream->write("Content-Type: text/plain\r\n");
$stream->write("\r\n");
$stream->write("File not found\r\n");
return;
} elsif (not -f $meta) {
$stream->write("HTTP/1.1 500 Error\r\n");
$stream->write("Content-Type: text/plain\r\n");
$stream->write("\r\n");
$stream->write("Metadata not found\r\n");
return;
}
my %meta = (map { split(/: /, $_, 2) } read_lines($meta));
if (not $meta{'content-type'}) {
$stream->write("HTTP/1.1 500 Error\r\n");
$stream->write("Content-Type: text/plain\r\n");
$stream->write("\r\n");
$stream->write("Metadata corrupt\r\n");
return;
}
$stream->write("HTTP/1.1 200 OK\r\n");
$stream->write("Content-Type: " . $meta{'content-type'} ."\r\n");
$stream->write("\r\n");
$stream->write(read_binary($file));
}
( run in 1.487 second using v1.01-cache-2.11-cpan-39bf76dae61 )