Reinhard Doberstein: HTTP-Post und Headererkennung

HAllo,

ich versuche gerade folgendes zu realisieren:

  • Ein PHP-Skript wird aufgerufen.
  • Dieses liest per http eine andere URL aus
  • Ändert diesen Inhalt
  • Gibt das an den Besucher zurück.

Der Besucher soll gar nicht merken das die Daten von wo anders kommen. Dabei soll das ganze auch bei Aufrufen mit POST funktionieren. Ich benutze dabei die Funktion die bei http://www.dclp-faq.de/q/q-code-post.html beschrieben ist.
Das geht auch soweit, denke ich zumindest.

Was ich aber zurückbekomme ist sowas wie:

+--------------------+
HTTP/1.1 100 Continue
Server: Microsoft-IIS/4.0
Date: Thu, 21 Nov 2002 14:51:41 GMT

HTTP/1.1 200 OK
Server: Microsoft-IIS/4.0
Date: Thu, 21 Nov 2002 14:51:42 GMT
Connection: close
MIME-Version: 1.0
Content-type: text/html

<html>
...
+--------------------+

d.h. es sieht so aus als ob zwei Header geschickt werden. Ist sowas überhaupt erlaubt? Vielleicht gehts ja weil der 1. Teil ein "100 Continue" ist. Da kenn ich das Protokoll zu wenig.

Wie kann ich in den Fall feststellen wo der eigentliche body beginnt?

Wenn sowas nicht erlaubt ist, wie könnte sowas zustande kommen? Wenn ich diese 'versteckte' URL mit dem Browser angucke siehts jedenfalls richtig aus. Aber da weis ich ja nicht was er für einen Header bekommt.

Webserver ist jedenfalls ein IIS4.0, sieht man ja. Dementsprechend läuft das ganze unter Windows (NT4).

