HTTP: wie muss ein GET über fsockopen aussehen?
Tom
- php
0 Moses0 Tom0 Alexander Brock0 Moses
Hello,
wie man einen Post vom Server auf einen anderen absetzt, finde ich überall. Aber was muss und darf alles bei einem Get drinstehen?
Harzliche Grüße vom Berg
esst mehr http://www.harte-harzer.de
Tom
Hallo!
wie man einen Post vom Server auf einen anderen absetzt, finde ich überall. Aber was muss und darf alles bei einem Get drinstehen?
Komisch, das ausgerechnet ein Stammgast dieses Forums sich nicht die Mühe macht, in der passenden Dokumentation nachzuschauen.
Gruß vom Moses
PS: GET mit URL ohne Domain und die Domain als Host, mehr nicht.
Hello,
Komisch, das ausgerechnet ein Stammgast dieses Forums sich nicht die Mühe macht, in der passenden Dokumentation nachzuschauen.
Netter Witz!
Als erstes habe ich unter http://de3.php.net/manual/de/function.fsockopen.php
die durchaus vielfältigen UCN angeschaut. Die bringen meistens mehr, als eine kryptische RCF.
Aber leider komme ich nicht zum Erfolg mit dem gewünschten Request. Es scheinen weitere mir bisher unerklärliche Effekte zuständig zu sein.
Harzliche Grüße vom Berg
esst mehr http://www.harte-harzer.de
Tom
Hallo Freunde des gehobenen Forumsgenusses,
Als erstes habe ich unter http://de3.php.net/manual/de/function.fsockopen.php
die durchaus vielfältigen UCN angeschaut. Die bringen meistens mehr, als eine kryptische RCF.
Also mir hat die HTTP-RFC mit meinem Problem, den Mime-Type einer URL herauszubekommen, sehr geholfen.
Aber leider komme ich nicht zum Erfolg mit dem gewünschten Request.
1. Zeige deinen Code
2. Installiere ein Netzwerk-Protokol-System, logge die Zugriffe durch PHP und Zugriffe über den Browser und vergleiche.
BTW: PostToHost aus der PHP-FAQ kennst du ja vermutlich. Das muss man nur ein bischen anpassen:
function PostToHost($host, $path, $referer, $data_to_send) {
$fp = fsockopen($host,80);
if ($fp === false) return false;
fputs($fp, "GET $path?$data_to_send HTTP/1.0\r\n");
fputs($fp, "Host: $host\r\n");
fputs($fp, "Referer: $referer\r\n");
fputs($fp, "Content-type: application/x-www-form-urlencoded\r\n");
fputs($fp, "Content-length: ".strlen($data_to_send)."\r\n");
fputs($fp, "Connection: close\r\n\r\n");
#fputs($fp, "$data_to_send\n");
while(!feof($fp)) {
$res .= fgets($fp, 128);
}
fclose($fp);
return $res;
}
(ungetestet)
Gruß
Alexander Brock
Hello,
function PostToHost($host, $path, $referer, $data_to_send) {
$fp = fsockopen($host,80);
if ($fp === false) return false;
fputs($fp, "GET $path?$data_to_send HTTP/1.0\r\n");
fputs($fp, "Host: $host\r\n");
fputs($fp, "Referer: $referer\r\n");
fputs($fp, "Content-type: application/x-www-form-urlencoded\r\n");
? fputs($fp, "Content-length: ".strlen($data_to_send)."\r\n");
fputs($fp, "Connection: close\r\n\r\n");
while(!feof($fp))
{
$res .= fgets($fp, 128);
}
fclose($fp);return $res;
}
Und das ganze dann in eine rekursive Funktion packen.
Es könnte sich ja eine Umleitung melden o. ä.
Welcher Parameter hat wo die Slashes?
$host
$path
$referer --> vollständige URi oder nur URL?
$data_to_send --> urlencoded ?
Was ist mit dem charset?
Ach, Fragen über Fragen...
Harzliche Grüße vom Berg
esst mehr http://www.harte-harzer.de
Tom
Hallo Freunde des gehobenen Forumsgenusses,
> > function PostToHost($host, $path, $referer, $data_to_send) {
> > $fp = fsockopen($host,80);
> > if ($fp === false) return false;
> > fputs($fp, "GET $path?$data_to_send HTTP/1.0\r\n");
> > fputs($fp, "Host: $host\r\n");
> > fputs($fp, "Referer: $referer\r\n");
> > fputs($fp, "Content-type: application/x-www-form-urlencoded\r\n");
> ? fputs($fp, "Content-length: ".strlen($data_to_send)."\r\n");
Ich weis nicht recht. Die gesendeten Daten sind doch Teil der URL, die stehen nicht im
Body des Requests (der Request hat keinen). Also kann der Request keine Body-Länge haben.
Und das ganze dann in eine rekursive Funktion packen.
Es könnte sich ja eine Umleitung melden o. ä.
Um die Umleitung zu erkennen macht man zuerst einen HEAD-Request.
Lies!
8.1 GET
The GET method means retrieve whatever information (in the form of an
entity) is identified by the Request-URI. If the Request-URI refers
to a data-producing process, it is the produced data which shall be
returned as the entity in the response and not the source text of the
process, unless that text happens to be the output of the process.
The semantics of the GET method changes to a "conditional GET" if the
request message includes an If-Modified-Since header field. A
conditional GET method requests that the identified resource be
transferred only if it has been modified since the date given by the
If-Modified-Since header, as described in Section 10.9. The
conditional GET method is intended to reduce network usage by
allowing cached entities to be refreshed without requiring multiple
requests or transferring unnecessary data.
8.2 HEAD
The HEAD method is identical to GET except that the server must not
return any Entity-Body in the response. The metainformation contained
in the HTTP headers in response to a HEAD request should be identical
to the information sent in response to a GET request. This method can
be used for obtaining metainformation about the resource identified
by the Request-URI without transferring the Entity-Body itself. This
method is often used for testing hypertext links for validity,
accessibility, and recent modification.
There is no "conditional HEAD" request analogous to the conditional
GET. If an If-Modified-Since header field is included with a HEAD
request, it should be ignored.
Welcher Parameter hat wo die Slashes?
$host
Hat keine Slashes
$path
Hat Slashes
$referer --> vollständige URi oder nur URL?
10.13 Referer
The Referer request-header field allows the client to specify, for
the server's benefit, the address (URI) of the resource from which
the Request-URI was obtained. This allows a server to generate lists
of back-links to resources for interest, logging, optimized caching,
etc. It also allows obsolete or mistyped links to be traced for
maintenance. The Referer field must not be sent if the Request-URI
was obtained from a source that does not have its own URI, such as
input from the user keyboard.
Referer = "Referer" ":" ( absoluteURI | relativeURI )
Example:
Referer: http://www.w3.org/hypertext/DataSources/Overview.html
If a partial URI is given, it should be interpreted relative to the
Request-URI. The URI must not include a fragment.
Note: Because the source of a link may be private information or
may reveal an otherwise private information source, it is strongly
recommended that the user be able to select whether or not the
Referer field is sent. For example, a browser client could have a
toggle switch for browsing openly/anonymously, which would
respectively enable/disable the sending of Referer and From
information.
$data_to_send --> urlencoded ?
Die Werte schon. Es empfiehlt sich, als $data_to_send ein assozoiatives Array zu übergeben:
$data_result = '';
foreach ($data as $key=>$value) {
$data_result .= $key.'='.urlencode($value).'&';
}
$data_result = substr($data_result, 0, -1);
Was ist mit dem charset?
Das ist doch normalerweise ein HTML-Formular, oder?
Da steht drin, welchen charset man senden soll.
Wenn nicht sendet man den, den die angeforderte Resource hat.
Den bekommt man über den HEAD-Request.
Tom
Hat offensichtlich Brett vorm Kopf *SCNR* (nicht bös gemeint).
Gruß
Alexander Brock
Hello,
$data_to_send --> urlencoded ?
Die Werte schon. Es empfiehlt sich, als $data_to_send ein assozoiatives Array zu übergeben:
Die Keys müssen auch codiert werden.
Nur was ist mit den Sonderzeichen = und & (;) ?
Muss man die hier als Entity codieren, wie im HTML-Quellcode?
$data_result = '';
foreach ($data as $key=>$value) {
$data_result .= urlencode($key).'='.urlencode($value).'&';
}
$data_result = substr($data_result, 0, -1);
Was ist mit dem charset?
Das ist doch normalerweise ein HTML-Formular, oder?
Da steht drin, welchen charset man senden soll.
Alos uss man beim GET auch einen Accept-Header setzen, oder?
Hat offensichtlich Brett vorm Kopf *SCNR* (nicht bös gemeint).
Aber ein ganz dickes! Seit Montagmittag habe ich derartig dicke und rote Augen und eine heiße Birne, als hätte in der Sauna Grog getrunken...
Und keiner weiß, warum. :-(
Na, jedenfalls sammeln sich in diesem Thread nun bald alle Gebrauchsanweisungen für solides Grabbing *gg*
Harzliche Grüße vom Berg
esst mehr http://www.harte-harzer.de
Tom
Hallo Freunde des gehobenen Forumsgenusses,
Nur was ist mit den Sonderzeichen = und & (;) ?
Das macht urlencode auch.
Muss man die hier als Entity codieren, wie im HTML-Quellcode?
Nein.
Das ist doch normalerweise ein HTML-Formular, oder?
Da steht drin, welchen charset man senden soll.Alos uss man beim GET auch einen Accept-Header setzen, oder?
Du wolltest doch wissen, mit welchem Charset man die Daten senden soll, oder?
Den Accept-Header würde ich aus einem aktuellen Firefox / Mozilla kopieren
und mich auf alle möglichen Zeichensätze als Antwort einstellen.
Na, jedenfalls sammeln sich in diesem Thread nun bald alle Gebrauchsanweisungen für solides Grabbing *gg*
Ich bastel mit im Moment eine Klasse um das Problem außenrum,
die lad ich mal kurz hoch... argh! Sobald ich sie wieder zum laufen gebracht habe.
Gruß
Alexander Brock
Moin!
Ich bastel mit im Moment eine Klasse um das Problem außenrum,
die lad ich mal kurz hoch... argh! Sobald ich sie wieder zum laufen gebracht habe.
Wohin hochgeladen? Hierhin? http://pear.php.net/package/HTTP_Request
Die Feature-Liste sieht besser aus, als alles, was man "mal eben schnell" hinskripten könnte: "Supports GET/POST/HEAD/TRACE/PUT/DELETE, Basic authentication, Proxy, Proxy Authentication, SSL, file uploads etc."
Und warum das Rad zweimal erfinden?
PS: Ein HTTP Client für multiple Requests gibts auch.
Features:
* Manages cookies and referrers between requests
* Handles HTTP redirection
* Has methods to set default headers and request parameters
* Implements the Subject-Observer design pattern: the base class sends
events to listeners that do the response processing.
- Sven Rautenberg
Hallo Freunde des gehobenen Forumsgenusses,
Die Feature-Liste sieht besser aus, als alles, was man "mal eben schnell" hinskripten könnte: "Supports GET/POST/HEAD/TRACE/PUT/DELETE, Basic authentication, Proxy, Proxy Authentication, SSL, file uploads etc."
Fein. Wenn ich aber nur einen ganz einfachen GET-Request absetzen möchte und keinen Bock
auf das lesen einer Dokumentation oder gar des Quellcodes habe?
Und warum das Rad zweimal erfinden?
Um den Mechanismus zu verstehen? Es gibt Millionen von Gästebüchern,
warum gibt es nicht das ultimative Gästebuch?
Und wenn man alles selbst macht, hat man den Vorteil, den Code sehr gut zu kennen und bei ev. später
auftretenden Fehlern diese wahrscheinlich einfacher beheben kann als in einer fremden Software.
Gruß
Alexander Brock
Moin!
Die Feature-Liste sieht besser aus, als alles, was man "mal eben schnell" hinskripten könnte: "Supports GET/POST/HEAD/TRACE/PUT/DELETE, Basic authentication, Proxy, Proxy Authentication, SSL, file uploads etc."
Fein. Wenn ich aber nur einen ganz einfachen GET-Request absetzen möchte und keinen Bock auf das lesen einer Dokumentation oder gar des Quellcodes habe?
Dann kopierst du dir das allererste simple Beispiel aus der Doku (erstes Kapitel, erste Seite) in dein Skript:
<?php
require_once "HTTP/Request.php";
$req =& new HTTP_Request("http://www.yahoo.com/");
if (!PEAR::isError($req->sendRequest())) {
echo $req->getResponseBody();
}
?>
Und warum das Rad zweimal erfinden?
Um den Mechanismus zu verstehen? Es gibt Millionen von Gästebüchern,
warum gibt es nicht das ultimative Gästebuch?
Wenn du dir eine HTTP-Klasse oder -Funktion schreibst, mußt du, damit das ordentlich und vernünftig wird, ja aber auch die einschlägigen RFC lesen und verstehen. Das mag auf den ersten Blick vielleicht noch recht simpel aussehen, aber sobald die Dinge komplizierter werden (und das können sie einfach dadurch, dass z.B. HTTP/1.1 ins Spiel kommt), wird das wahrscheinlich kein sonderlich großer Spaß mehr werden.
Und wenn man alles selbst macht, hat man den Vorteil, den Code sehr gut zu kennen und bei ev. später auftretenden Fehlern diese wahrscheinlich einfacher beheben kann als in einer fremden Software.
Der Einwand ist natürlich im Grundsatz richtig, allerdings setzt eine Fehlersuche und -behebung bei HTTP-Requests natürlich das Wissen über HTTP in Theorie und Praxis voraus.
Ich kenne mich beispielsweise ja auch mit SMTP aus. Trotzdem benutze ich zum Mailen in meinem Webshop keine eigene Konstruktion, sondern PEARs Net_SMTP zum Absetzen der jeweiligen SMTP-Befehle, weil mir da z.B. ein Standard-Interface zu den SMTP-Statusmeldungen geboten wird und es tatsächlich schneller und einfacher ist, existierenden Code (mit Dokumentation) einzubinden, als sich dieselben Funktionen erst mal selbst auszudenken.
- Sven Rautenberg
Guten Morgen.
Komisch, das ausgerechnet ein Stammgast dieses Forums sich nicht die Mühe macht, in der passenden Dokumentation nachzuschauen.
Netter Witz!
Das war kein Witz.
Als erstes habe ich unter http://de3.php.net/manual/de/function.fsockopen.php
die durchaus vielfältigen UCN angeschaut. Die bringen meistens mehr, als eine kryptische RCF.
So kryptisch ist die Liste http://www.w3.org/Protocols/rfc2616/rfc2616-sec5.html#sec5.3 nicht und auch die Seite "Request", in der diese Liste auftaucht, ist im Inhaltsverzeichnis nicht wirklich schwer zu finden (es sei denn, du kannst kein Englisch).
Aber leider komme ich nicht zum Erfolg mit dem gewünschten Request. Es scheinen weitere mir bisher unerklärliche Effekte zuständig zu sein.
Ah, kryptische Anleitungen, geheime Wünsche und unerklärliche Effekte. Ein Fall für die Glaskugel, ganz klar :->
Gruß, Moses