POST per Header senden

Mh, ich hatte ja gedacht, dass das weiter so einfach ist mit session_start() setzen und dann ganz einfach weiter senden. Na aber wenn das nicht so einfach ist, dann werde ich mal selber weiter forschen und mir was zusammen basteln. Würde das Thema damit erst einmal schließen und falls ich eine schöne Lösung finde, dann poste ich die vielleicht auch hier. Danke an alle die mir geholfen haben.
 
Hi,

dann gehe ich mal davon aus, dass das System, wo Du Dich einloggen willst, auf einem anderen Server liegt (sonst ist es ja sowieso nicht sinnvoll, das über einen HTTP-Request machen zu wollen).
Dann muss Dir klar sein, dass die Session auf Server A (post_by_header.php) nichts mit der Session auf Server B (get_headers.php) zu tun hat.

Du müsstest das Session-Cookie, das das Script auf Server B sendet, aus dem Response-Header rauspulen, in einer Session-Variablen auf Server A speichern und bei jedem weiteren Request an Server B mitsenden.

LG
 
Hallo, ich habe mal ein wenig weitergearbeitet an meiner Funktion PostToHost()

Mein aktuelles Ergebnis sieht so aus. Problem daran: zwar erhalte ich die Headerinformationen von der anderen Seite, nur wenn ich diese dann in ein Array speichern und die Informationen analysieren will, da sind sie auf einmal wie verschwunden und ich weiß keinen Rat warum. Vielleicht könnte ihr mir noch einmal helfen. Und zweite Sache wäre die, dass ich mir nicht sicher bin, ob kuddeldaddeldu das mit der Sessionid-Übergabe so meinte, wie ich es jetzt geschrieben habe. Danke schon im Voraus.

PHP:
<?php
function PostToHost($url, $data, $sessionid = NULL) {
	
	$rdata = array();
	
	if(!function_exists('parse_url') || !function_exists('http_build_query')) {
		return FALSE;
	}
	
	$data = http_build_query($data);
	$host = parse_url($url, PHP_URL_HOST);
	$path = parse_url($url, PHP_URL_PATH);
	
	if(!$fp = @fsockopen($host, 80)) {
		echo 'Verbindungsaufbau fehlgeschlagen!';
		return FALSE;
	}
	
	fputs($fp, 'POST '.$path.' HTTP/1.1'."\r\n");
	fputs($fp, 'Host: '.$host."\r\n");
	
	if(isset($sessionid)) {
		fputs($fp, 'Set-Cookie: PHPSESSID='.$sessionid."\r\n");
	}
	
	fputs($fp, 'Referer: '.$url."\r\n");
	fputs($fp, 'Content-type: application/x-www-form-urlencoded'."\r\n");
	fputs($fp, 'Content-length: '.strlen($data)."\r\n");
	fputs($fp, 'Connection: close'."\r\n\r\n");
	fputs($fp, $data);
	
	while(!feof($fp)) {
		$result .= fgets($fp, 128);
	}
	
	$lines = explode($result, "\n");
	
	foreach($lines as $line) {
				
		// Wenn die Zeile nicht leer ist
		if(trim($line) != '') {
			
			// Wenn noch nichts über das HTTP bekannt ist und es sich bei der Zeile um HTTP-Informationen handelt
			if(!array_key_exists('HTTP', $rdata) && strstr($line, 'HTTP') !== FALSE) {
				
				$temp = explode($line, ' ');

				print_r($temp);
				$version = explode($temp[0], '/');
				$version = $version[1];
				
				$rdata['HTTP']['version'] = $version;       // HTTP-Version
				$rdata['HTTP']['status']  = (int) $temp[1]; // HTTP-Statuscode
				
				unset($version, $temp);
			}
			
			// Ansonsten: andere Header-Informationen
			else {
				$temp = explode($line, ':', 2);
								
				switch(trim(strtolower($temp[0]))) {
					// Datums- und Zeitangabe
					case 'date':
						$rdata['DATE'] = trim($temp[1]);
						break;
					
					// Server-Informationen
					case 'server':
						$rdata['SERVER'] = trim($temp[1]);
						break;
					
					case 'x-powered-by':
						$rdata['X_POWERED_BY'] = trim($temp[1]);
						break;
					
					// Cookie-Informationen
					case 'set-cookie':
						$array = explode($temp[1], ',');
						
						// Bereinigt und analysiert die Informationen
						foreach($array as $key => $value) {
							
							$temp2 = explode($value, '=', 2);
							
							if($key == 0) {
								$name    = $temp2[0];       // Namen des Cookies speichern
								$content = trim($temp2[1]); // Inhalt des Cookies
							}
							
							// Andere Daten:
							else {
								// Ablaufzeitpunkt, Pfad und Domain ermitteln
								switch(strtolower(trim($temp2[0]))) {
									// Ablaufzeitpunkt
									case 'expires':
										$expires = trim($temp2[1]);
										break;
									
									// Pfad
									case 'path':
										$path = trim($temp2[1]);
										break;
									
									// Domain
									case 'domain':
										$domain = trim($temp2[1]);
										break;
									
									// Ansonsten: ignorieren
									default: break;
								}
							}
						}
						
						$rdata['COOKIE'][] = array('NAME' => $name, 'DATA' => $content, 'EXPIRES' => $expires, 'PATH' => $path, 'DOMAIN' => $domain);
						unset($name, $content, $expires, $path, $domain, $array, $key, $value, $temp2);
						break;
					
					// Cache-Informationen
					case 'cache-control':
						$array = explode(trim($temp[1]), ',');
						
						// Bereinigt die Informationen
						foreach($array as $value) {
							// Bereinigte Information in temporäres Array speichern
							$temp2[] = trim($value);
						}
						
						$rdata['CACHE'] = $temp;
						unset($temp2, $value, $array);
						break;
					
					// Verweis auf Seite
					case 'location':
						$rdata['LOCATION'] = trim($temp[1]);
						break;
					
					// Handlungen
					case 'pragma':
						$rdata['PRAGMA'] = trim($temp[1]);
						break;
					
					// Inhaltsgröße
					case 'content-length':
						$rdata['CONTENT_LENGTH'] = trim($temp[1]);
						break;
					
					// Informationen über den Verbindungsstatus
					case 'connection':
						$rdata['CONNECTION'] = trim($temp[1]);
						break;
					
					// Typ des Inhalts
					case 'content-type':
						$rdata['CONTENT'] = trim($temp[1]);
						break;
					
					// Ablaufzeitpunkt
					case 'expires':
						$rdata['EXPIRES'] = trim($temp[1]);
						break;
					
					// Andere Informationen
					default:
						$rdata['OTHER'][] = trim($temp[1]);
						break;
				}
			}
		}
	}
	
	fclose($fp);
	
	return array('referer' => $url, 'host' => $host, 'path' => $path, 'data' => $rdata, 'resource' => $result);
}
?>

