data. * * @return array */ public static function safeHttpMethodProvider() { return [ ['GET'], ['HEAD'], ]; } /** * Data provider for HTTP methods that can contain request bodies. * * @return array */ public static function httpMethodProvider() { return [ ['PATCH'], ['PUT'], ['POST'], ['DELETE'], ]; } /** * test constructor options * * @return void */ public function testConstructorMethodsOption() { $parser = new BodyParserMiddleware(['methods' => ['PUT']]); $this->assertAttributeEquals(['PUT'], 'methods', $parser); } /** * test constructor options * * @return void */ public function testConstructorXmlOption() { $parser = new BodyParserMiddleware(['json' => false]); $this->assertAttributeEquals([], 'parsers', $parser, 'Xml off by default'); $parser = new BodyParserMiddleware(['json' => false, 'xml' => false]); $this->assertAttributeEquals([], 'parsers', $parser, 'No Xml types set.'); $parser = new BodyParserMiddleware(['json' => false, 'xml' => true]); $expected = [ 'application/xml' => [$parser, 'decodeXml'], 'text/xml' => [$parser, 'decodeXml'], ]; $this->assertAttributeEquals($expected, 'parsers', $parser, 'Xml types are incorrect.'); } /** * test constructor options * * @return void */ public function testConstructorJsonOption() { $parser = new BodyParserMiddleware(['json' => false]); $this->assertAttributeEquals([], 'parsers', $parser, 'No JSON types set.'); $parser = new BodyParserMiddleware([]); $expected = [ 'application/json' => [$parser, 'decodeJson'], 'text/json' => [$parser, 'decodeJson'], ]; $this->assertAttributeEquals($expected, 'parsers', $parser, 'JSON types are incorrect.'); } /** * test setMethods() * * @return void */ public function testSetMethodsReturn() { $parser = new BodyParserMiddleware(); $this->assertSame($parser, $parser->setMethods(['PUT'])); $this->assertAttributeEquals(['PUT'], 'methods', $parser); } /** * test addParser() * * @return void */ public function testAddParserReturn() { $parser = new BodyParserMiddleware(['json' => false]); $this->assertSame($parser, $parser->addParser(['application/json'], 'json_decode')); } /** * test last parser defined wins * * @return void */ public function testAddParserOverwrite() { $parser = new BodyParserMiddleware(['json' => false]); $parser->addParser(['application/json'], 'json_decode'); $parser->addParser(['application/json'], 'strpos'); $this->assertAttributeEquals(['application/json' => 'strpos'], 'parsers', $parser); } /** * test skipping parsing on unknown type * * @dataProvider httpMethodProvider * @return void */ public function testInvokeMismatchedType($method) { $parser = new BodyParserMiddleware(); $request = new ServerRequest([ 'environment' => [ 'REQUEST_METHOD' => $method, 'CONTENT_TYPE' => 'text/csv', ], 'input' => 'a,b,c', ]); $response = new Response(); $next = function ($req, $res) { $this->assertEquals([], $req->getParsedBody()); }; $parser($request, $response, $next); } /** * test parsing on valid http method * * @dataProvider httpMethodProvider * @return void */ public function testInvokeCaseInsensitiveContentType($method) { $parser = new BodyParserMiddleware(); $request = new ServerRequest([ 'environment' => [ 'REQUEST_METHOD' => $method, 'CONTENT_TYPE' => 'ApPlIcAtIoN/JSoN', ], 'input' => '{"title": "yay"}', ]); $response = new Response(); $next = function ($req, $res) { $this->assertEquals(['title' => 'yay'], $req->getParsedBody()); }; $parser($request, $response, $next); } /** * test parsing on valid http method * * @dataProvider httpMethodProvider * @return void */ public function testInvokeParse($method) { $parser = new BodyParserMiddleware(); $request = new ServerRequest([ 'environment' => [ 'REQUEST_METHOD' => $method, 'CONTENT_TYPE' => 'application/json', ], 'input' => '{"title": "yay"}', ]); $response = new Response(); $next = function ($req, $res) { $this->assertEquals(['title' => 'yay'], $req->getParsedBody()); }; $parser($request, $response, $next); } /** * test parsing on valid http method with charset * * @return void */ public function testInvokeParseStripCharset() { $parser = new BodyParserMiddleware(); $request = new ServerRequest([ 'environment' => [ 'REQUEST_METHOD' => 'POST', 'CONTENT_TYPE' => 'application/json; charset=utf-8', ], 'input' => '{"title": "yay"}', ]); $response = new Response(); $next = function ($req, $res) { $this->assertEquals(['title' => 'yay'], $req->getParsedBody()); }; $parser($request, $response, $next); } /** * test parsing on ignored http method * * @dataProvider safeHttpMethodProvider * @return void */ public function testInvokeNoParseOnSafe($method) { $parser = new BodyParserMiddleware(); $request = new ServerRequest([ 'environment' => [ 'REQUEST_METHOD' => $method, 'CONTENT_TYPE' => 'application/json', ], 'input' => '{"title": "yay"}', ]); $response = new Response(); $next = function ($req, $res) { $this->assertEquals([], $req->getParsedBody()); }; $parser($request, $response, $next); } /** * test parsing XML bodies. * * @return void */ public function testInvokeXml() { $xml = <<
yay
XML; $request = new ServerRequest([ 'environment' => [ 'REQUEST_METHOD' => 'POST', 'CONTENT_TYPE' => 'application/xml', ], 'input' => $xml, ]); $response = new Response(); $next = function ($req, $res) { $expected = [ 'article' => ['title' => 'yay'], ]; $this->assertEquals($expected, $req->getParsedBody()); }; $parser = new BodyParserMiddleware(['xml' => true]); $parser($request, $response, $next); } /** * Test that CDATA is removed in XML data. * * @return void */ public function testInvokeXmlCdata() { $xml = <<
1 <![CDATA[first]]>
XML; $request = new ServerRequest([ 'environment' => [ 'REQUEST_METHOD' => 'POST', 'CONTENT_TYPE' => 'application/xml', ], 'input' => $xml, ]); $response = new Response(); $next = function ($req, $res) { $expected = [ 'article' => [ 'id' => 1, 'title' => 'first', ], ]; $this->assertEquals($expected, $req->getParsedBody()); }; $parser = new BodyParserMiddleware(['xml' => true]); $parser($request, $response, $next); } /** * Test that internal entity recursion is ignored. * * @return void */ public function testInvokeXmlInternalEntities() { $xml = << ]> &item8; XML; $request = new ServerRequest([ 'environment' => [ 'REQUEST_METHOD' => 'POST', 'CONTENT_TYPE' => 'application/xml', ], 'input' => $xml, ]); $response = new Response(); $next = function ($req, $res) { $this->assertEquals([], $req->getParsedBody()); }; $parser = new BodyParserMiddleware(['xml' => true]); $parser($request, $response, $next); } /** * test parsing fails will raise a bad request. * * @return void */ public function testInvokeParseNoArray() { $request = new ServerRequest([ 'environment' => [ 'REQUEST_METHOD' => 'POST', 'CONTENT_TYPE' => 'application/json', ], 'input' => 'lol', ]); $response = new Response(); $next = function ($req, $res) { }; $this->expectException(BadRequestException::class); $parser = new BodyParserMiddleware(); $parser($request, $response, $next); } }