php.de

Zurück   php.de > Webentwicklung > PHP-Fortgeschrittene

PHP-Fortgeschrittene Arbeiten mit PHP ohne Einschränkungen

Antwort
 
LinkBack Themen-Optionen Thema bewerten
Alt 10.05.2004, 15:20  
Gast
 
Beiträge: n/a
Standard HTTP Post mit PHP (Stream Funktionen)

Hallo,
ich möchte mit PHP einen HTTP Post an einen entfernten Webserver senden. Hierzu habe ich folgenden Code geschrieben:

Zitat:
function PostToHost($host, $path, $referer, $data_to_send) {
$opts = array('ssl'=>array(
'local_cert'=>"",
'passphrase'=>"",
'capath'=>"c:/2/"));
$context = stream_context_create();
$result = stream_context_set_option($context, 'ssl', 'local_cert', 'c:/2/userzertifikat.pem');
$result = stream_context_set_option($context, 'ssl', 'passphrase', 'ffffffff');
$result = stream_context_set_option($context, 'ssl', 'capath', '');

$fp = fsockopen($host, 80, $errno, $errstr, 5, $context);
printf("Open!\n");
fputs($fp, "POST $path HTTP/1.1\r\n");
fputs($fp, "Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, application/msword, application/vnd.ms-excel, application/vnd.ms-powerpoint, */*\r\n");
fputs($fp, "Referer: https://test/test/\r\n");
fputs($fp, "Accept-Language: de\r\n");
fputs($fp, "Content-Type: application/x-www-form-urlencoded\r\n");
fputs($fp, "Accept-Encoding: gzip, deflate\r\n");
fputs($fp, "User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; MyIE2; .NET CLR 1.1.4322)\r\n");
fputs($fp, "Host: $host\r\n");
fputs($fp, "Cache-Control: no-cache");
fputs($fp, "Connection: close\r\n\r\n");
fputs($fp, $data_to_send);
printf("Sent!\n");
while(!feof($fp)) {
$res .= fgets($fp, 12;
}
printf("Done!\n");
fclose($fp);

return $res;
}
Schön ist schonmal, dass der Code funktioniert, d.h. an der Gegenstelle kommt was an und das Zertifikat (da SSL) wird auch korrekt angewendet. Schlecht ist hingegen, dass die Gegenstelle (Apache Webserver) mir folgenden Fehler ausgibt:

Zitat:
HTTP/1.1 400 Bad Request Date: Mon, 10 May 2004 12:52:06 GMT Server: Apache/1.3.26 (Unix) PHP/4.2.3 ApacheJServ/1.1.2 mod_perl/1.27 mod_ssl/2.8.10 OpenSSL/0.9.6g Connection: close Transfer-Encoding: chunked Content-Type: text/html; charset=iso-8859-1 X-Pad: avoid browser bug 169
Bad Request
Your browser sent a request that this server could not understand.
Client sent malformed Host header
Das war jetzt nicht unbedingt mein Ziel
Fällt jemandem vielleicht ein Fehler in meinem HTTP Header auf? Muss ich bei HTTPS vielleicht noch etwas anderes beachten?

Danke für Eure Mühe,

Exe


PS: bevor jetzt jemand auf die Idee kommt zu sagen "dann bau doch einfach eine Form und schick die per JS ab" --> ganz schlecht, weil ich auf die Rückmeldung vom Server angewiesen bin und ich wüsste jetzt nicht, wie ich eine Server Rückmeldung per JS an mein PHP Skript zur Weiterverarbeitung übergebe ...
  Mit Zitat antworten
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 10.05.2004, 16:38  
Gast
 
Beiträge: n/a
Standard

Hatte auch mal ein Problem mit der POST Übermittlung. Bei mir hats geklappt nachdem ich "\r" entfernt hatte.

Zur POST Übermittlung nutze ich meistens diese Klasse:
Zitat:
class HTTPPost {

var $url;
var $uri;
var $dataArray = array();

function HTTPPost($url = '', $dataArray = '') {
$this->setURL($url);
$this->setDataArray($dataArray);
}

function setUrl($url) {
if($url != '') {
$url = preg_replace("|^http://|", "", $url);
$this->url = substr($url, 0, strpos($url, "/"));
$this->uri = strstr($url, "/");
return TRUE;
} else {
return FALSE;
}
}

function setDataArray($dataArray) {
if(is_array($dataArray)) {
$this->dataArray = $dataArray;
return TRUE;
} else {
return FALSE;
}
}

function post($includeHeaders = false)
{
foreach($this->dataArray as $key => $val)
{
$dataArray[] = $key."=".urlencode($val);
}
$body = implode('&', $dataArray);
$contentLength = strlen($body);
$request = "POST $this->uri HTTP/1.1\r\n".
"Host: $this->url\r\n".
"User-Agent: HTTPPost\r\n".
"Content-Type: application/x-www-form-urlencoded\r\n".
"Content-Length: $contentLength\r\n\r\n".
"$body\r\n";
$socket = fsockopen($this->url, 80, &$errno, &$errstr);
if(!$socket) {
$result["errno"] = $errno;
$result["errstr"] = $errstr;
return $result;
}
fputs($socket, $request);
$inHeader = !$includeHeaders;
while (!feof($socket))
{
$line = fgets($socket, 1024);
if(!$inHeader)
{
$result[] = $line;
} else {
$inHeader = (trim($line) != '');
}
}
return $result;
}

// Änderung: "\r" raus!!
function post2($includeHeaders = false)
{
foreach($this->dataArray as $key => $val)
{
$dataArray[] = $key."=".urlencode($val);
}
$body = implode('&', $dataArray);
$contentLength = strlen($body);
$request = "POST $this->uri HTTP/1.1\n".
"Host: $this->url\n".
"User-Agent: HTTPPost\n".
"Content-Type: application/x-www-form-urlencoded\n".
"Content-Length: $contentLength\n".
"Connection: close\n\n".
"$body\n";
$socket = fsockopen($this->url, 80, &$errno, &$errstr);
if(!$socket) {
$result["errno"] = $errno;
$result["errstr"] = $errstr;
return $result;
}
fputs($socket, $request);
$inHeader = !$includeHeaders;
while (!feof($socket))
{
$line = fgets($socket, 1024);
if(!$inHeader)
{
$result[] = $line;
} else {
$inHeader = (trim($line) != '');
}
}
return $result;
}



} // end class


// Beispielanwendung
//$arr['name'] = 'Daniel';
//$arr['address'] = 'New York';
//$arr['email'] = 'daniel@websapp.com';
//$post = new HTTPPost('data/checkpost.php', $arr);
//$result = $post->post();
//foreach($result as $line) {
// echo "$line
";
//}
Gruß KiBa
  Mit Zitat antworten
Alt 10.05.2004, 16:42  
Gast
 
Beiträge: n/a
Standard

Dankeschön,
ich werde die Sache morgen gleich mal testen. Wenns wirklich an den \r liegt, dann

Allerdings tippe ich immer noch darauf, dass ich bei HTTPS einen anderen Header senden muss... Aus der entsprechenden RFC werde ich aber nicht so richtig schlau.

Wirklich schön ist, dass ich den Traffic noch nicht mal sniffen kann ...
  Mit Zitat antworten
Alt 11.05.2004, 09:26  
Gast
 
Beiträge: n/a
Standard

Es wäre wohl sinnvoll, beim HTTP Host Parameter nicht den Wert zu verwenden, der auch bei fsockopen() zum Einsatz kommt!!
fsockopen() braucht ja ein vorangestelltes ssl:// damit es weiss, dass es sich um SSL handelt. Im Host Parameter im HTTP Header ist die Zeichenkette ssl:// natürlich vollkommen unangebracht.

Absoluter Leichtsinnsfehler, Asche auf mein Haupt
  Mit Zitat antworten
Alt 03.06.2004, 18:00  
Gast
 
Beiträge: n/a
Standard

Hi

Ich habe ein änliches Script und möchte auch einen SSL Server kontaktieren. Wenn ich das ganze mit fsockopen(..); mache, geht das Script in eine Endlosschleife, das heisst es wartet bis der Timeout abgeloffen ist. Ich habe es auch mit der neuen PHP5 Funktion stream_socket_client(..); versucht. Da habe ich genau das gleiche Problem. An meinem Lan Proxy kann es nicht liegen, denn den habe ich zu testzwecken auch mal ausgeschaltet. Nun meine Frage:

Kann es sein, dass die Gegenseite keine socket Verbindungen erlaubt? Kann man diese Verbindungen überhaupt blocken? (Es ist eine Website einer grösseren Firma...)

Danke, fluppel
  Mit Zitat antworten
Alt 03.06.2004, 18:08  
Gast
 
Beiträge: n/a
Standard

ouu mann, bin ich blöd! SSL läuft ja standardmässig über Port 443 und nicht über 80!!!!!

anyway, cooles forum
  Mit Zitat antworten
Alt 03.06.2004, 20:14  
Erfahrener Benutzer
 
Registriert seit: 21.05.2008
Beiträge: 1.531
Quadaptor befindet sich auf einem aufstrebenden Ast
Standard

Nur ein kleiner Tipp: Für dich mag vielleicht die PEAR-Klasse "HTTP_Request" (http://pear.php.net/package/HTTP_Request) recht interessant sein.
Quadaptor ist offline   Mit Zitat antworten
Alt 03.06.2004, 22:12  
Gast
 
Beiträge: n/a
Standard

Das tönt sehr interessant, muss es jedoch noch ausprobieren.

Ich hab jedenfalls noch ein Regex Problem: Wie kann ich den folgenden http Header auseinandernehmen, sodass ich nur den Cookie Wert selbst habe?
Code:
POST /seite.asp HTTP/1.1
Accept: */*
Referer: http://localhost/seite.html
Accept-Language: de-ch
Content-Type: application/x-www-form-urlencoded
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)
Host: www.domain.com
Content-Length: 185
Connection: Keep-Alive
Cache-Control: no-cache
Cookie: JSESSIONID=dd38pohdt4; IsiWeb23mobile=1ARKxUC/bANZjgA6qaCb/7jBTqMb+yb91/w5bhCgp3mbWKgIS0YT+QESpY5LBj3XLkHibSps63ypbGUhh4Dr+sA0dw54m+ZUJccTp0tq9U8Mdt16ViVQ+97l990iZn6FtyerY4slEW4lC70UmpEn2cJm+VOfw9LVzgobQ+8vU8/SKc4xixxgY6PLpCKcNV5T5mv3098kvgvxf/Qnc4KNdKUjRx2IcnTE19BdmA==; ARPT=ONZZKJS10.148.24.43CKUIJ; ASPSESSIONIDAQBQADSQ=HACAKHIDALGECDCHFICMFAOH; ASPSESSIONIDASBCDRQB=GPKCJMHDDMPPIJILJDOFMEGH; MenuIds=; MenuSelectID=1_64; LastSelectedID=1_64
(mit Cookie Wert meine ich dd38pohdt4)
Ich habs mit folgender Regex versucht:
Code:
^JSESSIONID=([a-z]|[A-Z]|[0-9]){10};^
Aber diese liefert mir nicht das gewünschte. Als Funktion ist sehrwarhscheindlich preg_split am geeignetsten?
  Mit Zitat antworten
Alt 03.06.2004, 22:19  
Gast
 
Beiträge: n/a
Standard

Zitat:
Zitat von fluppel
Ich habs mit folgender Regex versucht:
Code:
^JSESSIONID=([a-z]|[A-Z]|[0-9]){10};^
Ich glaube, damit suchst du eine Zeichenkette, die 10 Zeichen a-z, 10 Zeichen A-Z oder 10 Zeichen 0-9 hat. Du willst aber eine Zeichenkette suchen, die 10 Zeichen a-z,A-Z oder 0-9 hat. Also (ungetestet):
Code:
]^JSESSIONID=([a-zA-Z0-9]){10};^
KMAssS
  Mit Zitat antworten
Alt 03.06.2004, 22:34  
Gast
 
Beiträge: n/a
Standard

Mit der Funktion
Code:
preg_match('^([a-zA-Z0-9]){10};^',$string,$matches);
kommt genau das raus:
Code:
Array ( [0] => dd38pohdt4; [1] => 4 )
Keine Ahnung von wo die vier kommt und ich weiss auch nicht wie ich das ";" wegbringe, denn ohne diesen Charakter sucht die Funktion einfach nach einem 10 Zeichenmuster, da könnte auch mal ein anderer String rauskommen. Diese Regular Expressions bleiben mir ein Rätsel...
  Mit Zitat antworten
Antwort


Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an
Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Templatesystem mit Funktionen und Variablen drin? BartTheDevil89 PHP Tipps 2008 6 01.07.2008 09:32
[Erledigt] PHP -> Ordner anlegen der sich auch beschreiben lässt?! Nightuser PHP Tipps 2008 13 30.06.2008 23:51
Klassen und externe Funktionen ? ssm PHP-Fortgeschrittene 17 18.07.2007 11:59
POST manipulieren notyyy PHP Tipps 2006 5 24.09.2006 20:31
Funktionen überprüfen und Grafik Funktionen hans.karl2 PHP Tipps 2006 10 31.07.2006 20:08
Post Formular automatisch weiterleiten mansaylon PHP Tipps 2006 7 31.03.2006 10:46
[Erledigt] HTTP POST Senden und Antwort Abfangen PHP Tipps 2005-2 7 10.09.2005 16:05
http Stream in Variable leiten um in Datenbank zu schreiben PHP Tipps 2005-2 0 23.08.2005 21:52
HTTP Stream PHP-Fortgeschrittene 15 14.07.2005 13:10
POST socke PHP Tipps 2005 5 25.04.2005 12:52
ShowIt_V1.8.14 PHP Tipps 2005 1 23.03.2005 19:13
HTTP POST Anfrage senden DerDesian PHP Tipps 2005 6 03.03.2005 16:43
frage zum arbeiten mit dateien PHP Tipps 2005 21 01.03.2005 13:22
Linux Drucker unter Windows tennessee Server, Hosting und Workstations 10 16.12.2004 17:14
ankommender http header in einem php script auslesen PHP Tipps 2004 0 19.07.2004 23:37

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
php stream, php post stream, php http stream, stream php, http post stream, php stream post, php stream senden, html post funktion, php stream funktionen, php http streaming, http stream php, http://www.php.de/php-fortgeschrittene/2257-http-post-mit-php-stream-funktionen.html, php streams, php stream http, stream.php, client sent malformed host header, php http post, phpstream, funktion von http, php datenstrom formular post

Alle Zeitangaben in WEZ +2. Es ist jetzt 20:34 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum

Creative Commons License
Dieser Inhalt ist unter einer Creative Commons-Lizenz lizenziert.