Advertisement
Guest User

Untitled

a guest
Oct 13th, 2015
93
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.62 KB | None | 0 0
  1. use strict;
  2. use warnings;
  3. use Plack::MIME; # mimeタイプ自動判別用
  4. use Data::Dumper;
  5. use File::Slurp; # 効率的な静的ファイル応答
  6.  
  7. # 静的ファイル置き場
  8. my $public_dir = './public';
  9.  
  10. # ディレクトリインデックスの指定
  11. my $index_files = ['index.html','index.htm','top.html'];
  12.  
  13. # psgiアプリ本体
  14. my $app = sub {
  15. my $env = shift; # plackからの環境変数等が格納されたhashref
  16.  
  17. # PATH_INFO毎に実行するサブルーチンを定義
  18. my $responses = {
  19. '/top' => sub {
  20. return [
  21. 200,
  22. [ 'Content-Type' => 'text/plain' ],
  23. [ 'Welcome!' ]
  24. ];
  25. },
  26. '/func_test' => sub {
  27. my $ans=0;
  28. for(1 .. 100){ $ans += $_; }
  29. return [
  30. 200,
  31. [ 'Content-Type' => 'text/plain' ],
  32. [ $ans ]
  33. ];
  34. },
  35. '/dump_test' => sub {
  36. return [
  37. 200,
  38. [ 'Content-Type' => 'text/plain' ],
  39. [ Dumper $env ]
  40. ];
  41. },
  42. };
  43.  
  44. # 404 Not Foundレスポンス
  45. my $not_found = [
  46. 404,
  47. ['Content-Type' => 'text/plain'],
  48. ['404 Not found']
  49. ];
  50. # mime type
  51. my $mime = 'application/octet-stream'; # 不明時のデフォルト
  52. if($env->{PATH_INFO} =~ /(\.[^\.]+?)$/i){
  53. my $extension = $1;
  54. $mime = Plack::MIME->mime_type($extension);
  55. }
  56.  
  57. # PATH_INFOから処理を振り分け
  58. if(defined($responses->{$env->{PATH_INFO}})){
  59. # $responsesに定義済みの場合に実行
  60. return $responses->{$env->{PATH_INFO}}->();
  61. }elsif(-f $public_dir.$env->{PATH_INFO}){
  62. # 静的ファイルが存在する場合に実行
  63. return [
  64. 200,
  65. ['Content-Type' => $mime],
  66. [read_file($public_dir.$env->{PATH_INFO})],
  67. ];
  68. }else{
  69. # ファイル指定されていない場合はディレクトリインデックスをサーチ
  70. foreach my $index_file (@$index_files){
  71. if(-f $public_dir.$env->{PATH_INFO}.$index_file){
  72. if($index_file =~ /(\.[^\.]+?)$/i){
  73. my $extension = $1;
  74. $mime = Plack::MIME->mime_type($extension);
  75. }
  76. return [
  77. 200,
  78. ['Content-Type' => $mime],
  79. [read_file($public_dir.$env->{PATH_INFO}.$index_file)],
  80. ];
  81. }
  82. }
  83. # 最終的に見つからなかった場合は 404 Not Found
  84. return $not_found;
  85. }
  86. };
  87.  
  88.  
  89. return $app;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement