PrepareBodyMiddlewareTest.php 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162
  1. <?php
  2. namespace GuzzleHttp\Tests;
  3. use GuzzleHttp\Handler\MockHandler;
  4. use GuzzleHttp\HandlerStack;
  5. use GuzzleHttp\Middleware;
  6. use GuzzleHttp\Promise\PromiseInterface;
  7. use GuzzleHttp\Psr7;
  8. use GuzzleHttp\Psr7\FnStream;
  9. use GuzzleHttp\Psr7\Request;
  10. use GuzzleHttp\Psr7\Response;
  11. use PHPUnit\Framework\TestCase;
  12. use Psr\Http\Message\RequestInterface;
  13. class PrepareBodyMiddlewareTest extends TestCase
  14. {
  15. public function methodProvider()
  16. {
  17. $methods = ['GET', 'PUT', 'POST'];
  18. $bodies = ['Test', ''];
  19. foreach ($methods as $method) {
  20. foreach ($bodies as $body) {
  21. yield [$method, $body];
  22. }
  23. }
  24. }
  25. /**
  26. * @dataProvider methodProvider
  27. */
  28. public function testAddsContentLengthWhenMissingAndPossible($method, $body)
  29. {
  30. $h = new MockHandler([
  31. static function (RequestInterface $request) use ($body) {
  32. $length = \strlen($body);
  33. if ($length > 0) {
  34. self::assertEquals($length, $request->getHeaderLine('Content-Length'));
  35. } else {
  36. self::assertFalse($request->hasHeader('Content-Length'));
  37. }
  38. return new Response(200);
  39. },
  40. ]);
  41. $m = Middleware::prepareBody();
  42. $stack = new HandlerStack($h);
  43. $stack->push($m);
  44. $comp = $stack->resolve();
  45. $p = $comp(new Request($method, 'http://www.google.com', [], $body), []);
  46. self::assertInstanceOf(PromiseInterface::class, $p);
  47. $response = $p->wait();
  48. self::assertSame(200, $response->getStatusCode());
  49. }
  50. public function testAddsTransferEncodingWhenNoContentLength()
  51. {
  52. $body = FnStream::decorate(Psr7\Utils::streamFor('foo'), [
  53. 'getSize' => static function () {
  54. return null;
  55. },
  56. ]);
  57. $h = new MockHandler([
  58. static function (RequestInterface $request) {
  59. self::assertFalse($request->hasHeader('Content-Length'));
  60. self::assertSame('chunked', $request->getHeaderLine('Transfer-Encoding'));
  61. return new Response(200);
  62. },
  63. ]);
  64. $m = Middleware::prepareBody();
  65. $stack = new HandlerStack($h);
  66. $stack->push($m);
  67. $comp = $stack->resolve();
  68. $p = $comp(new Request('PUT', 'http://www.google.com', [], $body), []);
  69. self::assertInstanceOf(PromiseInterface::class, $p);
  70. $response = $p->wait();
  71. self::assertSame(200, $response->getStatusCode());
  72. }
  73. public function testAddsContentTypeWhenMissingAndPossible()
  74. {
  75. $bd = Psr7\Utils::streamFor(\fopen(__DIR__.'/../composer.json', 'r'));
  76. $h = new MockHandler([
  77. static function (RequestInterface $request) {
  78. self::assertSame('application/json', $request->getHeaderLine('Content-Type'));
  79. self::assertTrue($request->hasHeader('Content-Length'));
  80. return new Response(200);
  81. },
  82. ]);
  83. $m = Middleware::prepareBody();
  84. $stack = new HandlerStack($h);
  85. $stack->push($m);
  86. $comp = $stack->resolve();
  87. $p = $comp(new Request('PUT', 'http://www.google.com', [], $bd), []);
  88. self::assertInstanceOf(PromiseInterface::class, $p);
  89. $response = $p->wait();
  90. self::assertSame(200, $response->getStatusCode());
  91. }
  92. public function expectProvider()
  93. {
  94. return [
  95. [true, ['100-Continue']],
  96. [false, []],
  97. [10, ['100-Continue']],
  98. [500000, []],
  99. ];
  100. }
  101. /**
  102. * @dataProvider expectProvider
  103. */
  104. public function testAddsExpect($value, $result)
  105. {
  106. $bd = Psr7\Utils::streamFor(\fopen(__DIR__.'/../composer.json', 'r'));
  107. $h = new MockHandler([
  108. static function (RequestInterface $request) use ($result) {
  109. self::assertSame($result, $request->getHeader('Expect'));
  110. return new Response(200);
  111. },
  112. ]);
  113. $m = Middleware::prepareBody();
  114. $stack = new HandlerStack($h);
  115. $stack->push($m);
  116. $comp = $stack->resolve();
  117. $p = $comp(new Request('PUT', 'http://www.google.com', [], $bd), [
  118. 'expect' => $value,
  119. ]);
  120. self::assertInstanceOf(PromiseInterface::class, $p);
  121. $response = $p->wait();
  122. self::assertSame(200, $response->getStatusCode());
  123. }
  124. public function testIgnoresIfExpectIsPresent()
  125. {
  126. $bd = Psr7\Utils::streamFor(\fopen(__DIR__.'/../composer.json', 'r'));
  127. $h = new MockHandler([
  128. static function (RequestInterface $request) {
  129. self::assertSame(['Foo'], $request->getHeader('Expect'));
  130. return new Response(200);
  131. },
  132. ]);
  133. $m = Middleware::prepareBody();
  134. $stack = new HandlerStack($h);
  135. $stack->push($m);
  136. $comp = $stack->resolve();
  137. $p = $comp(
  138. new Request('PUT', 'http://www.google.com', ['Expect' => 'Foo'], $bd),
  139. ['expect' => true]
  140. );
  141. self::assertInstanceOf(PromiseInterface::class, $p);
  142. $response = $p->wait();
  143. self::assertSame(200, $response->getStatusCode());
  144. }
  145. }