Zur Navigation

PHP cURL Header abtrennen und Body senden

1 Gast (Gast)

Hallo,

ich habe eine Frage zu cURL in PHP, bezweifle allerdings, ob das überhaupt möglich ist. Ich weiß zwar wie ich mit cURL nur Header oder nur Body anfordern kann, aber ich möchte in einem Request Header und Body empfangen, allerdings den Header mittels PHPs header(...) direkt an den Client senden. Die Schwierigkeit dabei ist, dass ich cURLs Option RETURNTRANSFER deaktiviert habe, also direkt ausgebe, da es theoretisch möglich ist, dass das Script auch binäre Dateien wie Videos o. ä. von mehreren 100 MB Größe abfragt, daher scheidet meiner Meinung nach das Speichern in einer Variable (mit RETURNTRANSFER true) aus.
Jetzt meine Frage, ob es überhaupt möglich ist, den Header ohne RETURNTRANSFER abzutrennen und als Header an den Client zu senden und wenn ja wie.

Vielen Dank im Voraus

14.06.2013 12:42

2 Jörg Kruse

Mir ist noch nicht ganz klar, was du mit "Header an den Client senden" meinst? Der Client ist ja cURL, welches einen Request an einen Server sendet.

14.06.2013 16:21

3 Gast (Gast)

Hallo Jörg,
ich möchte den Header den cURL mit CURLOPT_HEADER true ausgibt (also den Antwort-Header des Servers) an den Client "weitersenden", also wenn der Server beispielsweise einen Content-Type-Header sendet, möchte ich dem Client genau diesen Header "weitersenden". Wenn ich mit cURL und CURLOPT_NOBODY und RETURNTRANSFER true einen Header empfange klappt dies mittels
$headers = explode("\r\n",$result);
foreach ($headers as $header) {
  header($header);
}
auch. Allerdings muss ich dann noch einen cURL Request absetzen um den Body zu empfangen. (Diese 2 einzelnen Requests (ein HEAD und ein GET) möchte ich allerdings vermeiden, da der Server dann beispielsweise 2 verschiedene PHPSESSID-Cookies sendet.)

14.06.2013 17:09

4 Jörg Kruse

Ok, du baust also eine Art Proxy.

Es gibt noch die Option CURLOPT_WRITEHEADER - aber die wird dir auch nicht nutzen, da du die Header als erstes senden musst. Du könntest zwar die Ausgabe solange mit ob_start anhalten, aber das würde möglicherweise auch so viel Speicher belegen, als wenn du den Transfer zuerst in eine Variable speicherst. Was du wohl suchst, ist die Möglichkeit, den Datenstrom bis zum "\r\n\r\n" zu verarbeiten, und den Rest dann direkt auf die Standardausgabe zu kippen. Da sehe ich leider auch grad keine Möglichkeit.

14.06.2013 18:07

5 Gast (Gast)

Hallo,

ich bins nochmal. Falls es jemanden interessiert: Ich habe das ganze jetzt mit fsockopen() statt cURL realisiert. Funktioniert wunderbar :)

$fp = fsockopen($host, 80, $errno, $errstr, 30);
if (!$fp) {
  echo "$errstr ($errno)<br>\r\n";
} else {
  $out = "GET $get HTTP/1.1\r\n";
  $out .= "Host: $host\r\n";
  $out .= "Connection: Close\r\n\r\n";
  fwrite($fp, $out);
  $data = "";
  $searchheader = true; //Header soll noch gesucht werden
  while (!feof($fp)) {
    while ($searchheader == true) { //prüfen, ob Header-Ende (\r\n\r\n) noch gesucht werden soll
      $data .= fgets($fp, 1024); //nächste Zeile holen
      $strstr = strstr($data, "\r\n\r\n", true); //prüfen, ob Header-Ende schon in $data enthalten
      if ($strstr != false) { //falls \r\n\r\n in $strstr -> Header verarbeiten
        $headers = explode("\r\n",$strstr);
        foreach ($headers as $header) {
          header($header);
        }
        $searchheader = false; //nicht mehr weiter suchen
      }
    }
    echo fgets($fp, 1024); //restliche Daten (Body) ausgeben
  }
  fclose($fp);
}

14.06.2013 21:19

Beitrag schreiben (als Gast)

Die Antwort wird nach der Überprüfung durch einen Moderator freigeschaltet.





[BBCode-Hilfe]