POST mit Proxy über @fsockopen gibt Fehler 411 Length Required zurück

Olivenbaum

Grünschnabel
Hallo,

ich öffne eine Socket-Verbindung zu einer Website über einen Proxy. Der Aufruf sieht wie folgt aus:

Code:
	$Handle = @fsockopen($Proxy, $Port, $Error, $ErrorStr, 30);
	$Header = array();
	$Header[] = "POST http://$Host/$Path HTTP/1.1\r\n";
	$Header[] = "Host: $Host\r\n";

Da bekomm ich jedoch bei jedem beliebiegen Proxy (auch wenn ich als Proxy den Host angebe, also gar kein Proxy verwendet wird) als Fehler:

Code:
Length Required
POST requests require a Content-length header.

und

Code:
Bad Request
Your client has issued a malformed or illegal request.

Allerdings ist der Content-Length Header angegeben:

Code:
	$Header[] = "Content-length: ".strlen($Postdata)."\r\n";

Ich bin wirklich ratlos.
 
Du solltest dir mal das LiveHttpHeader-Addon für FirFox installieren und paar Anfrage angucken ...

das sieht nähmlich so aus:
Code:
POST /forum/search.php?do=process HTTP/1.1 <== nur Pfad
Host: www.tutorials.de <== nur host ohne http oder sonst was
Content-Type: application/x-www-form-urlencoded <== content-type
Content-Length: 17 <== hier die Länge
s=blub&do=process <== die POST-Daten

Wie du siehst, hast du viele Fehler ...

P.S.: das ist der wichtigste Teil von einer Anfrage ...

MfG
 
@anhadikal: Der von mir gepostete Code ist nur ein Auszug aus der Funktion, die Firefox Erweiterung nutze ich bereits ;)

Für Gumbo poste ich hier mal die ganze Funktion:

Code:
function MakePostRequest($Proxy, $Port, $Host, $Path, $Postdata)
{
	echo("Debug: host $Host path $Path\r\n");
  
	$Handle = @fsockopen($Proxy, $Port, $ErrorNo, $ErrorStr, 30);
	if ($Handle)
	{  
		echo("Debug: connected to $Proxy:$Port\r\n");

	$Header = array();
	$Header[] = "POST http://$Host/$Path HTTP/1.0\r\n";
	$Header[] = "Host: $Host\r\n";
	$Header[] = "User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; de; rv:1.8.1.12) Gecko/20080201 Firefox/2.0.0.12\r\n";
	$Header[] = "Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5\r\n";
	$Header[] = "Accept-Language: de-de,de;q=0.8,en-us;q=0.5,en;q=0.3\r\n";
	$Header[] = "Accept-Encoding: gzip,deflate\r\n";
	$Header[] = "Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7\r\n";
	$Header[] = "Connection: close\r\n";
	$Header[] = "Referer: http://$Host/$Path\r\n";
	$Header[] = "Content-Type: application/x-www-form-urlencoded\r\n";
	$Header[] = "Content-Length: ".strlen($Postdata)."\r\n";
	$Header[] = $Postdata;

	foreach($Header as $aHeader)
	{
		fputs($Handle, $aHeader."\r\n");
		echo $aHeader;
	}
	fputs($Handle, "\r\n");

	echo("Debug: request sent\r\n");
  
	echo("Debug: getting answer\r\n");
  
	$Return = "";
	while(!feof($Handle))
	{
		$Return .= fgets($Handle, 512);
  	}
  
	return $oReturn;
	}
	else
	{
		echo "Debug: error $ErroNo $ErrorStr\r\n";
		return false;
	}
}
 
Zuletzt bearbeitet:
Hallo,

ich sehe hier mehrere Fehler:
  • Mit fputs($Handle, $aHeader."\r\n"); sendest du für jede Zeile zwei Zeilenumbrüche, da du diese auch schon beim Aufbauen des Arrays $Header notiert hast.
  • Vor den POST-Daten muss eine Leerzeile geschickt werden.
  • Der zusätzliche Zeilenumbruch nach den POST-Daten ist unnötig (sollte aber auch keinen Fehler produzieren).
  • Die Rückgabe muss return $Return; lauten, nicht return $oReturn;

Grüße,
Matthias
 
Zuletzt bearbeitet:
Danke,

das mit fputs($Handle, $aHeader."\r\n"); ist echt nen blöder Fehler, der ist mir grade schon bei der Eingabe aufgefallen und siehe da, es klappt wunderbar.

$Return und $oReturn sieht in meiner Prozedur anders aus, da ich sie hier nicht exakt so wie in meinem Programm reingestellt habe.

Vielen Dank an euch!
 
Du solltest zudem vorsichtig sein, was du dem Server alles für Informationen zur Content Negotiation schickst, wenn es denn nicht dein eigener ist.
 
Zurück