<?xml version="1.0" encoding="UTF-8"?>
<commit>
  <added type="array"/>
  <modified type="array">
    <modified>
      <diff>@@ -110,7 +110,7 @@ For example:
       @http_method  = http_method
       @data         = data
 
-      request_page(response.headers[&quot;Location&quot;], :get, data) if redirect?
+      request_page(response_location, :get, data) if internal_redirect?
 
       return response
     end
@@ -118,11 +118,15 @@ For example:
     def success_code? #:nodoc:
       (200..499).include?(response_code)
     end
-    
+
     def redirect? #:nodoc:
       response_code / 100 == 3
     end
 
+    def internal_redirect? #:nodoc:
+      redirect? &amp;&amp; current_host == response_location_host
+    end
+
     def exception_caught? #:nodoc:
       response_body =~ /Exception caught/
     end
@@ -222,6 +226,18 @@ For example:
 
   private
 
+    def response_location
+      response.headers[&quot;Location&quot;]
+    end
+
+    def current_host
+      URI.parse(current_url).host || &quot;www.example.com&quot;
+    end
+
+    def response_location_host
+      URI.parse(response_location).host || &quot;www.example.com&quot;
+    end
+
     def reset
       @elements     = {}
       @_scopes      = nil</diff>
      <filename>lib/webrat/core/session.rb</filename>
    </modified>
    <modified>
      <diff>@@ -7,8 +7,12 @@ class Testing &lt; Application
   def submit_form
   end
   
-  def redirect_to_root
+  def internal_redirect
     redirect &quot;/&quot;
   end
   
+  def external_redirect
+    redirect &quot;http://google.com&quot;
+  end
+  
 end
\ No newline at end of file</diff>
      <filename>spec/integration/merb/app/controllers/testing.rb</filename>
    </modified>
    <modified>
      <diff>@@ -28,5 +28,6 @@
 Merb.logger.info(&quot;Compiling routes...&quot;)
 Merb::Router.prepare do
   match(&quot;/&quot;).to(:controller =&gt; &quot;testing&quot;, :action =&gt; &quot;show_form&quot;)
-  match(&quot;/redirect&quot;).to(:controller =&gt; &quot;testing&quot;, :action =&gt; &quot;redirect_to_root&quot;)
+  match(&quot;/internal_redirect&quot;).to(:controller =&gt; &quot;testing&quot;, :action =&gt; &quot;internal_redirect&quot;)
+  match(&quot;/external_redirect&quot;).to(:controller =&gt; &quot;testing&quot;, :action =&gt; &quot;external_redirect&quot;)
 end
\ No newline at end of file</diff>
      <filename>spec/integration/merb/config/router.rb</filename>
    </modified>
    <modified>
      <diff>@@ -14,8 +14,14 @@ describe &quot;Webrat&quot; do
     click_button &quot;Test&quot;
   end
 
-  it &quot;should follow redirects&quot; do
-    response = visit &quot;/redirect&quot;
+  it &quot;should follow internal redirects&quot; do
+    response = visit &quot;/internal_redirect&quot;
+    response.status.should == 200
     response.should contain(&quot;Webrat Form&quot;)
   end
+
+  it &quot;should not follow external redirects&quot; do
+    response = visit &quot;/external_redirect&quot;
+    response.status.should == 302
+  end
 end
\ No newline at end of file</diff>
      <filename>spec/integration/merb/spec/webrat_spec.rb</filename>
    </modified>
    <modified>
      <diff>@@ -7,8 +7,12 @@ class WebratController &lt; ApplicationController
     render :text =&gt; &quot;OK&quot;
   end
 
-  def redirect
+  def internal_redirect
     redirect_to :submit
   end
+  
+  def external_redirect
+    redirect_to &quot;http://google.com&quot;
+  end
 
 end
\ No newline at end of file</diff>
      <filename>spec/integration/rails/app/controllers/webrat_controller.rb</filename>
    </modified>
    <modified>
      <diff>@@ -1,7 +1,8 @@
 ActionController::Routing::Routes.draw do |map|
   map.with_options :controller =&gt; &quot;webrat&quot; do |webrat|
