From 103346155fe2730f52171f96fd9bf778c205f803 Mon Sep 17 00:00:00 2001 From: mark_story Date: Tue, 6 Jul 2010 22:30:48 -0400 Subject: [PATCH] Fixing HttpSocket losing auth credentials when multiple requests are made with the same object. Fixes #893 --- cake/libs/http_socket.php | 12 +++++++---- cake/tests/cases/libs/http_socket.test.php | 25 ++++++++++++++++++++++ 2 files changed, 33 insertions(+), 4 deletions(-) diff --git a/cake/libs/http_socket.php b/cake/libs/http_socket.php index 6686ebbcee8..5d1198f387b 100644 --- a/cake/libs/http_socket.php +++ b/cake/libs/http_socket.php @@ -196,7 +196,10 @@ function request($request = array()) { $request['uri'] = null; } $uri = $this->_parseUri($request['uri']); - + $hadAuth = false; + if (is_array($uri) && array_key_exists('user', $uri)) { + $hadAuth = true; + } if (!isset($uri['host'])) { $host = $this->config['host']; } @@ -204,11 +207,14 @@ function request($request = array()) { $host = $request['host']; unset($request['host']); } - $request['uri'] = $this->url($request['uri']); $request['uri'] = $this->_parseUri($request['uri'], true); $this->request = Set::merge($this->request, $this->config['request'], $request); + if (!$hadAuth && !empty($this->config['request']['auth']['user'])) { + $this->request['uri']['user'] = $this->config['request']['auth']['user']; + $this->request['uri']['pass'] = $this->config['request']['auth']['pass']; + } $this->_configUri($this->request['uri']); if (isset($host)) { @@ -605,7 +611,6 @@ function _configUri($uri = null) { if (!isset($uri['host'])) { return false; } - $config = array( 'request' => array( 'uri' => array_intersect_key($uri, $this->config['request']['uri']), @@ -1049,7 +1054,6 @@ function reset($full = true) { if (empty($initalState)) { $initalState = get_class_vars(__CLASS__); } - if ($full == false) { $this->request = $initalState['request']; $this->response = $initalState['response']; diff --git a/cake/tests/cases/libs/http_socket.test.php b/cake/tests/cases/libs/http_socket.test.php index d61d654f52a..a492222352e 100644 --- a/cake/tests/cases/libs/http_socket.test.php +++ b/cake/tests/cases/libs/http_socket.test.php @@ -638,6 +638,31 @@ function testGet() { $this->RequestSocket->get('http://www.google.com/', null, array('auth' => array('user' => 'foo', 'pass' => 'bar'))); } +/** + * test that two consecutive get() calls reset the authentication credentials. + * + * @return void + */ + function testConsecutiveGetResetsAuthCredentials() { + $socket = new MockHttpSocket(); + $socket->config['request']['auth'] = array( + 'method' => 'Basic', + 'user' => 'mark', + 'pass' => 'secret' + ); + $socket->get('http://mark:secret@example.com/test'); + $this->assertEqual($socket->request['uri']['user'], 'mark'); + $this->assertEqual($socket->request['uri']['pass'], 'secret'); + + $socket->get('/test2'); + $this->assertEqual($socket->request['auth']['user'], 'mark'); + $this->assertEqual($socket->request['auth']['pass'], 'secret'); + + $socket->get('/test3'); + $this->assertEqual($socket->request['auth']['user'], 'mark'); + $this->assertEqual($socket->request['auth']['pass'], 'secret'); + } + /** * testPostPutDelete method *