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

Commit 2478f18

Browse files
committed
Merge branch 'feature/480' into develop
Close #480
2 parents 8833877 + 75dfa35 commit 2478f18

File tree

4 files changed

+32
-18
lines changed

4 files changed

+32
-18
lines changed

CHANGELOG.md

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,11 @@ All notable changes to this project will be documented in this file, in reverse
66

77
### Added
88

9-
- Nothing.
9+
- [#480](https://github.com/zendframework/zend-expressive/pull/480) updates the
10+
`ImplicitHeadMiddleware` to add a request attribute indicating the request was
11+
originally generated for a `HEAD` request before delegating the request; you
12+
can now pull the attribute `Zend\Expressive\Middleware\ImplicitHeadMiddleware::FORWARDED_HTTP_METHOD_ATTRIBUTE`
13+
in your own middleware in order to vary behavior in these scenarios.
1014

1115
### Changed
1216

doc/book/features/middleware/implicit-methods-middleware.md

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,15 @@ instance). However, if `GET` is supported, it will dispatch the next layer, but
7070
with a `GET` request instead of `HEAD`; additionally, it will inject the
7171
returned response with an empty response body before returning it.
7272

73+
### Detecting forwarded requests
74+
75+
- Since 2.1.0
76+
77+
When the next layer is dispatched, the request will have an additional
78+
attribute, `Zend\Expressive\Middleware\ImplicitHeadMiddleware::FORWARDED_HTTP_METHOD_ATTRIBUTE`,
79+
with a value of `HEAD`. As such, you can check for this value in order to vary
80+
the headers returned if desired.
81+
7382
## ImplicitOptionsMiddleware
7483

7584
`Zend\Expressive\Middleware\ImplicitOptionsMiddleware` provides support for

src/Middleware/ImplicitHeadMiddleware.php

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,8 @@
4343
*/
4444
class ImplicitHeadMiddleware implements ServerMiddlewareInterface
4545
{
46+
const FORWARDED_HTTP_METHOD_ATTRIBUTE = 'forwarded_http_method';
47+
4648
/**
4749
* @var null|ResponseInterface
4850
*/
@@ -89,7 +91,9 @@ public function process(ServerRequestInterface $request, DelegateInterface $dele
8991
}
9092

9193
$response = $delegate->process(
92-
$request->withMethod(RequestMethod::METHOD_GET)
94+
$request
95+
->withMethod(RequestMethod::METHOD_GET)
96+
->withAttribute(self::FORWARDED_HTTP_METHOD_ATTRIBUTE, RequestMethod::METHOD_HEAD)
9397
);
9498

9599
return $response->withBody(new Stream('php://temp/', 'wb+'));

test/Middleware/ImplicitHeadMiddlewareTest.php

Lines changed: 13 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,8 @@
1414
use Prophecy\Argument;
1515
use Psr\Http\Message\ResponseInterface;
1616
use Psr\Http\Message\ServerRequestInterface;
17-
use Psr\Http\Message\StreamInterface;
1817
use Zend\Diactoros\Response;
18+
use Zend\Diactoros\ServerRequest;
1919
use Zend\Expressive\Middleware\ImplicitHeadMiddleware;
2020
use Zend\Expressive\Router\Route;
2121
use Zend\Expressive\Router\RouteResult;
@@ -162,26 +162,23 @@ public function testInvokesNextWhenRouteImplicitlySupportsHeadAndSupportsGet()
162162
$result = $this->prophesize(RouteResult::class);
163163
$result->getMatchedRoute()->will([$route, 'reveal']);
164164

165-
$request = $this->prophesize(ServerRequestInterface::class);
166-
$request->getMethod()->willReturn(RequestMethod::METHOD_HEAD);
167-
$request->getAttribute(RouteResult::class, false)->will([$result, 'reveal']);
168-
$request->withMethod(RequestMethod::METHOD_GET)->will([$request, 'reveal']);
165+
$request = (new ServerRequest([], [], null, RequestMethod::METHOD_HEAD))
166+
->withAttribute(RouteResult::class, $result->reveal());
169167

170-
$response = $this->prophesize(ResponseInterface::class);
171-
$response
172-
->withBody(Argument::that(function ($body) {
173-
$this->assertInstanceOf(StreamInterface::class, $body);
174-
$this->assertEquals('', (string) $body);
175-
return true;
176-
}))
177-
->will([$response, 'reveal']);
168+
$response = new Response\JsonResponse(['some_data' => true], 400);
178169

179170
$delegate = $this->prophesize(DelegateInterface::class);
180-
$delegate->process($request->reveal())->will([$response, 'reveal']);
171+
$delegate->process(Argument::that(function (ServerRequestInterface $request) {
172+
$attr = $request->getAttribute(ImplicitHeadMiddleware::FORWARDED_HTTP_METHOD_ATTRIBUTE);
173+
$this->assertSame('HEAD', $attr);
174+
return true;
175+
}))->willReturn($response);
181176

182177
$middleware = new ImplicitHeadMiddleware();
183-
$result = $middleware->process($request->reveal(), $delegate->reveal());
178+
$result = $middleware->process($request, $delegate->reveal());
184179

185-
$this->assertSame($response->reveal(), $result);
180+
$this->assertSame(400, $result->getStatusCode());
181+
$this->assertSame('', (string) $result->getBody());
182+
$this->assertSame('application/json', $result->getHeaderLine('content-type'));
186183
}
187184
}

0 commit comments

Comments
 (0)