Browse Source

Merge branch '2.0' into 2.1

Conflicts:
	lib/Cake/Network/Http/HttpSocket.php
Ceeram 14 years ago
parent
commit
c8eae93292

+ 2 - 1
lib/Cake/Network/Http/HttpSocket.php

@@ -402,7 +402,7 @@ class HttpSocket extends CakeSocket {
 			}
 			$this->config['request']['cookies'][$Host] = array_merge($this->config['request']['cookies'][$Host], $this->response->cookies);
 		}
-		
+
 		if($this->request['redirect'] && $this->response->isRedirect()) {
 			$request['uri'] = $this->response->getHeader('Location');
 			$request['redirect'] = is_int($this->request['redirect']) ? $this->request['redirect'] - 1 : $this->request['redirect'];
@@ -655,6 +655,7 @@ class HttpSocket extends CakeSocket {
 
 		$uri['path'] = preg_replace('/^\//', null, $uri['path']);
 		$uri['query'] = http_build_query($uri['query']);
+		$uri['query'] = rtrim($uri['query'], '=');
 		$stripIfEmpty = array(
 			'query' => '?%query',
 			'fragment' => '#%fragment',

+ 1 - 0
lib/Cake/Routing/Route/CakeRoute.php

@@ -284,6 +284,7 @@ class CakeRoute {
 			$separatorIsPresent = strpos($param, $namedConfig['separator']) !== false;
 			if ((!isset($this->options['named']) || !empty($this->options['named'])) && $separatorIsPresent) {
 				list($key, $val) = explode($namedConfig['separator'], $param, 2);
+				$key = rawurldecode($key);
 				$val = rawurldecode($val);
 				$hasRule = isset($rules[$key]);
 				$passIt = (!$hasRule && !$greedy) || ($hasRule && !$this->_matchNamed($val, $rules[$key], $context));

+ 21 - 1
lib/Cake/Test/Case/Network/Http/HttpSocketTest.php

@@ -554,7 +554,7 @@ class HttpSocketTest extends CakeTestCase {
 
 /**
  * Test the scheme + port keys
- * 
+ *
  * @return void
  */
 	public function testGetWithSchemeAndPort() {
@@ -573,6 +573,26 @@ class HttpSocketTest extends CakeTestCase {
 	}
 
 /**
+ * Test urls like http://cakephp.org/index.php?somestring without key/value pair for query
+ *
+ * @return void
+ */
+	public function testRequestWithStringQuery() {
+		$this->Socket->reset();
+		$request = array(
+			'uri' => array(
+				'scheme' => 'http',
+				'host' => 'cakephp.org',
+				'path' => 'index.php',
+				'query' => 'somestring'
+			),
+			'method' => 'GET'
+		);
+		$response = $this->Socket->request($request);
+		$this->assertContains("GET /index.php?somestring HTTP/1.1", $this->Socket->request['line']);
+	}
+
+/**
  * The "*" asterisk character is only allowed for the following methods: OPTIONS.
  *
  * @expectedException SocketException

+ 20 - 0
lib/Cake/Test/Case/Routing/Route/CakeRouteTest.php

@@ -404,6 +404,26 @@ class CakeRouteTest extends CakeTestCase {
 	}
 
 /**
+ * Ensure that keys at named parameters are urldecoded
+ *
+ * @return void
+ */
+	public function testParseNamedKeyUrlDecode() {
+		Router::connectNamed(true);
+		$route = new CakeRoute('/:controller/:action/*', array('plugin' => null));
+
+		// checking /post/index/user[0]:a/user[1]:b
+		$result = $route->parse('/posts/index/user%5B0%5D:a/user%5B1%5D:b');
+		$this->assertArrayHasKey('user', $result['named']);
+		$this->assertEquals(array('a', 'b'), $result['named']['user']);
+
+		// checking /post/index/user[]:a/user[]:b
+		$result = $route->parse('/posts/index/user%5B%5D:a/user%5B%5D:b');
+		$this->assertArrayHasKey('user', $result['named']);
+		$this->assertEquals(array('a', 'b'), $result['named']['user']);
+	}
+
+/**
  * test that named params with null/false are excluded
  *
  * @return void