Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Returning header as array using Curl

Tags:

php

curl

I'm trying to get the response & the response headers from CURL using PHP, specifically for Content-Disposition: attachment; so I can return the filename passed within the header. This doesn't seem to get returned within curl_getinfo.

I've tried using the HeaderFunction to call a function to read the additional headers, however, I am unable to add the contents to an array.

Does anyone have any ideas please?


Below is part of my code which is a Curl wrapper class:

 ...  curl_setopt($this->_ch, CURLOPT_URL, $this->_url);  curl_setopt($this->_ch, CURLOPT_HEADER, false);  curl_setopt($this->_ch, CURLOPT_POST, 1);  curl_setopt($this->_ch, CURLOPT_POSTFIELDS, $this->_postData);  curl_setopt($this->_ch, CURLOPT_RETURNTRANSFER, 1);  curl_setopt($this->_ch, CURLOPT_USERAGENT, $this->_userAgent);  curl_setopt($this->_ch, CURLOPT_HEADERFUNCTION, 'readHeader');   $this->_response = curl_exec($this->_ch);  $info = curl_getinfo($this->_ch);  ...    function readHeader($ch, $header)  {       array_push($this->_headers, $header);  } 
like image 642
StuffandBlah Avatar asked May 14 '12 19:05

StuffandBlah


2 Answers

Here, this should do it:

curl_setopt($this->_ch, CURLOPT_URL, $this->_url); curl_setopt($this->_ch, CURLOPT_HEADER, 1); curl_setopt($this->_ch, CURLOPT_RETURNTRANSFER, 1);  $response = curl_exec($this->_ch); $info = curl_getinfo($this->_ch);  $headers = get_headers_from_curl_response($response);  function get_headers_from_curl_response($response) {     $headers = array();      $header_text = substr($response, 0, strpos($response, "\r\n\r\n"));      foreach (explode("\r\n", $header_text) as $i => $line)         if ($i === 0)             $headers['http_code'] = $line;         else         {             list ($key, $value) = explode(': ', $line);              $headers[$key] = $value;         }      return $headers; } 
like image 187
c.hill Avatar answered Sep 22 '22 12:09

c.hill


The anwser from c.hill is great but the code will not handle if the first response is a 301 or 302 - in that case only the first header will be added to the array returned by get_header_from_curl_response().

I've updated the function to return an array with each of the headers.

First I use this lines to create a variable with only the header content

$header_size = curl_getinfo($ch, CURLINFO_HEADER_SIZE); $header = substr($a, 0, $header_size); 

Than I pass $header in to the new get_headers_from_curl_response()-function:

static function get_headers_from_curl_response($headerContent) {      $headers = array();      // Split the string on every "double" new line.     $arrRequests = explode("\r\n\r\n", $headerContent);      // Loop of response headers. The "count() -1" is to      //avoid an empty row for the extra line break before the body of the response.     for ($index = 0; $index < count($arrRequests) -1; $index++) {          foreach (explode("\r\n", $arrRequests[$index]) as $i => $line)         {             if ($i === 0)                 $headers[$index]['http_code'] = $line;             else             {                 list ($key, $value) = explode(': ', $line);                 $headers[$index][$key] = $value;             }         }     }      return $headers; } 

This function will take header like this:

HTTP/1.1 302 Found Cache-Control: no-cache Pragma: no-cache Content-Type: text/html; charset=utf-8 Expires: -1 Location: http://www.website.com/ Server: Microsoft-IIS/7.5 X-AspNet-Version: 4.0.30319 Date: Sun, 08 Sep 2013 10:51:39 GMT Connection: close Content-Length: 16313  HTTP/1.1 200 OK Cache-Control: private Content-Type: text/html; charset=utf-8 Server: Microsoft-IIS/7.5 X-AspNet-Version: 4.0.30319 Date: Sun, 08 Sep 2013 10:51:39 GMT Connection: close Content-Length: 15519 

And return an array like this:

(     [0] => Array         (             [http_code] => HTTP/1.1 302 Found             [Cache-Control] => no-cache             [Pragma] => no-cache             [Content-Type] => text/html; charset=utf-8             [Expires] => -1             [Location] => http://www.website.com/             [Server] => Microsoft-IIS/7.5             [X-AspNet-Version] => 4.0.30319             [Date] => Sun, 08 Sep 2013 10:51:39 GMT             [Connection] => close             [Content-Length] => 16313         )      [1] => Array         (             [http_code] => HTTP/1.1 200 OK             [Cache-Control] => private             [Content-Type] => text/html; charset=utf-8             [Server] => Microsoft-IIS/7.5             [X-AspNet-Version] => 4.0.30319             [Date] => Sun, 08 Sep 2013 10:51:39 GMT             [Connection] => close             [Content-Length] => 15519         )  ) 
like image 41
Markus Knappen Johansson Avatar answered Sep 24 '22 12:09

Markus Knappen Johansson