protected function handle($url, & $result)
    {
        $stream           = new Stream();
        $parser           = new ImageParser($stream);
        $result['rounds'] = 0;
        $result['bytes']  = 0;
        $result['size']   = 'failed';

        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_HEADER, 0);
        curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
        curl_setopt($ch, CURLOPT_BUFFERSIZE, $this->bufferSize);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, $this->sslVerifyPeer ? 1 : 0);
        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, $this->sslVerifyHost ? 2 : 0);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $this->timeout);
        curl_setopt($ch, CURLOPT_TIMEOUT, $this->timeout);

        #  Some web servers require the useragent to be not a bot. So we are liars.
        curl_setopt($ch, CURLOPT_USERAGENT, $this->userAgent);
        curl_setopt($ch, CURLOPT_HTTPHEADER, [
            "Accept: image/webp,image/*,*/*;q=0.8",
            "Cache-Control: max-age=0",
            "Connection: keep-alive",
            "Keep-Alive: 300",
            "Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7",
            "Accept-Language: en-us,en;q=0.5",
            "Pragma: ", // browsers keep this blank.
        ]);
        curl_setopt($ch, CURLOPT_ENCODING, "");


        /*
         * We parse the headers to find the content-length. This is added to the
         * result array and can be useful to determine the overall image filesize.
         */
        if ($this->includeContentLength) {

            curl_setopt($ch, CURLOPT_HEADERFUNCTION, function ($curl, $header) use (&$result) {

                $len    = strlen($header);
                $header = explode(':', $header, 2);

                if ( strtolower($header[0]) === 'content-length' ) {
                    $result['content-length'] = trim($header[1]);
                }

                return $len;
            });
        }

        curl_setopt($ch, CURLOPT_WRITEFUNCTION, function ($ch, $str) use (& $result, & $parser, & $stream, $url) {

            $result['rounds']++;
            $result['bytes'] += strlen($str);

            $stream->write($str);

            try {
                // store the type in the result array by looking at the bits
                $result['type'] = $parser->parseType();

                /*
                 * We try here to parse the buffer of characters we already have
                 * for the size.
                 */
                $result['size'] = $parser->parseSize() ?: 'failed';
            }
            catch (StreamBufferTooSmallException $e) {
                /*
                 * If this exception is thrown, we don't have enough of the stream buffered
                 * so in order to tell curl to keep streaming we need to return the number
                 * of bytes we have already handled
                 *
                 * We set the 'size' to 'failed' in the case that we've done
                 * the entire image and we couldn't figure it out. Otherwise
                 * it'll get overwritten with the next round.
                 */
                $result['size'] = 'failed';

                return strlen($str);
            }
            catch (InvalidImageException $e) {

                /*
                 * This means we've determined that we're lost and don't know
                 * how to parse this image.
                 *
                 * We set the size to invalid and move on
                 */
                $result['size'] = 'invalid';

                return -1;
            }


            /*
             * We return -1 to abort the transfer when we have enough buffered
             * to find the size
             */
            //
            // hey curl! this is an error. But really we just are stopping cause
            // we already have what we wwant
            return -1;
        });

        return $ch;
    }
protected function handle($url, & $result)
    {
        $stream           = new Stream();
        $parser           = new ImageParser($stream);
        $result['rounds'] = 0;
        $result['bytes']  = 0;
        $result['size']   = 'failed';

        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_HEADER, 0);
        curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
        curl_setopt($ch, CURLOPT_BUFFERSIZE, $this->bufferSize);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, $this->sslVerifyPeer ? 1 : 0);
        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, $this->sslVerifyHost ? 2 : 0);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $this->timeout);
        curl_setopt($ch, CURLOPT_TIMEOUT, $this->timeout);

        #  Some web servers require the useragent to be not a bot. So we are liars.
        curl_setopt($ch, CURLOPT_USERAGENT, $this->userAgent);
        curl_setopt($ch, CURLOPT_HTTPHEADER, [
            "Accept: image/webp,image/*,*/*;q=0.8",
            "Cache-Control: max-age=0",
            "Connection: keep-alive",
            "Keep-Alive: 300",
            "Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7",
            "Accept-Language: en-us,en;q=0.5",
            "Pragma: ", // browsers keep this blank.
        ]);
        curl_setopt($ch, CURLOPT_ENCODING, "");


        /*
         * We parse the headers to find the content-length. This is added to the
         * result array and can be useful to determine the overall image filesize.
         */
        if ($this->includeContentLength) {

            curl_setopt($ch, CURLOPT_HEADERFUNCTION, function ($curl, $header) use (&$result) {

                $len    = strlen($header);
                $header = explode(':', $header, 2);

                if ( strtolower($header[0]) === 'content-length' ) {
                    $result['content-length'] = trim($header[1]);
                }

                return $len;
            });
        }

        curl_setopt($ch, CURLOPT_WRITEFUNCTION, function ($ch, $str) use (& $result, & $parser, & $stream, $url) {

            $result['rounds']++;
            $result['bytes'] += strlen($str);

            $stream->write($str);

            try {
                // store the type in the result array by looking at the bits
                $result['type'] = $parser->parseType();

                /*
                 * We try here to parse the buffer of characters we already have
                 * for the size.
                 */
                $result['size'] = $parser->parseSize() ?: 'failed';
            }
            catch (StreamBufferTooSmallException $e) {
                /*
                 * If this exception is thrown, we don't have enough of the stream buffered
                 * so in order to tell curl to keep streaming we need to return the number
                 * of bytes we have already handled
                 *
                 * We set the 'size' to 'failed' in the case that we've done
                 * the entire image and we couldn't figure it out. Otherwise
                 * it'll get overwritten with the next round.
                 */
                $result['size'] = 'failed';

                return strlen($str);
            }
            catch (InvalidImageException $e) {

                /*
                 * This means we've determined that we're lost and don't know
                 * how to parse this image.
                 *
                 * We set the size to invalid and move on
                 */
                $result['size'] = 'invalid';

                return -1;
            }


            /*
             * We return -1 to abort the transfer when we have enough buffered
             * to find the size
             */
            //
            // hey curl! this is an error. But really we just are stopping cause
            // we already have what we wwant
            return -1;
        });

        return $ch;
    }
