2008-05-30 11:40:08 +00:00
< ? php
/**
2009-03-18 17:55:58 +00:00
* HttpSocketTest file
2008-05-30 11:40:08 +00:00
*
2010-10-03 16:31:21 +00:00
* PHP 5
2008-05-30 11:40:08 +00:00
*
2010-05-19 01:15:13 +00:00
* CakePHP ( tm ) Tests < http :// book . cakephp . org / view / 1196 / Testing >
2010-01-26 19:18:20 +00:00
* Copyright 2005 - 2010 , Cake Software Foundation , Inc . ( http :// cakefoundation . org )
2008-05-30 11:40:08 +00:00
*
2010-10-03 16:31:21 +00:00
* Licensed under The MIT License
* Redistributions of files must retain the above copyright notice
2008-05-30 11:40:08 +00:00
*
2010-01-26 19:18:20 +00:00
* @ copyright Copyright 2005 - 2010 , Cake Software Foundation , Inc . ( http :// cakefoundation . org )
2010-05-19 01:15:13 +00:00
* @ link http :// book . cakephp . org / view / 1196 / Testing CakePHP ( tm ) Tests
2009-03-18 17:55:58 +00:00
* @ package cake
2008-10-30 17:30:26 +00:00
* @ subpackage cake . tests . cases . libs
* @ since CakePHP ( tm ) v 1.2 . 0.4206
2010-10-03 16:27:27 +00:00
* @ license MIT License ( http :// www . opensource . org / licenses / mit - license . php )
2008-05-30 11:40:08 +00:00
*/
App :: import ( 'Core' , 'HttpSocket' );
2009-05-07 18:49:21 +00:00
2010-12-01 15:46:13 +00:00
/**
* TestAuthentication class
*
* @ package cake
* @ subpackage cake . tests . cases . libs
*/
class TestAuthentication {
/**
* authentication method
*
* @ param HttpSocket $http
2010-12-03 02:46:11 +00:00
* @ param array $authInfo
2010-12-01 15:46:13 +00:00
* @ return void
*/
2010-12-03 02:46:11 +00:00
public static function authentication ( HttpSocket $http , & $authInfo ) {
$http -> request [ 'header' ][ 'Authorization' ] = 'Test ' . $authInfo [ 'user' ] . '.' . $authInfo [ 'pass' ];
2010-12-01 15:46:13 +00:00
}
/**
* proxyAuthentication method
*
* @ param HttpSocket $http
2010-12-04 01:10:07 +00:00
* @ param array $proxyInfo
2010-12-01 15:46:13 +00:00
* @ return void
*/
2010-12-04 01:10:07 +00:00
public static function proxyAuthentication ( HttpSocket $http , & $proxyInfo ) {
$http -> request [ 'header' ][ 'Proxy-Authorization' ] = 'Test ' . $proxyInfo [ 'user' ] . '.' . $proxyInfo [ 'pass' ];
2010-12-01 15:46:13 +00:00
}
}
2009-05-07 18:49:21 +00:00
class TestHttpSocket extends HttpSocket {
2009-07-24 19:18:37 +00:00
2009-05-07 18:49:21 +00:00
/**
* Convenience method for testing protected method
*
* @ param mixed $uri URI ( see { @ link _parseUri ()})
* @ return array Current configuration settings
*/
function configUri ( $uri = null ) {
return parent :: _configUri ( $uri );
}
2009-07-24 19:18:37 +00:00
2009-05-07 18:49:21 +00:00
/**
* Convenience method for testing protected method
*
* @ param string $uri URI to parse
* @ param mixed $base If true use default URI config , otherwise indexed array to set 'scheme' , 'host' , 'port' , etc .
* @ return array Parsed URI
*/
function parseUri ( $uri = null , $base = array ()) {
return parent :: _parseUri ( $uri , $base );
}
2009-07-24 19:18:37 +00:00
2009-05-07 18:49:21 +00:00
/**
* Convenience method for testing protected method
*
* @ param array $uri A $uri array , or uses $this -> config if left empty
* @ param string $uriTemplate The Uri template / format to use
* @ return string A fully qualified URL formated according to $uriTemplate
*/
function buildUri ( $uri = array (), $uriTemplate = '%scheme://%user:%pass@%host:%port/%path?%query#%fragment' ) {
return parent :: _buildUri ( $uri , $uriTemplate );
}
2009-07-24 19:18:37 +00:00
2009-05-07 18:49:21 +00:00
/**
* Convenience method for testing protected method
*
* @ param array $header Header to build
* @ return string Header built from array
*/
function buildHeader ( $header , $mode = 'standard' ) {
return parent :: _buildHeader ( $header , $mode );
}
/**
* Convenience method for testing protected method
*
* @ param string $message Message to parse
* @ return array Parsed message ( with indexed elements such as raw , status , header , body )
*/
function parseResponse ( $message ) {
return parent :: _parseResponse ( $message );
}
2009-07-24 19:18:37 +00:00
2009-05-07 18:49:21 +00:00
/**
* Convenience method for testing protected method
*
* @ param array $header Header as an indexed array ( field => value )
* @ return array Parsed header
*/
function parseHeader ( $header ) {
return parent :: _parseHeader ( $header );
}
2009-07-24 19:18:37 +00:00
2009-05-07 18:49:21 +00:00
/**
* Convenience method for testing protected method
*
* @ param mixed $query A query string to parse into an array or an array to return directly " as is "
* @ return array The $query parsed into a possibly multi - level array . If an empty $query is given , an empty array is returned .
*/
function parseQuery ( $query ) {
return parent :: _parseQuery ( $query );
}
2009-07-24 19:18:37 +00:00
2009-05-07 18:49:21 +00:00
/**
* Convenience method for testing protected method
*
* @ param string $body A string continaing the body to decode
* @ param mixed $encoding Can be false in case no encoding is being used , or a string representing the encoding
* @ return mixed Array or false
*/
function decodeBody ( $body , $encoding = 'chunked' ) {
return parent :: _decodeBody ( $body , $encoding );
}
2009-07-24 19:18:37 +00:00
2009-05-07 18:49:21 +00:00
/**
* Convenience method for testing protected method
*
* @ param string $body A string continaing the chunked body to decode
* @ return mixed Array or false
*/
function decodeChunkedBody ( $body ) {
return parent :: _decodeChunkedBody ( $body );
}
2009-07-24 19:18:37 +00:00
2009-05-07 18:49:21 +00:00
/**
* Convenience method for testing protected method
*
* @ param array $request Needs to contain a 'uri' key . Should also contain a 'method' key , otherwise defaults to GET .
* @ param string $versionToken The version token to use , defaults to HTTP / 1.1
* @ return string Request line
*/
function buildRequestLine ( $request = array (), $versionToken = 'HTTP/1.1' ) {
return parent :: _buildRequestLine ( $request , $versionToken );
}
2009-07-24 19:18:37 +00:00
2009-05-07 18:49:21 +00:00
/**
* Convenience method for testing protected method
*
* @ param boolean $hex true to get them as HEX values , false otherwise
* @ return array Escape chars
*/
function tokenEscapeChars ( $hex = true , $chars = null ) {
return parent :: _tokenEscapeChars ( $hex , $chars );
}
2009-07-24 19:18:37 +00:00
2009-05-07 18:49:21 +00:00
/**
* Convenience method for testing protected method
*
* @ param string $token Token to escape
* @ return string Escaped token
*/
function EscapeToken ( $token , $chars = null ) {
return parent :: _escapeToken ( $token , $chars );
}
2009-07-24 19:18:37 +00:00
2009-05-07 18:49:21 +00:00
/**
* Convenience method for testing protected method
*
* @ param string $token Token to unescape
* @ return string Unescaped token
*/
function unescapeToken ( $token , $chars = null ) {
return parent :: _unescapeToken ( $token , $chars );
}
}
2008-05-30 11:40:08 +00:00
/**
2009-03-18 17:55:58 +00:00
* HttpSocketTest class
2008-05-30 11:40:08 +00:00
*
2009-03-18 17:55:58 +00:00
* @ package cake
2008-10-30 17:30:26 +00:00
* @ subpackage cake . tests . cases . libs
2008-05-30 11:40:08 +00:00
*/
2008-07-21 02:40:58 +00:00
class HttpSocketTest extends CakeTestCase {
2009-07-24 19:18:37 +00:00
2008-06-02 19:22:55 +00:00
/**
* Socket property
2008-07-05 14:31:22 +00:00
*
2008-06-02 19:22:55 +00:00
* @ var mixed null
* @ access public
*/
2010-04-04 07:14:00 +00:00
public $Socket = null ;
2009-07-24 19:18:37 +00:00
2008-06-02 19:22:55 +00:00
/**
* RequestSocket property
2008-07-05 14:31:22 +00:00
*
2008-06-02 19:22:55 +00:00
* @ var mixed null
* @ access public
*/
2010-04-04 07:14:00 +00:00
public $RequestSocket = null ;
2009-07-24 19:18:37 +00:00
2008-05-30 11:40:08 +00:00
/**
* This function sets up a TestHttpSocket instance we are going to use for testing
*
2009-03-18 17:55:58 +00:00
* @ access public
* @ return void
2008-05-30 11:40:08 +00:00
*/
function setUp () {
2009-05-07 18:49:21 +00:00
if ( ! class_exists ( 'MockHttpSocket' )) {
2010-06-01 02:34:10 +00:00
$this -> getMock ( 'TestHttpSocket' , array ( 'read' , 'write' , 'connect' ), array (), 'MockHttpSocket' );
$this -> getMock ( 'TestHttpSocket' , array ( 'read' , 'write' , 'connect' , 'request' ), array (), 'MockHttpSocketRequests' );
2008-05-30 11:40:08 +00:00
}
2010-06-01 02:34:10 +00:00
$this -> Socket = new MockHttpSocket ();
$this -> RequestSocket = new MockHttpSocketRequests ();
2008-05-30 11:40:08 +00:00
}
2009-07-24 19:18:37 +00:00
2008-05-30 11:40:08 +00:00
/**
* We use this function to clean up after the test case was executed
*
2009-03-18 17:55:58 +00:00
* @ access public
* @ return void
2008-05-30 11:40:08 +00:00
*/
function tearDown () {
unset ( $this -> Socket , $this -> RequestSocket );
}
2009-07-24 19:18:37 +00:00
2008-05-30 11:40:08 +00:00
/**
* Test that HttpSocket :: __construct does what one would expect it to do
*
2009-03-18 17:55:58 +00:00
* @ access public
* @ return void
2008-05-30 11:40:08 +00:00
*/
function testConstruct () {
$this -> Socket -> reset ();
$baseConfig = $this -> Socket -> config ;
2010-06-01 02:34:10 +00:00
$this -> Socket -> expects ( $this -> never ()) -> method ( 'connect' );
2008-05-30 11:40:08 +00:00
$this -> Socket -> __construct ( array ( 'host' => 'foo-bar' ));
$baseConfig [ 'host' ] = 'foo-bar' ;
$baseConfig [ 'protocol' ] = getprotobyname ( $baseConfig [ 'protocol' ]);
2010-06-01 02:34:10 +00:00
$this -> assertEquals ( $this -> Socket -> config , $baseConfig );
2008-05-30 11:40:08 +00:00
$this -> Socket -> reset ();
$baseConfig = $this -> Socket -> config ;
$this -> Socket -> __construct ( 'http://www.cakephp.org:23/' );
$baseConfig [ 'host' ] = 'www.cakephp.org' ;
$baseConfig [ 'request' ][ 'uri' ][ 'host' ] = 'www.cakephp.org' ;
$baseConfig [ 'port' ] = 23 ;
$baseConfig [ 'request' ][ 'uri' ][ 'port' ] = 23 ;
$baseConfig [ 'protocol' ] = getprotobyname ( $baseConfig [ 'protocol' ]);
2010-06-01 02:34:10 +00:00
$this -> assertEquals ( $this -> Socket -> config , $baseConfig );
2008-07-05 14:31:22 +00:00
2008-05-30 11:40:08 +00:00
$this -> Socket -> reset ();
$this -> Socket -> __construct ( array ( 'request' => array ( 'uri' => 'http://www.cakephp.org:23/' )));
2010-06-01 02:34:10 +00:00
$this -> assertEquals ( $this -> Socket -> config , $baseConfig );
2008-05-30 11:40:08 +00:00
}
2009-07-24 19:18:37 +00:00
2008-05-30 11:40:08 +00:00
/**
* Test that HttpSocket :: configUri works properly with different types of arguments
*
2009-03-18 17:55:58 +00:00
* @ access public
* @ return void
2008-05-30 11:40:08 +00:00
*/
function testConfigUri () {
$this -> Socket -> reset ();
$r = $this -> Socket -> configUri ( 'https://bob:secret@www.cakephp.org:23/?query=foo' );
$expected = array (
'persistent' => false ,
'host' => 'www.cakephp.org' ,
'protocol' => 'tcp' ,
'port' => 23 ,
'timeout' => 30 ,
'request' => array (
'uri' => array (
'scheme' => 'https'
, 'host' => 'www.cakephp.org'
, 'port' => 23
),
'cookies' => array (),
)
);
2010-06-01 02:34:10 +00:00
$this -> assertEquals ( $this -> Socket -> config , $expected );
$this -> assertEquals ( $r , $expected );
2008-05-30 11:40:08 +00:00
$r = $this -> Socket -> configUri ( array ( 'host' => 'www.foo-bar.org' ));
$expected [ 'host' ] = 'www.foo-bar.org' ;
$expected [ 'request' ][ 'uri' ][ 'host' ] = 'www.foo-bar.org' ;
2010-06-01 02:34:10 +00:00
$this -> assertEquals ( $this -> Socket -> config , $expected );
$this -> assertEquals ( $r , $expected );
2008-05-30 11:40:08 +00:00
$r = $this -> Socket -> configUri ( 'http://www.foo.com' );
$expected = array (
'persistent' => false ,
'host' => 'www.foo.com' ,
'protocol' => 'tcp' ,
'port' => 80 ,
'timeout' => 30 ,
'request' => array (
'uri' => array (
'scheme' => 'http'
, 'host' => 'www.foo.com'
, 'port' => 80
),
'cookies' => array ()
)
);
2010-06-01 02:34:10 +00:00
$this -> assertEquals ( $this -> Socket -> config , $expected );
$this -> assertEquals ( $r , $expected );
2008-09-28 23:55:40 +00:00
$r = $this -> Socket -> configUri ( '/this-is-broken' );
2010-06-01 02:34:10 +00:00
$this -> assertEquals ( $this -> Socket -> config , $expected );
$this -> assertEquals ( $r , false );
2008-05-30 11:40:08 +00:00
$r = $this -> Socket -> configUri ( false );
2010-06-01 02:34:10 +00:00
$this -> assertEquals ( $this -> Socket -> config , $expected );
$this -> assertEquals ( $r , false );
2008-05-30 11:40:08 +00:00
}
2009-07-24 19:18:37 +00:00
2008-05-30 11:40:08 +00:00
/**
* Tests that HttpSocket :: request ( the heart of the HttpSocket ) is working properly .
*
2009-03-18 17:55:58 +00:00
* @ access public
* @ return void
2008-05-30 11:40:08 +00:00
*/
function testRequest () {
$this -> Socket -> reset ();
$response = $this -> Socket -> request ( true );
$this -> assertFalse ( $response );
$tests = array (
0 => array (
'request' => 'http://www.cakephp.org/?foo=bar'
, 'expectation' => array (
'config' => array (
'persistent' => false
, 'host' => 'www.cakephp.org'
, 'protocol' => 'tcp'
, 'port' => 80
, 'timeout' => 30
, 'request' => array (
'uri' => array (
'scheme' => 'http'
, 'host' => 'www.cakephp.org'
, 'port' => 80 ,
),
'cookies' => array (),
),
)
, 'request' => array (
'method' => 'GET'
, 'uri' => array (
'scheme' => 'http'
, 'host' => 'www.cakephp.org'
, 'port' => 80
, 'user' => null
, 'pass' => null
, 'path' => '/'
, 'query' => array ( 'foo' => 'bar' )
, 'fragment' => null
)
, 'version' => '1.1'
, 'body' => ''
, 'line' => " GET /?foo=bar HTTP/1.1 \r \n "
, 'header' => " Host: www.cakephp.org \r \n Connection: close \r \n User-Agent: CakePHP \r \n "
, 'raw' => " "
, 'cookies' => array (),
)
)
)
, 1 => array (
'request' => array (
'uri' => array (
'host' => 'www.cakephp.org'
, 'query' => '?foo=bar'
)
)
)
, 2 => array (
'request' => 'www.cakephp.org/?foo=bar'
)
, 3 => array (
'request' => array ( 'host' => '192.168.0.1' , 'uri' => 'http://www.cakephp.org/?foo=bar' )
, 'expectation' => array (
'request' => array (
'uri' => array ( 'host' => 'www.cakephp.org' )
)
, 'config' => array (
'request' => array (
'uri' => array ( 'host' => 'www.cakephp.org' )
)
, 'host' => '192.168.0.1'
)
)
)
, 'reset4' => array (
'request.uri.query' => array ()
)
, 4 => array (
'request' => array ( 'header' => array ( 'Foo@woo' => 'bar-value' ))
, 'expectation' => array (
'request' => array (
'header' => " Host: www.cakephp.org \r \n Connection: close \r \n User-Agent: CakePHP \r \n Foo \" @ \" woo: bar-value \r \n "
, 'line' => " GET / HTTP/1.1 \r \n "
)
)
)
, 5 => array (
'request' => array ( 'header' => array ( 'Foo@woo' => 'bar-value' , 'host' => 'foo.com' ), 'uri' => 'http://www.cakephp.org/' )
, 'expectation' => array (
'request' => array (
'header' => " Host: foo.com \r \n Connection: close \r \n User-Agent: CakePHP \r \n Foo \" @ \" woo: bar-value \r \n "
)
, 'config' => array (
'host' => 'www.cakephp.org'
)
)
)
, 6 => array (
'request' => array ( 'header' => " Foo: bar \r \n " )
, 'expectation' => array (
'request' => array (
'header' => " Foo: bar \r \n "
)
)
)
, 7 => array (
'request' => array ( 'header' => " Foo: bar \r \n " , 'uri' => 'http://www.cakephp.org/search?q=http_socket#ignore-me' )
, 'expectation' => array (
'request' => array (
'uri' => array (
'path' => '/search'
, 'query' => array ( 'q' => 'http_socket' )
, 'fragment' => 'ignore-me'
)
, 'line' => " GET /search?q=http_socket HTTP/1.1 \r \n "
)
)
)
, 'reset8' => array (
'request.uri.query' => array ()
)
, 8 => array (
'request' => array ( 'method' => 'POST' , 'uri' => 'http://www.cakephp.org/posts/add' , 'body' => array ( 'name' => 'HttpSocket-is-released' , 'date' => 'today' ))
, 'expectation' => array (
'request' => array (
'method' => 'POST'
, 'uri' => array (
'path' => '/posts/add'
, 'fragment' => null
)
, 'body' => " name=HttpSocket-is-released&date=today "
, 'line' => " POST /posts/add HTTP/1.1 \r \n "
, 'header' => " Host: www.cakephp.org \r \n Connection: close \r \n User-Agent: CakePHP \r \n Content-Type: application/x-www-form-urlencoded \r \n Content-Length: 38 \r \n "
, 'raw' => " name=HttpSocket-is-released&date=today "
)
)
)
, 9 => array (
2010-07-23 03:13:19 +00:00
'request' => array ( 'method' => 'POST' , 'uri' => 'http://www.cakephp.org:8080/posts/add' , 'body' => array ( 'name' => 'HttpSocket-is-released' , 'date' => 'today' ))
, 'expectation' => array (
'config' => array (
'port' => 8080
, 'request' => array (
'uri' => array (
'port' => 8080
)
)
)
, 'request' => array (
'uri' => array (
'port' => 8080
)
, 'header' => " Host: www.cakephp.org:8080 \r \n Connection: close \r \n User-Agent: CakePHP \r \n Content-Type: application/x-www-form-urlencoded \r \n Content-Length: 38 \r \n "
)
)
)
, 10 => array (
2008-05-30 11:40:08 +00:00
'request' => array ( 'method' => 'POST' , 'uri' => 'https://www.cakephp.org/posts/add' , 'body' => array ( 'name' => 'HttpSocket-is-released' , 'date' => 'today' ))
, 'expectation' => array (
'config' => array (
'port' => 443
, 'request' => array (
'uri' => array (
'scheme' => 'https'
, 'port' => 443
)
)
)
, 'request' => array (
'uri' => array (
'scheme' => 'https'
, 'port' => 443
)
2010-07-23 03:13:19 +00:00
, 'header' => " Host: www.cakephp.org \r \n Connection: close \r \n User-Agent: CakePHP \r \n Content-Type: application/x-www-form-urlencoded \r \n Content-Length: 38 \r \n "
2008-05-30 11:40:08 +00:00
)
)
)
2010-07-23 03:13:19 +00:00
, 11 => array (
2008-05-30 11:40:08 +00:00
'request' => array (
'method' => 'POST' ,
'uri' => 'https://www.cakephp.org/posts/add' ,
'body' => array ( 'name' => 'HttpSocket-is-released' , 'date' => 'today' ),
'cookies' => array ( 'foo' => array ( 'value' => 'bar' ))
)
, 'expectation' => array (
'request' => array (
'header' => " Host: www.cakephp.org \r \n Connection: close \r \n User-Agent: CakePHP \r \n Content-Type: application/x-www-form-urlencoded \r \n Content-Length: 38 \r \n Cookie: foo=bar \r \n " ,
'cookies' => array (
'foo' => array ( 'value' => 'bar' ),
)
)
)
)
);
$expectation = array ();
foreach ( $tests as $i => $test ) {
if ( strpos ( $i , 'reset' ) === 0 ) {
foreach ( $test as $path => $val ) {
$expectation = Set :: insert ( $expectation , $path , $val );
}
continue ;
}
if ( isset ( $test [ 'expectation' ])) {
$expectation = Set :: merge ( $expectation , $test [ 'expectation' ]);
}
$this -> Socket -> request ( $test [ 'request' ]);
$raw = $expectation [ 'request' ][ 'raw' ];
$expectation [ 'request' ][ 'raw' ] = $expectation [ 'request' ][ 'line' ] . $expectation [ 'request' ][ 'header' ] . " \r \n " . $raw ;
$r = array ( 'config' => $this -> Socket -> config , 'request' => $this -> Socket -> request );
2010-11-13 23:44:11 +00:00
$v = $this -> assertEquals ( $r , $expectation , 'Failed test #' . $i . ' ' );
2008-05-30 11:40:08 +00:00
$expectation [ 'request' ][ 'raw' ] = $raw ;
}
$this -> Socket -> reset ();
$request = array ( 'method' => 'POST' , 'uri' => 'http://www.cakephp.org/posts/add' , 'body' => array ( 'name' => 'HttpSocket-is-released' , 'date' => 'today' ));
$response = $this -> Socket -> request ( $request );
2010-06-01 02:34:10 +00:00
$this -> assertEquals ( $this -> Socket -> request [ 'body' ], " name=HttpSocket-is-released&date=today " );
2008-05-30 11:40:08 +00:00
$request = array ( 'uri' => '*' , 'method' => 'GET' );
2010-06-01 02:34:10 +00:00
$this -> expectError ();
2008-05-30 11:40:08 +00:00
$response = $this -> Socket -> request ( $request );
$this -> assertFalse ( $response );
$this -> assertFalse ( $this -> Socket -> response );
2010-06-01 02:34:10 +00:00
}
2008-05-30 11:40:08 +00:00
2010-06-01 02:34:10 +00:00
/**
* testRequest2 method
*
* @ access public
* @ return void
*/
function testRequest2 () {
2008-05-30 11:40:08 +00:00
$this -> Socket -> reset ();
$request = array ( 'uri' => 'htpp://www.cakephp.org/' );
2008-07-05 14:31:22 +00:00
$number = mt_rand ( 0 , 9999999 );
2010-06-01 02:34:10 +00:00
$this -> Socket -> expects ( $this -> once ()) -> method ( 'connect' ) -> will ( $this -> returnValue ( true ));
2009-07-28 20:01:42 +00:00
$serverResponse = " HTTP/1.x 200 OK \r \n Date: Mon, 16 Apr 2007 04:14:16 GMT \r \n Server: CakeHttp Server \r \n Content-Type: text/html \r \n \r \n <h1>Hello, your lucky number is " . $number . " </h1> " ;
2010-06-01 02:34:10 +00:00
$this -> Socket -> expects ( $this -> at ( 0 )) -> method ( 'read' ) -> will ( $this -> returnValue ( false ));
$this -> Socket -> expects ( $this -> at ( 1 )) -> method ( 'read' ) -> will ( $this -> returnValue ( $serverResponse ));
$this -> Socket -> expects ( $this -> once ()) -> method ( 'write' )
-> with ( " GET / HTTP/1.1 \r \n Host: www.cakephp.org \r \n Connection: close \r \n User-Agent: CakePHP \r \n \r \n " );
2008-05-30 11:40:08 +00:00
$response = $this -> Socket -> request ( $request );
2010-06-01 02:34:10 +00:00
$this -> assertEquals ( $response , " <h1>Hello, your lucky number is " . $number . " </h1> " );
}
2008-05-30 11:40:08 +00:00
2010-06-01 02:34:10 +00:00
/**
* testRequest3 method
*
* @ access public
* @ return void
*/
function testRequest3 () {
$request = array ( 'uri' => 'htpp://www.cakephp.org/' );
2008-05-30 11:40:08 +00:00
$serverResponse = " HTTP/1.x 200 OK \r \n Set-Cookie: foo=bar \r \n Date: Mon, 16 Apr 2007 04:14:16 GMT \r \n Server: CakeHttp Server \r \n Content-Type: text/html \r \n \r \n <h1>This is a cookie test!</h1> " ;
2010-06-01 02:34:10 +00:00
$this -> Socket -> expects ( $this -> at ( 1 )) -> method ( 'read' ) -> will ( $this -> returnValue ( $serverResponse ));
2008-05-30 11:40:08 +00:00
$this -> Socket -> connected = true ;
$this -> Socket -> request ( $request );
$result = $this -> Socket -> response [ 'cookies' ];
$expect = array (
'foo' => array (
'value' => 'bar'
)
);
$this -> assertEqual ( $result , $expect );
$this -> assertEqual ( $this -> Socket -> config [ 'request' ][ 'cookies' ], $expect );
$this -> assertFalse ( $this -> Socket -> connected );
}
2009-07-24 19:18:37 +00:00
2010-12-01 15:46:13 +00:00
/**
* testProxy method
*
* @ return void
*/
function testProxy () {
$this -> Socket -> reset ();
$this -> Socket -> expects ( $this -> any ()) -> method ( 'connect' ) -> will ( $this -> returnValue ( true ));
$this -> Socket -> expects ( $this -> any ()) -> method ( 'read' ) -> will ( $this -> returnValue ( false ));
2010-12-04 01:10:07 +00:00
$this -> Socket -> setProxyConfig ( 'proxy.server' , 123 );
2010-12-01 15:46:13 +00:00
$expected = " GET http://www.cakephp.org/ HTTP/1.1 \r \n Host: www.cakephp.org \r \n Connection: close \r \n User-Agent: CakePHP \r \n \r \n " ;
2010-12-04 01:10:07 +00:00
$this -> Socket -> request ( 'http://www.cakephp.org/' );
2010-12-01 15:46:13 +00:00
$this -> assertEqual ( $this -> Socket -> request [ 'raw' ], $expected );
$this -> assertEqual ( $this -> Socket -> config [ 'host' ], 'proxy.server' );
$this -> assertEqual ( $this -> Socket -> config [ 'port' ], 123 );
$expected = " GET http://www.cakephp.org/ HTTP/1.1 \r \n Host: www.cakephp.org \r \n Connection: close \r \n User-Agent: CakePHP \r \n Proxy-Authorization: Test mark.secret \r \n \r \n " ;
2010-12-04 01:10:07 +00:00
$this -> Socket -> setProxyConfig ( 'proxy.server' , 123 , 'Test' , 'mark' , 'secret' );
$this -> Socket -> request ( 'http://www.cakephp.org/' );
2010-12-01 15:46:13 +00:00
$this -> assertEqual ( $this -> Socket -> request [ 'raw' ], $expected );
$this -> assertEqual ( $this -> Socket -> config [ 'host' ], 'proxy.server' );
$this -> assertEqual ( $this -> Socket -> config [ 'port' ], 123 );
2010-12-03 02:46:11 +00:00
$this -> Socket -> setAuthConfig ( 'Test' , 'login' , 'passwd' );
2010-12-01 15:46:13 +00:00
$expected = " GET http://www.cakephp.org/ HTTP/1.1 \r \n Host: www.cakephp.org \r \n Connection: close \r \n User-Agent: CakePHP \r \n Authorization: Test login.passwd \r \n Proxy-Authorization: Test mark.secret \r \n \r \n " ;
2010-12-04 01:10:07 +00:00
$this -> Socket -> request ( 'http://www.cakephp.org/' );
2010-12-01 15:46:13 +00:00
$this -> assertEqual ( $this -> Socket -> request [ 'raw' ], $expected );
}
2008-06-02 19:22:55 +00:00
/**
* testUrl method
2008-07-05 14:31:22 +00:00
*
2008-06-02 19:22:55 +00:00
* @ access public
* @ return void
*/
2008-05-30 11:40:08 +00:00
function testUrl () {
$this -> Socket -> reset ( true );
2010-06-01 02:34:10 +00:00
$this -> assertEquals ( $this -> Socket -> url ( true ), false );
2008-05-30 11:40:08 +00:00
$url = $this -> Socket -> url ( 'www.cakephp.org' );
2010-06-01 02:34:10 +00:00
$this -> assertEquals ( $url , 'http://www.cakephp.org/' );
2008-05-30 11:40:08 +00:00
$url = $this -> Socket -> url ( 'https://www.cakephp.org/posts/add' );
2010-06-01 02:34:10 +00:00
$this -> assertEquals ( $url , 'https://www.cakephp.org/posts/add' );
2008-05-30 11:40:08 +00:00
$url = $this -> Socket -> url ( 'http://www.cakephp/search?q=socket' , '/%path?%query' );
2010-06-01 02:34:10 +00:00
$this -> assertEquals ( $url , '/search?q=socket' );
2008-05-30 11:40:08 +00:00
$this -> Socket -> config [ 'request' ][ 'uri' ][ 'host' ] = 'bakery.cakephp.org' ;
$url = $this -> Socket -> url ();
2010-06-01 02:34:10 +00:00
$this -> assertEquals ( $url , 'http://bakery.cakephp.org/' );
2008-05-30 11:40:08 +00:00
$this -> Socket -> configUri ( 'http://www.cakephp.org' );
$url = $this -> Socket -> url ( '/search?q=bar' );
2010-06-01 02:34:10 +00:00
$this -> assertEquals ( $url , 'http://www.cakephp.org/search?q=bar' );
2008-05-30 11:40:08 +00:00
$url = $this -> Socket -> url ( array ( 'host' => 'www.foobar.org' , 'query' => array ( 'q' => 'bar' )));
2010-06-01 02:34:10 +00:00
$this -> assertEquals ( $url , 'http://www.foobar.org/?q=bar' );
2008-05-30 11:40:08 +00:00
$url = $this -> Socket -> url ( array ( 'path' => '/supersearch' , 'query' => array ( 'q' => 'bar' )));
2010-06-01 02:34:10 +00:00
$this -> assertEquals ( $url , 'http://www.cakephp.org/supersearch?q=bar' );
2008-05-30 11:40:08 +00:00
$this -> Socket -> configUri ( 'http://www.google.com' );
$url = $this -> Socket -> url ( '/search?q=socket' );
2010-06-01 02:34:10 +00:00
$this -> assertEquals ( $url , 'http://www.google.com/search?q=socket' );
2008-05-30 11:40:08 +00:00
$url = $this -> Socket -> url ();
2010-06-01 02:34:10 +00:00
$this -> assertEquals ( $url , 'http://www.google.com/' );
2008-05-30 11:40:08 +00:00
$this -> Socket -> configUri ( 'https://www.google.com' );
$url = $this -> Socket -> url ( '/search?q=socket' );
2010-06-01 02:34:10 +00:00
$this -> assertEquals ( $url , 'https://www.google.com/search?q=socket' );
2008-05-30 11:40:08 +00:00
$this -> Socket -> reset ();
$this -> Socket -> configUri ( 'www.google.com:443' );
$url = $this -> Socket -> url ( '/search?q=socket' );
2010-06-01 02:34:10 +00:00
$this -> assertEquals ( $url , 'https://www.google.com/search?q=socket' );
2008-05-30 11:40:08 +00:00
$this -> Socket -> reset ();
$this -> Socket -> configUri ( 'www.google.com:8080' );
$url = $this -> Socket -> url ( '/search?q=socket' );
2010-06-01 02:34:10 +00:00
$this -> assertEquals ( $url , 'http://www.google.com:8080/search?q=socket' );
2008-05-30 11:40:08 +00:00
}
2009-07-24 19:18:37 +00:00
2008-06-02 19:22:55 +00:00
/**
* testGet method
2008-07-05 14:31:22 +00:00
*
2008-06-02 19:22:55 +00:00
* @ access public
* @ return void
*/
2008-05-30 11:40:08 +00:00
function testGet () {
$this -> RequestSocket -> reset ();
2010-06-01 02:34:10 +00:00
$this -> RequestSocket -> expects ( $this -> at ( 0 ))
-> method ( 'request' )
-> with ( array ( 'method' => 'GET' , 'uri' => 'http://www.google.com/' ));
2008-05-30 11:40:08 +00:00
2010-06-01 02:34:10 +00:00
$this -> RequestSocket -> expects ( $this -> at ( 1 ))
-> method ( 'request' )
-> with ( array ( 'method' => 'GET' , 'uri' => 'http://www.google.com/?foo=bar' ));
$this -> RequestSocket -> expects ( $this -> at ( 2 ))
-> method ( 'request' )
-> with ( array ( 'method' => 'GET' , 'uri' => 'http://www.google.com/?foo=bar' ));
2008-05-30 11:40:08 +00:00
2010-06-01 02:34:10 +00:00
$this -> RequestSocket -> expects ( $this -> at ( 3 ))
-> method ( 'request' )
-> with ( array ( 'method' => 'GET' , 'uri' => 'http://www.google.com/?foo=23&foobar=42' ));
2008-05-30 11:40:08 +00:00
2010-06-01 02:34:10 +00:00
$this -> RequestSocket -> expects ( $this -> at ( 4 ))
-> method ( 'request' )
-> with ( array ( 'method' => 'GET' , 'uri' => 'http://www.google.com/' , 'auth' => array ( 'user' => 'foo' , 'pass' => 'bar' )));
2008-05-30 11:40:08 +00:00
2010-06-01 02:34:10 +00:00
$this -> RequestSocket -> get ( 'http://www.google.com/' );
$this -> RequestSocket -> get ( 'http://www.google.com/' , array ( 'foo' => 'bar' ));
$this -> RequestSocket -> get ( 'http://www.google.com/' , 'foo=bar' );
$this -> RequestSocket -> get ( 'http://www.google.com/?foo=bar' , array ( 'foobar' => '42' , 'foo' => '23' ));
2008-05-30 11:40:08 +00:00
$this -> RequestSocket -> get ( 'http://www.google.com/' , null , array ( 'auth' => array ( 'user' => 'foo' , 'pass' => 'bar' )));
}
2009-07-24 19:18:37 +00:00
2010-12-03 03:30:03 +00:00
/**
* Test authentication
*
* @ return void
*/
public function testAuth () {
$socket = new MockHttpSocket ();
$socket -> get ( 'http://mark:secret@example.com/test' );
$this -> assertTrue ( strpos ( $socket -> request [ 'header' ], 'Authorization: Basic bWFyazpzZWNyZXQ=' ) !== false );
$socket -> setAuthConfig ( false );
$socket -> get ( 'http://example.com/test' );
$this -> assertFalse ( strpos ( $socket -> request [ 'header' ], 'Authorization:' ));
$socket -> setAuthConfig ( 'Test' , 'mark' , 'passwd' );
$socket -> get ( 'http://example.com/test' );
$this -> assertTrue ( strpos ( $socket -> request [ 'header' ], 'Authorization: Test mark.passwd' ) !== false );
}
2010-07-07 02:30:48 +00:00
/**
* test that two consecutive get () calls reset the authentication credentials .
*
* @ return void
*/
function testConsecutiveGetResetsAuthCredentials () {
$socket = new MockHttpSocket ();
$socket -> get ( 'http://mark:secret@example.com/test' );
$this -> assertEqual ( $socket -> request [ 'uri' ][ 'user' ], 'mark' );
$this -> assertEqual ( $socket -> request [ 'uri' ][ 'pass' ], 'secret' );
2010-11-10 01:03:43 +00:00
$this -> assertTrue ( strpos ( $socket -> request [ 'header' ], 'Authorization: Basic bWFyazpzZWNyZXQ=' ) !== false );
2010-07-07 02:30:48 +00:00
$socket -> get ( '/test2' );
2010-11-10 01:03:43 +00:00
$this -> assertTrue ( strpos ( $socket -> request [ 'header' ], 'Authorization: Basic bWFyazpzZWNyZXQ=' ) !== false );
2010-07-07 02:30:48 +00:00
$socket -> get ( '/test3' );
2010-11-10 01:03:43 +00:00
$this -> assertTrue ( strpos ( $socket -> request [ 'header' ], 'Authorization: Basic bWFyazpzZWNyZXQ=' ) !== false );
2010-07-07 02:30:48 +00:00
}
2008-06-02 19:22:55 +00:00
/**
* testPostPutDelete method
2008-07-05 14:31:22 +00:00
*
2008-06-02 19:22:55 +00:00
* @ access public
* @ return void
*/
2010-06-01 02:34:10 +00:00
function testPost () {
2008-05-30 11:40:08 +00:00
$this -> RequestSocket -> reset ();
2010-06-01 02:34:10 +00:00
$this -> RequestSocket -> expects ( $this -> at ( 0 ))
-> method ( 'request' )
-> with ( array ( 'method' => 'POST' , 'uri' => 'http://www.google.com/' , 'body' => array ()));
2008-05-30 11:40:08 +00:00
2010-06-01 02:34:10 +00:00
$this -> RequestSocket -> expects ( $this -> at ( 1 ))
-> method ( 'request' )
-> with ( array ( 'method' => 'POST' , 'uri' => 'http://www.google.com/' , 'body' => array ( 'Foo' => 'bar' )));
$this -> RequestSocket -> expects ( $this -> at ( 2 ))
-> method ( 'request' )
-> with ( array ( 'method' => 'POST' , 'uri' => 'http://www.google.com/' , 'body' => null , 'line' => 'Hey Server' ));
$this -> RequestSocket -> post ( 'http://www.google.com/' );
$this -> RequestSocket -> post ( 'http://www.google.com/' , array ( 'Foo' => 'bar' ));
$this -> RequestSocket -> post ( 'http://www.google.com/' , null , array ( 'line' => 'Hey Server' ));
}
function testPut () {
$this -> RequestSocket -> reset ();
$this -> RequestSocket -> expects ( $this -> at ( 0 ))
-> method ( 'request' )
-> with ( array ( 'method' => 'PUT' , 'uri' => 'http://www.google.com/' , 'body' => array ()));
$this -> RequestSocket -> expects ( $this -> at ( 1 ))
-> method ( 'request' )
-> with ( array ( 'method' => 'PUT' , 'uri' => 'http://www.google.com/' , 'body' => array ( 'Foo' => 'bar' )));
$this -> RequestSocket -> expects ( $this -> at ( 2 ))
-> method ( 'request' )
-> with ( array ( 'method' => 'PUT' , 'uri' => 'http://www.google.com/' , 'body' => null , 'line' => 'Hey Server' ));
$this -> RequestSocket -> put ( 'http://www.google.com/' );
$this -> RequestSocket -> put ( 'http://www.google.com/' , array ( 'Foo' => 'bar' ));
$this -> RequestSocket -> put ( 'http://www.google.com/' , null , array ( 'line' => 'Hey Server' ));
}
function testDelete () {
$this -> RequestSocket -> reset ();
$this -> RequestSocket -> expects ( $this -> at ( 0 ))
-> method ( 'request' )
-> with ( array ( 'method' => 'DELETE' , 'uri' => 'http://www.google.com/' , 'body' => array ()));
$this -> RequestSocket -> expects ( $this -> at ( 1 ))
-> method ( 'request' )
-> with ( array ( 'method' => 'DELETE' , 'uri' => 'http://www.google.com/' , 'body' => array ( 'Foo' => 'bar' )));
$this -> RequestSocket -> expects ( $this -> at ( 2 ))
-> method ( 'request' )
-> with ( array ( 'method' => 'DELETE' , 'uri' => 'http://www.google.com/' , 'body' => null , 'line' => 'Hey Server' ));
$this -> RequestSocket -> delete ( 'http://www.google.com/' );
$this -> RequestSocket -> delete ( 'http://www.google.com/' , array ( 'Foo' => 'bar' ));
$this -> RequestSocket -> delete ( 'http://www.google.com/' , null , array ( 'line' => 'Hey Server' ));
2008-05-30 11:40:08 +00:00
}
2009-07-24 19:18:37 +00:00
2008-05-30 11:40:08 +00:00
/**
2009-03-18 17:55:58 +00:00
* testParseResponse method
2008-05-30 11:40:08 +00:00
*
2009-03-18 17:55:58 +00:00
* @ access public
* @ return void
2008-05-30 11:40:08 +00:00
*/
function testParseResponse () {
$this -> Socket -> reset ();
$r = $this -> Socket -> parseResponse ( array ( 'foo' => 'bar' ));
2010-06-01 02:34:10 +00:00
$this -> assertEquals ( $r , array ( 'foo' => 'bar' ));
2008-05-30 11:40:08 +00:00
$r = $this -> Socket -> parseResponse ( true );
2010-06-01 02:34:10 +00:00
$this -> assertEquals ( $r , false );
2008-05-30 11:40:08 +00:00
$r = $this -> Socket -> parseResponse ( " HTTP Foo \r \n Bar: La " );
2010-06-01 02:34:10 +00:00
$this -> assertEquals ( $r , false );
2008-05-30 11:40:08 +00:00
$tests = array (
'simple-request' => array (
'response' => array (
'status-line' => " HTTP/1.x 200 OK \r \n " ,
'header' => " Date: Mon, 16 Apr 2007 04:14:16 GMT \r \n Server: CakeHttp Server \r \n " ,
'body' => " <h1>Hello World</h1> \r \n <p>It's good to be html</p> "
)
, 'expectations' => array (
'status.http-version' => 'HTTP/1.x' ,
'status.code' => 200 ,
'status.reason-phrase' => 'OK' ,
'header' => $this -> Socket -> parseHeader ( " Date: Mon, 16 Apr 2007 04:14:16 GMT \r \n Server: CakeHttp Server \r \n " ),
'body' => " <h1>Hello World</h1> \r \n <p>It's good to be html</p> "
)
),
'no-header' => array (
'response' => array (
'status-line' => " HTTP/1.x 404 OK \r \n " ,
'header' => null ,
)
, 'expectations' => array (
'status.code' => 404 ,
'header' => array ()
)
),
'chunked' => array (
'response' => array (
'header' => " Transfer-Encoding: chunked \r \n " ,
'body' => " 19 \r \n This is a chunked message \r \n 0 \r \n "
),
'expectations' => array (
'body' => " This is a chunked message " ,
'header' => $this -> Socket -> parseHeader ( " Transfer-Encoding: chunked \r \n " )
)
),
'enitity-header' => array (
'response' => array (
'body' => " 19 \r \n This is a chunked message \r \n 0 \r \n Foo: Bar \r \n "
),
'expectations' => array (
'header' => $this -> Socket -> parseHeader ( " Transfer-Encoding: chunked \r \n Foo: Bar \r \n " )
)
),
'enitity-header-combine' => array (
'response' => array (
'header' => " Transfer-Encoding: chunked \r \n Foo: Foobar \r \n "
),
'expectations' => array (
'header' => $this -> Socket -> parseHeader ( " Transfer-Encoding: chunked \r \n Foo: Foobar \r \n Foo: Bar \r \n " )
)
)
);
$testResponse = array ();
$expectations = array ();
foreach ( $tests as $name => $test ) {
$testResponse = array_merge ( $testResponse , $test [ 'response' ]);
$testResponse [ 'response' ] = $testResponse [ 'status-line' ] . $testResponse [ 'header' ] . " \r \n " . $testResponse [ 'body' ];
$r = $this -> Socket -> parseResponse ( $testResponse [ 'response' ]);
$expectations = array_merge ( $expectations , $test [ 'expectations' ]);
foreach ( $expectations as $property => $expectedVal ) {
$val = Set :: extract ( $r , $property );
2010-06-01 02:34:10 +00:00
$this -> assertEquals ( $val , $expectedVal , 'Test "' . $name . '": response.' . $property . ' - %s' );
2008-05-30 11:40:08 +00:00
}
foreach ( array ( 'status-line' , 'header' , 'body' , 'response' ) as $field ) {
2010-06-01 02:34:10 +00:00
$this -> assertEquals ( $r [ 'raw' ][ $field ], $testResponse [ $field ], 'Test response.raw.' . $field . ': %s' );
2008-05-30 11:40:08 +00:00
}
}
}
2009-07-24 19:18:37 +00:00
2008-05-30 11:40:08 +00:00
/**
2009-03-18 17:55:58 +00:00
* testDecodeBody method
2008-05-30 11:40:08 +00:00
*
2009-03-18 17:55:58 +00:00
* @ access public
* @ return void
2008-05-30 11:40:08 +00:00
*/
function testDecodeBody () {
$this -> Socket -> reset ();
$r = $this -> Socket -> decodeBody ( true );
2010-06-01 02:34:10 +00:00
$this -> assertEquals ( $r , false );
2008-05-30 11:40:08 +00:00
$r = $this -> Socket -> decodeBody ( 'Foobar' , false );
2010-06-01 02:34:10 +00:00
$this -> assertEquals ( $r , array ( 'body' => 'Foobar' , 'header' => false ));
2008-05-30 11:40:08 +00:00
2010-06-01 02:34:10 +00:00
$encoding = 'chunked' ;
$sample = array (
'encoded' => " 19 \r \n This is a chunked message \r \n 0 \r \n " ,
'decoded' => array ( 'body' => " This is a chunked message " , 'header' => false )
2008-05-30 11:40:08 +00:00
);
2010-06-01 02:34:10 +00:00
$r = $this -> Socket -> decodeBody ( $sample [ 'encoded' ], $encoding );
$this -> assertEquals ( $r , $sample [ 'decoded' ]);
}
2008-05-30 11:40:08 +00:00
2010-06-01 02:34:10 +00:00
function testDecodeFooCoded () {
$this -> Socket -> reset ();
2008-05-30 11:40:08 +00:00
2010-06-01 02:34:10 +00:00
$r = $this -> Socket -> decodeBody ( true );
$this -> assertEquals ( $r , false );
$r = $this -> Socket -> decodeBody ( 'Foobar' , false );
$this -> assertEquals ( $r , array ( 'body' => 'Foobar' , 'header' => false ));
$encoding = 'foo-bar' ;
$sample = array (
'encoded' => '!Foobar!' ,
'decoded' => array ( 'body' => '!Foobar!' , 'header' => false ),
);
$this -> Socket -> quirksMode = true ;
$r = $this -> Socket -> decodeBody ( $sample [ 'encoded' ], $encoding );
$this -> assertEquals ( $r , $sample [ 'decoded' ]);
$this -> Socket -> quirksMode = false ;
$this -> expectError ();
$r = $this -> Socket -> decodeBody ( $sample [ 'encoded' ], $encoding );
$this -> assertEquals ( $r , $sample [ 'decoded' ]);
2008-05-30 11:40:08 +00:00
}
2009-07-24 19:18:37 +00:00
2008-05-30 11:40:08 +00:00
/**
2009-03-18 17:55:58 +00:00
* testDecodeChunkedBody method
2008-05-30 11:40:08 +00:00
*
2009-03-18 17:55:58 +00:00
* @ access public
* @ return void
2008-05-30 11:40:08 +00:00
*/
function testDecodeChunkedBody () {
$this -> Socket -> reset ();
$r = $this -> Socket -> decodeChunkedBody ( true );
2010-06-01 02:34:10 +00:00
$this -> assertEquals ( $r , false );
2008-05-30 11:40:08 +00:00
$encoded = " 19 \r \n This is a chunked message \r \n 0 \r \n " ;
$decoded = " This is a chunked message " ;
$r = $this -> Socket -> decodeChunkedBody ( $encoded );
2010-06-01 02:34:10 +00:00
$this -> assertEquals ( $r [ 'body' ], $decoded );
$this -> assertEquals ( $r [ 'header' ], false );
2008-05-30 11:40:08 +00:00
$encoded = " 19 \r \n This is a chunked message \r \n 0 \r \n " ;
$r = $this -> Socket -> decodeChunkedBody ( $encoded );
2010-06-01 02:34:10 +00:00
$this -> assertEquals ( $r [ 'body' ], $decoded );
2008-05-30 11:40:08 +00:00
$encoded = " 19 \r \n This is a chunked message \r \n E \r \n \n That is cool \n \r \n 0 \r \n " ;
$decoded = " This is a chunked message \n That is cool \n " ;
$r = $this -> Socket -> decodeChunkedBody ( $encoded );
2010-06-01 02:34:10 +00:00
$this -> assertEquals ( $r [ 'body' ], $decoded );
$this -> assertEquals ( $r [ 'header' ], false );
2008-05-30 11:40:08 +00:00
$encoded = " 19 \r \n This is a chunked message \r \n E;foo-chunk=5 \r \n \n That is cool \n \r \n 0 \r \n " ;
$r = $this -> Socket -> decodeChunkedBody ( $encoded );
2010-06-01 02:34:10 +00:00
$this -> assertEquals ( $r [ 'body' ], $decoded );
$this -> assertEquals ( $r [ 'header' ], false );
2008-05-30 11:40:08 +00:00
$encoded = " 19 \r \n This is a chunked message \r \n E \r \n \n That is cool \n \r \n 0 \r \n foo-header: bar \r \n cake: PHP \r \n \r \n " ;
$r = $this -> Socket -> decodeChunkedBody ( $encoded );
2010-06-01 02:34:10 +00:00
$this -> assertEquals ( $r [ 'body' ], $decoded );
2010-11-13 23:44:11 +00:00
$this -> assertEquals ( $r [ 'header' ], array ( 'foo-header' => 'bar' , 'cake' => 'PHP' ));
2008-05-30 11:40:08 +00:00
2010-06-01 02:34:10 +00:00
$this -> Socket -> quirksMode = true ;
$encoded = " 19 \r \n This is a chunked message \r \n E \r \n \n That is cool \n \r \n foo-header: bar \r \n cake: PHP \r \n \r \n " ;
2008-05-30 11:40:08 +00:00
$r = $this -> Socket -> decodeChunkedBody ( $encoded );
2010-06-01 02:34:10 +00:00
$this -> assertEquals ( $r [ 'body' ], $decoded );
2010-11-13 23:44:11 +00:00
$this -> assertEquals ( $r [ 'header' ], array ( 'foo-header' => 'bar' , 'cake' => 'PHP' ));
2008-05-30 11:40:08 +00:00
2010-06-01 02:34:10 +00:00
$encoded = " 19 \r \n This is a chunked message \r \n E \r \n \n That is cool \n \r \n " ;
2008-05-30 11:40:08 +00:00
$r = $this -> Socket -> decodeChunkedBody ( $encoded );
2010-06-01 02:34:10 +00:00
$this -> assertEquals ( $r [ 'body' ], $decoded );
$this -> assertEquals ( $r [ 'header' ], false );
2008-05-30 11:40:08 +00:00
2010-06-01 02:34:10 +00:00
$this -> Socket -> quirksMode = false ;
$encoded = " 19 \r \n This is a chunked message \r \n E \r \n \n That is cool \n \r \n " ;
$this -> expectError ();
2008-05-30 11:40:08 +00:00
$r = $this -> Socket -> decodeChunkedBody ( $encoded );
2010-06-01 02:34:10 +00:00
$this -> assertEquals ( $r , false );
2008-05-30 11:40:08 +00:00
}
2009-07-24 19:18:37 +00:00
2008-06-02 19:22:55 +00:00
/**
* testBuildRequestLine method
2008-07-05 14:31:22 +00:00
*
2008-06-02 19:22:55 +00:00
* @ access public
* @ return void
*/
2008-05-30 11:40:08 +00:00
function testBuildRequestLine () {
$this -> Socket -> reset ();
$this -> Socket -> quirksMode = true ;
$r = $this -> Socket -> buildRequestLine ( 'Foo' );
2010-06-01 02:34:10 +00:00
$this -> assertEquals ( $r , 'Foo' );
2008-05-30 11:40:08 +00:00
$this -> Socket -> quirksMode = false ;
$r = $this -> Socket -> buildRequestLine ( true );
2010-06-01 02:34:10 +00:00
$this -> assertEquals ( $r , false );
2008-05-30 11:40:08 +00:00
$r = $this -> Socket -> buildRequestLine ( array ( 'foo' => 'bar' , 'method' => 'foo' ));
2010-06-01 02:34:10 +00:00
$this -> assertEquals ( $r , false );
2008-05-30 11:40:08 +00:00
$r = $this -> Socket -> buildRequestLine ( array ( 'method' => 'GET' , 'uri' => 'http://www.cakephp.org/search?q=socket' ));
2010-06-01 02:34:10 +00:00
$this -> assertEquals ( $r , " GET /search?q=socket HTTP/1.1 \r \n " );
2008-05-30 11:40:08 +00:00
$request = array (
'method' => 'GET' ,
'uri' => array (
'path' => '/search' ,
'query' => array ( 'q' => 'socket' )
)
);
$r = $this -> Socket -> buildRequestLine ( $request );
2010-06-01 02:34:10 +00:00
$this -> assertEquals ( $r , " GET /search?q=socket HTTP/1.1 \r \n " );
2008-05-30 11:40:08 +00:00
unset ( $request [ 'method' ]);
$r = $this -> Socket -> buildRequestLine ( $request );
2010-06-01 02:34:10 +00:00
$this -> assertEquals ( $r , " GET /search?q=socket HTTP/1.1 \r \n " );
2008-05-30 11:40:08 +00:00
$r = $this -> Socket -> buildRequestLine ( $request , 'CAKE-HTTP/0.1' );
2010-06-01 02:34:10 +00:00
$this -> assertEquals ( $r , " GET /search?q=socket CAKE-HTTP/0.1 \r \n " );
2008-05-30 11:40:08 +00:00
$request = array ( 'method' => 'OPTIONS' , 'uri' => '*' );
$r = $this -> Socket -> buildRequestLine ( $request );
2010-06-01 02:34:10 +00:00
$this -> assertEquals ( $r , " OPTIONS * HTTP/1.1 \r \n " );
2008-05-30 11:40:08 +00:00
$request [ 'method' ] = 'GET' ;
2010-06-01 02:34:10 +00:00
$this -> Socket -> quirksMode = true ;
2008-05-30 11:40:08 +00:00
$r = $this -> Socket -> buildRequestLine ( $request );
2010-06-01 02:34:10 +00:00
$this -> assertEquals ( $r , " GET * HTTP/1.1 \r \n " );
2008-05-30 11:40:08 +00:00
$r = $this -> Socket -> buildRequestLine ( " GET * HTTP/1.1 \r \n " );
2010-06-01 02:34:10 +00:00
$this -> assertEquals ( $r , " GET * HTTP/1.1 \r \n " );
}
2008-05-30 11:40:08 +00:00
2010-06-01 02:34:10 +00:00
/**
* testBadBuildRequestLine method
*
* @ access public
* @ return void
*/
function testBadBuildRequestLine () {
$this -> expectError ();
$r = $this -> Socket -> buildRequestLine ( 'Foo' );
}
2008-05-30 11:40:08 +00:00
2010-06-01 02:34:10 +00:00
/**
* testBadBuildRequestLine2 method
*
* @ access public
* @ return void
*/
function testBadBuildRequestLine2 () {
$this -> expectError ();
2008-05-30 11:40:08 +00:00
$r = $this -> Socket -> buildRequestLine ( " GET * HTTP/1.1 \r \n " );
}
2009-07-24 19:18:37 +00:00
2008-05-30 11:40:08 +00:00
/**
* Asserts that HttpSocket :: parseUri is working properly
*
2009-03-18 17:55:58 +00:00
* @ access public
* @ return void
2008-05-30 11:40:08 +00:00
*/
function testParseUri () {
$this -> Socket -> reset ();
$uri = $this -> Socket -> parseUri ( array ( 'invalid' => 'uri-string' ));
2010-06-01 02:34:10 +00:00
$this -> assertEquals ( $uri , false );
2008-05-30 11:40:08 +00:00
$uri = $this -> Socket -> parseUri ( array ( 'invalid' => 'uri-string' ), array ( 'host' => 'somehost' ));
2010-06-01 02:34:10 +00:00
$this -> assertEquals ( $uri , array ( 'host' => 'somehost' , 'invalid' => 'uri-string' ));
2008-05-30 11:40:08 +00:00
$uri = $this -> Socket -> parseUri ( false );
2010-06-01 02:34:10 +00:00
$this -> assertEquals ( $uri , false );
2008-05-30 11:40:08 +00:00
$uri = $this -> Socket -> parseUri ( '/my-cool-path' );
2010-06-01 02:34:10 +00:00
$this -> assertEquals ( $uri , array ( 'path' => '/my-cool-path' ));
2008-05-30 11:40:08 +00:00
$uri = $this -> Socket -> parseUri ( 'http://bob:foo123@www.cakephp.org:40/search?q=dessert#results' );
2010-06-01 02:34:10 +00:00
$this -> assertEquals ( $uri , array (
2008-05-30 11:40:08 +00:00
'scheme' => 'http' ,
'host' => 'www.cakephp.org' ,
'port' => 40 ,
'user' => 'bob' ,
'pass' => 'foo123' ,
'path' => '/search' ,
'query' => array ( 'q' => 'dessert' ),
'fragment' => 'results'
));
$uri = $this -> Socket -> parseUri ( 'http://www.cakephp.org/' );
2010-06-01 02:34:10 +00:00
$this -> assertEquals ( $uri , array (
2008-05-30 11:40:08 +00:00
'scheme' => 'http' ,
'host' => 'www.cakephp.org' ,
'path' => '/' ,
));
$uri = $this -> Socket -> parseUri ( 'http://www.cakephp.org' , true );
2010-06-01 02:34:10 +00:00
$this -> assertEquals ( $uri , array (
2008-05-30 11:40:08 +00:00
'scheme' => 'http' ,
'host' => 'www.cakephp.org' ,
'port' => 80 ,
'user' => null ,
'pass' => null ,
'path' => '/' ,
'query' => array (),
'fragment' => null
));
$uri = $this -> Socket -> parseUri ( 'https://www.cakephp.org' , true );
2010-06-01 02:34:10 +00:00
$this -> assertEquals ( $uri , array (
2008-05-30 11:40:08 +00:00
'scheme' => 'https' ,
'host' => 'www.cakephp.org' ,
'port' => 443 ,
'user' => null ,
'pass' => null ,
'path' => '/' ,
'query' => array (),
'fragment' => null
));
$uri = $this -> Socket -> parseUri ( 'www.cakephp.org:443/query?foo' , true );
2010-06-01 02:34:10 +00:00
$this -> assertEquals ( $uri , array (
2008-05-30 11:40:08 +00:00
'scheme' => 'https' ,
'host' => 'www.cakephp.org' ,
'port' => 443 ,
'user' => null ,
'pass' => null ,
'path' => '/query' ,
'query' => array ( 'foo' => " " ),
'fragment' => null
));
$uri = $this -> Socket -> parseUri ( 'http://www.cakephp.org' , array ( 'host' => 'piephp.org' , 'user' => 'bob' , 'fragment' => 'results' ));
2010-06-01 02:34:10 +00:00
$this -> assertEquals ( $uri , array (
2008-05-30 11:40:08 +00:00
'host' => 'www.cakephp.org' ,
'user' => 'bob' ,
'fragment' => 'results' ,
'scheme' => 'http'
));
$uri = $this -> Socket -> parseUri ( 'https://www.cakephp.org' , array ( 'scheme' => 'http' , 'port' => 23 ));
2010-06-01 02:34:10 +00:00
$this -> assertEquals ( $uri , array (
2008-05-30 11:40:08 +00:00
'scheme' => 'https' ,
'port' => 23 ,
'host' => 'www.cakephp.org'
));
$uri = $this -> Socket -> parseUri ( 'www.cakephp.org:59' , array ( 'scheme' => array ( 'http' , 'https' ), 'port' => 80 ));
2010-06-01 02:34:10 +00:00
$this -> assertEquals ( $uri , array (
2008-05-30 11:40:08 +00:00
'scheme' => 'http' ,
'port' => 59 ,
'host' => 'www.cakephp.org'
));
$uri = $this -> Socket -> parseUri ( array ( 'scheme' => 'http' , 'host' => 'www.google.com' , 'port' => 8080 ), array ( 'scheme' => array ( 'http' , 'https' ), 'host' => 'www.google.com' , 'port' => array ( 80 , 443 )));
2010-06-01 02:34:10 +00:00
$this -> assertEquals ( $uri , array (
2008-05-30 11:40:08 +00:00
'scheme' => 'http' ,
'host' => 'www.google.com' ,
'port' => 8080 ,
));
2009-10-30 00:14:36 +00:00
$uri = $this -> Socket -> parseUri ( 'http://www.cakephp.org/?param1=value1¶m2=value2%3Dvalue3' );
2010-06-01 02:34:10 +00:00
$this -> assertEquals ( $uri , array (
2009-10-30 00:14:36 +00:00
'scheme' => 'http' ,
'host' => 'www.cakephp.org' ,
'path' => '/' ,
'query' => array (
'param1' => 'value1' ,
'param2' => 'value2=value3'
)
));
$uri = $this -> Socket -> parseUri ( 'http://www.cakephp.org/?param1=value1¶m2=value2=value3' );
2010-06-01 02:34:10 +00:00
$this -> assertEquals ( $uri , array (
2009-10-30 00:14:36 +00:00
'scheme' => 'http' ,
'host' => 'www.cakephp.org' ,
'path' => '/' ,
'query' => array (
'param1' => 'value1' ,
'param2' => 'value2=value3'
)
));
2008-05-30 11:40:08 +00:00
}
2009-07-24 19:18:37 +00:00
2008-05-30 11:40:08 +00:00
/**
* Tests that HttpSocket :: buildUri can turn all kinds of uri arrays ( and strings ) into fully or partially qualified URI ' s
*
2009-03-18 17:55:58 +00:00
* @ access public
* @ return void
2008-05-30 11:40:08 +00:00
*/
function testBuildUri () {
$this -> Socket -> reset ();
$r = $this -> Socket -> buildUri ( true );
2010-06-01 02:34:10 +00:00
$this -> assertEquals ( $r , false );
2008-05-30 11:40:08 +00:00
$r = $this -> Socket -> buildUri ( 'foo.com' );
2010-06-01 02:34:10 +00:00
$this -> assertEquals ( $r , 'http://foo.com/' );
2008-05-30 11:40:08 +00:00
$r = $this -> Socket -> buildUri ( array ( 'host' => 'www.cakephp.org' ));
2010-06-01 02:34:10 +00:00
$this -> assertEquals ( $r , 'http://www.cakephp.org/' );
2008-05-30 11:40:08 +00:00
$r = $this -> Socket -> buildUri ( array ( 'host' => 'www.cakephp.org' , 'scheme' => 'https' ));
2010-06-01 02:34:10 +00:00
$this -> assertEquals ( $r , 'https://www.cakephp.org/' );
2008-05-30 11:40:08 +00:00
$r = $this -> Socket -> buildUri ( array ( 'host' => 'www.cakephp.org' , 'port' => 23 ));
2010-06-01 02:34:10 +00:00
$this -> assertEquals ( $r , 'http://www.cakephp.org:23/' );
2008-05-30 11:40:08 +00:00
2009-11-13 19:42:40 +00:00
$r = $this -> Socket -> buildUri ( array ( 'path' => 'www.google.com/search' , 'query' => 'q=cakephp' ));
2010-06-01 02:34:10 +00:00
$this -> assertEquals ( $r , 'http://www.google.com/search?q=cakephp' );
2009-11-13 19:42:40 +00:00
2008-05-30 11:40:08 +00:00
$r = $this -> Socket -> buildUri ( array ( 'host' => 'www.cakephp.org' , 'scheme' => 'https' , 'port' => 79 ));
2010-06-01 02:34:10 +00:00
$this -> assertEquals ( $r , 'https://www.cakephp.org:79/' );
2008-05-30 11:40:08 +00:00
$r = $this -> Socket -> buildUri ( array ( 'host' => 'www.cakephp.org' , 'path' => 'foo' ));
2010-06-01 02:34:10 +00:00
$this -> assertEquals ( $r , 'http://www.cakephp.org/foo' );
2008-05-30 11:40:08 +00:00
$r = $this -> Socket -> buildUri ( array ( 'host' => 'www.cakephp.org' , 'path' => '/foo' ));
2010-06-01 02:34:10 +00:00
$this -> assertEquals ( $r , 'http://www.cakephp.org/foo' );
2008-05-30 11:40:08 +00:00
$r = $this -> Socket -> buildUri ( array ( 'host' => 'www.cakephp.org' , 'path' => '/search' , 'query' => array ( 'q' => 'HttpSocket' )));
2010-06-01 02:34:10 +00:00
$this -> assertEquals ( $r , 'http://www.cakephp.org/search?q=HttpSocket' );
2008-05-30 11:40:08 +00:00
$r = $this -> Socket -> buildUri ( array ( 'host' => 'www.cakephp.org' , 'fragment' => 'bar' ));
2010-06-01 02:34:10 +00:00
$this -> assertEquals ( $r , 'http://www.cakephp.org/#bar' );
2008-05-30 11:40:08 +00:00
$r = $this -> Socket -> buildUri ( array (
'scheme' => 'https' ,
'host' => 'www.cakephp.org' ,
'port' => 25 ,
'user' => 'bob' ,
'pass' => 'secret' ,
'path' => '/cool' ,
'query' => array ( 'foo' => 'bar' ),
'fragment' => 'comment'
));
2010-06-01 02:34:10 +00:00
$this -> assertEquals ( $r , 'https://bob:secret@www.cakephp.org:25/cool?foo=bar#comment' );
2008-05-30 11:40:08 +00:00
$r = $this -> Socket -> buildUri ( array ( 'host' => 'www.cakephp.org' , 'fragment' => 'bar' ), '%fragment?%host' );
2010-06-01 02:34:10 +00:00
$this -> assertEquals ( $r , 'bar?www.cakephp.org' );
2008-05-30 11:40:08 +00:00
$r = $this -> Socket -> buildUri ( array ( 'host' => 'www.cakephp.org' ), '%fragment???%host' );
2010-06-01 02:34:10 +00:00
$this -> assertEquals ( $r , '???www.cakephp.org' );
2008-05-30 11:40:08 +00:00
$r = $this -> Socket -> buildUri ( array ( 'path' => '*' ), '/%path?%query' );
2010-06-01 02:34:10 +00:00
$this -> assertEquals ( $r , '*' );
2008-05-30 11:40:08 +00:00
$r = $this -> Socket -> buildUri ( array ( 'scheme' => 'foo' , 'host' => 'www.cakephp.org' ));
2010-06-01 02:34:10 +00:00
$this -> assertEquals ( $r , 'foo://www.cakephp.org:80/' );
2008-05-30 11:40:08 +00:00
}
2009-07-24 19:18:37 +00:00
2008-05-30 11:40:08 +00:00
/**
* Asserts that HttpSocket :: parseQuery is working properly
*
2009-03-18 17:55:58 +00:00
* @ access public
* @ return void
2008-05-30 11:40:08 +00:00
*/
function testParseQuery () {
$this -> Socket -> reset ();
$query = $this -> Socket -> parseQuery ( array ( 'framework' => 'cakephp' ));
2010-06-01 02:34:10 +00:00
$this -> assertEquals ( $query , array ( 'framework' => 'cakephp' ));
2008-05-30 11:40:08 +00:00
$query = $this -> Socket -> parseQuery ( '' );
2010-06-01 02:34:10 +00:00
$this -> assertEquals ( $query , array ());
2008-05-30 11:40:08 +00:00
$query = $this -> Socket -> parseQuery ( 'framework=cakephp' );
2010-06-01 02:34:10 +00:00
$this -> assertEquals ( $query , array ( 'framework' => 'cakephp' ));
2008-05-30 11:40:08 +00:00
$query = $this -> Socket -> parseQuery ( '?framework=cakephp' );
2010-06-01 02:34:10 +00:00
$this -> assertEquals ( $query , array ( 'framework' => 'cakephp' ));
2008-05-30 11:40:08 +00:00
$query = $this -> Socket -> parseQuery ( 'a&b&c' );
2010-06-01 02:34:10 +00:00
$this -> assertEquals ( $query , array ( 'a' => '' , 'b' => '' , 'c' => '' ));
2008-05-30 11:40:08 +00:00
$query = $this -> Socket -> parseQuery ( 'value=12345' );
2010-06-01 02:34:10 +00:00
$this -> assertEquals ( $query , array ( 'value' => '12345' ));
2008-05-30 11:40:08 +00:00
$query = $this -> Socket -> parseQuery ( 'a[0]=foo&a[1]=bar&a[2]=cake' );
2010-06-01 02:34:10 +00:00
$this -> assertEquals ( $query , array ( 'a' => array ( 0 => 'foo' , 1 => 'bar' , 2 => 'cake' )));
2008-05-30 11:40:08 +00:00
$query = $this -> Socket -> parseQuery ( 'a[]=foo&a[]=bar&a[]=cake' );
2010-06-01 02:34:10 +00:00
$this -> assertEquals ( $query , array ( 'a' => array ( 0 => 'foo' , 1 => 'bar' , 2 => 'cake' )));
2008-05-30 11:40:08 +00:00
$query = $this -> Socket -> parseQuery ( 'a]][[=foo&[]=bar&]]][]=cake' );
2010-06-01 02:34:10 +00:00
$this -> assertEquals ( $query , array ( 'a]][[' => 'foo' , 0 => 'bar' , ']]]' => array ( 'cake' )));
2008-05-30 11:40:08 +00:00
$query = $this -> Socket -> parseQuery ( 'a[][]=foo&a[][]=bar&a[][]=cake' );
$expectedQuery = array (
'a' => array (
0 => array (
0 => 'foo'
),
1 => array (
0 => 'bar'
),
array (
0 => 'cake'
)
)
);
2010-06-01 02:34:10 +00:00
$this -> assertEquals ( $query , $expectedQuery );
2008-05-30 11:40:08 +00:00
$query = $this -> Socket -> parseQuery ( 'a[][]=foo&a[bar]=php&a[][]=bar&a[][]=cake' );
$expectedQuery = array (
'a' => array (
0 => array (
0 => 'foo'
),
'bar' => 'php' ,
1 => array (
0 => 'bar'
),
array (
0 => 'cake'
)
)
);
2010-06-01 02:34:10 +00:00
$this -> assertEquals ( $query , $expectedQuery );
2008-05-30 11:40:08 +00:00
$query = $this -> Socket -> parseQuery ( 'user[]=jim&user[3]=tom&user[]=bob' );
$expectedQuery = array (
'user' => array (
0 => 'jim' ,
3 => 'tom' ,
4 => 'bob'
)
);
2010-06-01 02:34:10 +00:00
$this -> assertEquals ( $query , $expectedQuery );
2008-05-30 11:40:08 +00:00
$queryStr = 'user[0]=foo&user[0][items][]=foo&user[0][items][]=bar&user[][name]=jim&user[1][items][personal][]=book&user[1][items][personal][]=pen&user[1][items][]=ball&user[count]=2&empty' ;
$query = $this -> Socket -> parseQuery ( $queryStr );
$expectedQuery = array (
'user' => array (
0 => array (
'items' => array (
'foo' ,
'bar'
)
),
1 => array (
'name' => 'jim' ,
'items' => array (
'personal' => array (
'book'
, 'pen'
),
'ball'
)
),
'count' => '2'
),
'empty' => ''
);
2010-06-01 02:34:10 +00:00
$this -> assertEquals ( $query , $expectedQuery );
2008-05-30 11:40:08 +00:00
}
2009-07-24 19:18:37 +00:00
2008-05-30 11:40:08 +00:00
/**
* Tests that HttpSocket :: buildHeader can turn a given $header array into a proper header string according to
* HTTP 1.1 specs .
*
2009-03-18 17:55:58 +00:00
* @ access public
* @ return void
2008-05-30 11:40:08 +00:00
*/
function testBuildHeader () {
$this -> Socket -> reset ();
$r = $this -> Socket -> buildHeader ( true );
2010-06-01 02:34:10 +00:00
$this -> assertEquals ( $r , false );
2008-05-30 11:40:08 +00:00
$r = $this -> Socket -> buildHeader ( 'My raw header' );
2010-06-01 02:34:10 +00:00
$this -> assertEquals ( $r , 'My raw header' );
2008-05-30 11:40:08 +00:00
$r = $this -> Socket -> buildHeader ( array ( 'Host' => 'www.cakephp.org' ));
2010-06-01 02:34:10 +00:00
$this -> assertEquals ( $r , " Host: www.cakephp.org \r \n " );
2008-05-30 11:40:08 +00:00
$r = $this -> Socket -> buildHeader ( array ( 'Host' => 'www.cakephp.org' , 'Connection' => 'Close' ));
2010-06-01 02:34:10 +00:00
$this -> assertEquals ( $r , " Host: www.cakephp.org \r \n Connection: Close \r \n " );
2008-05-30 11:40:08 +00:00
$r = $this -> Socket -> buildHeader ( array ( 'People' => array ( 'Bob' , 'Jim' , 'John' )));
2010-06-01 02:34:10 +00:00
$this -> assertEquals ( $r , " People: Bob,Jim,John \r \n " );
2008-05-30 11:40:08 +00:00
$r = $this -> Socket -> buildHeader ( array ( 'Multi-Line-Field' => " This is my \r \n Multi Line field " ));
2010-06-01 02:34:10 +00:00
$this -> assertEquals ( $r , " Multi-Line-Field: This is my \r \n Multi Line field \r \n " );
2008-05-30 11:40:08 +00:00
$r = $this -> Socket -> buildHeader ( array ( 'Multi-Line-Field' => " This is my \r \n Multi Line field " ));
2010-06-01 02:34:10 +00:00
$this -> assertEquals ( $r , " Multi-Line-Field: This is my \r \n Multi Line field \r \n " );
2008-05-30 11:40:08 +00:00
$r = $this -> Socket -> buildHeader ( array ( 'Multi-Line-Field' => " This is my \r \n \t Multi Line field " ));
2010-06-01 02:34:10 +00:00
$this -> assertEquals ( $r , " Multi-Line-Field: This is my \r \n \t Multi Line field \r \n " );
2008-05-30 11:40:08 +00:00
$r = $this -> Socket -> buildHeader ( array ( 'Test@Field' => " My value " ));
2010-06-01 02:34:10 +00:00
$this -> assertEquals ( $r , " Test \" @ \" Field: My value \r \n " );
2008-05-30 11:40:08 +00:00
}
2009-07-24 19:18:37 +00:00
2008-05-30 11:40:08 +00:00
/**
* Test that HttpSocket :: parseHeader can take apart a given ( and valid ) $header string and turn it into an array .
*
2009-03-18 17:55:58 +00:00
* @ access public
* @ return void
2008-05-30 11:40:08 +00:00
*/
function testParseHeader () {
$this -> Socket -> reset ();
$r = $this -> Socket -> parseHeader ( array ( 'foo' => 'Bar' , 'fOO-bAr' => 'quux' ));
2010-11-13 23:44:11 +00:00
$this -> assertEquals ( $r , array ( 'foo' => 'Bar' , 'fOO-bAr' => 'quux' ));
2008-05-30 11:40:08 +00:00
$r = $this -> Socket -> parseHeader ( true );
2010-06-01 02:34:10 +00:00
$this -> assertEquals ( $r , false );
2008-05-30 11:40:08 +00:00
$header = " Host: cakephp.org \t \r \n " ;
$r = $this -> Socket -> parseHeader ( $header );
$expected = array (
'Host' => 'cakephp.org'
);
2010-06-01 02:34:10 +00:00
$this -> assertEquals ( $r , $expected );
2008-05-30 11:40:08 +00:00
$header = " Date:Sat, 07 Apr 2007 10:10:25 GMT \r \n X-Powered-By: PHP/5.1.2 \r \n " ;
$r = $this -> Socket -> parseHeader ( $header );
$expected = array (
'Date' => 'Sat, 07 Apr 2007 10:10:25 GMT'
, 'X-Powered-By' => 'PHP/5.1.2'
);
2010-06-01 02:34:10 +00:00
$this -> assertEquals ( $r , $expected );
2008-05-30 11:40:08 +00:00
$header = " people: Jim,John \r \n foo-LAND: Bar \r \n cAKe-PHP: rocks \r \n " ;
$r = $this -> Socket -> parseHeader ( $header );
$expected = array (
2010-11-13 23:44:11 +00:00
'people' => 'Jim,John'
, 'foo-LAND' => 'Bar'
, 'cAKe-PHP' => 'rocks'
2008-05-30 11:40:08 +00:00
);
2010-06-01 02:34:10 +00:00
$this -> assertEquals ( $r , $expected );
2008-05-30 11:40:08 +00:00
$header = " People: Jim,John,Tim \r \n People: Lisa,Tina,Chelsea \r \n " ;
$r = $this -> Socket -> parseHeader ( $header );
$expected = array (
'People' => array ( 'Jim,John,Tim' , 'Lisa,Tina,Chelsea' )
);
2010-06-01 02:34:10 +00:00
$this -> assertEquals ( $r , $expected );
2008-05-30 11:40:08 +00:00
$header = " Multi-Line: I am a \r \n multi line \t \r \n field value. \r \n Single-Line: I am not \r \n " ;
$r = $this -> Socket -> parseHeader ( $header );
$expected = array (
'Multi-Line' => " I am a \r \n multi line \r \n field value. "
, 'Single-Line' => 'I am not'
);
2010-06-01 02:34:10 +00:00
$this -> assertEquals ( $r , $expected );
2008-05-30 11:40:08 +00:00
$header = " Esc \" @ \" ped: value \r \n " ;
$r = $this -> Socket -> parseHeader ( $header );
$expected = array (
'Esc@ped' => 'value'
);
2010-06-01 02:34:10 +00:00
$this -> assertEquals ( $r , $expected );
2008-05-30 11:40:08 +00:00
}
2009-07-24 19:18:37 +00:00
2008-05-30 11:40:08 +00:00
/**
2009-03-18 17:55:58 +00:00
* testParseCookies method
2008-05-30 11:40:08 +00:00
*
* @ access public
2009-03-18 17:55:58 +00:00
* @ return void
2008-05-30 11:40:08 +00:00
*/
function testParseCookies () {
$header = array (
'Set-Cookie' => array (
'foo=bar' ,
2009-05-04 19:53:39 +00:00
'people=jim,jack,johnny";";Path=/accounts' ,
'google=not=nice'
2008-05-30 11:40:08 +00:00
),
'Transfer-Encoding' => 'chunked' ,
'Date' => 'Sun, 18 Nov 2007 18:57:42 GMT' ,
);
$cookies = $this -> Socket -> parseCookies ( $header );
$expected = array (
'foo' => array (
'value' => 'bar'
),
'people' => array (
'value' => 'jim,jack,johnny";"' ,
2009-05-04 19:53:39 +00:00
'path' => '/accounts' ,
),
'google' => array (
'value' => 'not=nice' ,
2008-05-30 11:40:08 +00:00
)
);
$this -> assertEqual ( $cookies , $expected );
$header [ 'Set-Cookie' ][] = 'cakephp=great; Secure' ;
$expected [ 'cakephp' ] = array ( 'value' => 'great' , 'secure' => true );
$cookies = $this -> Socket -> parseCookies ( $header );
$this -> assertEqual ( $cookies , $expected );
$header [ 'Set-Cookie' ] = 'foo=bar' ;
2009-05-04 19:53:39 +00:00
unset ( $expected [ 'people' ], $expected [ 'cakephp' ], $expected [ 'google' ]);
2008-05-30 11:40:08 +00:00
$cookies = $this -> Socket -> parseCookies ( $header );
$this -> assertEqual ( $cookies , $expected );
}
2009-07-24 19:18:37 +00:00
2008-05-30 11:40:08 +00:00
/**
2009-03-18 17:55:58 +00:00
* testBuildCookies method
2008-05-30 11:40:08 +00:00
*
* @ return void
* @ access public
* @ todo Test more scenarios
*/
function testBuildCookies () {
$cookies = array (
'foo' => array (
'value' => 'bar'
),
'people' => array (
'value' => 'jim,jack,johnny;' ,
'path' => '/accounts'
)
);
2010-06-23 03:10:21 +00:00
$expect = " Cookie: foo=bar; people=jim,jack,johnny \" ; \" \r \n " ;
2008-05-30 11:40:08 +00:00
$result = $this -> Socket -> buildCookies ( $cookies );
$this -> assertEqual ( $result , $expect );
}
2009-07-24 19:18:37 +00:00
2008-05-30 11:40:08 +00:00
/**
2009-05-07 18:49:21 +00:00
* Tests that HttpSocket :: _tokenEscapeChars () returns the right characters .
2008-05-30 11:40:08 +00:00
*
2009-03-18 17:55:58 +00:00
* @ access public
* @ return void
2008-05-30 11:40:08 +00:00
*/
function testTokenEscapeChars () {
$this -> Socket -> reset ();
2008-06-20 20:17:23 +00:00
$expected = array (
'\x22' , '\x28' , '\x29' , '\x3c' , '\x3e' , '\x40' , '\x2c' , '\x3b' , '\x3a' , '\x5c' , '\x2f' , '\x5b' , '\x5d' , '\x3f' , '\x3d' , '\x7b' ,
'\x7d' , '\x20' , '\x00' , '\x01' , '\x02' , '\x03' , '\x04' , '\x05' , '\x06' , '\x07' , '\x08' , '\x09' , '\x0a' , '\x0b' , '\x0c' , '\x0d' ,
'\x0e' , '\x0f' , '\x10' , '\x11' , '\x12' , '\x13' , '\x14' , '\x15' , '\x16' , '\x17' , '\x18' , '\x19' , '\x1a' , '\x1b' , '\x1c' , '\x1d' ,
'\x1e' , '\x1f' , '\x7f'
);
2009-05-07 18:49:21 +00:00
$r = $this -> Socket -> tokenEscapeChars ();
2008-05-30 11:40:08 +00:00
$this -> assertEqual ( $r , $expected );
foreach ( $expected as $key => $char ) {
$expected [ $key ] = chr ( hexdec ( substr ( $char , 2 )));
}
2009-05-07 18:49:21 +00:00
$r = $this -> Socket -> tokenEscapeChars ( false );
2008-05-30 11:40:08 +00:00
$this -> assertEqual ( $r , $expected );
}
2009-07-24 19:18:37 +00:00
2008-05-30 11:40:08 +00:00
/**
* Test that HttpSocket :: escapeToken is escaping all characters as descriped in RFC 2616 ( HTTP 1.1 specs )
*
2009-03-18 17:55:58 +00:00
* @ access public
* @ return void
2008-05-30 11:40:08 +00:00
*/
function testEscapeToken () {
$this -> Socket -> reset ();
2010-06-01 02:34:10 +00:00
$this -> assertEquals ( $this -> Socket -> escapeToken ( 'Foo' ), 'Foo' );
2008-05-30 11:40:08 +00:00
2009-05-07 18:49:21 +00:00
$escape = $this -> Socket -> tokenEscapeChars ( false );
2008-05-30 11:40:08 +00:00
foreach ( $escape as $char ) {
$token = 'My-special-' . $char . '-Token' ;
$escapedToken = $this -> Socket -> escapeToken ( $token );
$expectedToken = 'My-special-"' . $char . '"-Token' ;
2010-06-01 02:34:10 +00:00
$this -> assertEquals ( $escapedToken , $expectedToken , 'Test token escaping for ASCII ' . ord ( $char ));
2008-05-30 11:40:08 +00:00
}
$token = 'Extreme-:Token- -"@-test' ;
$escapedToken = $this -> Socket -> escapeToken ( $token );
$expectedToken = 'Extreme-":"Token-" "-""""@"-test' ;
2010-06-01 02:34:10 +00:00
$this -> assertEquals ( $expectedToken , $escapedToken );
2008-05-30 11:40:08 +00:00
}
2009-07-24 19:18:37 +00:00
2008-05-30 11:40:08 +00:00
/**
* Test that escaped token strings are properly unescaped by HttpSocket :: unescapeToken
*
2009-03-18 17:55:58 +00:00
* @ access public
* @ return void
2008-05-30 11:40:08 +00:00
*/
function testUnescapeToken () {
$this -> Socket -> reset ();
2010-06-01 02:34:10 +00:00
$this -> assertEquals ( $this -> Socket -> unescapeToken ( 'Foo' ), 'Foo' );
2008-05-30 11:40:08 +00:00
2009-05-07 18:49:21 +00:00
$escape = $this -> Socket -> tokenEscapeChars ( false );
2008-05-30 11:40:08 +00:00
foreach ( $escape as $char ) {
$token = 'My-special-"' . $char . '"-Token' ;
$unescapedToken = $this -> Socket -> unescapeToken ( $token );
$expectedToken = 'My-special-' . $char . '-Token' ;
2010-06-01 02:34:10 +00:00
$this -> assertEquals ( $unescapedToken , $expectedToken , 'Test token unescaping for ASCII ' . ord ( $char ));
2008-05-30 11:40:08 +00:00
}
$token = 'Extreme-":"Token-" "-""""@"-test' ;
$escapedToken = $this -> Socket -> unescapeToken ( $token );
$expectedToken = 'Extreme-:Token- -"@-test' ;
2010-06-01 02:34:10 +00:00
$this -> assertEquals ( $expectedToken , $escapedToken );
2008-05-30 11:40:08 +00:00
}
2009-07-24 19:18:37 +00:00
2008-05-30 11:40:08 +00:00
/**
* This tests asserts HttpSocket :: reset () resets a HttpSocket instance to it ' s initial state ( before Object :: __construct
* got executed )
*
2009-03-18 17:55:58 +00:00
* @ access public
* @ return void
2008-05-30 11:40:08 +00:00
*/
function testReset () {
$this -> Socket -> reset ();
$initialState = get_class_vars ( 'HttpSocket' );
foreach ( $initialState as $property => $value ) {
$this -> Socket -> { $property } = 'Overwritten' ;
}
$return = $this -> Socket -> reset ();
foreach ( $initialState as $property => $value ) {
2010-06-01 02:34:10 +00:00
$this -> assertEquals ( $this -> Socket -> { $property }, $value );
2008-05-30 11:40:08 +00:00
}
2010-06-01 02:34:10 +00:00
$this -> assertEquals ( $return , true );
2008-05-30 11:40:08 +00:00
}
2009-07-24 19:18:37 +00:00
2008-05-30 11:40:08 +00:00
/**
* This tests asserts HttpSocket :: reset ( false ) resets certain HttpSocket properties to their initial state ( before
* Object :: __construct got executed ) .
*
2009-03-18 17:55:58 +00:00
* @ access public
* @ return void
2008-05-30 11:40:08 +00:00
*/
function testPartialReset () {
$this -> Socket -> reset ();
$partialResetProperties = array ( 'request' , 'response' );
$initialState = get_class_vars ( 'HttpSocket' );
foreach ( $initialState as $property => $value ) {
$this -> Socket -> { $property } = 'Overwritten' ;
}
$return = $this -> Socket -> reset ( false );
foreach ( $initialState as $property => $originalValue ) {
if ( in_array ( $property , $partialResetProperties )) {
2010-06-01 02:34:10 +00:00
$this -> assertEquals ( $this -> Socket -> { $property }, $originalValue );
2008-05-30 11:40:08 +00:00
} else {
2010-06-01 02:34:10 +00:00
$this -> assertEquals ( $this -> Socket -> { $property }, 'Overwritten' );
2008-05-30 11:40:08 +00:00
}
}
2010-06-01 02:34:10 +00:00
$this -> assertEquals ( $return , true );
2008-05-30 11:40:08 +00:00
}
}