| 30 | | my $config = config(); |
| 31 | | if (! $config) { |
| 32 | | die "config() でアプリケーション設定がされていません!"; |
| 33 | | } |
| 34 | | |
| 35 | | my $input; |
| 36 | | if ($ENV{'REQUEST_METHOD'} eq "POST") { |
| 37 | | my $max_post_body = $config->{menta}->{max_post_body}; |
| 38 | | if ($max_post_body > 0 && $ENV{CONTENT_LENGTH} > $max_post_body) { |
| 39 | | die "投稿データが長すぎです"; |
| 40 | | } else { |
| 41 | | read(STDIN, $input, $ENV{'CONTENT_LENGTH'}); |
| | 35 | my $path = $ENV{PATH_INFO} || '/'; |
| | 36 | $path =~ s!^/+!!g; |
| | 37 | if ($path =~ /^[a-z0-9_]*$/) { |
| | 38 | my $mode = $path || 'index'; |
| | 39 | my $meth = "do_$mode"; |
| | 40 | if (my $code = main->can($meth)) { |
| | 41 | $code->(); |
| | 42 | unless ($MENTA::FINISHED) { |
| | 43 | die "なにも出力してません"; |
| | 44 | } |
| | 45 | } else { |
| | 46 | die "「${mode}」というモードは存在しません"; |
| | 47 | } |
| | 48 | } elsif (-f $path) { |
| | 49 | if (open my $fh, '<', $path) { |
| | 50 | printf "Content-Type: %s\r\n\r\n", guess_mime_type($path); |
| | 51 | print do { local $/; <$fh> }; |
| | 52 | close $fh; |
| | 53 | return 1; |
| | 54 | } else { |
| | 55 | die "ファイルが開きません"; |
| 44 | | $input = $ENV{QUERY_STRING}; |
| 45 | | } |
| 46 | | local $MENTA::REQ = {}; |
| 47 | | local $MENTA::FINISHED = 0; |
| 48 | | |
| 49 | | for ( split /&/, $input) { |
| 50 | | my ($key, $val) = split /=/, $_; |
| 51 | | if ($val) { |
| 52 | | $val =~ tr/+/ /; |
| 53 | | $val =~ s/%([a-fA-F0-9]{2})/pack("H2", $1)/eg; |
| 54 | | } |
| 55 | | $MENTA::REQ->{$key} = $val; |
| 56 | | } |
| 57 | | |
| 58 | | if (my $static_file = $ENV{PATH_INFO}) { |
| 59 | | $static_file =~ s!^/+!!g; |
| 60 | | if ($static_file !~ /\bmenta\.cgi\b/ && -f $static_file) { |
| 61 | | if (open my $fh, '<', $static_file) { |
| 62 | | printf "Content-Type: %s\r\n\r\n", guess_mime_type($static_file); |
| 63 | | print do { local $/; <$fh> }; |
| 64 | | close $fh; |
| 65 | | return 1; |
| 66 | | } else { |
| 67 | | die "ファイルが開きません"; |
| 68 | | } |
| 69 | | } |
| 70 | | } |
| 71 | | |
| 72 | | my $mode = $MENTA::REQ->{mode} || 'index'; |
| 73 | | my $meth = "do_$mode"; |
| 74 | | if (my $code = main->can($meth)) { |
| 75 | | $code->($MENTA::REQ); |
| 76 | | unless ($MENTA::FINISHED) { |
| 77 | | die "なにも出力してません"; |
| 78 | | } |
| 79 | | } else { |
| 80 | | die "「${mode}」というモードは存在しません"; |
| | 58 | die "$path を処理する方法がわかりません"; |
| | 180 | sub param { |
| | 181 | my $key = shift; |
| | 182 | |
| | 183 | unless (defined $MENTA::REQ) { |
| | 184 | my $input; |
| | 185 | if ($ENV{'REQUEST_METHOD'} eq "POST") { |
| | 186 | my $max_post_body = config()->{menta}->{max_post_body}; |
| | 187 | if ($max_post_body > 0 && $ENV{CONTENT_LENGTH} > $max_post_body) { |
| | 188 | die "投稿データが長すぎです"; |
| | 189 | } else { |
| | 190 | read(STDIN, $input, $ENV{'CONTENT_LENGTH'}); |
| | 191 | } |
| | 192 | } else { |
| | 193 | $input = $ENV{QUERY_STRING}; |
| | 194 | } |
| | 195 | |
| | 196 | for ( split /&/, $input) { |
| | 197 | my ($key, $val) = split /=/, $_; |
| | 198 | if ($val) { |
| | 199 | $val =~ tr/+/ /; |
| | 200 | $val =~ s/%([a-fA-F0-9]{2})/pack("H2", $1)/eg; |
| | 201 | } |
| | 202 | $MENTA::REQ->{$key} = $val; |
| | 203 | } |
| | 204 | } |
| | 205 | |
| | 206 | return $MENTA::REQ->{$key}; |
| | 207 | } |
| | 208 | |