Http responses – php

Il peut s’avérer intéressant de récupérer le code renvoyé dans la réponse HTTP dans un script.

Quelques codes comme exemples :

  • 200: OK
  • 302: Déplacé mais trouvé
  • 403: Accès interdit
  • 404: Page Introuvable
  • 500: Erreur serveur

Voici comment faire (je vous fourni un bout de code commenté, des explications plus complètes se trouvent en dessous de ce dernier) :

function ch_url($urlParam){
	// On récupère l'ancien level d'error reporting
	$levelBefore = error_reporting();
	//Le fopen d'une url sur un serveur qui n'existerait plus par exemple fait un très moche message d'erreur, on les déactive donc
	error_reporting(0);
	//Ouverture de la connexion
	if (!$fp = fopen($urlParam, 'r')) {
	    error_reporting($levelBefore);
	    return "404";
	}
	//On récupère les données du stream
	$meta = stream_get_meta_data($fp);
	//On prend la donnée qui nous intéressé dans l'objet et on la transforme comme on veut (voir si dessous pour l'explication)
	$return = explode(' ',$meta['wrapper_data'][0]);
	//On ferme proprement la connexion
	fclose($fp);
	//On replace le niveau d'erreur
	error_reporting($levelBefore);
	//Et on renvoie le résultat
	return $return[1];
}
/*On fait s'afficher la réponse de notre fonction pour une url étant passé par GET
 (script.php?url=http://lgnap.helpcomputer.org/ par exemple)
*/
echo ch_url($_GET['url']);


La fonction stream_get_meta_data(); nous renvoie le tableau suivant :

Array
(
    [wrapper_data] => Array
        (
            [0] => HTTP/1.1 200 OK
            [1] => Date: Sun, 14 Feb 2010 01:41:22 GMT
            [2] => Server: Apache/2.2.X (OVH)
            [3] => Accept-Ranges: bytes
            [4] => Vary: Accept-Encoding
            [5] => Content-Length: 1241
            [6] => Connection: close
            [7] => Content-Type: text/html
        )

    [wrapper_type] => http
    [stream_type] => tcp_socket/ssl
    [mode] => r
    [unread_bytes] => 1241
    [seekable] =>
    [uri] => http://www.helpcomputer.org
    [timed_out] =>
    [blocked] => 1
    [eof] =>
)

Vous remarquez en bleu la partie du code qui m’intéresse et en rouge le chemin pour aller la récupérer.

De là découle

$meta[‘wrapper_data‘][0] /*afin de récupérer la partie en bleu suivante : */
HTTP/1.1 200 OK

Un petit explode() sur l’espace (‘ ‘) donnera ceci :

Array
(
    [0] => HTTP/1.1
    [1] => 200
    [2] => OK
)

Et vous voyez là notre code 200 qui trône fièrement à l’index 1. Ensuite

return $return[1];

qui se situe à la fin l’extrait et retourne le résultat.

Voilà qui termine mon explication.
J’ajoute ci dessous une classe ne m’appartenant pas donnant une signification à la plupart sinon tous les codes de réponses http.