-    webrat.submit   &quot;/submit&quot;,    :action =&gt; &quot;submit&quot;
-    webrat.redirect &quot;/redirect&quot;,  :action =&gt; &quot;redirect&quot;
+    webrat.submit             &quot;/submit&quot;,            :action =&gt; &quot;submit&quot;
+    webrat.internal_redirect  &quot;/internal_redirect&quot;, :action =&gt; &quot;internal_redirect&quot;
+    webrat.external_redirect  &quot;/external_redirect&quot;, :action =&gt; &quot;external_redirect&quot;
 
     webrat.root :action =&gt; &quot;form&quot;
   end</diff>
      <filename>spec/integration/rails/config/routes.rb</filename>
    </modified>
    <modified>
      <diff>@@ -15,8 +15,13 @@ class WebratTest &lt; ActionController::IntegrationTest
     click_button &quot;Test&quot;
   end
 
-  test &quot;should follow redirects&quot; do
-    visit redirect_path
+  test &quot;should follow internal redirects&quot; do
+    visit internal_redirect_path
     assert response.body.include?(&quot;OK&quot;)
   end
+  
+  test &quot;should not follow external redirects&quot; do
+    visit external_redirect_path
+    assert response.redirect?
+  end
 end</diff>
      <filename>spec/integration/rails/test/integration/webrat_test.rb</filename>
    </modified>
    <modified>
      <diff>@@ -1,26 +1,30 @@
 require &quot;rubygems&quot;
 require &quot;sinatra&quot;
- 
+
 use_in_file_templates!
- 
+
 get &quot;/&quot; do
   erb :home
 end
- 
+
 get &quot;/go&quot; do
   erb :go
 end
 
-get &quot;/redirect&quot; do
+get &quot;/internal_redirect&quot; do
   redirect &quot;/&quot;
 end
- 
+
+get &quot;/external_redirect&quot; do
+  redirect &quot;http://google.com&quot;
+end
+
 post &quot;/go&quot; do
   @user = params[:name]
   @email = params[:email]
   erb :hello
 end
- 
+
 __END__
 
 @@ layout
@@ -31,10 +35,10 @@ __END__
     &lt;%= yield %&gt;
   &lt;/body&gt;
 &lt;/html&gt;
- 
+
 @@ home
 &lt;p&gt; visit &lt;a href=&quot;/go&quot;&gt;there&lt;/a&gt;&lt;/p&gt;
- 
+
 @@ go
 &lt;form method=&quot;post&quot; action=&quot;/go&quot;&gt;
   &lt;div&gt;
@@ -47,7 +51,7 @@ __END__
   &lt;/div&gt;
   &lt;input type=&quot;submit&quot; value=&quot;Submit&quot; /&gt;
 &lt;/form&gt;
- 
+
 @@ hello
 &lt;p&gt;Hello, &lt;%= @user %&gt;&lt;/p&gt;
 &lt;p&gt;Your email is: &lt;%= @email %&gt;&lt;/p&gt;
\ No newline at end of file</diff>
      <filename>spec/integration/sinatra/app.rb</filename>
    </modified>
    <modified>
      <diff>@@ -8,19 +8,24 @@ class WebratTest &lt; Test::Unit::TestCase
     click_link &quot;there&quot;
     assert response_body.include?('&lt;form method=&quot;post&quot; action=&quot;/go&quot;&gt;')
   end
-  
+
   def test_submits_form
     visit &quot;/go&quot;
     fill_in &quot;Name&quot;, :with =&gt; &quot;World&quot;
     fill_in &quot;Email&quot;, :with =&gt; &quot;world@example.org&quot;
     click_button &quot;Submit&quot;
-    
+
     assert response_body.include?(&quot;Hello, World&quot;)
     assert response_body.include?(&quot;Your email is: world@example.org&quot;)
   end
-  
-  def test_follows_redirects
-    visit &quot;/redirect&quot;
+
+  def test_follows_internal_redirects
+    visit &quot;/internal_redirect&quot;
     assert response_body.include?(&quot;visit&quot;)
   end
+
+  def test_does_not_follow_external_redirects
+    visit &quot;/external_redirect&quot;
+    assert response_code == 302
+  end
 end</diff>
      <filename>spec/integration/sinatra/test/webrat_test.rb</filename>
    </modified>
    <modified>
      <diff>@@ -113,14 +113,22 @@ describe Webrat::Session do
       lambda { webrat_session.request_page('some url', :get, {}) }.should raise_error(Webrat::PageLoadError)
     end
 
