App-Phoebe
view release on metacpan or search on metacpan
lib/App/Phoebe/Oddmuse.pm view on Meta::CPAN
sub oddmuse_serve_file_page {
my $stream = shift;
my $id = shift;
my $type = shift;
my $data = shift;
$log->info("Serving $id as $type file");
$data = decode_base64($data);
$log->debug("Bytes: " . length($data));
success($stream, $type);
binmode(STDOUT, ":raw");
$stream->write($data);
}
sub oddmuse_serve_gemini_page {
my $stream = shift;
my $host = shift;
my $space = shift;
my $id = shift;
my $text = shift;
my $revision = shift;
script/gemini view on Meta::CPAN
warn "$header\n";
if ($header =~ /^2\d* (?:text\/\S+)?(?:; *charset=(\S+))?$/g) {
# empty, or text without charset defaults to UTF-8
$encoding = $1 || 'UTF-8';
}
$bytes =~ s/^(.*?)\r\n//;
return unless $bytes;
if (-t STDOUT) {
# connected to a tty
if ($force) {
binmode(STDOUT, ":raw");
print $bytes;
} elsif ($encoding) {
if ($encoding eq $ENCODING_CONSOLE_OUT) {
print $bytes;
} else {
warn "The console takes $ENCODING_CONSOLE_OUT but this text uses $encoding, so better not print it (use --force to do it anyway)\n";
warn "Or even better, redirect it to a file:\n";
warn "gemini $uri > data.txt\n";
Mojo::IOLoop->stop;
}
} else {
my $extension = extension($header);
warn "Better not to print binary data to a terminal (use --force to do it anyway)\n";
warn "Or even better, redirect it to a file:\n";
warn "gemini $uri > data.$extension\n";
Mojo::IOLoop->stop;
}
} else {
# connected to a file or pipe
binmode(STDOUT, ":raw");
print $bytes;
}
} else {
# continuing to print
print $bytes;
}});
# Write request
warn "Requesting $uri\n" if $verbose;
$stream->write("$uri\r\n")});
script/phoebe-ctl view on Meta::CPAN
package Gemini::Wiki::Control;
use Modern::Perl '2018';
use File::Slurper qw(read_dir read_text write_text);
use Encode qw(encode_utf8 decode_utf8);
use Getopt::Long;
use Pod::Text;
use File::Path qw(remove_tree);
use POSIX qw(round);
use utf8;
binmode(STDOUT, ":utf8");
my $log = 2;
my $dir = "./wiki";
my @sources;
my $target;
my $no_extension;
GetOptions (
"log=i" => \$log,
"wiki_dir=s" => \$dir,
"source=s" => \@sources,
t/oddmuse-wiki.pl view on Meta::CPAN
InitRequest(); # make sure we can report errors before InitRequest
print GetHttpHeader('text/html', 'nocache', $status), GetHtmlHeader(T('Error')),
$q->start_div({class=>'error'}), $q->h1(QuoteHtml($errmsg)), @html, $q->end_div,
$q->end_html, "\n\n"; # newlines for FCGI because of exit()
WriteStringToFile("$TempDir/error", '<body>' . $q->h1("$status $errmsg") . $q->Dump) if $log;
map { ReleaseLockDir($_); } keys %Locks;
exit 2;
}
sub Init {
binmode(STDOUT, ':encoding(UTF-8)'); # this is where the HTML gets printed
binmode(STDERR, ':encoding(UTF-8)'); # just in case somebody prints debug info to stderr
InitDirConfig();
$FS = "\x1e"; # The FS character is the RECORD SEPARATOR control char in ASCII
$Message = ''; # Warnings and non-fatal errors.
InitLinkPatterns(); # Link pattern can be changed in config files
InitModules(); # Modules come first so that users can change module variables in config
InitConfig(); # Config comes as early as possible; remember $q is not available here
InitRequest(); # get $q with $MaxPost; set these in the config file
InitCookie(); # After InitRequest, because $q is used
InitVariables(); # After config, to change variables, after InitCookie for GetParam
}
t/oddmuse-wiki.pl view on Meta::CPAN
my ($revisionPage, $revision) = GetTextRevision(GetParam('revision', '')); # maybe revision reset!
my $text = $revisionPage->{text};
if (my ($type, $encoding) = TextIsFile($text)) {
my ($data) = $text =~ /^[^\n]*\n(.*)/s;
my %allowed = map {$_ => 1} @UploadTypes;
if (@UploadTypes and not $allowed{$type}) {
ReportError(Ts('Files of type %s are not allowed.', $type), '415 UNSUPPORTED MEDIA TYPE');
}
print GetHttpHeader($type, $Page{ts}, undef, $encoding);
require MIME::Base64;
binmode(STDOUT, ":pop:raw"); # need to pop utf8 for Windows users!?
print MIME::Base64::decode($data);
} else {
print GetHttpHeader('text/plain', $Page{ts});
print $text;
}
}
sub DoPassword {
my $id = shift;
print GetHeader('', T('Password')), $q->start_div({-class=>'content password'});
( run in 0.943 second using v1.01-cache-2.11-cpan-3cd7ad12f66 )