[PHP] Envoyer et recevoir des requêtes HTTP

Résolu/Fermé
KunGu Messages postés 1169 Date d'inscription vendredi 7 septembre 2007 Statut Membre Dernière intervention 17 mars 2013 - 18 mai 2011 à 12:42
KunGu Messages postés 1169 Date d'inscription vendredi 7 septembre 2007 Statut Membre Dernière intervention 17 mars 2013 - 18 mai 2011 à 21:18
Bonjour à tous,

J'ai besoin pour mon projet d'envoyer une en tête d'une requête GET à un serveur web, et j'ai besoin d'avoir sa réponse, ainsi que la page web qu'il est censé renvoyer.

Je m'explique :

J'envoie une requête du type :
GET / HTTP/1.1
Host: www.exemple.com
Connection: keep-alive
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/534.24 (KHTML, like Gecko) Chrome/11.0.696.65 Safari/534.24
Accept: application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
Accept-Encoding: gzip,deflate,sdch
Accept-Language: fr-FR,fr;q=0.8,en-US;q=0.6,en;q=0.4
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3

en PHP ça me donne ça :
<?php
	$fp = fsockopen("www.exemple", 80, $errno, $errstr, 30);
	if (!$fp) 
	{
		echo "$errstr ($errno)<br />\n";
	} 
		else 
		{
			$out = "GET / HTTP/1.1\r\n";
			$out .= "Host: www.exemple.com\r\n";
			$out .= "Connection: keep-alive\r\n";
			$out .= "User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/534.24 (KHTML, like Gecko) Chrome/11.0.696.65 Safari/534.24\r\n";
			$out .= "Accept: application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5\r\n";
			$out .= "Accept-Encoding: gzip,deflate,sdch\r\n";
			$out .= "Accept-Language: fr-FR,fr;q=0.8,en-US;q=0.6,en;q=0.4\r\n";
			$out .= "Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3\r\n";
	
	
			fwrite($fp, $out);
			while (!feof($fp)) 
				{
				echo fgets($fp);
				}


			
			fclose($fp);
		}
?>



Seulement je récupère via fgets l'en tête de ce que m'envoie le serveur mais après une partie incompréhensible de données. Mon but étant de récupérer la page web qu'est censée afficher un navigateur, je ne sais pas si "cette partie incompréhensible de données" est cette page web "cryptée" ou si je n'ai simplement pas récupéré cette page web avec ce code.

Pouvez-vous m'éclairer ?
Merci !


4 réponses

Profil bloqué
18 mai 2011 à 14:26
Bonjour,

d'après la description, je pencherais plutôt vers la compression que le cryptage. Pour en être sur, il suffit de supprimer la ligne
$out .= "Accept-Encoding: gzip,deflate,sdch\r\n";

En clair, on demande au serveur de nous envoyer le texte compressé avec gzip. Sans cette ligne dans la commande GET, le code HTML est envoyé 'en clair'.
0
KunGu Messages postés 1169 Date d'inscription vendredi 7 septembre 2007 Statut Membre Dernière intervention 17 mars 2013 224
18 mai 2011 à 17:38
Merci pour la réponse,
En effet en supprimant cette ligne j'arrive a avoir du code HTML en clair :)
Mais je n'ai pas tout, je vois sur ma page s'afficher seulement une partie de la page web que je veux récupérer ...

J'ai essayé de modifier un peu mon code au niveau du while pour qu'a lieu de m'afficher la page qu'il l'écrive dans un fichiers, seulement là je tombe sur un truc encore pire, un code tronqué complètement avec des balises à moitié fermées...
Voici mon code modifié :
<?php
	$fp = fsockopen("www.exemple", 80, $errno, $errstr, 30);
	if (!$fp) 
	{
		echo "$errstr ($errno)<br />\n";
	} 
		else 
		{
			$out = "GET / HTTP/1.1\r\n";
			$out .= "Host: www.exemple.com\r\n";
			$out .= "Connection: keep-alive\r\n";
			$out .= "User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/534.24 (KHTML, like Gecko) Chrome/11.0.696.65 Safari/534.24\r\n";
			$out .= "Accept: application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5\r\n";
			$out .= "Accept-Language: fr-FR,fr;q=0.8,en-US;q=0.6,en;q=0.4\r\n";
			$out .= "Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3\r\n";
	
	
			fwrite($fp, $out);
			while (!feof($fp)) 
				{
				$data = fgets($fp);
				$ft = fopen ("test.txt", "r+");
				fputs ($ft, $data);
				fclose ($ft);
				}


			
			fclose($fp);
		}
?>


Pourrais-je avoir la page web complète ?
0
Profil bloqué
18 mai 2011 à 20:21
Passe plutot par la mémoire et un tampon, c'est plus rapide et plus sur
$buf="";
while (!feof($fp)) {
$buf.= fgets($fp, 128);
}

puis

$ft = fopen ("test.txt", "r+");
fputs ($ft, $buf);
fclose ($ft);
0
KunGu Messages postés 1169 Date d'inscription vendredi 7 septembre 2007 Statut Membre Dernière intervention 17 mars 2013 224
18 mai 2011 à 21:18
Mon dieu merci beaucoup j'aurais jamais pensé à ça et CA MARCHE !

Merci !!
0