Comment lire les entêtes HTTP avec CURL et PHP ?

Un cas un petit peu particulier puisque ici, contrairement à la vérification du code de retour HTTP, les headers sont à récupérer de manière identique à la récupération du contenu d'une requête CURL.

On indique donc à CURL que l'on ne veut pas le contenu de la page requêtée (CURLOPT_NOBODY), mais uniquement les headers à la place du contenu (CURLOPT_HEADER).

<?php

$url = 'http://www.oseox.fr';
$timeout = 10;

$ch = curl_init($url);

curl_setopt($ch, CURLOPT_FRESH_CONNECT, true);
curl_setopt($ch, CURLOPT_TIMEOUT, $timeout);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout);

if (preg_match('`^https://`i', $url))
{
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
}

curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_NOBODY, true);

// Inclure les headers HTTP de retour dans le corps de la réponse
curl_setopt($ch, CURLOPT_HEADER, true);

$headers = curl_exec($ch);
curl_close($ch);

echo $headers;
?>

Ce premier script nous renvoie quelque chose comme :

HTTP/1.1 301 Moved Permanently
Date: Thu, 20 Jan 2011 10:05:29 GMT
Server: Apache/1.3.34 (Debian) PHP/5.2.0-8+etch15
Location: http://oseox.fr/
Content-Type: text/html; charset=iso-8859-1

HTTP/1.1 200 OK
Date: Thu, 20 Jan 2011 10:05:29 GMT
Server: Apache/1.3.34 (Debian) PHP/5.2.0-8+etch15
Vary: Host
X-Powered-By: PHP/5.2.0-8+etch15
Content-Type: text/html; charset=iso-8859-1

Voilà une petite fonction qui permet de parser la chaîne retournée afin d'en extraire les headers dans un tableau de façon à pouvoir les exploiter plus aisément.

<?php
/*
//...

$headers = curl_exec($ch);

curl_close($ch);

$headers = my_curl_parse_headers($headers);
*/
function my_curl_parse_headers($pHeaders)
{
$r = array();
if ($pHeaders)
{
 $lines = explode("\r\n", $pHeaders);
 $header_idx = 0;
 foreach ($lines as $line)
{
  if (preg_match('`^(?:(HTTP/[^\s]+)|([^:\s]+):) (.*)$`i', $line, $matches))
  $r[$header_idx][] = array(
   'k' => $matches[1] ? $matches[1] : $matches[2],
   'v' => $matches[3]
  );
 else
 $header_idx++;
}
}
return $r;
}
?>

Une question ? Venez la poser sur notre forum développement web !

A propos de l'auteur

Antoine Beaumont

Antoine Beaumont est Consultant Web et Développeur. Fort d'une expérience construite au sein de grandes agences Web-marketing, pour tous types de comptes, il accompagne désormais les professionnels dans leurs projets Web, de façon souple et objective.

Newsletter Marketing