Browse Source

Merge pull request #7809 from ndm2/fix-request-action-cookies

Fix cookies not being passed for requested actions.
Mark Story 10 years ago
parent
commit
56516eaf26

+ 2 - 1
src/Controller/Component/RequestHandlerComponent.php

@@ -271,7 +271,8 @@ class RequestHandlerComponent extends Component
             'environment' => [
                 'REQUEST_METHOD' => 'GET'
             ],
-            'query' => $query
+            'query' => $query,
+            'cookies' => $request->cookies
         ]));
         $response->statusCode(200);
         return $response;

+ 3 - 0
src/Routing/RequestActionTrait.php

@@ -139,6 +139,9 @@ trait RequestActionTrait
         if (isset($extra['query'])) {
             $params['query'] = $extra['query'];
         }
+        if (isset($extra['cookies'])) {
+            $params['cookies'] = $extra['cookies'];
+        }
         if (isset($extra['environment'])) {
             $params['environment'] = $extra['environment'] + $_SERVER + $_ENV;
         }

+ 33 - 0
tests/TestCase/Controller/Component/RequestHandlerComponentTest.php

@@ -942,6 +942,39 @@ class RequestHandlerComponentTest extends TestCase
     }
 
     /**
+     * Test that AJAX requests involving redirects handle cookie data
+     *
+     * @return void
+     * @triggers Controller.beforeRedirect $this->Controller
+     */
+    public function testAjaxRedirectAsRequestActionWithCookieData()
+    {
+        Configure::write('App.namespace', 'TestApp');
+        Router::connect('/:controller/:action');
+        $event = new Event('Controller.beforeRedirect', $this->Controller);
+
+        $this->Controller->RequestHandler = new RequestHandlerComponent($this->Controller->components());
+        $this->Controller->request = $this->getMock('Cake\Network\Request', ['is']);
+        $this->Controller->response = $this->getMock('Cake\Network\Response', ['_sendHeader', 'stop']);
+        $this->Controller->RequestHandler->request = $this->Controller->request;
+        $this->Controller->RequestHandler->response = $this->Controller->response;
+        $this->Controller->request->expects($this->any())->method('is')->will($this->returnValue(true));
+
+        $cookies = [
+            'foo' => 'bar'
+        ];
+        $this->Controller->request->cookies = $cookies;
+
+        $response = $this->Controller->RequestHandler->beforeRedirect(
+            $event,
+            '/request_action/cookie_pass',
+            $this->Controller->response
+        );
+        $data = json_decode($response, true);
+        $this->assertEquals($cookies, $data);
+    }
+
+    /**
      * Tests that AJAX requests involving redirects don't let the status code bleed through.
      *
      * @return void

+ 18 - 0
tests/TestCase/Routing/RequestActionTraitTest.php

@@ -359,6 +359,24 @@ class RequestActionTraitTest extends TestCase
     }
 
     /**
+     * Test that requestAction handles cookies correctly.
+     *
+     * @return void
+     */
+    public function testRequestActionCookies()
+    {
+        $cookies = [
+            'foo' => 'bar'
+        ];
+        $result = $this->object->requestAction(
+            '/request_action/cookie_pass',
+            ['cookies' => $cookies]
+        );
+        $result = json_decode($result, true);
+        $this->assertEquals($cookies, $result);
+    }
+
+    /**
      * Test that environment overrides can be set.
      *
      * @return void

+ 11 - 0
tests/test_app/TestApp/Controller/RequestActionController.php

@@ -109,6 +109,17 @@ class RequestActionController extends AppController
     }
 
     /**
+     * cookie pass, testing cookie passing
+     *
+     * @return \Cake\Network\Response
+     */
+    public function cookie_pass()
+    {
+        $this->response->body(json_encode($this->request->cookies));
+        return $this->response;
+    }
+
+    /**
      * test param passing and parsing.
      *
      * @return \Cake\Network\Response