protected function handle ( $ url , & $ result ) { $ stream = new Stream ( ) ; $ parser = new ImageParser ( $ stream ) ; $ result [ 'rounds' ] = 0 ; $ result [ 'bytes' ] = 0 ; $ result [ 'size' ] = 'failed' ; $ ch = curl_init ( ) ; curl_setopt ( $ ch , CURLOPT_URL , $ url ) ; curl_setopt ( $ ch , CURLOPT_HEADER , 0 ) ; curl_setopt ( $ ch , CURLOPT_FOLLOWLOCATION , true ) ; curl_setopt ( $ ch , CURLOPT_BUFFERSIZE , $ this -> bufferSize ) ; curl_setopt ( $ ch , CURLOPT_SSL_VERIFYPEER , $ this -> sslVerifyPeer ? 1 : 0 ) ; curl_setopt ( $ ch , CURLOPT_SSL_VERIFYHOST , $ this -> sslVerifyHost ? 2 : 0 ) ; curl_setopt ( $ ch , CURLOPT_RETURNTRANSFER , true ) ; curl_setopt ( $ ch , CURLOPT_CONNECTTIMEOUT , $ this -> timeout ) ; curl_setopt ( $ ch , CURLOPT_TIMEOUT , $ this -> timeout ) ; #  Some web servers require the useragent to be not a bot. So we are liars. curl_setopt ( $ ch , CURLOPT_USERAGENT , $ this -> userAgent ) ; curl_setopt ( $ ch , CURLOPT_HTTPHEADER , [ "Accept: image/webp,image/*,*/*;q=0.8" , "Cache-Control: max-age=0" , "Connection: keep-alive" , "Keep-Alive: 300" , "Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7" , "Accept-Language: en-us,en;q=0.5" , "Pragma: " , // browsers keep this blank. ] ) ; curl_setopt ( $ ch , CURLOPT_ENCODING , "" ) ; /*
         * We parse the headers to find the content-length. This is added to the
         * result array and can be useful to determine the overall image filesize.
         */ if ( $ this -> includeContentLength ) { curl_setopt ( $ ch , CURLOPT_HEADERFUNCTION , function ( $ curl , $ header ) use ( & $ result ) { $ len = strlen ( $ header ) ; $ header = explode ( ':' , $ header , 2 ) ; if ( strtolower ( $ header [ 0 ] ) === 'content-length' ) { $ result [ 'content-length' ] = trim ( $ header [ 1 ] ) ; } return $ len ; } ) ; } curl_setopt ( $ ch , CURLOPT_WRITEFUNCTION , function ( $ ch , $ str ) use ( & $ result , & $ parser , & $ stream , $ url ) { $ result [ 'rounds' ] ++ ; $ result [ 'bytes' ] += strlen ( $ str ) ; $ stream -> write ( $ str ) ; try { // store the type in the result array by looking at the bits $ result [ 'type' ] = $ parser -> parseType ( ) ; /*
                 * We try here to parse the buffer of characters we already have
                 * for the size.
                 */ $ result [ 'size' ] = $ parser -> parseSize ( ) ? : 'failed' ; } catch ( StreamBufferTooSmallException $ e ) { /*
                 * If this exception is thrown, we don't have enough of the stream buffered
                 * so in order to tell curl to keep streaming we need to return the number
                 * of bytes we have already handled
                 *
                 * We set the 'size' to 'failed' in the case that we've done
                 * the entire image and we couldn't figure it out. Otherwise
                 * it'll get overwritten with the next round.
                 */ $ result [ 'size' ] = 'failed' ; return strlen ( $ str ) ; } catch ( InvalidImageException $ e ) { /*
                 * This means we've determined that we're lost and don't know
                 * how to parse this image.
                 *
                 * We set the size to invalid and move on
                 */ $ result [ 'size' ] = 'invalid' ; return - 1 ; } /*
             * We return -1 to abort the transfer when we have enough buffered
             * to find the size
             */ // // hey curl! this is an error. But really we just are stopping cause // we already have what we wwant return - 1 ; } ) ; return $ ch ; }
Create the handle for the curl request

@param $url
@param $result

@return resource
Create the handle for the curl request