/** 
* StatusCodes provides named constants for 
* HTTP protocol status codes. Written for the 
* Recess Framework (http://www.recessframework.com/) 
* 
* @author Kris Jordan 
* @license MIT 
* @package recess.http 
*/  
class StatusCodes {  
	// [Informational 1xx]  
	const HTTP_CONTINUE = 100;  
	const HTTP_SWITCHING_PROTOCOLS = 101;  
	// [Successful 2xx]  
	const HTTP_OK = 200;  
	const HTTP_CREATED = 201;  
	const HTTP_ACCEPTED = 202;  
	const HTTP_NONAUTHORITATIVE_INFORMATION = 203;  
	const HTTP_NO_CONTENT = 204;  
	const HTTP_RESET_CONTENT = 205;  
	const HTTP_PARTIAL_CONTENT = 206;  
	// [Redirection 3xx]  
	const HTTP_MULTIPLE_CHOICES = 300;  
	const HTTP_MOVED_PERMANENTLY = 301;  
	const HTTP_FOUND = 302;  
	const HTTP_SEE_OTHER = 303;  
	const HTTP_NOT_MODIFIED = 304;  
	const HTTP_USE_PROXY = 305;  
	const HTTP_UNUSED= 306;  
	const HTTP_TEMPORARY_REDIRECT = 307;  
	// [Client Error 4xx]  
	const errorCodesBeginAt = 400;  
	const HTTP_BAD_REQUEST = 400;  
	const HTTP_UNAUTHORIZED  = 401;  
	const HTTP_PAYMENT_REQUIRED = 402;  
	const HTTP_FORBIDDEN = 403;  
	const HTTP_NOT_FOUND = 404;  
	const HTTP_METHOD_NOT_ALLOWED = 405;  
	const HTTP_NOT_ACCEPTABLE = 406;  
	const HTTP_PROXY_AUTHENTICATION_REQUIRED = 407;  
	const HTTP_REQUEST_TIMEOUT = 408;  
	const HTTP_CONFLICT = 409;  
	const HTTP_GONE = 410;  
	const HTTP_LENGTH_REQUIRED = 411;  
	const HTTP_PRECONDITION_FAILED = 412;  
	const HTTP_REQUEST_ENTITY_TOO_LARGE = 413;  
	const HTTP_REQUEST_URI_TOO_LONG = 414;  
	const HTTP_UNSUPPORTED_MEDIA_TYPE = 415;  
	const HTTP_REQUESTED_RANGE_NOT_SATISFIABLE = 416;  
	const HTTP_EXPECTATION_FAILED = 417;  
	// [Server Error 5xx]  
	const HTTP_INTERNAL_SERVER_ERROR = 500;  
	const HTTP_NOT_IMPLEMENTED = 501;  
	const HTTP_BAD_GATEWAY = 502;  
	const HTTP_SERVICE_UNAVAILABLE = 503;  
	const HTTP_GATEWAY_TIMEOUT = 504;  
	const HTTP_VERSION_NOT_SUPPORTED = 505;  

	private static $messages = array(  
		// [Informational 1xx]  
		100=>'100 Continue',  
		101=>'101 Switching Protocols',  
		// [Successful 2xx]  
		200=>'200 OK',  
		201=>'201 Created',  
		202=>'202 Accepted',  
		203=>'203 Non-Authoritative Information',  
		204=>'204 No Content',  
		205=>'205 Reset Content',  
		206=>'206 Partial Content',  
		// [Redirection 3xx]  
		300=>'300 Multiple Choices',  
		301=>'301 Moved Permanently',  
		302=>'302 Found',  
		303=>'303 See Other',  
		304=>'304 Not Modified',  
		305=>'305 Use Proxy',  
		306=>'306 (Unused)',  
		307=>'307 Temporary Redirect',  
		// [Client Error 4xx]  
		400=>'400 Bad Request',  
		401=>'401 Unauthorized',  
		402=>'402 Payment Required',  
		403=>'403 Forbidden',  
		404=>'404 Not Found',  
		405=>'405 Method Not Allowed',  
		406=>'406 Not Acceptable',  
		407=>'407 Proxy Authentication Required',  
		408=>'408 Request Timeout',  
		409=>'409 Conflict',  
		410=>'410 Gone',  
		411=>'411 Length Required',  
		412=>'412 Precondition Failed',  
		413=>'413 Request Entity Too Large',  
		414=>'414 Request-URI Too Long',  
		415=>'415 Unsupported Media Type',  
		416=>'416 Requested Range Not Satisfiable',  
		417=>'417 Expectation Failed',  
		// [Server Error 5xx]  
		500=>'500 Internal Server Error',  
		501=>'501 Not Implemented',  
		502=>'502 Bad Gateway',  
		503=>'503 Service Unavailable',  
		504=>'504 Gateway Timeout',  
		505=>'505 HTTP Version Not Supported'  
	);  

	public static function httpHeaderFor($code) {  
		return 'HTTP/1.1 ' . self::$messages[$code];  
	}  

	public static function getMessageForCode($code) {  
		return self::$messages[$code];  
	}  

	public static function isError($code) {  
		return is_numeric($code) && $code >= self::HTTP_BAD_REQUEST;  
	}  

	public static function canHaveBody($code) {  
		return  
		// True if not in 100s  
		($code < self::HTTP_CONTINUE || $code >= self::HTTP_OK)  
		&& // and not 204 NO CONTENT  
		$code != self::HTTP_NO_CONTENT  
		&& // and not 304 NOT MODIFIED  
		$code != self::HTTP_NOT_MODIFIED;  
	}  
}  
Posted in Web by El Gnap at February 14th, 2010.
Tags: , , , , , , , ,

Comments are closed.