diff --git a/ecrire/action/editer_site.php b/ecrire/action/editer_site.php
index 815e9c15522119d0a95da414dc5eb2d30ecdd1e3..b60bfa54488f1e45ad3201e50be82b5dfa5b2938 100644
--- a/ecrire/action/editer_site.php
+++ b/ecrire/action/editer_site.php
@@ -55,8 +55,8 @@ function action_editer_site_dist() {
 		}
 	}
 	// Envoi depuis le formulaire d'analyse automatique d'un site
-	else if (strlen(vider_url(_request('url_auto')))) {
-		if ($auto = analyser_site(_request('url_auto'))) {
+	else if (strlen(vider_url($u = _request('url_auto')))) {
+		if ($auto = analyser_site($u)) {
 			$id_syndic = insert_syndic(_request('id_parent'));
 			revisions_sites($id_syndic, $auto);
 			if ($auto['syndication'] == 'oui')
@@ -90,10 +90,11 @@ function action_editer_site_dist() {
 			$chercher_logo = charger_fonction('chercher_logo', 'inc');
 			if (!$logo = $chercher_logo($id_syndic, 'id_syndic', 'on')
 			OR !$t) {
-				$auto = analyser_site(_request('url_syndic'));
-				revisions_sites($id_syndic,
-					array('descriptif' => $auto['descriptif'])
-				);
+				if ($auto = vider_url(_request('url_auto'))) {
+					$auto = analyser_site($auto);
+					revisions_sites($id_syndic,
+					array('descriptif' => $auto['descriptif']));
+				}
 				if (!$logo
 				AND $auto['logo'] AND $auto['format_logo'])
 					@rename($auto['logo'],
diff --git a/ecrire/inc/distant.php b/ecrire/inc/distant.php
index 594d2bd5d932a79a6e9c70f3fcb7df8e415aa652..d663322be216c82e778ee09a9fe779c1e6465e3d 100644
--- a/ecrire/inc/distant.php
+++ b/ecrire/inc/distant.php
@@ -141,7 +141,7 @@ function prepare_donnees_post($donnees, $boundary = '') {
 // et au besoin l'encode dans le charset local
 //
 // options : get_headers si on veut recuperer les entetes
-// taille_max : arreter le contenu au-dela (0 = seulement les entetes)
+// taille_max : arreter le contenu au-dela (0 = seulement les entetes ==>HEAD)
 // Par defaut taille_max = 1Mo.
 // datas, une chaine ou un tableau pour faire un POST de donnees
 // boundary, pour forcer l'envoi par cette methode
@@ -153,7 +153,6 @@ function recuperer_page($url, $munge_charset=false, $get_headers=false,
 	$taille_max = 1048576, $datas='', $boundary='', $refuser_gz = false,
 	$date_verif = '', $uri_referer = '') {
   	$gz = false;
-
   // Accepter les URLs au format feed:// ou qui ont oublie le http://
 	$url = preg_replace(',^feed://,i', 'http://', $url);
 	if (!preg_match(',^[a-z]+://,i', $url)) $url = 'http://'.$url;
@@ -165,20 +164,35 @@ function recuperer_page($url, $munge_charset=false, $get_headers=false,
 
 	if (!empty($datas)) {
 		$get = 'POST';
-		list($content_type, $postdata) = prepare_donnees_post($datas);
+		$datas = prepare_donnees_post($datas);
 	}
 
-	for ($i=0;$i<10;$i++) {	// dix tentatives maximum en cas d'entetes 301...
-		list($f, $fopen) = init_http($get, $url, $refuser_gz, $uri_referer);
-		$gz = false;
+	// dix tentatives maximum en cas d'entetes 301...
+	for ($i=0;$i<10;$i++) {
+		$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;
+			return ($get_headers ? $headers."\n" : '').$result;
+		}
+	}
+}
+
+// args comme ci-dessus (presque)
+// retourne l'URL en cas de 301, un tableau (entete, corps) si ok, false sinon
 
-		// si on a utilise fopen() - passer a la suite
-		if ($fopen) {
+function recuperer_lapage($url, $trans=false, $get='GET', $taille_max = 1048576, $datas='', $boundary='', $refuser_gz = false, $date_verif = '', $uri_referer = '')
+{
+	list($f, $fopen) = init_http($get, $url, $refuser_gz, $uri_referer);
+	$gz = false;
+
+	// si on a utilise fopen() - passer a la suite
+	if ($fopen) {
 			spip_log('connexion via fopen');
-			break;
-		} else {
+	} else {
 			// Fin des entetes envoyees par SPIP
 			if($get == 'POST') {
+				list($content_type, $postdata) = $datas;
 				@fputs($f, $content_type);
 				@fputs($f, 'Content-Length: '.strlen($postdata)."\r\n");
 				@fputs($f, "\r\n".$postdata);
@@ -191,7 +205,7 @@ function recuperer_page($url, $munge_charset=false, $get_headers=false,
 			if (preg_match(',^HTTP/[0-9]+\.[0-9]+ ([0-9]+),', $s, $r)) {
 				$status = $r[1];
 			}
-			else return;
+			else return false;
 
 			// Entetes HTTP de la page
 			$headers = '';
@@ -200,7 +214,6 @@ function recuperer_page($url, $munge_charset=false, $get_headers=false,
 				if (preg_match(',^Location: (.*),i', $s, $r)) {
 					include_spip('inc/filtres');
 					$location = suivre_lien($url, $r[1]);
-					spip_log("Location: $location");
 				}
 				if ($date_verif AND preg_match(',^Last-Modified: (.*),', $s, $r)) {
 					if(strtotime($date_verif)>=strtotime($r[1])) {
@@ -212,23 +225,21 @@ function recuperer_page($url, $munge_charset=false, $get_headers=false,
 				if (preg_match(",^Content-Encoding: .*gzip,i", $s))
 					$gz = true;
 			}
-			if ($status >= 300 AND $status < 400 AND $location)
-				$url = $location;
-			else if ($status != 200)
+			if ($status >= 300 AND $status < 400 AND $location) {
+				fclose($f);
+				return $location;
+			} else if ($status != 200)
 				return false;
-			else
-				break; # ici on est content
-			fclose($f);
-			$f = false;
+			; # sinon on est content
 		}
-	}
-
+		
 	// Contenu de la page
 	if (!$f) {
 		spip_log("ECHEC chargement $url");
 		return false;
 	}
 
+	if ($trans === NULL) return array($headers, '');
 	$result = '';
 	while (!feof($f) AND strlen($result)<$taille_max)
 		$result .= fread($f, 16384);
@@ -239,12 +250,12 @@ function recuperer_page($url, $munge_charset=false, $get_headers=false,
 		$result = gzinflate(substr($result,10));
 
 	// Faut-il l'importer dans notre charset local ?
-	if ($munge_charset) {
+	if ($trans) {
 		include_spip('inc/charsets');
 		$result = transcoder_page ($result, $headers);
 	}
 
-	return ($get_headers ? $headers."\n" : '').$result;
+	return array($headers, $result);
 }