/lib/Cake/Test/Case/Network/Http/HttpSocketTest.php
PHP | 1764 lines | 1222 code | 213 blank | 329 comment | 6 complexity | 26a45281c8ecac695e15f5bc26509e1f MD5 | raw file
Large files files are truncated, but you can click here to view the full file
1<?php 2/** 3 * HttpSocketTest file 4 * 5 * CakePHP(tm) Tests <http://book.cakephp.org/2.0/en/development/testing.html> 6 * Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org) 7 * 8 * Licensed under The MIT License 9 * For full copyright and license information, please see the LICENSE.txt 10 * Redistributions of files must retain the above copyright notice 11 * 12 * @copyright Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org) 13 * @link http://book.cakephp.org/2.0/en/development/testing.html CakePHP(tm) Tests 14 * @package Cake.Test.Case.Network.Http 15 * @since CakePHP(tm) v 1.2.0.4206 16 * @license http://www.opensource.org/licenses/mit-license.php MIT License 17 */ 18 19App::uses('HttpSocket', 'Network/Http'); 20App::uses('HttpResponse', 'Network/Http'); 21 22/** 23 * TestAuthentication class 24 * 25 * @package Cake.Test.Case.Network.Http 26 */ 27class TestAuthentication { 28 29/** 30 * authentication method 31 * 32 * @param HttpSocket $http 33 * @param array $authInfo 34 * @return void 35 */ 36 public static function authentication(HttpSocket $http, &$authInfo) { 37 $http->request['header']['Authorization'] = 'Test ' . $authInfo['user'] . '.' . $authInfo['pass']; 38 } 39 40/** 41 * proxyAuthentication method 42 * 43 * @param HttpSocket $http 44 * @param array $proxyInfo 45 * @return void 46 */ 47 public static function proxyAuthentication(HttpSocket $http, &$proxyInfo) { 48 $http->request['header']['Proxy-Authorization'] = 'Test ' . $proxyInfo['user'] . '.' . $proxyInfo['pass']; 49 } 50 51} 52 53/** 54 * CustomResponse 55 * 56 */ 57class CustomResponse { 58 59/** 60 * First 10 chars 61 * 62 * @var string 63 */ 64 public $first10; 65 66/** 67 * Constructor 68 * 69 */ 70 public function __construct($message) { 71 $this->first10 = substr($message, 0, 10); 72 } 73 74} 75 76/** 77 * TestHttpSocket 78 * 79 */ 80class TestHttpSocket extends HttpSocket { 81 82/** 83 * Convenience method for testing protected method 84 * 85 * @param string|array $uri URI (see {@link _parseUri()}) 86 * @return array Current configuration settings 87 */ 88 public function configUri($uri = null) { 89 return parent::_configUri($uri); 90 } 91 92/** 93 * Convenience method for testing protected method 94 * 95 * @param string|array $uri URI to parse 96 * @param boolean|array $base If true use default URI config, otherwise indexed array to set 'scheme', 'host', 'port', etc. 97 * @return array Parsed URI 98 */ 99 public function parseUri($uri = null, $base = array()) { 100 return parent::_parseUri($uri, $base); 101 } 102 103/** 104 * Convenience method for testing protected method 105 * 106 * @param array $uri A $uri array, or uses $this->config if left empty 107 * @param string $uriTemplate The Uri template/format to use 108 * @return string A fully qualified URL formatted according to $uriTemplate 109 */ 110 public function buildUri($uri = array(), $uriTemplate = '%scheme://%user:%pass@%host:%port/%path?%query#%fragment') { 111 return parent::_buildUri($uri, $uriTemplate); 112 } 113 114/** 115 * Convenience method for testing protected method 116 * 117 * @param array $header Header to build 118 * @return string Header built from array 119 */ 120 public function buildHeader($header, $mode = 'standard') { 121 return parent::_buildHeader($header, $mode); 122 } 123 124/** 125 * Convenience method for testing protected method 126 * 127 * @param string|array $query A query string to parse into an array or an array to return directly "as is" 128 * @return array The $query parsed into a possibly multi-level array. If an empty $query is given, an empty array is returned. 129 */ 130 public function parseQuery($query) { 131 return parent::_parseQuery($query); 132 } 133 134/** 135 * Convenience method for testing protected method 136 * 137 * @param array $request Needs to contain a 'uri' key. Should also contain a 'method' key, otherwise defaults to GET. 138 * @param string $versionToken The version token to use, defaults to HTTP/1.1 139 * @return string Request line 140 */ 141 public function buildRequestLine($request = array(), $versionToken = 'HTTP/1.1') { 142 return parent::_buildRequestLine($request, $versionToken); 143 } 144 145/** 146 * Convenience method for testing protected method 147 * 148 * @param boolean $hex true to get them as HEX values, false otherwise 149 * @return array Escape chars 150 */ 151 public function tokenEscapeChars($hex = true, $chars = null) { 152 return parent::_tokenEscapeChars($hex, $chars); 153 } 154 155/** 156 * Convenience method for testing protected method 157 * 158 * @param string $token Token to escape 159 * @return string Escaped token 160 */ 161 public function escapeToken($token, $chars = null) { 162 return parent::_escapeToken($token, $chars); 163 } 164 165} 166 167/** 168 * HttpSocketTest class 169 * 170 * @package Cake.Test.Case.Network.Http 171 */ 172class HttpSocketTest extends CakeTestCase { 173 174/** 175 * Socket property 176 * 177 * @var mixed null 178 */ 179 public $Socket = null; 180 181/** 182 * RequestSocket property 183 * 184 * @var mixed null 185 */ 186 public $RequestSocket = null; 187 188/** 189 * This function sets up a TestHttpSocket instance we are going to use for testing 190 * 191 * @return void 192 */ 193 public function setUp() { 194 parent::setUp(); 195 if (!class_exists('MockHttpSocket')) { 196 $this->getMock('TestHttpSocket', array('read', 'write', 'connect'), array(), 'MockHttpSocket'); 197 $this->getMock('TestHttpSocket', array('read', 'write', 'connect', 'request'), array(), 'MockHttpSocketRequests'); 198 } 199 200 $this->Socket = new MockHttpSocket(); 201 $this->RequestSocket = new MockHttpSocketRequests(); 202 } 203 204/** 205 * We use this function to clean up after the test case was executed 206 * 207 * @return void 208 */ 209 public function tearDown() { 210 parent::tearDown(); 211 unset($this->Socket, $this->RequestSocket); 212 } 213 214/** 215 * Test that HttpSocket::__construct does what one would expect it to do 216 * 217 * @return void 218 */ 219 public function testConstruct() { 220 $this->Socket->reset(); 221 $baseConfig = $this->Socket->config; 222 $this->Socket->expects($this->never())->method('connect'); 223 $this->Socket->__construct(array('host' => 'foo-bar')); 224 $baseConfig['host'] = 'foo-bar'; 225 $baseConfig['protocol'] = getprotobyname($baseConfig['protocol']); 226 $this->assertEquals($this->Socket->config, $baseConfig); 227 228 $this->Socket->reset(); 229 $baseConfig = $this->Socket->config; 230 $this->Socket->__construct('http://www.cakephp.org:23/'); 231 $baseConfig['host'] = $baseConfig['request']['uri']['host'] = 'www.cakephp.org'; 232 $baseConfig['port'] = $baseConfig['request']['uri']['port'] = 23; 233 $baseConfig['request']['uri']['scheme'] = 'http'; 234 $baseConfig['protocol'] = getprotobyname($baseConfig['protocol']); 235 $this->assertEquals($this->Socket->config, $baseConfig); 236 237 $this->Socket->reset(); 238 $this->Socket->__construct(array('request' => array('uri' => 'http://www.cakephp.org:23/'))); 239 $this->assertEquals($this->Socket->config, $baseConfig); 240 } 241 242/** 243 * Test that HttpSocket::configUri works properly with different types of arguments 244 * 245 * @return void 246 */ 247 public function testConfigUri() { 248 $this->Socket->reset(); 249 $r = $this->Socket->configUri('https://bob:secret@www.cakephp.org:23/?query=foo'); 250 $expected = array( 251 'persistent' => false, 252 'host' => 'www.cakephp.org', 253 'protocol' => 'tcp', 254 'port' => 23, 255 'timeout' => 30, 256 'ssl_verify_peer' => true, 257 'ssl_allow_self_signed' => false, 258 'ssl_verify_depth' => 5, 259 'ssl_verify_host' => true, 260 'request' => array( 261 'uri' => array( 262 'scheme' => 'https', 263 'host' => 'www.cakephp.org', 264 'port' => 23 265 ), 266 'redirect' => false, 267 'cookies' => array(), 268 ) 269 ); 270 $this->assertEquals($expected, $this->Socket->config); 271 $this->assertTrue($r); 272 $r = $this->Socket->configUri(array('host' => 'www.foo-bar.org')); 273 $expected['host'] = 'www.foo-bar.org'; 274 $expected['request']['uri']['host'] = 'www.foo-bar.org'; 275 $this->assertEquals($expected, $this->Socket->config); 276 $this->assertTrue($r); 277 278 $r = $this->Socket->configUri('http://www.foo.com'); 279 $expected = array( 280 'persistent' => false, 281 'host' => 'www.foo.com', 282 'protocol' => 'tcp', 283 'port' => 80, 284 'timeout' => 30, 285 'ssl_verify_peer' => true, 286 'ssl_allow_self_signed' => false, 287 'ssl_verify_depth' => 5, 288 'ssl_verify_host' => true, 289 'request' => array( 290 'uri' => array( 291 'scheme' => 'http', 292 'host' => 'www.foo.com', 293 'port' => 80 294 ), 295 'redirect' => false, 296 'cookies' => array(), 297 ) 298 ); 299 $this->assertEquals($expected, $this->Socket->config); 300 $this->assertTrue($r); 301 302 $r = $this->Socket->configUri('/this-is-broken'); 303 $this->assertEquals($expected, $this->Socket->config); 304 $this->assertFalse($r); 305 306 $r = $this->Socket->configUri(false); 307 $this->assertEquals($expected, $this->Socket->config); 308 $this->assertFalse($r); 309 } 310 311/** 312 * Tests that HttpSocket::request (the heart of the HttpSocket) is working properly. 313 * 314 * @return void 315 */ 316 public function testRequest() { 317 $this->Socket->reset(); 318 319 $response = $this->Socket->request(true); 320 $this->assertFalse($response); 321 322 $context = array( 323 'ssl' => array( 324 'verify_peer' => true, 325 'allow_self_signed' => false, 326 'verify_depth' => 5, 327 'CN_match' => 'www.cakephp.org', 328 'cafile' => CAKE . 'Config' . DS . 'cacert.pem' 329 ) 330 ); 331 332 $tests = array( 333 array( 334 'request' => 'http://www.cakephp.org/?foo=bar', 335 'expectation' => array( 336 'config' => array( 337 'persistent' => false, 338 'host' => 'www.cakephp.org', 339 'protocol' => 'tcp', 340 'port' => 80, 341 'timeout' => 30, 342 'context' => $context, 343 'request' => array( 344 'uri' => array( 345 'scheme' => 'http', 346 'host' => 'www.cakephp.org', 347 'port' => 80 348 ), 349 'redirect' => false, 350 'cookies' => array() 351 ) 352 ), 353 'request' => array( 354 'method' => 'GET', 355 'uri' => array( 356 'scheme' => 'http', 357 'host' => 'www.cakephp.org', 358 'port' => 80, 359 'user' => null, 360 'pass' => null, 361 'path' => '/', 362 'query' => array('foo' => 'bar'), 363 'fragment' => null 364 ), 365 'version' => '1.1', 366 'body' => '', 367 'line' => "GET /?foo=bar HTTP/1.1\r\n", 368 'header' => "Host: www.cakephp.org\r\nConnection: close\r\nUser-Agent: CakePHP\r\n", 369 'raw' => "", 370 'redirect' => false, 371 'cookies' => array(), 372 'proxy' => array(), 373 'auth' => array() 374 ) 375 ) 376 ), 377 array( 378 'request' => array( 379 'uri' => array( 380 'host' => 'www.cakephp.org', 381 'query' => '?foo=bar' 382 ) 383 ) 384 ), 385 array( 386 'request' => 'www.cakephp.org/?foo=bar' 387 ), 388 array( 389 'request' => array( 390 'host' => '192.168.0.1', 391 'uri' => 'http://www.cakephp.org/?foo=bar' 392 ), 393 'expectation' => array( 394 'request' => array( 395 'uri' => array('host' => 'www.cakephp.org') 396 ), 397 'config' => array( 398 'request' => array( 399 'uri' => array('host' => 'www.cakephp.org') 400 ), 401 'host' => '192.168.0.1' 402 ) 403 ) 404 ), 405 'reset4' => array( 406 'request.uri.query' => array() 407 ), 408 array( 409 'request' => array( 410 'header' => array('Foo@woo' => 'bar-value') 411 ), 412 'expectation' => array( 413 'request' => array( 414 'header' => "Host: www.cakephp.org\r\nConnection: close\r\nUser-Agent: CakePHP\r\nFoo\"@\"woo: bar-value\r\n", 415 'line' => "GET / HTTP/1.1\r\n" 416 ) 417 ) 418 ), 419 array( 420 'request' => array('header' => array('Foo@woo' => 'bar-value', 'host' => 'foo.com'), 'uri' => 'http://www.cakephp.org/'), 421 'expectation' => array( 422 'request' => array( 423 'header' => "Host: foo.com\r\nConnection: close\r\nUser-Agent: CakePHP\r\nFoo\"@\"woo: bar-value\r\n" 424 ), 425 'config' => array( 426 'host' => 'www.cakephp.org' 427 ) 428 ) 429 ), 430 array( 431 'request' => array('header' => "Foo: bar\r\n"), 432 'expectation' => array( 433 'request' => array( 434 'header' => "Foo: bar\r\n" 435 ) 436 ) 437 ), 438 array( 439 'request' => array('header' => "Foo: bar\r\n", 'uri' => 'http://www.cakephp.org/search?q=http_socket#ignore-me'), 440 'expectation' => array( 441 'request' => array( 442 'uri' => array( 443 'path' => '/search', 444 'query' => array('q' => 'http_socket'), 445 'fragment' => 'ignore-me' 446 ), 447 'line' => "GET /search?q=http_socket HTTP/1.1\r\n" 448 ) 449 ) 450 ), 451 'reset8' => array( 452 'request.uri.query' => array() 453 ), 454 array( 455 'request' => array( 456 'method' => 'POST', 457 'uri' => 'http://www.cakephp.org/posts/add', 458 'body' => array( 459 'name' => 'HttpSocket-is-released', 460 'date' => 'today' 461 ) 462 ), 463 'expectation' => array( 464 'request' => array( 465 'method' => 'POST', 466 'uri' => array( 467 'path' => '/posts/add', 468 'fragment' => null 469 ), 470 'body' => "name=HttpSocket-is-released&date=today", 471 'line' => "POST /posts/add HTTP/1.1\r\n", 472 'header' => "Host: www.cakephp.org\r\nConnection: close\r\nUser-Agent: CakePHP\r\nContent-Type: application/x-www-form-urlencoded\r\nContent-Length: 38\r\n", 473 'raw' => "name=HttpSocket-is-released&date=today" 474 ) 475 ) 476 ), 477 array( 478 'request' => array( 479 'method' => 'POST', 480 'uri' => 'http://www.cakephp.org:8080/posts/add', 481 'body' => array( 482 'name' => 'HttpSocket-is-released', 483 'date' => 'today' 484 ) 485 ), 486 'expectation' => array( 487 'config' => array( 488 'port' => 8080, 489 'request' => array( 490 'uri' => array( 491 'port' => 8080 492 ) 493 ) 494 ), 495 'request' => array( 496 'uri' => array( 497 'port' => 8080 498 ), 499 'header' => "Host: www.cakephp.org:8080\r\nConnection: close\r\nUser-Agent: CakePHP\r\nContent-Type: application/x-www-form-urlencoded\r\nContent-Length: 38\r\n" 500 ) 501 ) 502 ), 503 array( 504 'request' => array( 505 'method' => 'POST', 506 'uri' => 'https://www.cakephp.org/posts/add', 507 'body' => array( 508 'name' => 'HttpSocket-is-released', 509 'date' => 'today' 510 ) 511 ), 512 'expectation' => array( 513 'config' => array( 514 'port' => 443, 515 'request' => array( 516 'uri' => array( 517 'scheme' => 'https', 518 'port' => 443 519 ) 520 ) 521 ), 522 'request' => array( 523 'uri' => array( 524 'scheme' => 'https', 525 'port' => 443 526 ), 527 'header' => "Host: www.cakephp.org\r\nConnection: close\r\nUser-Agent: CakePHP\r\nContent-Type: application/x-www-form-urlencoded\r\nContent-Length: 38\r\n" 528 ) 529 ) 530 ), 531 array( 532 'request' => array( 533 'method' => 'POST', 534 'uri' => 'https://www.cakephp.org/posts/add', 535 'body' => array('name' => 'HttpSocket-is-released', 'date' => 'today'), 536 'cookies' => array('foo' => array('value' => 'bar')) 537 ), 538 'expectation' => array( 539 'request' => array( 540 'header' => "Host: www.cakephp.org\r\nConnection: close\r\nUser-Agent: CakePHP\r\nContent-Type: application/x-www-form-urlencoded\r\nContent-Length: 38\r\nCookie: foo=bar\r\n", 541 'cookies' => array( 542 'foo' => array('value' => 'bar'), 543 ) 544 ) 545 ) 546 ) 547 ); 548 549 $expectation = array(); 550 foreach ($tests as $i => $test) { 551 if (strpos($i, 'reset') === 0) { 552 foreach ($test as $path => $val) { 553 $expectation = Hash::insert($expectation, $path, $val); 554 } 555 continue; 556 } 557 558 if (isset($test['expectation'])) { 559 $expectation = Hash::merge($expectation, $test['expectation']); 560 } 561 $this->Socket->request($test['request']); 562 563 $raw = $expectation['request']['raw']; 564 $expectation['request']['raw'] = $expectation['request']['line'] . $expectation['request']['header'] . "\r\n" . $raw; 565 566 $r = array('config' => $this->Socket->config, 'request' => $this->Socket->request); 567 $this->assertEquals($r, $expectation, 'Failed test #' . $i . ' '); 568 $expectation['request']['raw'] = $raw; 569 } 570 571 $this->Socket->reset(); 572 $request = array('method' => 'POST', 'uri' => 'http://www.cakephp.org/posts/add', 'body' => array('name' => 'HttpSocket-is-released', 'date' => 'today')); 573 $response = $this->Socket->request($request); 574 $this->assertEquals("name=HttpSocket-is-released&date=today", $this->Socket->request['body']); 575 } 576 577/** 578 * Test the scheme + port keys 579 * 580 * @return void 581 */ 582 public function testGetWithSchemeAndPort() { 583 $this->Socket->reset(); 584 $request = array( 585 'uri' => array( 586 'scheme' => 'http', 587 'host' => 'cakephp.org', 588 'port' => 8080, 589 'path' => '/', 590 ), 591 'method' => 'GET' 592 ); 593 $this->Socket->request($request); 594 $this->assertContains('Host: cakephp.org:8080', $this->Socket->request['header']); 595 } 596 597/** 598 * Test URLs like http://cakephp.org/index.php?somestring without key/value pair for query 599 * 600 * @return void 601 */ 602 public function testRequestWithStringQuery() { 603 $this->Socket->reset(); 604 $request = array( 605 'uri' => array( 606 'scheme' => 'http', 607 'host' => 'cakephp.org', 608 'path' => 'index.php', 609 'query' => 'somestring' 610 ), 611 'method' => 'GET' 612 ); 613 $this->Socket->request($request); 614 $this->assertContains("GET /index.php?somestring HTTP/1.1", $this->Socket->request['line']); 615 } 616 617/** 618 * The "*" asterisk character is only allowed for the following methods: OPTIONS. 619 * 620 * @expectedException SocketException 621 * @return void 622 */ 623 public function testRequestNotAllowedUri() { 624 $this->Socket->reset(); 625 $request = array('uri' => '*', 'method' => 'GET'); 626 $this->Socket->request($request); 627 } 628 629/** 630 * testRequest2 method 631 * 632 * @return void 633 */ 634 public function testRequest2() { 635 $this->Socket->reset(); 636 $request = array('uri' => 'htpp://www.cakephp.org/'); 637 $number = mt_rand(0, 9999999); 638 $this->Socket->expects($this->once())->method('connect')->will($this->returnValue(true)); 639 $serverResponse = "HTTP/1.x 200 OK\r\nDate: Mon, 16 Apr 2007 04:14:16 GMT\r\nServer: CakeHttp Server\r\nContent-Type: text/html\r\n\r\n<h1>Hello, your lucky number is " . $number . "</h1>"; 640 $this->Socket->expects($this->at(0))->method('read')->will($this->returnValue(false)); 641 $this->Socket->expects($this->at(1))->method('read')->will($this->returnValue($serverResponse)); 642 $this->Socket->expects($this->once())->method('write') 643 ->with("GET / HTTP/1.1\r\nHost: www.cakephp.org\r\nConnection: close\r\nUser-Agent: CakePHP\r\n\r\n"); 644 $response = (string)$this->Socket->request($request); 645 $this->assertEquals($response, "<h1>Hello, your lucky number is " . $number . "</h1>"); 646 } 647 648/** 649 * testRequest3 method 650 * 651 * @return void 652 */ 653 public function testRequest3() { 654 $request = array('uri' => 'htpp://www.cakephp.org/'); 655 $serverResponse = "HTTP/1.x 200 OK\r\nSet-Cookie: foo=bar\r\nDate: Mon, 16 Apr 2007 04:14:16 GMT\r\nServer: CakeHttp Server\r\nContent-Type: text/html\r\n\r\n<h1>This is a cookie test!</h1>"; 656 $this->Socket->expects($this->at(1))->method('read')->will($this->returnValue($serverResponse)); 657 $this->Socket->connected = true; 658 $this->Socket->request($request); 659 $result = $this->Socket->response['cookies']; 660 $expect = array( 661 'foo' => array( 662 'value' => 'bar' 663 ) 664 ); 665 $this->assertEquals($expect, $result); 666 $this->assertEquals($this->Socket->config['request']['cookies']['www.cakephp.org'], $expect); 667 $this->assertFalse($this->Socket->connected); 668 } 669 670/** 671 * testRequestWithConstructor method 672 * 673 * @return void 674 */ 675 public function testRequestWithConstructor() { 676 $request = array( 677 'request' => array( 678 'uri' => array( 679 'scheme' => 'http', 680 'host' => 'localhost', 681 'port' => '5984', 682 'user' => null, 683 'pass' => null 684 ) 685 ) 686 ); 687 $http = new MockHttpSocketRequests($request); 688 689 $expected = array('method' => 'GET', 'uri' => '/_test'); 690 $http->expects($this->at(0))->method('request')->with($expected); 691 $http->get('/_test'); 692 693 $expected = array('method' => 'GET', 'uri' => 'http://localhost:5984/_test?count=4'); 694 $http->expects($this->at(0))->method('request')->with($expected); 695 $http->get('/_test', array('count' => 4)); 696 } 697 698/** 699 * testRequestWithResource 700 * 701 * @return void 702 */ 703 public function testRequestWithResource() { 704 $serverResponse = "HTTP/1.x 200 OK\r\nDate: Mon, 16 Apr 2007 04:14:16 GMT\r\nServer: CakeHttp Server\r\nContent-Type: text/html\r\n\r\n<h1>This is a test!</h1>"; 705 $this->Socket->expects($this->at(1))->method('read')->will($this->returnValue($serverResponse)); 706 $this->Socket->expects($this->at(2))->method('read')->will($this->returnValue(false)); 707 $this->Socket->expects($this->at(4))->method('read')->will($this->returnValue($serverResponse)); 708 $this->Socket->connected = true; 709 710 $f = fopen(TMP . 'download.txt', 'w'); 711 if (!$f) { 712 $this->markTestSkipped('Can not write in TMP directory.'); 713 } 714 715 $this->Socket->setContentResource($f); 716 $result = (string)$this->Socket->request('http://www.cakephp.org/'); 717 $this->assertEquals('', $result); 718 $this->assertEquals('CakeHttp Server', $this->Socket->response['header']['Server']); 719 fclose($f); 720 $this->assertEquals(file_get_contents(TMP . 'download.txt'), '<h1>This is a test!</h1>'); 721 unlink(TMP . 'download.txt'); 722 723 $this->Socket->setContentResource(false); 724 $result = (string)$this->Socket->request('http://www.cakephp.org/'); 725 $this->assertEquals('<h1>This is a test!</h1>', $result); 726 } 727 728/** 729 * testRequestWithCrossCookie 730 * 731 * @return void 732 */ 733 public function testRequestWithCrossCookie() { 734 $this->Socket->connected = true; 735 $this->Socket->config['request']['cookies'] = array(); 736 737 $serverResponse = "HTTP/1.x 200 OK\r\nSet-Cookie: foo=bar\r\nDate: Mon, 16 Apr 2007 04:14:16 GMT\r\nServer: CakeHttp Server\r\nContent-Type: text/html\r\n\r\n<h1>This is a test!</h1>"; 738 $this->Socket->expects($this->at(1))->method('read')->will($this->returnValue($serverResponse)); 739 $this->Socket->expects($this->at(2))->method('read')->will($this->returnValue(false)); 740 $expected = array('www.cakephp.org' => array('foo' => array('value' => 'bar'))); 741 $this->Socket->request('http://www.cakephp.org/'); 742 $this->assertEquals($expected, $this->Socket->config['request']['cookies']); 743 744 $serverResponse = "HTTP/1.x 200 OK\r\nSet-Cookie: bar=foo\r\nDate: Mon, 16 Apr 2007 04:14:16 GMT\r\nServer: CakeHttp Server\r\nContent-Type: text/html\r\n\r\n<h1>This is a test!</h1>"; 745 $this->Socket->expects($this->at(1))->method('read')->will($this->returnValue($serverResponse)); 746 $this->Socket->expects($this->at(2))->method('read')->will($this->returnValue(false)); 747 $this->Socket->request('http://www.cakephp.org/other'); 748 $this->assertEquals(array('foo' => array('value' => 'bar')), $this->Socket->request['cookies']); 749 $expected['www.cakephp.org'] += array('bar' => array('value' => 'foo')); 750 $this->assertEquals($expected, $this->Socket->config['request']['cookies']); 751 752 $serverResponse = "HTTP/1.x 200 OK\r\nDate: Mon, 16 Apr 2007 04:14:16 GMT\r\nServer: CakeHttp Server\r\nContent-Type: text/html\r\n\r\n<h1>This is a test!</h1>"; 753 $this->Socket->expects($this->at(1))->method('read')->will($this->returnValue($serverResponse)); 754 $this->Socket->expects($this->at(2))->method('read')->will($this->returnValue(false)); 755 $this->Socket->request('/other2'); 756 $this->assertEquals($expected, $this->Socket->config['request']['cookies']); 757 758 $serverResponse = "HTTP/1.x 200 OK\r\nSet-Cookie: foobar=ok\r\nDate: Mon, 16 Apr 2007 04:14:16 GMT\r\nServer: CakeHttp Server\r\nContent-Type: text/html\r\n\r\n<h1>This is a test!</h1>"; 759 $this->Socket->expects($this->at(1))->method('read')->will($this->returnValue($serverResponse)); 760 $this->Socket->expects($this->at(2))->method('read')->will($this->returnValue(false)); 761 $this->Socket->request('http://www.cake.com'); 762 $this->assertTrue(empty($this->Socket->request['cookies'])); 763 $expected['www.cake.com'] = array('foobar' => array('value' => 'ok')); 764 $this->assertEquals($expected, $this->Socket->config['request']['cookies']); 765 } 766 767/** 768 * testRequestCustomResponse 769 * 770 * @return void 771 */ 772 public function testRequestCustomResponse() { 773 $this->Socket->connected = true; 774 $serverResponse = "HTTP/1.x 200 OK\r\nDate: Mon, 16 Apr 2007 04:14:16 GMT\r\nServer: CakeHttp Server\r\nContent-Type: text/html\r\n\r\n<h1>This is a test!</h1>"; 775 $this->Socket->expects($this->at(1))->method('read')->will($this->returnValue($serverResponse)); 776 $this->Socket->expects($this->at(2))->method('read')->will($this->returnValue(false)); 777 778 $this->Socket->responseClass = 'CustomResponse'; 779 $response = $this->Socket->request('http://www.cakephp.org/'); 780 $this->assertInstanceOf('CustomResponse', $response); 781 $this->assertEquals('HTTP/1.x 2', $response->first10); 782 } 783 784/** 785 * Test that redirect URLs are urldecoded 786 * 787 * @return void 788 */ 789 public function testRequestWithRedirectUrlEncoded() { 790 $request = array( 791 'uri' => 'http://localhost/oneuri', 792 'redirect' => 1 793 ); 794 $serverResponse1 = "HTTP/1.x 302 Found\r\nDate: Mon, 16 Apr 2007 04:14:16 GMT\r\nServer: CakeHttp Server\r\nContent-Type: text/html\r\nLocation: http://i.cmpnet.com%2Ftechonline%2Fpdf%2Fa.pdf=\r\n\r\n"; 795 $serverResponse2 = "HTTP/1.x 200 OK\r\nDate: Mon, 16 Apr 2007 04:14:16 GMT\r\nServer: CakeHttp Server\r\nContent-Type: text/html\r\n\r\n<h1>You have been redirected</h1>"; 796 797 $this->Socket->expects($this->at(1)) 798 ->method('read') 799 ->will($this->returnValue($serverResponse1)); 800 801 $this->Socket->expects($this->at(3)) 802 ->method('write') 803 ->with($this->logicalAnd( 804 $this->stringContains('Host: i.cmpnet.com'), 805 $this->stringContains('GET /techonline/pdf/a.pdf') 806 )); 807 808 $this->Socket->expects($this->at(4)) 809 ->method('read') 810 ->will($this->returnValue($serverResponse2)); 811 812 $response = $this->Socket->request($request); 813 $this->assertEquals('<h1>You have been redirected</h1>', $response->body()); 814 } 815 816/** 817 * testRequestWithRedirect method 818 * 819 * @return void 820 */ 821 public function testRequestWithRedirectAsTrue() { 822 $request = array( 823 'uri' => 'http://localhost/oneuri', 824 'redirect' => true 825 ); 826 $serverResponse1 = "HTTP/1.x 302 Found\r\nDate: Mon, 16 Apr 2007 04:14:16 GMT\r\nServer: CakeHttp Server\r\nContent-Type: text/html\r\nLocation: http://localhost/anotheruri\r\n\r\n"; 827 $serverResponse2 = "HTTP/1.x 200 OK\r\nDate: Mon, 16 Apr 2007 04:14:16 GMT\r\nServer: CakeHttp Server\r\nContent-Type: text/html\r\n\r\n<h1>You have been redirected</h1>"; 828 $this->Socket->expects($this->at(1))->method('read')->will($this->returnValue($serverResponse1)); 829 $this->Socket->expects($this->at(4))->method('read')->will($this->returnValue($serverResponse2)); 830 831 $response = $this->Socket->request($request); 832 $this->assertEquals('<h1>You have been redirected</h1>', $response->body()); 833 } 834 835/** 836 * Test that redirects with a count limit are decremented. 837 * 838 * @return void 839 */ 840 public function testRequestWithRedirectAsInt() { 841 $request = array( 842 'uri' => 'http://localhost/oneuri', 843 'redirect' => 2 844 ); 845 $serverResponse1 = "HTTP/1.x 302 Found\r\nDate: Mon, 16 Apr 2007 04:14:16 GMT\r\nServer: CakeHttp Server\r\nContent-Type: text/html\r\nLocation: http://localhost/anotheruri\r\n\r\n"; 846 $serverResponse2 = "HTTP/1.x 200 OK\r\nDate: Mon, 16 Apr 2007 04:14:16 GMT\r\nServer: CakeHttp Server\r\nContent-Type: text/html\r\n\r\n<h1>You have been redirected</h1>"; 847 $this->Socket->expects($this->at(1))->method('read')->will($this->returnValue($serverResponse1)); 848 $this->Socket->expects($this->at(4))->method('read')->will($this->returnValue($serverResponse2)); 849 850 $this->Socket->request($request); 851 $this->assertEquals(1, $this->Socket->request['redirect']); 852 } 853 854/** 855 * Test that redirects after the redirect count reaches 9 are not followed. 856 * 857 * @return void 858 */ 859 public function testRequestWithRedirectAsIntReachingZero() { 860 $request = array( 861 'uri' => 'http://localhost/oneuri', 862 'redirect' => 1 863 ); 864 $serverResponse1 = "HTTP/1.x 302 Found\r\nDate: Mon, 16 Apr 2007 04:14:16 GMT\r\nServer: CakeHttp Server\r\nContent-Type: text/html\r\nLocation: http://localhost/oneruri\r\n\r\n"; 865 $serverResponse2 = "HTTP/1.x 302 Found\r\nDate: Mon, 16 Apr 2007 04:14:16 GMT\r\nServer: CakeHttp Server\r\nContent-Type: text/html\r\nLocation: http://localhost/anotheruri\r\n\r\n"; 866 $this->Socket->expects($this->at(1))->method('read')->will($this->returnValue($serverResponse1)); 867 $this->Socket->expects($this->at(4))->method('read')->will($this->returnValue($serverResponse2)); 868 869 $response = $this->Socket->request($request); 870 $this->assertEquals(0, $this->Socket->request['redirect']); 871 $this->assertEquals(302, $response->code); 872 $this->assertEquals('http://localhost/anotheruri', $response->getHeader('Location')); 873 } 874 875/** 876 * testProxy method 877 * 878 * @return void 879 */ 880 public function testProxy() { 881 $this->Socket->reset(); 882 $this->Socket->expects($this->any())->method('connect')->will($this->returnValue(true)); 883 $this->Socket->expects($this->any())->method('read')->will($this->returnValue(false)); 884 885 $this->Socket->configProxy('proxy.server', 123); 886 $expected = "GET http://www.cakephp.org/ HTTP/1.1\r\nHost: www.cakephp.org\r\nConnection: close\r\nUser-Agent: CakePHP\r\n\r\n"; 887 $this->Socket->request('http://www.cakephp.org/'); 888 $this->assertEquals($expected, $this->Socket->request['raw']); 889 $this->assertEquals('proxy.server', $this->Socket->config['host']); 890 $this->assertEquals(123, $this->Socket->config['port']); 891 $expected = array( 892 'host' => 'proxy.server', 893 'port' => 123, 894 'method' => null, 895 'user' => null, 896 'pass' => null 897 ); 898 $this->assertEquals($expected, $this->Socket->request['proxy']); 899 900 $expected = "GET http://www.cakephp.org/bakery HTTP/1.1\r\nHost: www.cakephp.org\r\nConnection: close\r\nUser-Agent: CakePHP\r\n\r\n"; 901 $this->Socket->request('/bakery'); 902 $this->assertEquals($expected, $this->Socket->request['raw']); 903 $this->assertEquals('proxy.server', $this->Socket->config['host']); 904 $this->assertEquals(123, $this->Socket->config['port']); 905 $expected = array( 906 'host' => 'proxy.server', 907 'port' => 123, 908 'method' => null, 909 'user' => null, 910 'pass' => null 911 ); 912 $this->assertEquals($expected, $this->Socket->request['proxy']); 913 914 $expected = "GET http://www.cakephp.org/ HTTP/1.1\r\nHost: www.cakephp.org\r\nConnection: close\r\nUser-Agent: CakePHP\r\nProxy-Authorization: Test mark.secret\r\n\r\n"; 915 $this->Socket->configProxy('proxy.server', 123, 'Test', 'mark', 'secret'); 916 $this->Socket->request('http://www.cakephp.org/'); 917 $this->assertEquals($expected, $this->Socket->request['raw']); 918 $this->assertEquals('proxy.server', $this->Socket->config['host']); 919 $this->assertEquals(123, $this->Socket->config['port']); 920 $expected = array( 921 'host' => 'proxy.server', 922 'port' => 123, 923 'method' => 'Test', 924 'user' => 'mark', 925 'pass' => 'secret' 926 ); 927 $this->assertEquals($expected, $this->Socket->request['proxy']); 928 929 $this->Socket->configAuth('Test', 'login', 'passwd'); 930 $expected = "GET http://www.cakephp.org/ HTTP/1.1\r\nHost: www.cakephp.org\r\nConnection: close\r\nUser-Agent: CakePHP\r\nProxy-Authorization: Test mark.secret\r\nAuthorization: Test login.passwd\r\n\r\n"; 931 $this->Socket->request('http://www.cakephp.org/'); 932 $this->assertEquals($expected, $this->Socket->request['raw']); 933 $expected = array( 934 'host' => 'proxy.server', 935 'port' => 123, 936 'method' => 'Test', 937 'user' => 'mark', 938 'pass' => 'secret' 939 ); 940 $this->assertEquals($expected, $this->Socket->request['proxy']); 941 $expected = array( 942 'Test' => array( 943 'user' => 'login', 944 'pass' => 'passwd' 945 ) 946 ); 947 $this->assertEquals($expected, $this->Socket->request['auth']); 948 } 949 950/** 951 * testUrl method 952 * 953 * @return void 954 */ 955 public function testUrl() { 956 $this->Socket->reset(true); 957 958 $this->assertEquals(false, $this->Socket->url(true)); 959 960 $url = $this->Socket->url('www.cakephp.org'); 961 $this->assertEquals('http://www.cakephp.org/', $url); 962 963 $url = $this->Socket->url('https://www.cakephp.org/posts/add'); 964 $this->assertEquals('https://www.cakephp.org/posts/add', $url); 965 $url = $this->Socket->url('http://www.cakephp/search?q=socket', '/%path?%query'); 966 $this->assertEquals('/search?q=socket', $url); 967 968 $this->Socket->config['request']['uri']['host'] = 'bakery.cakephp.org'; 969 $url = $this->Socket->url(); 970 $this->assertEquals('http://bakery.cakephp.org/', $url); 971 972 $this->Socket->configUri('http://www.cakephp.org'); 973 $url = $this->Socket->url('/search?q=bar'); 974 $this->assertEquals('http://www.cakephp.org/search?q=bar', $url); 975 976 $url = $this->Socket->url(array('host' => 'www.foobar.org', 'query' => array('q' => 'bar'))); 977 $this->assertEquals('http://www.foobar.org/?q=bar', $url); 978 979 $url = $this->Socket->url(array('path' => '/supersearch', 'query' => array('q' => 'bar'))); 980 $this->assertEquals('http://www.cakephp.org/supersearch?q=bar', $url); 981 982 $this->Socket->configUri('http://www.google.com'); 983 $url = $this->Socket->url('/search?q=socket'); 984 $this->assertEquals('http://www.google.com/search?q=socket', $url); 985 986 $url = $this->Socket->url(); 987 $this->assertEquals('http://www.google.com/', $url); 988 989 $this->Socket->configUri('https://www.google.com'); 990 $url = $this->Socket->url('/search?q=socket'); 991 $this->assertEquals('https://www.google.com/search?q=socket', $url); 992 993 $this->Socket->reset(); 994 $this->Socket->configUri('www.google.com:443'); 995 $url = $this->Socket->url('/search?q=socket'); 996 $this->assertEquals('https://www.google.com/search?q=socket', $url); 997 998 $this->Socket->reset(); 999 $this->Socket->configUri('www.google.com:8080'); 1000 $url = $this->Socket->url('/search?q=socket'); 1001 $this->assertEquals('http://www.google.com:8080/search?q=socket', $url); 1002 } 1003 1004/** 1005 * testGet method 1006 * 1007 * @return void 1008 */ 1009 public function testGet() { 1010 $this->RequestSocket->reset(); 1011 1012 $this->RequestSocket->expects($this->at(0)) 1013 ->method('request') 1014 ->with(array('method' => 'GET', 'uri' => 'http://www.google.com/')); 1015 1016 $this->RequestSocket->expects($this->at(1)) 1017 ->method('request') 1018 ->with(array('method' => 'GET', 'uri' => 'http://www.google.com/?foo=bar')); 1019 1020 $this->RequestSocket->expects($this->at(2)) 1021 ->method('request') 1022 ->with(array('method' => 'GET', 'uri' => 'http://www.google.com/?foo=bar')); 1023 1024 $this->RequestSocket->expects($this->at(3)) 1025 ->method('request') 1026 ->with(array('method' => 'GET', 'uri' => 'http://www.google.com/?foo=23&foobar=42')); 1027 1028 $this->RequestSocket->expects($this->at(4)) 1029 ->method('request') 1030 ->with(array('method' => 'GET', 'uri' => 'http://www.google.com/', 'version' => '1.0')); 1031 1032 $this->RequestSocket->expects($this->at(5)) 1033 ->method('request') 1034 ->with(array('method' => 'GET', 'uri' => 'https://secure.example.com/test.php?one=two')); 1035 1036 $this->RequestSocket->expects($this->at(6)) 1037 ->method('request') 1038 ->with(array('method' => 'GET', 'uri' => 'https://example.com/oauth/access?clientid=123&redirect_uri=http%3A%2F%2Fexample.com&code=456')); 1039 1040 $this->RequestSocket->get('http://www.google.com/'); 1041 $this->RequestSocket->get('http://www.google.com/', array('foo' => 'bar')); 1042 $this->RequestSocket->get('http://www.google.com/', 'foo=bar'); 1043 $this->RequestSocket->get('http://www.google.com/?foo=bar', array('foobar' => '42', 'foo' => '23')); 1044 $this->RequestSocket->get('http://www.google.com/', null, array('version' => '1.0')); 1045 $this->RequestSocket->get('https://secure.example.com/test.php', array('one' => 'two')); 1046 $this->RequestSocket->get('https://example.com/oauth/access', array( 1047 'clientid' => '123', 1048 'redirect_uri' => 'http://example.com', 1049 'code' => 456 1050 )); 1051 } 1052 1053/** 1054 * Test authentication 1055 * 1056 * @return void 1057 */ 1058 public function testAuth() { 1059 $socket = new MockHttpSocket(); 1060 $socket->get('http://mark:secret@example.com/test'); 1061 $this->assertTrue(strpos($socket->request['header'], 'Authorization: Basic bWFyazpzZWNyZXQ=') !== false); 1062 1063 $socket->configAuth(false); 1064 $socket->get('http://example.com/test'); 1065 $this->assertFalse(strpos($socket->request['header'], 'Authorization:')); 1066 1067 $socket->configAuth('Test', 'mark', 'passwd'); 1068 $socket->get('http://example.com/test'); 1069 $this->assertTrue(strpos($socket->request['header'], 'Authorization: Test mark.passwd') !== false); 1070 1071 $socket->configAuth(false); 1072 $socket->request(array( 1073 'method' => 'GET', 1074 'uri' => 'http://example.com/test', 1075 'auth' => array( 1076 'method' => 'Basic', 1077 'user' => 'joel', 1078 'pass' => 'hunter2' 1079 ) 1080 )); 1081 $this->assertEquals($socket->request['auth'], array('Basic' => array('user' => 'joel', 'pass' => 'hunter2'))); 1082 $this->assertTrue(strpos($socket->request['header'], 'Authorization: Basic am9lbDpodW50ZXIy') !== false); 1083 } 1084 1085/** 1086 * test that two consecutive get() calls reset the authentication credentials. 1087 * 1088 * @return void 1089 */ 1090 public function testConsecutiveGetResetsAuthCredentials() { 1091 $socket = new MockHttpSocket(); 1092 $socket->get('http://mark:secret@example.com/test'); 1093 $this->assertEquals('mark', $socket->request['uri']['user']); 1094 $this->assertEquals('secret', $socket->request['uri']['pass']); 1095 $this->assertTrue(strpos($socket->request['header'], 'Authorization: Basic bWFyazpzZWNyZXQ=') !== false); 1096 1097 $socket->get('/test2'); 1098 $this->assertTrue(strpos($socket->request['header'], 'Authorization: Basic bWFyazpzZWNyZXQ=') !== false); 1099 1100 $socket->get('/test3'); 1101 $this->assertTrue(strpos($socket->request['header'], 'Authorization: Basic bWFyazpzZWNyZXQ=') !== false); 1102 } 1103 1104/** 1105 * testPostPutDelete method 1106 * 1107 * @return void 1108 */ 1109 public function testPost() { 1110 $this->RequestSocket->reset(); 1111 $this->RequestSocket->expects($this->at(0)) 1112 ->method('request') 1113 ->with(array('method' => 'POST', 'uri' => 'http://www.google.com/', 'body' => array())); 1114 1115 $this->RequestSocket->expects($this->at(1)) 1116 ->method('request') 1117 ->with(array('method' => 'POST', 'uri' => 'http://www.google.com/', 'body' => array('Foo' => 'bar'))); 1118 1119 $this->RequestSocket->expects($this->at(2)) 1120 ->method('request') 1121 ->with(array('method' => 'POST', 'uri' => 'http://www.google.com/', 'body' => null, 'line' => 'Hey Server')); 1122 1123 $this->RequestSocket->post('http://www.google.com/'); 1124 $this->RequestSocket->post('http://www.google.com/', array('Foo' => 'bar')); 1125 $this->RequestSocket->post('http://www.google.com/', null, array('line' => 'Hey Server')); 1126 } 1127 1128/** 1129 * testPut 1130 * 1131 * @return void 1132 */ 1133 public function testPut() { 1134 $this->RequestSocket->reset(); 1135 $this->RequestSocket->expects($this->at(0)) 1136 ->method('request') 1137 ->with(array('method' => 'PUT', 'uri' => 'http://www.google.com/', 'body' => array())); 1138 1139 $this->RequestSocket->expects($this->at(1)) 1140 ->method('request') 1141 ->with(array('method' => 'PUT', 'uri' => 'http://www.google.com/', 'body' => array('Foo' => 'bar'))); 1142 1143 $this->RequestSocket->expects($this->at(2)) 1144 ->method('request') 1145 ->with(array('method' => 'PUT', 'uri' => 'http://www.google.com/', 'body' => null, 'line' => 'Hey Server')); 1146 1147 $this->RequestSocket->put('http://www.google.com/'); 1148 $this->RequestSocket->put('http://www.google.com/', array('Foo' => 'bar')); 1149 $this->RequestSocket->put('http://www.google.com/', null, array('line' => 'Hey Server')); 1150 } 1151 1152/** 1153 * testPatch 1154 * 1155 * @return void 1156 */ 1157 public function testPatch() { 1158 $this->RequestSocket->reset(); 1159 $this->RequestSocket->expects($this->at(0)) 1160 ->method('request') 1161 ->with(array('method' => 'PATCH', 'uri' => 'http://www.google.com/', 'body' => array())); 1162 1163 $this->RequestSocket->expects($this->at(1)) 1164 ->method('request') 1165 ->with(array('method' => 'PATCH', 'uri' => 'http://www.google.com/', 'body' => array('Foo' => 'bar'))); 1166 1167 $this->RequestSocket->expects($this->at(2)) 1168 ->method('request') 1169 ->with(array('method' => 'PATCH', 'uri' => 'http://www.google.com/', 'body' => null, 'line' => 'Hey Server')); 1170 1171 $this->RequestSocket->patch('http://www.google.com/'); 1172 $this->RequestSocket->patch('http://www.google.com/', array('Foo' => 'bar')); 1173 $this->RequestSocket->patch('http://www.google.com/', null, array('line' => 'Hey Server')); 1174 } 1175 1176/** 1177 * testDelete 1178 * 1179 * @return void 1180 */ 1181 public function testDelete() { 1182 $this->RequestSocket->reset(); 1183 $this->RequestSocket->expects($this->at(0)) 1184 ->method('request') 1185 ->with(array('method' => 'DELETE', 'uri' => 'http://www.google.com/', 'body' => array())); 1186 1187 $this->RequestSocket->expects($this->at(1)) 1188 ->method('request') 1189 ->with(array('method' => 'DELETE', 'uri' => 'http://www.google.com/', 'body' => array('Foo' => 'bar'))); 1190 1191 $this->RequestSocket->expects($this->at(2)) 1192 ->method('request') 1193 ->with(array('method' => 'DELETE', 'uri' => 'http://www.google.com/', 'body' => null, 'line' => 'Hey Server')); 1194 1195 $this->RequestSocket->delete('http://www.google.com/'); 1196 $this->RequestSocket->delete('http://www.google.com/', array('Foo' => 'bar')); 1197 $this->RequestSocket->delete('http://www.google.com/', null, array('line' => 'Hey Server')); 1198 } 1199 1200/** 1201 * testBuildRequestLine method 1202 * 1203 * @return void 1204 */ 1205 public function testBuildRequestLine() { 1206 $this->Socket->reset(); 1207 1208 $this->Socket->quirksMode = true; 1209 $r = $this->Socket->buildRequestLine('Foo'); 1210 $this->assertEquals('Foo', $r); 1211 $this->Socket->quirksMode = false; 1212 1213 $r = $this->Socket->buildRequestLine(true); 1214 $this->assertEquals(false, $r); 1215 1216 $r = $this->Socket->buildRequestLine(array('foo' => 'bar', 'method' => 'foo')); 1217 $this->assertEquals(false, $r); 1218 1219 $r = $this->Socket->buildRequestLine(array('method' => 'GET', 'uri' => 'http://www.cakephp.org/search?q=socket')); 1220 $this->assertEquals("GET /search?q=socket HTTP/1.1\r\n", $r); 1221 1222 $request = array( 1223 'method' => 'GET', 1224 'uri' => array( 1225 'path' => '/search', 1226 'query' => array('q' => 'socket') 1227 ) 1228 ); 1229 $r = $this->Socket->buildRequestLine($request); 1230 $this->assertEquals("GET /search?q=socket HTTP/1.1\r\n", $r); 1231 1232 unset($request['method']); 1233 $r = $this->Socket->buildRequestLine($request); 1234 $this->assertEquals("GET /search?q=socket HTTP/1.1\r\n", $r); 1235 1236 $r = $this->Socket->buildRequestLine($request, 'CAKE-HTTP/0.1'); 1237 $this->assertEquals("GET /search?q=socket CAKE-HTTP/0.1\r\n", $r); 1238 1239 $request = array('method' => 'OPTIONS', 'uri' => '*'); 1240 $r = $this->Socket->buildRequestLine($request); 1241 $this->assertEquals("OPTIONS * HTTP/1.1\r\n", $r); 1242 1243 $request['method'] = 'GET'; 1244 $this->Socket->quirksMode = true; 1245 $r = $this->Socket->buildRequestLine($request); 1246 $this->assertEquals("GET * HTTP/1.1\r\n", $r); 1247 1248 $r = $this->Socket->buildRequestLine("GET * HTTP/1.1\r\n"); 1249 $this->assertEquals("GET * HTTP/1.1\r\n", $r); 1250 } 1251 1252/** 1253 * testBadBuildRequestLine method 1254 * 1255 * @expectedException SocketException 1256 * @return void 1257 */ 1258 public function testBadBuildRequestLine() { 1259 $this->Socket->buildRequestLine('Foo'); 1260 } 1261 1262/** 1263 * testBadBuildRequestLine2 method 1264 * 1265 * @expectedException SocketException 1266 * @return void 1267 */ 1268 public function testBadBuildRequestLine2() { 1269 $this->Socket->buildRequestLine("GET * HTTP/1.1\r\n"); 1270 } 1271 1272/** 1273 * Asserts that HttpSocket::parseUri is working properly 1274 * 1275 * @return void 1276 */ 1277 public function testParseUri() { 1278 $this->Socket->reset(); 1279 1280 $uri = $this->Socket->parseUri(array('invalid' => 'uri-string')); 1281 $this->assertEquals(false, $uri); 1282 1283 $uri = $this->Socket->parseUri(array('invalid' => 'uri-string'), array('host' => 'somehost')); 1284 $this->assertEquals(array('host' => 'somehost', 'invalid' => 'uri-string'), $uri); 1285 1286 $uri = $this->Socket->parseUri(false); 1287 $this->assertEquals(false, $uri); 1288 1289 $uri = $this->Socket->parseUri('/my-cool-path'); 1290 $this->assertEquals(array('path' => '/my-cool-path'), $uri); 1291 1292 $uri = $this->Socket->parseUri('http://bob:foo123@www.cakephp.org:40/search?q=dessert#results'); 1293 $this->assertEquals($uri, array( 1294 'scheme' => 'http', 1295 'host' => 'www.cakephp.org', 1296 'port' => 40, 1297 'user' => 'bob', 1298 'pass' => 'foo123', 1299 'path' => '/search', 1300 'query' => array('q' => 'dessert'), 1301 'fragment' => 'results' 1302 )); 1303 1304 $uri = $this->Socket->parseUri('http://www.cakephp.org/'); 1305 $this->assertEquals($uri, array( 1306 'scheme' => 'http', 1307 'host' => 'www.cakephp.org', 1308 'path' => '/' 1309 )); 1310 1311 $uri = $this->Socket->parseUri('http://www.cakephp.org', true); 1312 $this->assertEquals($uri, array( 1313 'scheme' => 'http', 1314 'host' => 'www.cakephp.org', 1315 'port' => 80, 1316 'user' => null, 1317 'pass' => null, 1318 'path' => '/', 1319 'query' => array(), 1320 'fragment' => null 1321 )); 1322 1323 $uri = $this->Socket->parseUri('https://www.cakephp.org', true); 1324 $this->assertEquals($uri, array( 1325 'scheme' => 'https', 1326 'host' => 'www.cakephp.org', 1327 'port' => 443, 1328 'user' => null, 1329 'pass' => null, 1330 'path' => '/', 1331 'query' => array(), 1332 'fragment' => null 1333 )); 1334 1335 $uri = $this->Socket->parseUri('www.cakephp.org:443/query?foo', true); 1336 $this->assertEquals($uri, array( 1337 'scheme' => 'https', 1338 'host' => 'www.cakephp.org', 1339 'port' => 443, 1340 'user' => null, 1341 'pass' => null, 1342 'path' => '/query', 1343 'query' => array('foo' => ""), 1344 'fragment' => null 1345 )); 1346 1347 $uri = $this->Socket->parseUri('http://www.cakephp.org', array('host' => 'piephp.org', 'user' => 'bob', 'fragment' => 'results')); 1348 $this->assertEquals($uri, array( 1349 'host' => 'www.cakephp.org', 1350 'user' => 'bob', 1351 'fragment' => 'results', 1352 'scheme' => 'http' 1353 )); 1354 1355 $uri = $this->Socket->parseUri('https://www.cakephp.org', array('scheme' => 'http', 'port' => 23)); 1356 $this->assertEquals($uri, array( 1357 'scheme' => 'https', 1358 'port' => 23, 1359 'host' => 'www.cakephp.org' 1360 )); 1361 1362 $uri = $this->Socket->parseUri('www.cakephp.org:59', array('scheme' => array('http', 'https'), 'port' => 80)); 1363 $this->assertEquals($uri, array( 1364 'scheme' => 'http', 1365 'port' => 59, 1366 'host' => 'www.cakephp.org' 1367 )); 1368 1369 $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))); 1370 $this->assertEquals($uri, array( 1371 'scheme' => 'http', 1372 'host' => 'www.google.com', 1373 'port' => 8080 1374 )); 1375 1376 $uri = $this->Socket->parseUri('http://www.cakephp.org/?param1=value1¶m2=value2%3Dvalue3'); 1377 $this->assertEquals($uri, array( 1378 'scheme' => 'http', 1379 'host' => 'www.cakephp.org', 1380 'path' => '/', 1381 'query' => array( 1382 'param1' => 'value1', 1383 'param2' => 'value2=value3' 1384 ) 1385 )); 1386 1387 $uri = $this->Socket->parseUri('http://www.cakephp.org/?param1=value1¶m2=value2=value3'); 1388 $this->assertEquals($uri, array( 1389 'scheme' => 'http', 1390 'host' => 'www.cakephp.org', 1391 'path' => '/', 1392 'query' => array( 1393 'param1' => 'value1', 1394 'param2' => 'value2=value3' 1395 ) 1396 )); 1397 } 1398 1399/** 1400 * Tests that HttpSocket::buildUri can turn all kinds of uri arrays (and strings) into fully or partially qualified URI's 1401 * 1402 * @return void 1403 */ 1404 public function testBuildUri() { 1405 $this->Socket->reset(); 1406 1407 $r = $this->Socket->buildUri(true); 1408 $this->assertEquals(false, $r); 1409 1410 $r = $this->Socket->buildUri('foo.com'); 1411 $this->assertEquals('http://foo.com/', $r); 1412 1413 $r = $this->Socket->buildUri(array('host' => 'www.cakephp.org')); 1414 $this->assertEquals('http://www.cakephp.org/', $r); 1415 1416 $r = $this->Socket->buildUri(array('host' => 'www.cakephp.org', 'scheme' => 'https')); 1417 $this->assertEquals('https://www.cakephp.org/', $r); 1418 1419 $r = $this->Socket->buildUri(array('host' => 'www.cakephp.org', 'port' => 23)); 1420 $this->assertEquals('http://www.cakephp.org:23/', $r); 1421 1422 $r = $this->Socket->buildUri(array('path' => 'www.google.com/search', 'query' => 'q=cakephp')); 1423 $this->assertEquals('http://www.google.com/search?q=cakephp', $r); 1424 1425 $r = $this->Socket->buildUri(array('host' => 'www.cakephp.org', 'scheme' => 'https', 'port' => 79)); 1426 $this->assertEquals('https://www.cakephp.org:79/', $r); 1427 1428 $r = $this->Socket->buildUri(array('host' => 'www.cakephp.org', 'path' => 'foo')); 1429 $this->assertEquals('http://www.cakephp.org/foo', $r); 1430 1431 $r = $this->Socket->buildUri(array('host' => 'www.cakephp.org', 'path' => '/foo')); 1432 $this->assertEquals('http://www.cakephp.org/foo', $r); 1433 1434 $r = $this->Socket->buildUri(array('host' => 'www.cakephp.org', 'path' => '/search', 'query' => array('q' => 'HttpSocket'))); 1435 $this->assertEquals('http://www.cakephp.org/search?q=HttpSocket', $r); 1436 1437 $r = $this->Socket->buildUri(array('host' => 'www.cakephp.org', 'fragment' => 'bar')); 1438 $this->assertEquals('http://www.cakephp.org/#bar', $r); 1439 1440 $r = $this->Socket->buildUri(array( 1441 'scheme' => 'https', 1442 'host' => 'www.cakephp.org', 1443 'port' => 25, 1444 'user' => 'bob', 1445 'pass' => 'secret', 1446 'path' => '/cool', 1447 'query' => array('foo' => 'bar'), 1448 'fragment' => 'comment' 1449 )); 1450 $this->assertEquals('https://bob:secret@www.cakephp.org:25/cool?foo=bar#comment', $r); 1451 1452 $r = $this->Socket->buildUri(array('host' => 'www.cakephp.org', 'fragment' => 'bar'), '%fragment?%host'); 1453 $this->assertEquals('bar?www.cakephp.org', $r); 1454 1455 $r = $this->Socket->buildUri(array('host' => 'www.cakephp.org'), '%fragment???%host'); 1456 $this->assertEquals('???www.cakephp.org', $r); 1457 1458 $r = $this->Socket->buildUri(array('path' => '*'), '/%path?%query'); 1459 $this->assertEquals('*', $r); 1460 1461 $r = $this->Socket->buildUri(array('scheme' => 'foo', 'host' => 'www.cakephp.org')); 1462 $this->assertEquals('foo://www.cakephp.org:80/', $r); 1463 } 1464 1465/** 1466 * Asserts that HttpSocket::parseQuery is working properly 1467 * 1468 * @return void 1469 */ 1470 public function testParseQuery() { 1471 $this->Socket->reset(); 1472 1473 $query = $this->Socket->parseQuery(array('framework' => 'cakephp')); 1474 $this->assertEquals(array('framework' => 'cakephp'), $query); 1475 1476 $query = $this->Socket->parseQuery(''); 1477 $this->assertEquals(array(), $query); 1478 1479 $query = $this->Socket->parseQuery('framework=cakephp'); 1480 $this->assertEquals(array('framework' => 'cakephp'), $query); 1481 1482 $query = $this->Socket->parseQuery('?framework=cakephp'); 1483 $this->assertEquals(array('framework' => 'cakephp'), $query); 1484 1485 $query = $this->Socket->parseQuery('a&b&c'); 1486 $this->assertEquals(array('a' => '', 'b' => '', 'c' => ''), $query); 1487 1488 $query = $this->Socket->parseQuery('value=12345'); 1489 $this->assertEquals(array('value' => '12345'), $query); 1490 1491 $query = $this->Socket->parseQuery('a[0]=foo&a[1]=bar&a[2]=cake'); 1492 $this->assertEquals(array('a' => array(0 => 'foo', 1 => 'bar', 2 => 'cake')), $query); 1493 1494 $query = $this->Socket->parseQuery('a[]=foo&a[]=bar&a[]=cake'); 1495 $this->assertEquals(array('a' => array(0 => 'foo', 1 => 'bar', 2 => 'cake')), $query); 1496 1497 $query = $this->Socket->parseQuery('a[][]=foo&a[][]=bar&a[][]=cake'); 1498 $expectedQuery = array( 1499 'a' => array( 1500 0 => array( 1501 0 => 'foo' 1502 ), 1503 1 => array( 1504 0 => 'bar' 1505 ), 1506 array( 1507 0 => 'cake' 1508 ) 1509 ) 1510 ); 1511 $this->assertEquals($expectedQuery, $query); 1512 1513…
Large files files are truncated, but you can click here to view the full file