private function assignParsedResponse(RequestCycle $cycle, array $parsedResponseArr)
{
$this->collectRequestCycleWatchers($cycle);
if (($body = $parsedResponseArr['body']) && $cycle->options[self::OP_BUFFER_BODY]) {
$body = stream_get_contents($body);
}
/**
* @var $response \Amp\Artax\Response
*/
$cycle->response = $response = (new Response())->setStatus($parsedResponseArr['status'])->setReason($parsedResponseArr['reason'])->setProtocol($parsedResponseArr['protocol'])->setBody($body)->setAllHeaders($parsedResponseArr['headers']);
if ($this->canDecompressResponseBody($response)) {
$this->inflateGzipBody($response);
}
if ($response->hasHeader('Set-Cookie')) {
$requestDomain = parse_url($cycle->request->getUri(), PHP_URL_HOST);
$cookies = $response->getHeader('Set-Cookie');
foreach ($cookies as $rawCookieStr) {
$this->storeResponseCookie($requestDomain, $rawCookieStr);
}
}
$response->setRequest(clone $cycle->request);
if ($newUri = $this->getRedirectUri($cycle)) {
return $this->redirect($cycle, $newUri);
}
if ($cycle->previousResponse) {
$response->setPreviousResponse($cycle->previousResponse);
}
$socket = $cycle->socket;
$cycle->futureResponse->update([Notify::RESPONSE, $cycle->response, "export_socket" => function () use(&$socket, $parsedResponseArr) {
if ($socket) {
$sock = $socket;
$socket = null;
$this->socketPool->clear($sock);
return [$sock, $parsedResponseArr['buffer']];
}
throw new \LogicException("Cannot export socket after notification callback invocation");
}]);
// Do socket check-in *after* redirects because we handle the socket
// differently if we need to redirect.
if ($socket) {
if ($this->shouldCloseSocketAfterResponse($cycle->request, $cycle->response)) {
@fclose($socket);
$this->socketPool->clear($socket);
} else {
$this->socketPool->checkin($socket);
}
$socket = null;
}
// If we've held any sockets over from previous redirected requests
// we need to check those back in now.
if ($cycle->redirectedSockets) {
foreach ($cycle->redirectedSockets as $socket) {
$this->socketPool->checkin($socket);
}
}
$cycle->futureResponse->succeed($response);
}