By
Reinhard

  1. Hallo Reinhard,

    Der Besucher soll gar nicht merken das die Daten von wo
    anders kommen.

    Wofuer willst du sowas?

    Dabei soll das ganze auch bei Aufrufen mit POST
    funktionieren. Ich benutze dabei die Funktion die bei
    http://www.dclp-faq.de/q/q-code-post.html
    beschrieben ist.

    Da werden falsche Zeilenenden benutzt, man sollte statt \n
    \015\012 benutzen.

    Was ich aber zurückbekomme ist sowas wie:

    +--------------------+
    HTTP/1.1 100 Continue
    Server: Microsoft-IIS/4.0
    Date: Thu, 21 Nov 2002 14:51:41 GMT

    HTTP/1.1 200 OK
    Server: Microsoft-IIS/4.0
    Date: Thu, 21 Nov 2002 14:51:42 GMT
    Connection: close
    MIME-Version: 1.0
    Content-type: text/html

    <html>
    ...
    +--------------------+

    d.h. es sieht so aus als ob zwei Header geschickt werden.

    Korrekt. In der RFC steht darueber:

    |10.1.1 100 Continue
    |
    |   The client may continue with its request. This interim
    |   response is used to inform the client that the initial
    |   part of the request has been received and has not yet
    |   been rejected by the server. The client SHOULD continue
    |   by sending the remainder of the request or, if the
    |   request has already been completed, ignore this response.
    |   The server MUST send a final response after the request
    |   has been completed.

    Ist sowas überhaupt erlaubt?

    Jup, klar ist das erlaubt.

    Vielleicht gehts ja weil der 1. Teil ein "100 Continue"
    ist. Da kenn ich das Protokoll zu wenig.

    Was genau meinst du?

    Wie kann ich in den Fall feststellen wo der eigentliche
    body beginnt?

    HTTP-Header sind vom HTTP-Body durch ein '\015\012'
    getrennt, also einer Leerzeile. Aber das bewahrt dich nicht
    davor, zu interpretieren, was vom Server zurueck kommt. Will
    heissen, statt einem 200 koennte auch ein '404 Not Found'
    oder ein '500 Internal Server Error' oder, wie in diesem
    Falle, ein '100 Continue' zurueck kommen. Erst bei einem
    '200 Ok' kannst du dich darauf einstellen, dass der Body
    folgt.

    Wenn sowas nicht erlaubt ist, wie könnte sowas zustande
    kommen? Wenn ich diese 'versteckte' URL mit dem Browser
    angucke siehts jedenfalls richtig aus. Aber da weis ich ja
    nicht was er für einen Header bekommt.

    Das kannst du hier betrachten:

    http://forum.de.selfhtml.org/cgi-bin/http_trace.pl

    Gruesse,
     CK

    1. HAllo,

      Der Besucher soll gar nicht merken das die Daten von wo
      anders kommen.

      Wofuer willst du sowas?

      Der eigentliche Datenlieferant (eine spezielle Datenbank Schnittstelle) liefert das HTML nicht so wie wir es brauchen. Daher diese verrenkungen für die Konvertierung. Die eigentliche Datenquelle ist von aussen auch nicht erreichbar, daher geht diese Adresse und die ganze Technik niemanden was an. Das verwirrt blos.

      Dabei soll das ganze auch bei Aufrufen mit POST
      funktionieren. Ich benutze dabei die Funktion die bei
      http://www.dclp-faq.de/q/q-code-post.html
      beschrieben ist.

      Da werden falsche Zeilenenden benutzt, man sollte statt \n
      \015\012 benutzen.

      Das sollte man dann wohl Kristian Köhntopp sagen :-) In meinen Skripten hab ich das auch schon ausgetauscht.

      Was ich aber zurückbekomme ist sowas wie:

      +--------------------+
      HTTP/1.1 100 Continue
      Server: Microsoft-IIS/4.0
      Date: Thu, 21 Nov 2002 14:51:41 GMT

      HTTP/1.1 200 OK
      Server: Microsoft-IIS/4.0
      Date: Thu, 21 Nov 2002 14:51:42 GMT
      Connection: close
      MIME-Version: 1.0
      Content-type: text/html

      <html>
      ...
      +--------------------+

      d.h. es sieht so aus als ob zwei Header geschickt werden.

      Korrekt. In der RFC steht darueber:

      [...]

      Ist sowas überhaupt erlaubt?

      Jup, klar ist das erlaubt.

      Vielleicht gehts ja weil der 1. Teil ein "100 Continue"
      ist. Da kenn ich das Protokoll zu wenig.

      Was genau meinst du?

      Wie kann ich in den Fall feststellen wo der eigentliche
      body beginnt?

      HTTP-Header sind vom HTTP-Body durch ein '\015\012'
      getrennt, also einer Leerzeile.

      Das ist genau mein Problem. Der Leerzeile kommt vor der Zeile "HTTP/1.1 200 OK". D.h. diese müßte schon von vom Browser angezeigt werden. Oder sind zwei, und mehr, Header erlaubt solange immer ein "100 Continue" ist?

      Ich werde also die 100er Header interpretieren, rausfiltern und wegschmeissen bis ein 'richtiger' Header kommt. (Vereinfacht gesagt)

      Aber das bewahrt dich nicht
      davor, zu interpretieren, was vom Server zurueck kommt.

      Eigentlich würde ich ja die einfach alles rausgeben. Aber in PHP geb ich halt Headerinformationen anders aus als den Body. Daher muss ich erkennen was zum Header, und was zum Body gehört. In dem Fall wäre mal Perl einfacher :-)

      Will
      heissen, statt einem 200 koennte auch ein '404 Not Found'
      oder ein '500 Internal Server Error'

      Och, da soll sich der Browser der Besuchers drum kümmern. Auch ein 404 oder 500 geb ich einfach weiter.

      Wenn sowas nicht erlaubt ist, wie könnte sowas zustande
      kommen? Wenn ich diese 'versteckte' URL mit dem Browser
      angucke siehts jedenfalls richtig aus. Aber da weis ich ja
      nicht was er für einen Header bekommt.

      Das kannst du hier betrachten:

      http://forum.de.selfhtml.org/cgi-bin/http_trace.pl

      Danke für den Tipp und die Infos.

      By
      Reinhard

      1. Hallo Reinhard,

        Wie kann ich in den Fall feststellen wo der
        eigentliche body beginnt?

        HTTP-Header sind vom HTTP-Body durch ein '\015\012'
        getrennt, also einer Leerzeile.

        Das ist genau mein Problem. Der Leerzeile kommt vor der
        Zeile "HTTP/1.1 200 OK". D.h. diese müßte schon von vom
        Browser angezeigt werden. Oder sind zwei, und mehr, Header
        erlaubt solange immer ein "100 Continue" ist?

        Richtig. Ein '100 Continue'-Response hat keinen Body. Nach
        einem '100 Continue' folgt ein weiterer Header-Part, wie auch
        die RFC schon gesagt hat (A HTTP-Server MUST send a final
        response header).

        Ich werde also die 100er Header interpretieren,
        rausfiltern und wegschmeissen bis ein 'richtiger' Header
        kommt. (Vereinfacht gesagt)

        Prinzipiell kannst du die auch weiterschicken. Waere PHP
        nicht so ekelig und gaebe es dort eine Moeglichkeit, etwas
        auszugeben, ohne dass Header von PHP selber geschickt werden,
        haettest du die Probleme nicht...

        Gruesse,
         CK