/** * Schedule requests to run. * * @codeCoverageIgnore * * @return integer Number of finished requests */ public function schedule() { static $RawResponse = <<<EOT HTTP/1.1 200 OK Server: nginx Date: Thu, 10 Apr 2014 00:00:00 GMT Content-Type: text/html; charset=utf-8 Transfer-Encoding: chunked Connection: keep-alive Vary: Accept-Encoding, Cookie X-Frame-Options: SAMEORIGIN Set-Cookie: test=foo; expires=Wed, 01-Jan-2020 00:00:00 GMT Content-Encoding: gzip <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Untitled</title> </head> <body> <h1>Heading</h1> <p>Paragraph</p> </body> </html> EOT; static $RawInvalidResponse = <<<EOT HTTP/1.1 0 INVALID Server: nginx Date: Thu, 10 Apr 2014 00:00:00 GMT Content-Type: text/html; charset=utf-8 Transfer-Encoding: chunked Connection: keep-alive Vary: Accept-Encoding, Cookie X-Frame-Options: SAMEORIGIN Content-Encoding: gzip EOT; static $RawRedirectResponse = <<<EOT HTTP/1.1 307 Temporary Redirect Server: nginx Date: Thu, 10 Apr 2014 00:00:00 GMT Content-Type: text/html; charset=utf-8 Transfer-Encoding: chunked Connection: keep-alive Vary: Accept-Encoding, Cookie X-Frame-Options: SAMEORIGIN Content-Encoding: gzip Location: http://example.com EOT; // Number of requests finished $return = 0; // Loop through each request foreach ($this as $Request) { if (($Response = $this[$Request]) instanceof IResponse) { // Response not finished if (!isset($Response['Finished']) ?: !$Response['Finished']) { // Redirect? if ($this->Redirect) { $this->Redirect = false; $Response = $RawRedirectResponse; } elseif ($this->Invalid) { $this->Invalid = false; $Response = $RawInvalidResponse; } else { $Response = $RawResponse; } // Finish request $Response = Response::createFromString($Response); $Response->URI = $Request->URI; $Response->RequestURI = $Request->URI; $Response['Running'] = $this->Timeout; $Response['Finished'] = !$this->Timeout; $this[$Request] = $Response; // Upadte count $return++; } } } // Done return $return; }
/** * Does grunt work of finishing a request. * * @ignore * @param \BLW\Type\HTTP\IRequest $Request */ private function _finish(IRequest $Request) { // Validate $Request if ($this->contains($Request)) { if (($Response = $this[$Request]) instanceof IResponse) { $Handle = $Response['handle']; // Create Response // Is code known? if ($Response->isValidCode(intval(curl_getinfo($Handle, CURLINFO_HTTP_CODE)))) { // parse response $Response = Response::createFromString(curl_multi_getcontent($Handle)); // Update handle $Response['handle'] = $Handle; // RequestURI $Response->setRequestURI($Request->getURI()); // Update $this[$Request] = $Response; } // Update finished flag $Response['Running'] = false; $Response['Finished'] = true; // Update info $this->_update($Request); // Free Handle $this->_Helper->freeHandle($Handle); // Does mediator exist? if ($this->_Mediator instanceof IMediator) { // Request.Finished event $this->_do('Request.Finished', new Event($this, array('Request' => &$Request, 'Response' => &$Response))); } } } }