From d83b5c4fd4f66e19978aaa298270e3003bbbbe4f Mon Sep 17 00:00:00 2001 From: makoto kuwata Date: Sun, 27 Jun 2010 21:01:55 +0900 Subject: [add] add 'contrib/index.cgi' and 'contrib/_htaccess' --- contrib/_htaccess | 8 +++++++ contrib/index.cgi | 67 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 75 insertions(+) create mode 100644 contrib/_htaccess create mode 100644 contrib/index.cgi (limited to 'contrib') diff --git a/contrib/_htaccess b/contrib/_htaccess new file mode 100644 index 0000000..532cbf2 --- /dev/null +++ b/contrib/_htaccess @@ -0,0 +1,8 @@ +## enable mod_rewrie +RewriteEngine on +## deny access to *.rhtml and *.cache +RewriteRule \.(rhtml|cache)$ - [R=404,L] +## rewrite only if requested file is not found +RewriteCond %{SCRIPT_FILENAME} !-f +## handle request to *.html by index.cgi +RewriteRule ^.*\.html$ index.cgi diff --git a/contrib/index.cgi b/contrib/index.cgi new file mode 100644 index 0000000..8d8f7a4 --- /dev/null +++ b/contrib/index.cgi @@ -0,0 +1,67 @@ +#!/usr/bin/env ruby + +### +### CGI script to handle *.rhtml with Erubis +### +### Licsense: same as Erubis +### + +require 'cgi' +require 'erubis' +include Erubis::XmlHelper + +ERUBY = Erubis::Eruby # or Erubis::EscapeEruby +encoding = 'utf-8' + +## helper class to represent http error +class HttpError < Exception + attr_accessor :status + def initialize(status, message) + super(message) + @status = status + end +end + + +## main +cgi = CGI.new +content_type = "text/html; charset=#{encoding}" +begin + + ## check environment variables + document_root = ENV['DOCUMENT_ROOT'] or raise "ENV['DOCUMENT_ROOT'] is not set." + request_uri = ENV['REQUEST_URI'] or raise "ENV['REQUEST_URI'] is not set." + ## get filepath + basepath = request_uri.split(/\?/, 2).first + filepath = File.join(document_root, basepath) + filepath.gsub!(/\.html\z/, '.rhtml') or # expected '*.html' + raise HttpError.new('500 Internal Error', 'invalid .htaccess configuration.') + File.file?(filepath) or # file not found + raise HttpError.new('404 Not Found', "#{basepath}: not found.") + basepath != ENV['SCRIPT_NAME'] or # can't access to index.cgi + raise HttpError.new('403 Forbidden', "#{basepath}: not accessable.") + ## process as eRuby file + eruby = ERUBY.load_file(filepath) # or ERUBY.new(File.read(filepath)) + html = eruby.result() + ## send response + print cgi.header('Content-Type'=>content_type, 'Content-Length'=>html.length) + print html + +rescue HttpError => ex + ## handle http error (such as 404 Not Found) + print cgi.header('Content-Type'=>content_type, 'Status'=>ex.status) + print "

#{h(ex.status)}

\n" + print "

#{h(ex.message)}

" + +rescue Exception => ex + ## print exception backtrace + print cgi.header('Content-Type'=>content_type, 'Status'=>'500 Internal Error') + arr = ex.backtrace + print "
\n"
+  print   "#{h(arr[0])}: #{h(ex.message)} (#{h(ex.class.name)})\n"
+  arr[1..-1].each do |item|
+    print "        from #{h(item)}\n"
+  end
+  print   "
\n" + +end -- cgit v1.2.1