RequestTest.php 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203
  1. <?php
  2. namespace GuzzleHttp\Tests\Psr7;
  3. use GuzzleHttp\Psr7;
  4. use GuzzleHttp\Psr7\Request;
  5. use GuzzleHttp\Psr7\Uri;
  6. /**
  7. * @covers GuzzleHttp\Psr7\Request
  8. */
  9. class RequestTest extends BaseTest
  10. {
  11. public function testRequestUriMayBeString()
  12. {
  13. $r = new Request('GET', '/');
  14. $this->assertEquals('/', (string) $r->getUri());
  15. }
  16. public function testRequestUriMayBeUri()
  17. {
  18. $uri = new Uri('/');
  19. $r = new Request('GET', $uri);
  20. $this->assertSame($uri, $r->getUri());
  21. }
  22. /**
  23. * @expectedException \InvalidArgumentException
  24. */
  25. public function testValidateRequestUri()
  26. {
  27. new Request('GET', '///');
  28. }
  29. public function testCanConstructWithBody()
  30. {
  31. $r = new Request('GET', '/', [], 'baz');
  32. $this->assertInstanceOf('Psr\Http\Message\StreamInterface', $r->getBody());
  33. $this->assertEquals('baz', (string) $r->getBody());
  34. }
  35. public function testNullBody()
  36. {
  37. $r = new Request('GET', '/', [], null);
  38. $this->assertInstanceOf('Psr\Http\Message\StreamInterface', $r->getBody());
  39. $this->assertSame('', (string) $r->getBody());
  40. }
  41. public function testFalseyBody()
  42. {
  43. $r = new Request('GET', '/', [], '0');
  44. $this->assertInstanceOf('Psr\Http\Message\StreamInterface', $r->getBody());
  45. $this->assertSame('0', (string) $r->getBody());
  46. }
  47. public function testConstructorDoesNotReadStreamBody()
  48. {
  49. $streamIsRead = false;
  50. $body = Psr7\FnStream::decorate(Psr7\stream_for(''), [
  51. '__toString' => function () use (&$streamIsRead) {
  52. $streamIsRead = true;
  53. return '';
  54. }
  55. ]);
  56. $r = new Request('GET', '/', [], $body);
  57. $this->assertFalse($streamIsRead);
  58. $this->assertSame($body, $r->getBody());
  59. }
  60. public function testCapitalizesMethod()
  61. {
  62. $r = new Request('get', '/');
  63. $this->assertEquals('GET', $r->getMethod());
  64. }
  65. public function testCapitalizesWithMethod()
  66. {
  67. $r = new Request('GET', '/');
  68. $this->assertEquals('PUT', $r->withMethod('put')->getMethod());
  69. }
  70. public function testWithUri()
  71. {
  72. $r1 = new Request('GET', '/');
  73. $u1 = $r1->getUri();
  74. $u2 = new Uri('http://www.example.com');
  75. $r2 = $r1->withUri($u2);
  76. $this->assertNotSame($r1, $r2);
  77. $this->assertSame($u2, $r2->getUri());
  78. $this->assertSame($u1, $r1->getUri());
  79. }
  80. public function testSameInstanceWhenSameUri()
  81. {
  82. $r1 = new Request('GET', 'http://foo.com');
  83. $r2 = $r1->withUri($r1->getUri());
  84. $this->assertSame($r1, $r2);
  85. }
  86. public function testWithRequestTarget()
  87. {
  88. $r1 = new Request('GET', '/');
  89. $r2 = $r1->withRequestTarget('*');
  90. $this->assertEquals('*', $r2->getRequestTarget());
  91. $this->assertEquals('/', $r1->getRequestTarget());
  92. }
  93. /**
  94. * @expectedException \InvalidArgumentException
  95. */
  96. public function testRequestTargetDoesNotAllowSpaces()
  97. {
  98. $r1 = new Request('GET', '/');
  99. $r1->withRequestTarget('/foo bar');
  100. }
  101. public function testRequestTargetDefaultsToSlash()
  102. {
  103. $r1 = new Request('GET', '');
  104. $this->assertEquals('/', $r1->getRequestTarget());
  105. $r2 = new Request('GET', '*');
  106. $this->assertEquals('*', $r2->getRequestTarget());
  107. $r3 = new Request('GET', 'http://foo.com/bar baz/');
  108. $this->assertEquals('/bar%20baz/', $r3->getRequestTarget());
  109. }
  110. public function testBuildsRequestTarget()
  111. {
  112. $r1 = new Request('GET', 'http://foo.com/baz?bar=bam');
  113. $this->assertEquals('/baz?bar=bam', $r1->getRequestTarget());
  114. }
  115. public function testBuildsRequestTargetWithFalseyQuery()
  116. {
  117. $r1 = new Request('GET', 'http://foo.com/baz?0');
  118. $this->assertEquals('/baz?0', $r1->getRequestTarget());
  119. }
  120. public function testHostIsAddedFirst()
  121. {
  122. $r = new Request('GET', 'http://foo.com/baz?bar=bam', ['Foo' => 'Bar']);
  123. $this->assertEquals([
  124. 'Host' => ['foo.com'],
  125. 'Foo' => ['Bar']
  126. ], $r->getHeaders());
  127. }
  128. public function testCanGetHeaderAsCsv()
  129. {
  130. $r = new Request('GET', 'http://foo.com/baz?bar=bam', [
  131. 'Foo' => ['a', 'b', 'c']
  132. ]);
  133. $this->assertEquals('a, b, c', $r->getHeaderLine('Foo'));
  134. $this->assertEquals('', $r->getHeaderLine('Bar'));
  135. }
  136. public function testHostIsNotOverwrittenWhenPreservingHost()
  137. {
  138. $r = new Request('GET', 'http://foo.com/baz?bar=bam', ['Host' => 'a.com']);
  139. $this->assertEquals(['Host' => ['a.com']], $r->getHeaders());
  140. $r2 = $r->withUri(new Uri('http://www.foo.com/bar'), true);
  141. $this->assertEquals('a.com', $r2->getHeaderLine('Host'));
  142. }
  143. public function testWithUriSetsHostIfNotSet()
  144. {
  145. $r = (new Request('GET', 'http://foo.com/baz?bar=bam'))->withoutHeader('Host');
  146. $this->assertEquals([], $r->getHeaders());
  147. $r2 = $r->withUri(new Uri('http://www.baz.com/bar'), true);
  148. $this->assertSame('www.baz.com', $r2->getHeaderLine('Host'));
  149. }
  150. public function testOverridesHostWithUri()
  151. {
  152. $r = new Request('GET', 'http://foo.com/baz?bar=bam');
  153. $this->assertEquals(['Host' => ['foo.com']], $r->getHeaders());
  154. $r2 = $r->withUri(new Uri('http://www.baz.com/bar'));
  155. $this->assertEquals('www.baz.com', $r2->getHeaderLine('Host'));
  156. }
  157. public function testAggregatesHeaders()
  158. {
  159. $r = new Request('GET', '', [
  160. 'ZOO' => 'zoobar',
  161. 'zoo' => ['foobar', 'zoobar']
  162. ]);
  163. $this->assertEquals(['ZOO' => ['zoobar', 'foobar', 'zoobar']], $r->getHeaders());
  164. $this->assertEquals('zoobar, foobar, zoobar', $r->getHeaderLine('zoo'));
  165. }
  166. public function testAddsPortToHeader()
  167. {
  168. $r = new Request('GET', 'http://foo.com:8124/bar');
  169. $this->assertEquals('foo.com:8124', $r->getHeaderLine('host'));
  170. }
  171. public function testAddsPortToHeaderAndReplacePreviousPort()
  172. {
  173. $r = new Request('GET', 'http://foo.com:8124/bar');
  174. $r = $r->withUri(new Uri('http://foo.com:8125/bar'));
  175. $this->assertEquals('foo.com:8125', $r->getHeaderLine('host'));
  176. }
  177. }