function let(SiteConfigBuilder $siteConfigBuilder, SiteConfig $siteConfig, Factory $authenticatorFactory, ClientInterface $guzzle, Emitter $emitter, BeforeEvent $beforeEvent, CompleteEvent $completeEvent, RequestInterface $request, ResponseInterface $response, Factory $authenticatorFactory) { $siteConfig->getHost()->willReturn('example.com'); $siteConfigBuilder->buildForHost('example.com')->willReturn($siteConfig); $guzzle->getEmitter()->willReturn($emitter); $request->getHost()->willReturn('example.com'); $beforeEvent->getRequest()->willReturn($request); $beforeEvent->getClient()->willReturn($guzzle); $response->getBody()->willReturn('<html></html>'); $completeEvent->getResponse()->willReturn($response); $completeEvent->getRequest()->willReturn($request); $completeEvent->getClient()->willReturn($guzzle); $this->beConstructedWith($siteConfigBuilder, $authenticatorFactory); }
public function loginIfRequested(CompleteEvent $event) { if (($config = $this->buildSiteConfig($event->getRequest())) === false) { return; } if (!$config->requiresLogin()) { return; } $authenticator = $this->authenticatorFactory->buildFromSiteConfig($config); if ($authenticator->isLoginRequired($event->getResponse()->getBody())) { $client = $event->getClient(); $emitter = $client->getEmitter(); $emitter->detach($this); $authenticator->login($client); $emitter->attach($this); $event->retry(); } }
/** * Called when a request receives a redirect response * * @param CompleteEvent $event Event emitted * @throws TooManyRedirectsException */ public function onComplete(CompleteEvent $event) { $response = $event->getResponse(); if (substr($response->getStatusCode(), 0, 1) != '3' || !$response->hasHeader('Location')) { return; } $redirectCount = 0; $redirectRequest = $event->getRequest(); $redirectResponse = $response; $max = $redirectRequest->getConfig()->getPath('redirect/max') ?: 5; do { if (++$redirectCount > $max) { throw new TooManyRedirectsException("Will not follow more than {$redirectCount} redirects", $redirectRequest); } $redirectRequest = $this->createRedirectRequest($redirectRequest, $redirectResponse); $redirectResponse = $event->getClient()->send($redirectRequest); } while (substr($redirectResponse->getStatusCode(), 0, 1) == '3' && $redirectResponse->hasHeader('Location')); if ($redirectResponse !== $response) { $event->intercept($redirectResponse); } }
private function handle304Response(RequestInterface $request, ResponseInterface $response, ResponseInterface $validated, CompleteEvent $event) { // Make sure that this response has the same ETag if ($validated->getHeader('ETag') !== $response->getHeader('ETag')) { // Revalidation failed, so remove from cache and retry. $this->storage->delete($request); $event->intercept($event->getClient()->send($request)); return; } // Replace cached headers with any of these headers from the // origin server that might be more up to date $modified = false; foreach (self::$replaceHeaders as $name) { if ($validated->hasHeader($name) && $validated->getHeader($name) != $response->getHeader($name)) { $modified = true; $response->setHeader($name, $validated->getHeader($name)); } } // Store the updated response in cache if ($modified) { $this->storage->cache($request, $response); } }