Header-Informationen von der Seite:
Code:
HTTP/1.1 302 Found
Date: Wed, 03 Jun 2009 13:42:23 GMT
Server: Apache/2.2.3 (Debian) PHP/5.2.0-8+etch11 mod_ssl/2.2.3 OpenSSL/0.9.8c
X-Powered-By: PHP/5.2.0-8+etch11
Set-Cookie: PHPSESSID=8351838ca2f7d35e342a638f7447129e; path=/; domain=dampfer.net
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
Set-Cookie: dampfer=ebx71xd17v9a3vb03zbxa2bdc22v9f9bbb1abv1z0ba2a12x; path=/; domain=.dampfer.net
Set-Cookie: du=f2b2d273f13cd281ec31; expires=Thu, 03-Jun-2010 13:42:23 GMT; path=/; domain=.dampfer.net
Location: index.php?railing
Content-Length: 0
Connection: close
Content-Type: text/html; charset=ISO-8859-1
 
Hi,

ich habe mir das nicht alles angeschaut, aber was hat ein set-cookie-Header in einem Request zu suchen? Du willst nicht auf dem Server ein Cookie setzen, Du willst ein Cookie vom Client an den Server senden, falls vorhanden.

LG
 
Aber wie versende ich den dann Session ID des anderen Servers im Header? Das muss doch auch möglich sein. Und es wäre toll, wenn du mir noch mit meinem mysteriösen Problem mit explode() helfen könntest. Danke.
 
Hi,

Aber wie versende ich den dann Session ID des anderen Servers im Header? Das muss doch auch möglich sein.

ja sicher, Dein Browser kann's ja auch. Da müsstest Du Dich aber auch erst mal ein wenig mit HTTP beschäftigen.

PHP:
fputs($fp, 'Cookie: PHPSESSID='.$sessionid."\r\n");

Und es wäre toll, wenn du mir noch mit meinem mysteriösen Problem mit explode() helfen könntest. Danke.

Dann zeig mir erstmal, wo das sein soll, damit ich mich nicht durch den ganzen Code da wurschteln und die Stelle erraten muss.
Und mach Testausgaben von dem, was Du da exploden willst und von dem, was explode geliefert hat.

LG
 
Ja, wie gesagt. Das Problem liegt auf Zeile 36. Wenn es eine nützliche Ausgabe geben würde, dann hätte ich sie schon gepostet, nur leider bekomme ich nur einen Array, wo die Schlüssel von 0 bis 13 enthalten sind, mehr aber auch nicht.
 
Hi,

füge ein var_dump($result) und ein var_dump($lines) ein und poste die Ausgabe hier.
Außerdem solltest Du erstmal Head und Body trennen und die Headerzeilen dann nach \r\n auftrennen, nicht nach \n.

Warum nutzt Du eigentlich nicht eine vorhandene HTTP-Klasse, wie z.B. die von Dennis Wronka?

LG
 
Zurück