private function createRequestFromFollow(Step $step, ValueBag $values, RequestInterface $request = null, ResponseInterface $response = null, Crawler $crawler = null)
{
if (null === $request || null === $response) {
throw new CrawlException('Unable to follow when no previous page.');
}
if ('3' !== substr($response->getStatusCode(), 0, 1) || !$response->hasHeader('Location')) {
throw new CrawlException('Unable to follow when no previous page is not a redirect.');
}
// logic from Guzzle\RedirectMiddleware
// Request modifications to apply.
$modify = [];
// Use a GET request if this is an entity enclosing request and we are
// not forcing RFC compliance, but rather emulating what all browsers
// would do.
$statusCode = $response->getStatusCode();
if ($statusCode == 303 || $statusCode <= 302 && $request->getBody()) {
$modify['method'] = 'GET';
$modify['body'] = '';
}
$modify['uri'] = Psr7\Uri::resolve($request->getUri(), $response->getHeaderLine('Location'));
Psr7\rewind_body($request);
// Add the Referer header only if we are not redirecting from https to http
if ($modify['uri']->getScheme() === $request->getUri()->getScheme()) {
$modify['set_headers']['Referer'] = (string) $request->getUri()->withUserInfo('', '');
} else {
$modify['remove_headers'][] = 'Referer';
}
// Remove Authorization header if host is different
if ($request->getUri()->getHost() !== $modify['uri']->getHost()) {
$modify['remove_headers'][] = 'Authorization';
}
return Psr7\modify_request($request, $modify);
}