curl_setopt($ch, CURLOPT_HEADERFUNCTION, array(&$this,'readHeader')) not working

19,291

Solution 1

It appears this works fine on

  • libcurl 7.19.7, Ubuntu 10.10, PHP 5.3.2

but not on

  • libcurl 7.18.2 on Debian Lenny, PHP 5.2.6

A working workaround on both versions is to put the header function in the global space

curl_setopt($ch, CURLOPT_HEADERFUNCTION, 'readHeader');

Solution 2

This should work:

curl_setopt($ch, CURLOPT_HEADERFUNCTION, array($this,'readHeader'));
Share:
19,291
jdog
Author by

jdog

Updated on June 04, 2022

Comments

  • jdog
    jdog almost 2 years

    I have this wrapper to load a symfony project from within Joomla

    class NZGBCComponentHelper {
        function requestAndFollow($path = '') {
            $c = 0;$first = 1;$httpcode = 0;
            $uri = JRequest::getVar('uri');
            while ($c <= 4 && ($first || $httpcode == 302)){
                $first = 0;
                $finalSfUrl = NZGBCComponentHelper::buildRequestUri($uri, $path);
    
                $ch = curl_init($finalSfUrl);
    
                if(JRequest::getMethod() == 'POST' && $httpcode != 302){
                    curl_setopt($ch, CURLOPT_POST, 1);
                    $postThrough = array_merge(JRequest::get($_POST),array('_csrf_token' => $_POST['_csrf_token']));
                    curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($postThrough));
                }
    
                // Get sf content
                curl_setopt($ch, CURLOPT_REFERER, JURI::getInstance()->root().$path);
                curl_setopt($ch, CURLOPT_HEADERFUNCTION, 'readHeader');
                curl_setopt($ch, CURLOPT_HEADER, 1);
                curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
                curl_setopt($ch, CURLOPT_COOKIE, 'symfony='.$_COOKIE['symfony']);
    
                $return = curl_exec($ch);
                $httpcode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
    
    
                if (!$return){
                    $error = curl_error($ch);
                }
    
                if($this->headers['Set-Cookie']){
                    JResponse::setHeader('Set-Cookie', $mainframe->sym_headers['Set-Cookie']);
                }
                if ($httpcode >= 400){
                    $return = "There was an <!--$finalSfUrl-->  error ";
                    mail ('[email protected]', 'symfony wrapper error',
                    $finalSfUrl."\r\n".
                    $httpcode."\r\n".
                    $return
                    );
    
                }else if ($httpcode == 302){
                    $query = parse_url(trim($mainframe->sym_headers['Location']), PHP_URL_QUERY);
                    parse_str($query);
                    parse_str($uri);
                    if ($outside == 'true'){
                        JApplication::redirect(trim(urldecode($uri)));
                    }
                }
                curl_close($ch);
                $c++;
            }
            return $return;
    
        }
        }
    
        if (!function_exists('readHeader')){
        function readHeader($ch, $header){
    
            $mainframe =& JFactory::getApplication();
            if($pos = strpos($header, ':')){
                $mainframe->sym_headers[substr($header, 0, $pos)] = substr(strstr($header, ':'), 1);
            }
    
            return strlen($header);
        }
    }
    

    requestAndFollow is statically called. How can I refer to readHeader() instead of putting it into the global function space. I tried:

    curl_setopt($ch, CURLOPT_HEADERFUNCTION, array(&$this,'readHeader'));//didn't expect this to work - no $this when statically called
    
    
    curl_setopt($ch, CURLOPT_HEADERFUNCTION, array('NZGBCComponentHelper','readHeader'));
    
    
    curl_setopt($ch, CURLOPT_HEADERFUNCTION, array(self,'readHeader'));