diff --git a/src/StreamRequestPayloadMiddleware.php b/src/StreamRequestPayloadMiddleware.php index 8b46369ec4..dd63d3a5f6 100644 --- a/src/StreamRequestPayloadMiddleware.php +++ b/src/StreamRequestPayloadMiddleware.php @@ -69,8 +69,8 @@ public function __invoke(CommandInterface $command, RequestInterface $request) $size = $request->getBody()->getSize(); if (is_null($size)) { throw new IncalculablePayloadException('Payload' - . 'content lenggth is required and can not be' - . 'calculated.'); + . ' content length is required and can not be' + . ' calculated.'); } $request = $request->withHeader( 'content-length', diff --git a/tests/StreamRequestPayloadMiddlewareTest.php b/tests/StreamRequestPayloadMiddlewareTest.php index d0d96ab7b9..b6aa921ecc 100644 --- a/tests/StreamRequestPayloadMiddlewareTest.php +++ b/tests/StreamRequestPayloadMiddlewareTest.php @@ -32,18 +32,7 @@ public function testAddsProperHeaders( array $expectedHeaders, array $expectedNonHeaders ) { - $service = $this->generateTestService(); - $serializer = ClientResolver::_default_serializer([ - 'api' => $service, - 'endpoint' => '' - ]); - - $list = new HandlerList(); - $list->prependBuild(Middleware::requestBuilder($serializer), 'builder'); - $list->prependSign( - StreamRequestPayloadMiddleware::wrap($service), - 'StreamRequestPayloadMiddleware' - ); + $list = $this->generateTestHandlerList(); $list->setHandler(function ( CommandInterface $command, @@ -123,6 +112,59 @@ public function generateTestCases() ]; } + /** + * @expectedException \Aws\Exception\IncalculablePayloadException + * @expectedExceptionMessage Payload content length is required and can not be calculated. + */ + public function testThrowsExceptionOnIncalculableSize() + { + $service = $this->generateTestService(); + $client = $this->generateTestClient($service); + $command = $client->getCommand( + 'StreamingOp', + [ + 'InputStream' => Psr7\stream_for('test'), + ] + ); + $middleware = StreamRequestPayloadMiddleware::wrap($service); + $invokable = $middleware(function($cmd, $req) {}); + + // Mock a request with a body whose size returns null + $streamMock = $this->getMockBuilder(\stdClass::class) + ->setMethods(['getSize']) + ->getMock(); + $streamMock->expects($this->any()) + ->method('getSize') + ->willReturn(null); + $requestMock = $this->getMockBuilder(Request::class) + ->setConstructorArgs(['POST', 'https://foo.com']) + ->setMethods(['getBody']) + ->getMock(); + $requestMock->expects($this->any()) + ->method('getBody') + ->willReturn($streamMock); + + $invokable($command, $requestMock); + } + + private function generateTestHandlerList() + { + $service = $this->generateTestService(); + $serializer = ClientResolver::_default_serializer([ + 'api' => $service, + 'endpoint' => '' + ]); + + $list = new HandlerList(); + $list->prependBuild(Middleware::requestBuilder($serializer), 'builder'); + $list->prependSign( + StreamRequestPayloadMiddleware::wrap($service), + 'StreamRequestPayloadMiddleware' + ); + + return $list; + } + private function generateTestClient(Service $service, $args = []) { return new AwsClient(