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'));
Author by
jdog
Updated on June 04, 2022Comments
-
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'));