From 7b794139efe122b01b87bcedf1ed5e1c85b84821 Mon Sep 17 00:00:00 2001 From: Kai Rubarth Date: Thu, 18 Sep 2014 16:14:54 +0200 Subject: [PATCH 1/2] support external redirects --- lib/rack/url.rb | 16 +++++++++++++++- test/rack/rewritten_url_test.rb | 18 ++++++++++++++++++ 2 files changed, 33 insertions(+), 1 deletion(-) diff --git a/lib/rack/url.rb b/lib/rack/url.rb index 3e9767a..8698623 100644 --- a/lib/rack/url.rb +++ b/lib/rack/url.rb @@ -14,6 +14,14 @@ def initialize(app, &block) instance_eval(&block) if block_given? end + def is_internal_target?(url) + url.nil? or url.start_with?('/') or url.start_with?('http://www.example.org') + end + + def is_external_target?(url) + !is_internal_target?(url) + end + def call(env) req = Rack::Request.new(env) @@ -22,7 +30,13 @@ def call(env) path = "#{subdomain}#{req.path_info}" path.downcase! if downcase_before_lookup? - if ::Rewritten.includes?(path.chomp("/")) or backwards=( translate_backwards? && ::Rewritten.exist_translation_for?(path) ) + target_url = ::Rewritten.translate(path) + + if is_external_target?(target_url) + r = Rack::Response.new + r.redirect(target_url, 301) + r.finish + elsif ::Rewritten.includes?(path.chomp("/")) or backwards=( translate_backwards? && ::Rewritten.exist_translation_for?(path) ) to = ::Rewritten.includes?(path.chomp("/")) || path diff --git a/test/rack/rewritten_url_test.rb b/test/rack/rewritten_url_test.rb index babcbf4..8cdb43d 100644 --- a/test/rack/rewritten_url_test.rb +++ b/test/rack/rewritten_url_test.rb @@ -61,6 +61,24 @@ def request_url(url, params={}) ret[0].must_equal 200 end + describe 'external redirection' do + + before { + @app = MiniTest::Mock.new + @rack = Rack::Rewritten::Url.new(@app) + + Rewritten.add_translation '/external/target', 'http://www.external.com' + } + + it "must redirect to external target" do + ret = @rack.call request_url('/external/target') + @app.verify + ret[0].must_equal 301 + ret[1]['Location'].must_equal "http://www.external.com" + end + + end + describe "partial translation" do before do From 23ce741525b2e50f90d6c761aedea11c188e85c4 Mon Sep 17 00:00:00 2001 From: Kai Rubarth Date: Thu, 18 Sep 2014 16:21:24 +0200 Subject: [PATCH 2/2] make base_url configurable --- lib/rack/url.rb | 5 ++++- test/rack/rewritten_url_test.rb | 4 +++- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/lib/rack/url.rb b/lib/rack/url.rb index 8698623..98a24d2 100644 --- a/lib/rack/url.rb +++ b/lib/rack/url.rb @@ -6,16 +6,19 @@ module Rewritten class Url + attr_accessor :base_url + def initialize(app, &block) @app = app @translate_backwards = false @downcase_before_lookup = false @translate_partial = false + @base_url = '' instance_eval(&block) if block_given? end def is_internal_target?(url) - url.nil? or url.start_with?('/') or url.start_with?('http://www.example.org') + url.nil? or url.start_with?('/') or url.start_with?(@base_url) end def is_external_target?(url) diff --git a/test/rack/rewritten_url_test.rb b/test/rack/rewritten_url_test.rb index 8cdb43d..c04f14e 100644 --- a/test/rack/rewritten_url_test.rb +++ b/test/rack/rewritten_url_test.rb @@ -65,7 +65,9 @@ def request_url(url, params={}) before { @app = MiniTest::Mock.new - @rack = Rack::Rewritten::Url.new(@app) + @rack = Rack::Rewritten::Url.new(@app) do |config| + config.base_url = 'http://www.example.org' + end Rewritten.add_translation '/external/target', 'http://www.external.com' }