Skip to content
This repository has been archived by the owner on Jan 29, 2020. It is now read-only.

Commit

Permalink
Merge branch 'hotfix/3'
Browse files Browse the repository at this point in the history
Close #3
  • Loading branch information
weierophinney committed Sep 28, 2015
2 parents fda7cb8 + 176d45f commit b7a819b
Show file tree
Hide file tree
Showing 4 changed files with 321 additions and 0 deletions.
77 changes: 77 additions & 0 deletions src/Psr7Response.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
<?php
/**
* Zend Framework (http://framework.zend.com/)
*
* @see http://github.com/zendframework/zend-diactoros for the canonical source repository
* @copyright Copyright (c) 2015 Zend Technologies USA Inc. (http://www.zend.com)
* @license https://github.com/zendframework/zend-diactoros/blob/master/LICENSE.md New BSD License
*/

namespace Zend\Psr7Bridge;

use Psr\Http\Message\ResponseInterface;
use Zend\Http\Response as ZendResponse;
use Zend\Diactoros\Response;
use Zend\Diactoros\Stream;

final class Psr7Response
{
/**
* Convert a PSR-7 response in a Zend\Http\Response
*
* @param ResponseInterface $psr7Response
* @return ZendResponse
*/
public static function toZend(ResponseInterface $psr7Response)
{
$response = sprintf(
"HTTP/%s %d %s\r\n%s\r\n%s",
$psr7Response->getProtocolVersion(),
$psr7Response->getStatusCode(),
$psr7Response->getReasonPhrase(),
self::psr7HeadersToString($psr7Response),
(string) $psr7Response->getBody()
);
return ZendResponse::fromString($response);
}

/**
* 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()
);
}

/**
* 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.
*/
private function __construct()
{
}
}
60 changes: 60 additions & 0 deletions src/Psr7ServerRequest.php
Original file line number Diff line number Diff line change
Expand Up @@ -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
{
Expand Down Expand Up @@ -52,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
*
Expand All @@ -78,6 +110,34 @@ 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;
}

/**
* Do not allow instantiation.
*/
Expand Down
89 changes: 89 additions & 0 deletions test/Psr7ResponseTest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,89 @@
<?php
/**
* Zend Framework (http://framework.zend.com/)
*
* @see http://github.com/zendframework/zend-diactoros for the canonical source repository
* @copyright Copyright (c) 2015 Zend Technologies USA Inc. (http://www.zend.com)
* @license https://github.com/zendframework/zend-diactoros/blob/master/LICENSE.md New BSD License
*/

namespace ZendTest\Psr7Bridge;

use PHPUnit_Framework_TestCase as TestCase;
use Zend\Diactoros\Response;
use Zend\Diactoros\Stream;
use Zend\Psr7Bridge\Psr7Response;
use Zend\Http\Response as ZendResponse;

class Psr7ResponseTest extends TestCase
{
public function getResponseData()
{
return [
[ 'Test!', 200, [ 'Content-Type' => [ '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());

$zendHeaders = $zendResponse->getHeaders()->toArray();
foreach ($headers as $type => $values) {
foreach ($values as $value) {
$this->assertContains($value, $zendHeaders[$type]);
}
}
}

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!" ],
[ "HTTP/1.1 200 OK\r\nContent-Type: text/html, text/xml\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());

$zendHeaders = $zendResponse->getHeaders()->toArray();
foreach ($psr7Response->getHeaders() as $type => $values) {
foreach ($values as $value) {
$this->assertContains($value, $zendHeaders[$type]);
}
}
}
}
95 changes: 95 additions & 0 deletions test/Psr7ServerRequestTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -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
{
Expand Down Expand Up @@ -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
'<html></html>', // 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());
}
}
}

0 comments on commit b7a819b

Please sign in to comment.