root/lang/ruby/ssb/libs/ssb.rb @ 2173

Revision 2173, 6.0 kB (checked in by ursm, 6 years ago)

lang/ruby/ssb: デバッグプリントが残ってました。ごめんなさい。

  • Property svn:mime-type set to text/x-ruby; charset=utf-8
  • Property svn:eol-style set to native
  • Property svn:keywords set to Id Date Author Rev URL
Line 
1# ssb.rb - SSB Application
2#
3# Author:: MIZOGUCHI Coji <mizoguchi.coji at gmail.com>
4# License:: Distributes under the same terms as Ruby
5 #
6# $Id$
7#
8require 'erb'
9require 'cgi'
10require 'net/http'
11require 'nkf'
12require 'ssb/ktai_spec'
13require 'ssb/emoji'
14require 'ssb/time_stamper'
15require 'ssb/misc'
16require 'ssb/request'
17
18module SSB
19  class Application
20    def initialize
21      @time_stamp = SSB::TimeStamper.new
22    end
23
24    # リクエスト開始 〜 終了
25    def request_time
26      @time_stamp.diff(:request_start, :request_finish)
27    end
28
29    # 処理開始 〜 処理完了
30    def proc_time
31      @time_stamp.diff(:request_finish, :proc_finish)
32    end
33
34    # リクエスト終了 〜 処理完了
35    def total_time
36      proc_time + request_time
37    end
38
39    def log(request_method, query, user_agent, uid)
40      open(File.join(SSB::CONFIG[:home_dir], 'logs', 'browser.log'), 'a+') do |log|
41        now = Time.now
42        log.print now
43        log.print "\t", request_method, "\t", query, "\t", user_agent, "\t", uid, "\n"
44      end
45    end
46
47    def process_response(res, response)
48      response_header = nil
49      source = page = 'N/A'
50
51      if response.nil?
52        page = 'response is nil'
53      else
54        if response.class == String
55          res.header['Content-Type'] = 'text/html; charset=utf-8'
56          page = NKF.nkf('-w', response.dup.untaint)
57        elsif response.code == '302' || response.code == '301'
58          response_header = response.header
59          res.header['Content-Type'] = 'text/html; charset=utf-8'
60          renderable = true
61          redirect = response.header['location'].to_s.dup.untaint
62          page = "<html><head></head><body><p style=\"background-color: #f0f000; color: navy\">[SSB]リダイレクトされました</p>"
63          page += "<p style=\"font-size:x-small\">#{redirect}</p><a href=\"#{redirect}\">リダイレクト先へ</a></body></html>"
64
65          source = CGI.escapeHTML(page.dup)
66
67          #cgi.header('location'=>'./?q='+CGI.escape(response.header['location']).to_s)
68          #exit
69        else
70          response_header = response.header
71          renderable = true
72          content_type = 'text/html'
73          if response.header['content-type'].nil?
74            content_type = 'text/plain'
75          elsif response.header['content-type'].include?('text/')
76            content_type = 'text/html'
77          elsif response.header['content-type'].include?('application/xhtml')
78            content_type = 'text/html'
79          else
80            renderable = false
81            content_type = response.header['content-type']
82          end
83
84          unless renderable
85            res.header['Content-Type'] = content_type
86            res.body = response.body
87            return
88          else
89            res.header['Content-Type'] = "#{content_type}; charset=utf-8"
90          end
91
92          page = response.body.dup.untaint
93          source = CGI.escapeHTML(NKF::nkf('-w', page))
94        end
95      end
96
97      [page,source]
98    end
99
100    def run(req, res)
101      # リクエストの生成
102      @ssb_uri = 'http://' + req.host + File.basename(req.script_name) + '/'
103      @request = SSB::Request.build_request(req)
104
105      # ログ
106      log(@request.method, @request.uri, @request.term.get_useragent(true), @request.term[:uid])
107      @time_stamp.stamp(:request_start)
108
109      # リクエスト
110      source = ''
111      response = nil
112      begin
113        response = @request.execute
114      rescue =>e
115        response = e.to_s + '<hr />' + e.backtrace.to_s
116      end
117      # リクエスト終了
118      @time_stamp.stamp(:request_finish)
119
120      page,source = process_response(res, response)
121      if res.body != ""
122        # レスポンスをまんま返しちゃったときとかはもうここで終わり。
123        return
124      end
125
126      # 変換処理終了
127      @time_stamp.stamp(:proc_finish)
128
129      output_template(@request.uri,
130                      response,
131                      @request.term,
132                      page,
133                      source,
134                      res)
135    end
136
137    def output_template(request_uri, response, term, page, source, res)
138      ssb = ''
139      tpl_file = 'ssb.rhtml'
140      template = open(File.join(SSB::CONFIG[:template_dir], tpl_file)).read.untaint
141
142      # レスポンスヘッダ
143      response_header = {}
144      response.each do |k,v|
145        response_header[k] = v
146      end
147
148
149      # <?xml をけす。IEのバグ対応
150      page.gsub!(/<\?([^\?]+)\?>/) { |s|
151        ''
152      }
153
154      # form action と a href と img src のURLを書き換え
155      page.gsub!(/ (action|href|src|data)[ ]*=[ ]*[\"']?([^>\"' ]+)[\"']?([^>]*)>/im) { |s|
156        begin
157          tag = $1.downcase
158          case tag
159          when 'src', 'data', 'href'
160            if $2.index('#') == 0
161              %Q! #{tag}="#{$2}"#{$3} target="_top" >!
162            elsif $2.index('/') == 0
163              %Q! #{tag}="./#{ssb}?q=#{CGI.escape(('http://' + request_uri.host + ':' + request_uri.port.to_s + $2).to_s)}"#{$3} target="_top" >!
164            else
165              %Q! #{tag}="./#{ssb}?q=#{CGI.escape((request_uri + $2).to_s)}"#{$3} target="_top" >!
166            end
167          when 'action'
168            %Q! #{tag}="./" #{$3}><input type="hidden" name="q" value="#{(request_uri + $2).to_s}" />!
169          end
170        rescue => err
171          ' ' + $1 + '=""'
172        end
173      }
174
175      # xx-small/xx-large を手加減
176      page.gsub!(/xx-small/im) { |s|
177        'small'
178      }
179      page.gsub!(/xx-large/im) { |s|
180        'large'
181      }
182
183      # 絵文字を <img> に変換
184      page = Emoji::emoji_conv(term, page)
185
186      page = NKF::nkf('-w', page)
187
188      # タイトル
189      page =~ /<title>(.+)<\/title>/
190      title = $1
191
192      page_js = page.gsub(/(\r|\n|\")/im) { |s|
193        case $1
194        when "\r"
195          "\\r"
196        when "\n"
197          "\\n"
198        # when "\""
199        #  "\\" + $1
200        else
201          $1
202        end
203      }
204
205      begin
206        erb = ERB.new(template)
207        res.body = erb.result(binding)
208      rescue => e
209        res.body = e
210      end
211    end
212
213  end
214
215end
Note: See TracBrowser for help on using the browser.