Esempio n. 1
0
    /**
     * 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;
    }
Esempio n. 2
0
 /**
  * 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)));
             }
         }
     }
 }