/tests/Guzzle/Tests/Http/Message/RequestFactoryTest.php

https://github.com/azogheb/guzzle · PHP · 278 lines · 201 code · 26 blank · 51 comment · 0 complexity · 9c3f8796848819077a5b9d39719af615 MD5 · raw file

  1. <?php
  2. namespace Guzzle\Tests\Http\Message;
  3. use Guzzle\Common\Collection;
  4. use Guzzle\Http\Url;
  5. use Guzzle\Http\EntityBody;
  6. use Guzzle\Http\Message\RequestFactory;
  7. use Guzzle\Http\QueryString;
  8. /**
  9. * @author Michael Dowling <michael@guzzlephp.org>
  10. */
  11. class HttpRequestFactoryTest extends \Guzzle\Tests\GuzzleTestCase
  12. {
  13. /**
  14. * @covers Guzzle\Http\Message\RequestFactory::create
  15. * @covers Guzzle\Http\Message\RequestFactory::get
  16. */
  17. public function testCreatesNewGetRequests()
  18. {
  19. $request = RequestFactory::get('http://www.google.com/');
  20. $this->assertInstanceOf('Guzzle\\Http\\Message\\MessageInterface', $request);
  21. $this->assertInstanceOf('Guzzle\\Http\\Message\\RequestInterface', $request);
  22. $this->assertInstanceOf('Guzzle\\Http\\Message\\Request', $request);
  23. $this->assertEquals('GET', $request->getMethod());
  24. $this->assertEquals('http', $request->getScheme());
  25. $this->assertEquals('http://www.google.com/', $request->getUrl());
  26. $this->assertEquals('www.google.com', $request->getHost());
  27. $this->assertEquals('/', $request->getPath());
  28. $this->assertEquals('/', $request->getResourceUri());
  29. // Create a GET request with a custom receiving body
  30. $this->getServer()->enqueue("HTTP/1.1 200 OK\r\nContent-Length: 0\r\n\r\n");
  31. $b = EntityBody::factory('');
  32. $request = RequestFactory::get($this->getServer()->getUrl(), null, $b);
  33. $response = $request->send();
  34. $this->assertSame($b, $response->getBody());
  35. }
  36. /**
  37. * @covers Guzzle\Http\Message\RequestFactory::create
  38. * @covers Guzzle\Http\Message\RequestFactory::put
  39. */
  40. public function testCreatesPutRequests()
  41. {
  42. // Test using a string
  43. $request = RequestFactory::put('http://www.google.com/path?q=1&v=2', null, 'Data');
  44. $this->assertInstanceOf('Guzzle\\Http\\Message\\EntityEnclosingRequest', $request);
  45. $this->assertEquals('PUT', $request->getMethod());
  46. $this->assertEquals('http', $request->getScheme());
  47. $this->assertEquals('http://www.google.com/path?q=1&v=2', $request->getUrl());
  48. $this->assertEquals('www.google.com', $request->getHost());
  49. $this->assertEquals('/path', $request->getPath());
  50. $this->assertEquals('/path?q=1&v=2', $request->getResourceUri());
  51. $this->assertInstanceOf('Guzzle\\Http\\EntityBody', $request->getBody());
  52. $this->assertEquals('Data', (string) $request->getBody());
  53. unset($request);
  54. // Test using an EntityBody
  55. $request = RequestFactory::put('http://www.google.com/path?q=1&v=2', null, EntityBody::factory('Data'));
  56. $this->assertInstanceOf('Guzzle\\Http\\Message\\EntityEnclosingRequest', $request);
  57. $this->assertEquals('Data', (string) $request->getBody());
  58. // Test using a resource
  59. $resource = fopen('php://temp', 'w+');
  60. fwrite($resource, 'Data');
  61. $request = RequestFactory::put('http://www.google.com/path?q=1&v=2', null, $resource);
  62. $this->assertInstanceOf('Guzzle\\Http\\Message\\EntityEnclosingRequest', $request);
  63. $this->assertEquals('Data', (string) $request->getBody());
  64. // Test using an object that can be cast as a string
  65. $request = RequestFactory::put('http://www.google.com/path?q=1&v=2', null, Url::factory('http://www.example.com/'));
  66. $this->assertInstanceOf('Guzzle\\Http\\Message\\EntityEnclosingRequest', $request);
  67. $this->assertEquals('http://www.example.com/', (string) $request->getBody());
  68. }
  69. /**
  70. * @covers Guzzle\Http\Message\RequestFactory::head
  71. * @covers Guzzle\Http\Message\RequestFactory::delete
  72. */
  73. public function testCreatesHeadAndDeleteRequests()
  74. {
  75. $request = RequestFactory::delete('http://www.test.com/');
  76. $this->assertEquals('DELETE', $request->getMethod());
  77. $request = RequestFactory::head('http://www.test.com/');
  78. $this->assertEquals('HEAD', $request->getMethod());
  79. }
  80. /**
  81. * @covers Guzzle\Http\Message\RequestFactory::options
  82. */
  83. public function testCreatesOptionsRequests()
  84. {
  85. $request = RequestFactory::options('http://www.example.com/');
  86. $this->assertEquals('OPTIONS', $request->getMethod());
  87. $this->assertInstanceOf('Guzzle\\Http\\Message\\Request', $request);
  88. }
  89. /**
  90. * @covers Guzzle\Http\Message\RequestFactory::create
  91. * @covers Guzzle\Http\Message\RequestFactory::put
  92. */
  93. public function testCreatesNewPutRequestWithBody()
  94. {
  95. $request = RequestFactory::put('http://www.google.com/path?q=1&v=2', null, 'Data');
  96. $this->assertEquals('Data', (string) $request->getBody());
  97. }
  98. /**
  99. * @covers Guzzle\Http\Message\RequestFactory::create
  100. * @covers Guzzle\Http\Message\RequestFactory::post
  101. */
  102. public function testCreatesNewPostRequestWithFields()
  103. {
  104. // Use an array
  105. $request = RequestFactory::create('POST', 'http://www.google.com/path?q=1&v=2', null, array(
  106. 'a' => 'b'
  107. ));
  108. $this->assertEquals(array('a' => 'b'), $request->getPostFields()->getAll());
  109. unset($request);
  110. // Use a collection
  111. $request = RequestFactory::create('POST', 'http://www.google.com/path?q=1&v=2', null, new Collection(array(
  112. 'a' => 'b'
  113. )));
  114. $this->assertEquals(array('a' => 'b'), $request->getPostFields()->getAll());
  115. // Use a QueryString
  116. $request = RequestFactory::create('POST', 'http://www.google.com/path?q=1&v=2', null, new QueryString(array(
  117. 'a' => 'b'
  118. )));
  119. $this->assertEquals(array('a' => 'b'), $request->getPostFields()->getAll());
  120. $request = RequestFactory::post('http://www.test.com/', null, array(
  121. 'a' => 'b',
  122. 'file' => '@' . __FILE__
  123. ));
  124. $this->assertEquals(array(
  125. 'a' => 'b',
  126. 'file' => '@' . __FILE__
  127. ), $request->getPostFields()->getAll());
  128. $this->assertEquals(array(
  129. 'file' => __FILE__
  130. ), $request->getPostFiles());
  131. }
  132. /**
  133. * @covers Guzzle\Http\Message\RequestFactory::fromParts
  134. * @covers Guzzle\Http\Message\RequestFactory::create
  135. */
  136. public function testCreatesFromParts()
  137. {
  138. $parts = parse_url('http://michael:123@www.google.com:8080/path?q=1&v=2');
  139. $request = RequestFactory::fromParts('PUT', $parts, null, 'Data');
  140. $this->assertInstanceOf('Guzzle\\Http\\Message\\EntityEnclosingRequest', $request);
  141. $this->assertEquals('PUT', $request->getMethod());
  142. $this->assertEquals('http', $request->getScheme());
  143. $this->assertEquals('http://www.google.com:8080/path?q=1&v=2', $request->getUrl());
  144. $this->assertEquals('www.google.com', $request->getHost());
  145. $this->assertEquals('www.google.com:8080', $request->getHeader('Host'));
  146. $this->assertEquals('/path', $request->getPath());
  147. $this->assertEquals('/path?q=1&v=2', $request->getResourceUri());
  148. $this->assertInstanceOf('Guzzle\\Http\\EntityBody', $request->getBody());
  149. $this->assertEquals('Data', (string)$request->getBody());
  150. $this->assertEquals('michael', $request->getUsername());
  151. $this->assertEquals('123', $request->getPassword());
  152. $this->assertEquals('8080', $request->getPort());
  153. $this->assertEquals(array(
  154. 'scheme' => 'http',
  155. 'host' => 'www.google.com',
  156. 'port' => 8080,
  157. 'path' => '/path',
  158. 'query' => 'q=1&v=2',
  159. ), parse_url($request->getUrl()));
  160. }
  161. /**
  162. * @covers Guzzle\Http\Message\RequestFactory::parseMessage
  163. * @covers Guzzle\Http\Message\RequestFactory::fromMessage
  164. * @covers Guzzle\Http\Message\RequestFactory::create
  165. */
  166. public function testCreatesFromMessage()
  167. {
  168. $auth = base64_encode('michael:123');
  169. $message = "PUT /path?q=1&v=2 HTTP/1.1\r\nHost: www.google.com:8080\r\nContent-Length: 4\r\nAuthorization: Basic {$auth}\r\n\r\nData";
  170. $request = RequestFactory::fromMessage($message);
  171. $this->assertInstanceOf('Guzzle\\Http\\Message\\EntityEnclosingRequest', $request);
  172. $this->assertEquals('PUT', $request->getMethod());
  173. $this->assertEquals('http', $request->getScheme());
  174. $this->assertEquals('http://www.google.com:8080/path?q=1&v=2', $request->getUrl());
  175. $this->assertEquals('www.google.com', $request->getHost());
  176. $this->assertEquals('www.google.com:8080', $request->getHeader('Host'));
  177. $this->assertEquals('/path', $request->getPath());
  178. $this->assertEquals('/path?q=1&v=2', $request->getResourceUri());
  179. $this->assertInstanceOf('Guzzle\\Http\\EntityBody', $request->getBody());
  180. $this->assertEquals('Data', (string)$request->getBody());
  181. $this->assertEquals('michael', $request->getUsername());
  182. $this->assertEquals('123', $request->getPassword());
  183. $this->assertEquals('8080', $request->getPort());
  184. // Test passing a blank message returns false
  185. $this->assertFalse($request = RequestFactory::fromMessage(''));
  186. // Test passing a url with no port
  187. $message = "PUT /path?q=1&v=2 HTTP/1.1\r\nHost: www.google.com\r\nContent-Length: 4\r\nAuthorization: Basic {$auth}\r\n\r\nData";
  188. $request = RequestFactory::fromMessage($message);
  189. $this->assertInstanceOf('Guzzle\\Http\\Message\\EntityEnclosingRequest', $request);
  190. $this->assertEquals('PUT', $request->getMethod());
  191. $this->assertEquals('http', $request->getScheme());
  192. $this->assertEquals('http://www.google.com/path?q=1&v=2', $request->getUrl());
  193. $this->assertEquals('www.google.com', $request->getHost());
  194. $this->assertEquals('/path', $request->getPath());
  195. $this->assertEquals('/path?q=1&v=2', $request->getResourceUri());
  196. $this->assertInstanceOf('Guzzle\\Http\\EntityBody', $request->getBody());
  197. $this->assertEquals('Data', (string)$request->getBody());
  198. $this->assertEquals('michael', $request->getUsername());
  199. $this->assertEquals('123', $request->getPassword());
  200. $this->assertEquals(80, $request->getPort());
  201. }
  202. /**
  203. * @covers Guzzle\Http\Message\RequestFactory::create
  204. */
  205. public function testCreatesNewTraceRequest()
  206. {
  207. $request = RequestFactory::create('TRACE', 'http://www.google.com/');
  208. $this->assertFalse($request instanceof \Guzzle\Http\Message\EntityEnclosingRequest);
  209. $this->assertEquals('TRACE', $request->getMethod());
  210. }
  211. /**
  212. * @covers Guzzle\Http\Message\RequestFactory::parseMessage
  213. */
  214. public function testParsesMessages()
  215. {
  216. $parts = RequestFactory::parseMessage(
  217. "get /testing?q=10&f=3 http/1.1\r\n" .
  218. "host: localhost:443\n" .
  219. "authorization: basic bWljaGFlbDoxMjM=\r\n\r\n"
  220. );
  221. $this->assertEquals('GET', $parts['method']);
  222. $this->assertEquals('HTTP', $parts['protocol']);
  223. $this->assertEquals('1.1', $parts['protocol_version']);
  224. $this->assertEquals('https', $parts['parts']['scheme']);
  225. $this->assertEquals('localhost', $parts['parts']['host']);
  226. $this->assertEquals('443', $parts['parts']['port']);
  227. $this->assertEquals('michael', $parts['parts']['user']);
  228. $this->assertEquals('123', $parts['parts']['pass']);
  229. $this->assertEquals('/testing', $parts['parts']['path']);
  230. $this->assertEquals('?q=10&f=3', $parts['parts']['query']);
  231. $this->assertEquals(array(
  232. 'Host' => 'localhost:443',
  233. 'Authorization' => 'basic bWljaGFlbDoxMjM='
  234. ), $parts['headers']);
  235. $this->assertEquals('', $parts['body']);
  236. $parts = RequestFactory::parseMessage(
  237. "get / spydy/1.0\r\n"
  238. );
  239. $this->assertEquals('GET', $parts['method']);
  240. $this->assertEquals('SPYDY', $parts['protocol']);
  241. $this->assertEquals('1.0', $parts['protocol_version']);
  242. $this->assertEquals('http', $parts['parts']['scheme']);
  243. $this->assertEquals('', $parts['parts']['host']);
  244. $this->assertEquals('', $parts['parts']['port']);
  245. $this->assertEquals('', $parts['parts']['user']);
  246. $this->assertEquals('', $parts['parts']['pass']);
  247. $this->assertEquals('/', $parts['parts']['path']);
  248. $this->assertEquals('', $parts['parts']['query']);
  249. $this->assertEquals(array(), $parts['headers']);
  250. $this->assertEquals('', $parts['body']);
  251. }
  252. }