From 31b74b70f0c18586221415de02b4a8917dc68bb4 Mon Sep 17 00:00:00 2001
From: "Committo,Ergo:sum" <esj@rezo.net>
Date: Fri, 23 May 2008 22:21:53 +0000
Subject: [PATCH] =?UTF-8?q?Pb=20dans=20recuperer=5Fpage=20avec=20les=20red?=
 =?UTF-8?q?irections=20relatives.=20Et=20isoler=20le=20code=20lan=C3=A7ant?=
 =?UTF-8?q?=20la=20requ=C3=AAte.?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 ecrire/inc/distant.php | 100 ++++++++++++++++++++++-------------------
 1 file changed, 53 insertions(+), 47 deletions(-)

diff --git a/ecrire/inc/distant.php b/ecrire/inc/distant.php
index 0f3235671a..95e74455f7 100644
--- a/ecrire/inc/distant.php
+++ b/ecrire/inc/distant.php
@@ -180,9 +180,9 @@ function recuperer_page($url, $munge_charset=false, $get_headers=false,
 		$url = recuperer_lapage($url, $munge_charset, $get, $taille_max, $datas, $boundary, $refuser_gz, $date_verif, $uri_referer);
 		if (!$url) return false;
 		if (is_array($url)) {
-			list($headers,  $result) = $url;
+			list($headers, $result) = $url;
 			return ($get_headers ? $headers."\n" : '').$result;
-		}
+		} else spip_log("recuperer page recommence sur $url");
 	}
 }
 
@@ -210,9 +210,10 @@ function recuperer_lapage($url, $trans=false, $get='GET', $taille_max = 1048576,
 			fclose($f);
 			return false;
 		}
-		if (!is_array($headers)) {
+		if (!is_array($headers)) { // cas Location 
 			fclose($f);
-			return $headers ; // cas Location ou Modified.
+			include_spip('inc/filtres');
+			return suivre_lien($url, $headers);
 		}
 		$headers = join('', $headers);
 	}
@@ -284,25 +285,25 @@ function recuperer_entetes($f, $date_verif='')
 	}
 	$status = intval($r[1]);
 	$headers = array();
+	$not_modif = false;
 	while ($s = trim(fgets($f, 16384))) {
 		$headers[]= $s."\n";
-		if (preg_match(',^Location: (.*),i', $s, $r)) {
-			include_spip('inc/filtres');
-			$location = suivre_lien($url, $r[1]);
+		preg_match(',^([^:]*): *(.*)$,i', $s, $r);
+		list(,$d, $v) = $r;
+		if ($d == 'Location' AND $status >= 300 AND $status < 400) {
+			$location = $v;
 		}
-		if ($date_verif AND preg_match(',^Last-Modified: (.*),', $s, $r)) {
-			if(strtotime($date_verif)>=strtotime($r[1])) {
+		elseif ($date_verif AND ($d == 'Last-Modified')) {
+			if (strtotime($date_verif)>=strtotime($r[1])) {
 				//Cas ou la page distante n'a pas bouge depuis
 				//la derniere visite
-				return $status;
+				$not_modif = true;
 			}
 		}
 	}
-	if ($status >= 300 AND $status < 400 AND $location) {
-		return $location;
-	} else if ($status != 200){
-		return $status;
-	}
+
+	if ($location) return $location;
+	if ($status != 200 or $not_modif) return $status;
 	return $headers;
 }
 
@@ -511,18 +512,33 @@ function init_http($method, $url, $refuse_gz=false, $referer = '', $datas="", $v
 	$t = @parse_url($url);
 	$host = $t['host'];
 	if ($t['scheme'] == 'http') {
-		$scheme = 'http'; $scheme_fsock='';
+		$scheme = 'http'; $noproxy = '';
 	} elseif ($t['scheme'] == 'https') {
-		$scheme = 'ssl'; $scheme_fsock='ssl://';
+		$scheme = 'ssl'; $noproxy = 'ssl://';
 		if (!isset($t['port']) || !($port = $t['port'])) $t['port'] = 443;
 	} 
 	else {
-		$scheme = $t['scheme']; $scheme_fsock=$scheme.'://';
+		$scheme = $t['scheme']; $noproxy = $scheme.'://';
 	}
 	if (!isset($t['port']) || !($port = $t['port'])) $port = 80;
 	if (!isset($t['path']) || !($path = $t['path'])) $path = "/";
 	if ($t['query']) $path .= "?" .$t['query'];
 
+	$f = lance_requete($method, $scheme, $host, $path, $port, $noproxy, $refuse_gz, $referer, $datas, $vers);
+	if (!$f) {
+	  // fallback : fopen
+		if (!$GLOBALS['tester_proxy']) {
+			$f = @fopen($url, "rb");
+			spip_log("connexion vers $url par simple fopen");
+			$fopen = true;
+		} else $f = false;// echec total
+	}
+
+	return array($f, $fopen);
+}
+
+function lance_requete($method, $scheme, $host, $path, $port, $noproxy, $refuse_gz=false, $referer = '', $datas="", $vers="HTTP/1.0") {
+
 	$http_proxy = need_proxy($host);
 
 	if ($http_proxy) {
@@ -533,37 +549,27 @@ function init_http($method, $url, $refuse_gz=false, $referer = '', $datas="", $v
 		$first_host = $t2['host'];
 		if (!($port = $t2['port'])) $port = 80;
 
-	} else $first_host = $scheme_fsock.$host;
+	} else $first_host = $noproxy.$host;
+
 	$f = @fsockopen($first_host, $port);
 	spip_log("Recuperer $path sur $first_host:$port par $f");
-	if ($f) {
-		$site = $GLOBALS['meta']["adresse_site"];
-
-		$req = "$method $path $vers\r\n"
-		. "Host: $host\r\n"
-		. "User-Agent: SPIP-".$GLOBALS['spip_version_affichee']." (http://www.spip.net/)\r\n"
-		. ($refuse_gz ? '' : "Accept-Encoding: gzip\r\n")
-		. (!$site ? '' : "Referer: $site/$referer\r\n")
-		. (!$proxy_user ? '' :
-		    ("Proxy-Authorization: Basic "
-		     . base64_encode($proxy_user . ":" . $proxy_pass) . "\r\n"));
-
-#		spip_log("Requete\n$req");
-		fputs($f, $req);
-		fputs($f, $datas ? $datas : "\r\n");
-	}
-	// fallback : fopen
-	else if (!$GLOBALS['tester_proxy']) {
-		$f = @fopen($url, "rb");
-		spip_log("connexion vers $url par simple fopen");
-		$fopen = true;
-	}
-	// echec total
-	else {
-		$f = false;
-	}
-
-	return array($f, $fopen);
+	if (!$f) return false;
+
+	$site = $GLOBALS['meta']["adresse_site"];
+
+	$req = "$method $path $vers\r\n"
+	. "Host: $host\r\n"
+	. "User-Agent: SPIP-".$GLOBALS['spip_version_affichee']." (http://www.spip.net/)\r\n"
+	. ($refuse_gz ? '' : "Accept-Encoding: gzip\r\n")
+	. (!$site ? '' : "Referer: $site/$referer\r\n")
+	. (!$proxy_user ? '' :
+	    ("Proxy-Authorization: Basic "
+	     . base64_encode($proxy_user . ":" . $proxy_pass) . "\r\n"));
+
+#	spip_log("Requete\n$req");
+	fputs($f, $req);
+	fputs($f, $datas ? $datas : "\r\n");
+	return $f;
 }
 
 ?>
-- 
GitLab