Index: lib/mouseHole/proxyhandler.rb =================================================================== --- lib/mouseHole/proxyhandler.rb (revision 78) +++ lib/mouseHole/proxyhandler.rb (working copy) @@ -127,6 +127,8 @@ end # @logger.info("start #{env['request-method']} http:#{env['path-info']}") + env['server-name'], env['server-port'], path = + @central.redirect(env['server-name'], env['server-port'], path) http = Net::HTTP.new(env['server-name'], env['server-port'], @central.options.proxy_host, @central.options.proxy_port) http.open_timeout = 10 http.read_timeout = 20 Index: lib/mouseHole/app.rb =================================================================== --- lib/mouseHole/app.rb (revision 78) +++ lib/mouseHole/app.rb (working copy) @@ -21,6 +21,13 @@ def broken?; false end + def ugly_rewrites? page + if @rules + rule = @rules.detect { |rule| rule.match_uri(page.location) } + return rule && rule.action == :ugly_rewrite + end + end + def rewrites? page if @rules rule = @rules.detect { |rule| rule.match_uri(page.location) } @@ -29,6 +36,14 @@ end end + def do_ugly_rewrite(page) + begin + ugly_rewrite(page) + rescue Exception => e + puts "[#{self.name}] #{e.class}: #{e.message}" + end + end + def do_rewrite(page) @document = page.document begin @@ -145,12 +160,13 @@ end def -@; @action = :ignore end def +@; @action = :rewrite end + def u; @action = :ugly_rewrite end end class URL < Rule - def initialize(expr) + def initialize(expr, action = :rewrite) @expr = expr - @action = :rewrite + @action = action end def match_uri(uri) if @expr.respond_to? :source Index: lib/mouseHole/central.rb =================================================================== --- lib/mouseHole/central.rb (revision 78) +++ lib/mouseHole/central.rb (working copy) @@ -73,18 +73,42 @@ end end + def find_ugly_rewrites page + refresh_apps + @apps.values.find_all do |app| + app.ugly_rewrites? page + end + end + def rewrite(page, resin) + ugly_apps = find_ugly_rewrites(page) apps = find_rewrites(page) - return false if apps.empty? + + return false if ugly_apps.empty? && apps.empty? if page.decode(resin) + ugly_apps.each do |app| + app.do_ugly_rewrite(page) + end + end + + if !apps.empty? && page.convert! apps.each do |app| app.do_rewrite(page) end end true end - + + def redirect(host, port, path) + @apps.values.find_all do |app| + if app.respond_to?(:redirect) + host, port, path = app.redirect(host, port, path) + end + end + [host, port, path] + end + def app_list refresh_apps @apps.values Index: lib/mouseHole/page.rb =================================================================== --- lib/mouseHole/page.rb (revision 78) +++ lib/mouseHole/page.rb (working copy) @@ -49,15 +49,19 @@ self.headers['content-encoding'] = nil end - @document = @converter.parse(self, body) - if @document + @document = body + true + end + + def convert! + if @document = @converter.parse(self, @document) true else @document = body false end - end - + end + class ElementNotFound < StandardError; end def method_missing(ele, &b)