# -*- coding: utf-8; -*- module TDiary class Dispatcher class IndexMain def self.run( request, cgi ) new( request, cgi ).run end attr_reader :request, :cgi, :conf, :tdiary, :params def initialize( request, cgi ) @request = request @cgi = cgi @conf = TDiary::Configuration::new( cgi, request ) @params = request.params end def run begin status = nil @tdiary = create_tdiary begin head = { 'Content-Type' => 'text/html', 'Vary' => 'User-Agent' } head['status'] = status if status body = '' head['Last-Modified'] = CGI::rfc1123_date( tdiary.last_modified ) if request.head? head['Pragma'] = 'no-cache' head['Cache-Control'] = 'no-cache' return TDiary::Response.new( '', 200, head ) else if request.mobile_agent? body = conf.to_mobile( tdiary.eval_rhtml( 'i.' ) ) head['charset'] = conf.mobile_encoding head['Content-Length'] = body.bytesize.to_s else require 'digest/md5' body = tdiary.eval_rhtml head['ETag'] = %Q["#{Digest::MD5.hexdigest( body )}"] if ENV['HTTP_IF_NONE_MATCH'] == head['ETag'] and request.get? then head['status'] = CGI::HTTP_STATUS['NOT_MODIFIED'] else head['charset'] = conf.encoding head['Content-Length'] = body.bytesize.to_s end head['Pragma'] = 'no-cache' head['Cache-Control'] = 'no-cache' head['X-Frame-Options'] = conf.x_frame_options if conf.x_frame_options end head['cookie'] = tdiary.cookies if tdiary.cookies.size > 0 TDiary::Response.new( body, ::TDiary::Dispatcher.extract_status_for_legacy_tdiary( head ), head ) end rescue TDiary::NotFound body = %Q[

404 Not Found

#{' ' * 500}
] TDiary::Response.new( body, 404, { 'Content-Type' => 'text/html' } ) end rescue TDiary::ForceRedirect head = { #'Location' => $!.path 'Content-Type' => 'text/html', } body = %Q[ moving... Wait or Click here! ] head['cookie'] = tdiary.cookies if tdiary && tdiary.cookies.size > 0 # TODO return code should be 302? (current behaviour returns 200) TDiary::Response.new( body, 200, head ) end end def create_tdiary begin if params['comment'] tdiary = TDiary::TDiaryComment::new( cgi, "day.rhtml", conf ) elsif params['plugin'] tdiary = TDiary::TDiaryPluginView::new( cgi, '', conf ) elsif (date = params['date']) if /^\d{8}-\d+$/ =~ date tdiary = TDiary::TDiaryLatest::new( cgi, "latest.rhtml", conf ) elsif /^\d{8}$/ =~ date tdiary = TDiary::TDiaryDay::new( cgi, "day.rhtml", conf ) elsif /^\d{6}$/ =~ date tdiary = TDiary::TDiaryMonth::new( cgi, "month.rhtml", conf ) elsif /^\d{4}$/ =~ date tdiary = TDiary::TDiaryNYear::new( cgi, "month.rhtml", conf ) end elsif params['category'] tdiary = TDiary::TDiaryCategoryView::new( cgi, "category.rhtml", conf ) elsif params['q'] tdiary = TDiary::TDiarySearch::new( cgi, "search.rhtml", conf ) else tdiary = TDiary::TDiaryLatest::new( cgi, "latest.rhtml", conf ) end rescue TDiary::PermissionError raise rescue TDiary::TDiaryError end ( tdiary ? tdiary : TDiary::TDiaryLatest::new( cgi, "latest.rhtml", conf ) ) end end end end # Local Variables: # mode: ruby # indent-tabs-mode: t # tab-width: 3 # ruby-indent-level: 3 # End: # vim: ts=3