| 43 | | } |
| 44 | | |
| 45 | | sub dispatch { |
| 46 | | my $path = $ENV{PATH_INFO} || '/'; |
| 47 | | $path =~ s!^/+!!g; |
| 48 | | if ($path =~ /^[a-z0-9_]*$/) { |
| 49 | | $path ||= 'index'; |
| 50 | | my $cdir = controller_dir(); |
| 51 | | my $controller = "${cdir}/${path}.pl"; |
| 52 | | my $controller_mt = controller_dir() . "/${path}.mt"; |
| 53 | | if (-f $controller) { |
| 54 | | my $meth = "do_$path"; |
| 55 | | package main; |
| 56 | | do $controller; |
| 57 | | if (my $e = $@) { |
| 58 | | if (ref $e) { |
| 59 | | warn "KTKR"; |
| 60 | | return; |
| 61 | | } else { |
| 62 | | die $e; |
| 63 | | } |
| 64 | | } |
| 65 | | die $@ if $@; |
| 66 | | if (my $code = main->can($meth)) { |
| 67 | | $code->(); |
| 68 | | die "なにも出力してません"; |
| 69 | | } else { |
| 70 | | die "「${path}」というモードは存在しません!${controller} の中に ${meth} が定義されていないようです"; |
| 71 | | } |
| 72 | | } elsif (-f $controller_mt) { |
| 73 | | my $out = __render_partial("${path}.mt", controller_dir()); |
| 74 | | utf8::encode($out); |
| 75 | | print "Content-Type: text/html; charset=utf-8\r\n"; |
| 76 | | print "\r\n"; |
| 77 | | print $out; |
| 78 | | } else { |
| 79 | | die "「${path}」というモードは存在しません。コントローラファイルもありません(${controller})。テンプレートファイルもありません(${controller_mt})"; |
| 80 | | } |
| 81 | | } elsif ($path ne 'menta.cgi' && -f "app/$path" && $path =~ /^static\//) { |
| 82 | | $path = "app/$path"; |
| 83 | | if (open my $fh, '<', $path) { |
| 84 | | binmode $fh; |
| 85 | | binmode STDOUT; |
| 86 | | printf "Content-Type: %s\r\n\r\n", guess_mime_type($path); |
| 87 | | print do { local $/; <$fh> }; |
| 88 | | close $fh; |
| 89 | | } else { |
| 90 | | die "ファイルが開きません"; |
| 91 | | } |
| 92 | | } elsif ($path =~ /^(?:crossdomain\.xml|favicon\.ico|robots\.txt)$/) { |
| 93 | | print "status: 404\r\ncontent-type: text/plain\r\n\r\n"; |
| 94 | | } else { |
| 95 | | die "${path} を処理する方法がわかりません"; |
| 96 | | } |