From 6ddc20b3cf40438264066b6de8a2f0d05f5399a0 Mon Sep 17 00:00:00 2001 From: Enrico Zimuel Date: Wed, 23 Sep 2015 20:07:05 +0200 Subject: [PATCH 1/5] Added the response translations --- src/Psr7Response.php | 71 +++++++++++++++++++++++++++++++ test/Psr7ResponseTest.php | 88 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 159 insertions(+) create mode 100644 src/Psr7Response.php create mode 100644 test/Psr7ResponseTest.php diff --git a/src/Psr7Response.php b/src/Psr7Response.php new file mode 100644 index 0000000..5867660 --- /dev/null +++ b/src/Psr7Response.php @@ -0,0 +1,71 @@ +getProtocolVersion(), + $psr7Response->getStatusCode(), + $psr7Response->getReasonPhrase(), + self::getPsr7Headers($psr7Response), + (string) $psr7Response->getBody() + ); + return ZendResponse::fromString($response); + } + + private static function getPsr7Headers(ResponseInterface $psr7Response) + { + $headers = ''; + foreach ($psr7Response->getHeaders() as $name => $value) { + $headers .= $name . ": " . implode(", ", $value) . "\r\n"; + } + return $headers; + } + + /** + * Convert a Zend\Http\Response in a PSR-7 response, using zend-diactoros + * + * @param ZendResponse $zendResponse + * @return Response + */ + public static function fromZend(ZendResponse $zendResponse) + { + $body = new Stream('php://temp', 'wb+'); + $body->write($zendResponse->getBody()); + + return new Response( + $body, + $zendResponse->getStatusCode(), + $zendResponse->getHeaders()->toArray() + ); + } + + /** + * Do not allow instantiation. + */ + private function __construct() + { + } +} diff --git a/test/Psr7ResponseTest.php b/test/Psr7ResponseTest.php new file mode 100644 index 0000000..5a73dc3 --- /dev/null +++ b/test/Psr7ResponseTest.php @@ -0,0 +1,88 @@ + [ 'text/html' ] ] ], + [ '', 204, [] ], + [ 'Test!', 200, [ + 'Content-Type' => [ 'text/html; charset=utf-8' ], + 'Content-Length' => [ 5 ] + ]], + [ 'Test!', 202, [ + 'Content-Type' => [ 'text/html; level=1', 'text/html' ], + 'Content-Length' => [ 5 ] + ]], + ]; + } + + /** + * @dataProvider getResponseData + */ + public function testResponseToZend($body, $status, $headers) + { + $stream = new Stream('php://temp', 'wb+'); + $stream->write($body); + + $psr7Response = new Response($stream, $status, $headers); + $this->assertInstanceOf('Psr\Http\Message\ResponseInterface', $psr7Response); + + $zendResponse = Psr7Response::toZend($psr7Response); + $this->assertInstanceOf('Zend\Http\Response', $zendResponse); + $this->assertEquals($body, (string) $zendResponse->getBody()); + $this->assertEquals($status, $zendResponse->getStatusCode()); + $this->assertEquals($headers, $this->zendToPsr7Headers($zendResponse->getHeaders())); + } + + /** + * Transform a Zend headers into Psr7 headers + */ + protected function zendToPsr7Headers($headers) + { + $zendHeaders = $headers->toArray(); + foreach ($zendHeaders as $type => $value) { + $zendHeaders[$type] = split(', ', $value); + } + return $zendHeaders; + } + + public function getResponseString() + { + return [ + [ "HTTP/1.1 200 OK\r\nContent-Type: text/html; charset=utf-8\r\n\r\nTest!" ], + [ "HTTP/1.1 204 OK\r\n\r\n" ], + [ "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\nContent-Length: 5\r\n\r\nTest!" ], + ]; + } + + /** + * @dataProvider getResponseString + */ + public function testResponseFromZend($response) + { + $zendResponse = ZendResponse::fromString($response); + $this->assertInstanceOf('Zend\Http\Response', $zendResponse); + $psr7Response = Psr7Response::fromZend($zendResponse); + $this->assertInstanceOf('Psr\Http\Message\ResponseInterface', $psr7Response); + $this->assertEquals((string) $psr7Response->getBody(), $zendResponse->getBody()); + $this->assertEquals($psr7Response->getStatusCode(), $zendResponse->getStatusCode()); + $this->assertEquals($psr7Response->getHeaders(), $this->zendToPsr7Headers($zendResponse->getHeaders())); + } +} From 744e40c1ba12b07710105389e020cb76b34424f2 Mon Sep 17 00:00:00 2001 From: Enrico Zimuel Date: Wed, 23 Sep 2015 20:15:25 +0200 Subject: [PATCH 2/5] Removed the split usage --- test/Psr7ResponseTest.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/Psr7ResponseTest.php b/test/Psr7ResponseTest.php index 5a73dc3..9e93401 100644 --- a/test/Psr7ResponseTest.php +++ b/test/Psr7ResponseTest.php @@ -58,7 +58,7 @@ protected function zendToPsr7Headers($headers) { $zendHeaders = $headers->toArray(); foreach ($zendHeaders as $type => $value) { - $zendHeaders[$type] = split(', ', $value); + $zendHeaders[$type] = explode(', ', $value); } return $zendHeaders; } From 6553ed52d4161a0262783362942272aa0d652f10 Mon Sep 17 00:00:00 2001 From: Enrico Zimuel Date: Thu, 24 Sep 2015 07:48:57 +0200 Subject: [PATCH 3/5] Improved the unit test --- test/Psr7ResponseTest.php | 29 +++++++++++++++-------------- 1 file changed, 15 insertions(+), 14 deletions(-) diff --git a/test/Psr7ResponseTest.php b/test/Psr7ResponseTest.php index 9e93401..590cd8d 100644 --- a/test/Psr7ResponseTest.php +++ b/test/Psr7ResponseTest.php @@ -24,11 +24,11 @@ public function getResponseData() [ '', 204, [] ], [ 'Test!', 200, [ 'Content-Type' => [ 'text/html; charset=utf-8' ], - 'Content-Length' => [ 5 ] + 'Content-Length' => [ '5' ] ]], [ 'Test!', 202, [ 'Content-Type' => [ 'text/html; level=1', 'text/html' ], - 'Content-Length' => [ 5 ] + 'Content-Length' => [ '5' ] ]], ]; } @@ -48,19 +48,13 @@ public function testResponseToZend($body, $status, $headers) $this->assertInstanceOf('Zend\Http\Response', $zendResponse); $this->assertEquals($body, (string) $zendResponse->getBody()); $this->assertEquals($status, $zendResponse->getStatusCode()); - $this->assertEquals($headers, $this->zendToPsr7Headers($zendResponse->getHeaders())); - } - /** - * Transform a Zend headers into Psr7 headers - */ - protected function zendToPsr7Headers($headers) - { - $zendHeaders = $headers->toArray(); - foreach ($zendHeaders as $type => $value) { - $zendHeaders[$type] = explode(', ', $value); + $zendHeaders = $zendResponse->getHeaders()->toArray(); + foreach ($headers as $type => $values) { + foreach ($values as $value) { + $this->assertContains($value, $zendHeaders[$type]); + } } - return $zendHeaders; } public function getResponseString() @@ -69,6 +63,7 @@ public function getResponseString() [ "HTTP/1.1 200 OK\r\nContent-Type: text/html; charset=utf-8\r\n\r\nTest!" ], [ "HTTP/1.1 204 OK\r\n\r\n" ], [ "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\nContent-Length: 5\r\n\r\nTest!" ], + [ "HTTP/1.1 200 OK\r\nContent-Type: text/html, text/xml\r\nContent-Length: 5\r\n\r\nTest!" ], ]; } @@ -83,6 +78,12 @@ public function testResponseFromZend($response) $this->assertInstanceOf('Psr\Http\Message\ResponseInterface', $psr7Response); $this->assertEquals((string) $psr7Response->getBody(), $zendResponse->getBody()); $this->assertEquals($psr7Response->getStatusCode(), $zendResponse->getStatusCode()); - $this->assertEquals($psr7Response->getHeaders(), $this->zendToPsr7Headers($zendResponse->getHeaders())); + + $zendHeaders = $zendResponse->getHeaders()->toArray(); + foreach ($psr7Response->getHeaders() as $type => $values) { + foreach ($values as $value) { + $this->assertContains($value, $zendHeaders[$type]); + } + } } } From 3da1ce597c1607ca2d7f4504705f5de5bff5e0a9 Mon Sep 17 00:00:00 2001 From: Enrico Zimuel Date: Fri, 25 Sep 2015 16:42:04 +0200 Subject: [PATCH 4/5] Added the request conversion from Zend to PSR-7 --- src/Psr7Response.php | 10 +++- src/Psr7ServerRequest.php | 60 +++++++++++++++++++++ test/Psr7ServerRequestTest.php | 95 ++++++++++++++++++++++++++++++++++ 3 files changed, 163 insertions(+), 2 deletions(-) diff --git a/src/Psr7Response.php b/src/Psr7Response.php index 5867660..416d39c 100644 --- a/src/Psr7Response.php +++ b/src/Psr7Response.php @@ -29,13 +29,19 @@ public static function toZend(ResponseInterface $psr7Response) $psr7Response->getProtocolVersion(), $psr7Response->getStatusCode(), $psr7Response->getReasonPhrase(), - self::getPsr7Headers($psr7Response), + self::psr7HeadersToString($psr7Response), (string) $psr7Response->getBody() ); return ZendResponse::fromString($response); } - private static function getPsr7Headers(ResponseInterface $psr7Response) + /** + * Convert the PSR-7 headers to string + * + * @param ResponseInterface $psr7Response + * @return string + */ + private static function psr7HeadersToString(ResponseInterface $psr7Response) { $headers = ''; foreach ($psr7Response->getHeaders() as $name => $value) { diff --git a/src/Psr7ServerRequest.php b/src/Psr7ServerRequest.php index 1d2cef1..64423ac 100644 --- a/src/Psr7ServerRequest.php +++ b/src/Psr7ServerRequest.php @@ -10,6 +10,10 @@ namespace Zend\Psr7Bridge; use Psr\Http\Message\ServerRequestInterface; +use Zend\Http\Request as ZendRequest; +use Zend\Diactoros\ServerRequest; +use Zend\Diactoros\Stream; +use Zend\Diactoros\UploadedFile; final class Psr7ServerRequest { @@ -78,6 +82,62 @@ private static function convertUploadedFiles(array $uploadedFiles) return $files; } + /** + * Convert a Zend\Http file structure to PSR-7 uploaded files + * + * @param array + * @return UploadedFile[] + */ + private static function convertFilesToUploaded(array $files) + { + if (!isset($files['file'])) { + return []; + } + $uploadedFiles = []; + foreach ($files['file'] as $name => $value) { + if (is_array($name)) { + $uploadedFiles[$name] = self::convertFilesToUploaded($value); + continue; + } + $uploadFiles[$name] = new UploadedFile( + $value['tmp_name'], + $value['size'], + $value['error'], + $value['name'], + $value['type'] + ); + } + return $uploadedFiles; + } + + /** + * Convert a Zend\Http\Response in a PSR-7 response, using zend-diactoros + * + * @param ZendRequest $zendRequest + * @return ServerRequest + */ + public static function fromZend(ZendRequest $zendRequest) + { + $body = new Stream('php://memory', 'wb+'); + $body->write($zendRequest->getContent()); + + $headers = empty($zendRequest->getHeaders()) ? [] : $zendRequest->getHeaders()->toArray(); + $query = empty($zendRequest->getQuery()) ? [] : $zendRequest->getQuery()->toArray(); + $post = empty($zendRequest->getPost()) ? [] : $zendRequest->getPost()->toArray(); + $files = empty($zendRequest->getFiles()) ? [] : $zendRequest->getFiles()->toArray(); + + $request = new ServerRequest( + [], + self::convertFilesToUploaded($files), + $zendRequest->getUriString(), + $zendRequest->getMethod(), + $body, + $headers + ); + $request = $request->withQueryParams($query); + return $request->withParsedBody($post); + } + /** * Do not allow instantiation. */ diff --git a/test/Psr7ServerRequestTest.php b/test/Psr7ServerRequestTest.php index 0d32ef4..e646b42 100644 --- a/test/Psr7ServerRequestTest.php +++ b/test/Psr7ServerRequestTest.php @@ -13,6 +13,7 @@ use Zend\Diactoros\ServerRequest; use Zend\Diactoros\UploadedFile; use Zend\Psr7Bridge\Psr7ServerRequest; +use Zend\Http\Request as ZendRequest; class Psr7ServerRequestTest extends TestCase { @@ -208,4 +209,98 @@ public function testCustomHttpMethodsDoNotRaiseAnExceptionDuringConversionToZend { $this->markTestIncomplete('Functionality is written but untested'); } + + public function getResponseData() + { + return [ + [ + 'http://framework.zend.com/', // uri + 'GET', // http method + [ 'Content-Type' => 'text/html' ], // headers + '', // body + [ 'foo' => 'bar' ], // query params + [], // post + [], // files + ], + [ + 'http://framework.zend.com/', // uri + 'POST', // http method + [ + 'Content-Type' => 'application/x-www-form-urlencoded', + 'Cookie' => sprintf("PHPSESSID=%s;foo=bar", uniqid()) + ], // headers + '', // body + [ 'foo' => 'bar' ], // query params + [ 'baz' => 'bar' ], // post + [], // files + ], + [ + 'http://framework.zend.com/', // uri + 'POST', // http method + [ 'Content-Type' => 'multipart/form-data' ], // headers + file_get_contents(__FILE__), // body + [ 'foo' => 'bar' ], // query params + [], // post + [ + 'file' => [ + 'test1' => [ + 'name' => 'test1.txt', + 'type' => 'text/plain', + 'tmp_name' => '/tmp/phpXXX', + 'error' => 0, + 'size' => 1, + ], + 'test2' => [ + 'name' => 'test2.txt', + 'type' => 'text/plain', + 'tmp_name' => '/tmp/phpYYY', + 'error' => 0, + 'size' => 1, + ] + ] + ], // files + ] + ]; + } + + /** + * @dataProvider getResponseData + */ + public function testFromZend($uri, $method, $headers, $body, $query, $post, $files) + { + $zendRequest = new ZendRequest(); + $zendRequest->setUri($uri); + $zendRequest->setMethod($method); + $zendRequest->getHeaders()->addHeaders($headers); + $zendRequest->setContent($body); + $zendRequest->getQuery()->fromArray($query); + $zendRequest->getPost()->fromArray($post); + $zendRequest->getFiles()->fromArray($files); + + $psr7Request = Psr7ServerRequest::fromZend($zendRequest); + $this->assertInstanceOf('Zend\Diactoros\ServerRequest', $psr7Request); + // URI + $this->assertEquals($uri, (string) $psr7Request->getUri()); + // HTTP method + $this->assertEquals($method, $psr7Request->getMethod()); + // headers + $psr7Headers = $psr7Request->getHeaders(); + foreach ($headers as $key => $value) { + $this->assertContains($value, $psr7Headers[$key]); + } + // body + $this->assertEquals($body, (string) $psr7Request->getBody()); + // query params + $this->assertEquals($query, $psr7Request->getQueryParams()); + // post + $this->assertEquals($post, $psr7Request->getParsedBody()); + // files + foreach ($psr7Request->getUploadedFiles() as $name => $upload) { + $this->assertEquals($files['file'][$name]['name'], $upload->getClientFilename()); + $this->assertEquals($files['file'][$name]['type'], $upload->getClientMediaType()); + $this->assertEquals($files['file'][$name]['size'], $upload->getSize()); + $this->assertEquals($files['file'][$name]['tmp_name'], $upload->getStream()); + $this->assertEquals($files['file'][$name]['error'], $upload->getError()); + } + } } From 176d45f7c0dad13b93277e3befc884aaa7b6d29f Mon Sep 17 00:00:00 2001 From: Matthew Weier O'Phinney Date: Mon, 28 Sep 2015 10:47:17 -0500 Subject: [PATCH 5/5] Move private methods after public ones --- src/Psr7Response.php | 30 ++++++++++----------- src/Psr7ServerRequest.php | 56 +++++++++++++++++++-------------------- 2 files changed, 43 insertions(+), 43 deletions(-) diff --git a/src/Psr7Response.php b/src/Psr7Response.php index 416d39c..581fcd1 100644 --- a/src/Psr7Response.php +++ b/src/Psr7Response.php @@ -35,21 +35,6 @@ public static function toZend(ResponseInterface $psr7Response) return ZendResponse::fromString($response); } - /** - * Convert the PSR-7 headers to string - * - * @param ResponseInterface $psr7Response - * @return string - */ - private static function psr7HeadersToString(ResponseInterface $psr7Response) - { - $headers = ''; - foreach ($psr7Response->getHeaders() as $name => $value) { - $headers .= $name . ": " . implode(", ", $value) . "\r\n"; - } - return $headers; - } - /** * Convert a Zend\Http\Response in a PSR-7 response, using zend-diactoros * @@ -68,6 +53,21 @@ public static function fromZend(ZendResponse $zendResponse) ); } + /** + * Convert the PSR-7 headers to string + * + * @param ResponseInterface $psr7Response + * @return string + */ + private static function psr7HeadersToString(ResponseInterface $psr7Response) + { + $headers = ''; + foreach ($psr7Response->getHeaders() as $name => $value) { + $headers .= $name . ": " . implode(", ", $value) . "\r\n"; + } + return $headers; + } + /** * Do not allow instantiation. */ diff --git a/src/Psr7ServerRequest.php b/src/Psr7ServerRequest.php index 64423ac..a973e33 100644 --- a/src/Psr7ServerRequest.php +++ b/src/Psr7ServerRequest.php @@ -56,6 +56,34 @@ public static function toZend(ServerRequestInterface $psr7Request, $shallow = fa return $zendRequest; } + /** + * Convert a Zend\Http\Response in a PSR-7 response, using zend-diactoros + * + * @param ZendRequest $zendRequest + * @return ServerRequest + */ + public static function fromZend(ZendRequest $zendRequest) + { + $body = new Stream('php://memory', 'wb+'); + $body->write($zendRequest->getContent()); + + $headers = empty($zendRequest->getHeaders()) ? [] : $zendRequest->getHeaders()->toArray(); + $query = empty($zendRequest->getQuery()) ? [] : $zendRequest->getQuery()->toArray(); + $post = empty($zendRequest->getPost()) ? [] : $zendRequest->getPost()->toArray(); + $files = empty($zendRequest->getFiles()) ? [] : $zendRequest->getFiles()->toArray(); + + $request = new ServerRequest( + [], + self::convertFilesToUploaded($files), + $zendRequest->getUriString(), + $zendRequest->getMethod(), + $body, + $headers + ); + $request = $request->withQueryParams($query); + return $request->withParsedBody($post); + } + /** * Convert a PSR-7 uploaded files structure to a $_FILES structure * @@ -110,34 +138,6 @@ private static function convertFilesToUploaded(array $files) return $uploadedFiles; } - /** - * Convert a Zend\Http\Response in a PSR-7 response, using zend-diactoros - * - * @param ZendRequest $zendRequest - * @return ServerRequest - */ - public static function fromZend(ZendRequest $zendRequest) - { - $body = new Stream('php://memory', 'wb+'); - $body->write($zendRequest->getContent()); - - $headers = empty($zendRequest->getHeaders()) ? [] : $zendRequest->getHeaders()->toArray(); - $query = empty($zendRequest->getQuery()) ? [] : $zendRequest->getQuery()->toArray(); - $post = empty($zendRequest->getPost()) ? [] : $zendRequest->getPost()->toArray(); - $files = empty($zendRequest->getFiles()) ? [] : $zendRequest->getFiles()->toArray(); - - $request = new ServerRequest( - [], - self::convertFilesToUploaded($files), - $zendRequest->getUriString(), - $zendRequest->getMethod(), - $body, - $headers - ); - $request = $request->withQueryParams($query); - return $request->withParsedBody($post); - } - /** * Do not allow instantiation. */