-    it &quot;should follow redirects&quot; do
-      webrat_session.should_receive(:redirect?).twice.and_return(true, false)
+    it &quot;should follow internal redirects&quot; do
+      webrat_session.should_receive(:internal_redirect?).twice.and_return(true, false)
       webrat_session.response.should_receive(:headers).once.and_return({ &quot;Location&quot; =&gt; &quot;/newurl&quot; })
 
       webrat_session.request_page(&quot;/oldurl&quot;, :get, {})
 
       webrat_session.current_url.should == &quot;/newurl&quot;
     end
+
+    it &quot;should now follow external redirects&quot; do
+      webrat_session.should_receive(:internal_redirect?).and_return(false)
+
+      webrat_session.request_page(&quot;/oldurl&quot;, :get, {})
+
+      webrat_session.current_url.should == &quot;/oldurl&quot;
+    end
   end
 
   describe &quot;#redirect?&quot; do
@@ -138,4 +146,29 @@ describe Webrat::Session do
       webrat_session.redirect?.should be_false
     end
   end
+  
+  describe &quot;#internal_redirect?&quot; do
+    before(:each) do
+      webrat_session = Webrat::Session.new
+    end
+
+    it &quot;should return true if the last response was a redirect and the host of the current_url matches that of the response location&quot; do
+      webrat_session.stub!(:redirect?         =&gt; true)
+      webrat_session.stub!(:current_url       =&gt; &quot;http://example.com&quot;)
+      webrat_session.stub!(:response_location =&gt; &quot;http://example.com&quot;)
+      webrat_session.internal_redirect?.should be_true
+    end
+    
+    it &quot;should return false if the last response was not a redirect&quot; do
+      webrat_session.stub!(:redirect? =&gt; false)
+      webrat_session.internal_redirect?.should be_false
+    end
+    
+    it &quot;should return false if the last response was a redirect but the host of the current_url doesn't matches that of the response location&quot; do
+      webrat_session.stub!(:redirect?         =&gt; true)
+      webrat_session.stub!(:current_url       =&gt; &quot;http://example.com&quot;)
+      webrat_session.stub!(:response_location =&gt; &quot;http://google.com&quot;)
+      webrat_session.internal_redirect?.should be_false
+    end
+  end
 end
\ No newline at end of file</diff>
      <filename>spec/private/core/session_spec.rb</filename>
    </modified>
    <modified>
      <diff>@@ -31,14 +31,22 @@ describe &quot;visit&quot; do
     lambda { fill_in &quot;foo&quot;, :with =&gt; &quot;blah&quot; }.should raise_error(Webrat::WebratError)
   end
 
-  it &quot;should follow redirects&quot; do
-    webrat_session.should_receive(:redirect?).twice.and_return(true, false)
+  it &quot;should follow internal redirects&quot; do
+    webrat_session.should_receive(:internal_redirect?).twice.and_return(true, false)
     webrat_session.response.should_receive(:headers).once.and_return({ &quot;Location&quot; =&gt; &quot;/newurl&quot; })
 
     visit(&quot;/oldurl&quot;)
 
     current_url.should == &quot;/newurl&quot;
   end
+
+  it &quot;should not follow external redirects&quot; do
+    webrat_session.should_receive(:internal_redirect?).and_return(false)
+
+    visit(&quot;/oldurl&quot;)
+
+    current_url.should == &quot;/oldurl&quot;
+  end
 end
 
 describe &quot;visit with referer&quot; do</diff>
      <filename>spec/public/visit_spec.rb</filename>
    </modified>
  </modified>
  <removed type="array"/>
  <parents type="array">
    <parent>
      <id>4565a3cea641b79a77661b4bda6d3b21f7644886</id>
    </parent>
  </parents>
  <author>
    <name>Josh Knowles</name>
    <email>joshknowles@gmail.com</email>
  </author>
  <url>http://github.com/brynary/webrat/commit/9825aee47efa7c3ef438db5ce10f410d3f8938c8</url>
  <id>9825aee47efa7c3ef438db5ce10f410d3f8938c8</id>
  <committed-date>2009-01-04T20:56:52-08:00</committed-date>
  <authored-date>2009-01-04T20:56:52-08:00</authored-date>
  <message>Don't follow external redirects</message>
  <tree>bdaa28523bd575a4816d1549d7e3ecafe44b9dd5</tree>
  <committer>
    <name>Josh Knowles</name>
    <email>joshknowles@gmail.com</email>
  </committer>
</commit>
