hotti: Leerzeile in Handle erkennen

hi,

s. Thema. Es geht um eine HTTP/1.0-Response, die ich direkt aus einem socket lesen möchte (wird eine ziemlich fette binary die Response). Nun sind die Mittelchen, ein Handle zu lesen recht bescheiden, ich muss der read()-Funktion sagen, wieviele Bytes zu lesen sind, wie kann ich da die Leerzeile erkennen, die zwischen headers und body steht?

Bitte mal um Hinweise,
Hotti

--
Wenn der Kommentar nicht zum Code passt, kann auch der Code falsch sein.
  1. s. Thema. Es geht um eine HTTP/1.0-Response, die ich direkt aus einem socket lesen möchte (wird eine ziemlich fette binary die Response). Nun sind die Mittelchen, ein Handle zu lesen recht bescheiden, ich muss der read()-Funktion sagen, wieviele Bytes zu lesen sind, wie kann ich da die Leerzeile erkennen, die zwischen headers und body steht?

    Ich versteh dich vermutlich jetzt falsch, aber such doch einfach nach \r\n\r\n bzw. 0D0A0D0A

    1. hi,

      s. Thema. Es geht um eine HTTP/1.0-Response, die ich direkt aus einem socket lesen möchte (wird eine ziemlich fette binary die Response). Nun sind die Mittelchen, ein Handle zu lesen recht bescheiden, ich muss der read()-Funktion sagen, wieviele Bytes zu lesen sind, wie kann ich da die Leerzeile erkennen, die zwischen headers und body steht?

      Ich versteh dich vermutlich jetzt falsch, aber such doch einfach nach \r\n\r\n bzw. 0D0A0D0A

      Da müsste ich dann sukzessive 4 byte aus dem Socket lesen... Du bringst mich auf eine Idee. Es ist ja nicht sicher, dass der Webserver genau diese 4 byte als Leerzeile nach dem Header sendet, aber: Wenn ich ein nph-Script (non parsed header) baue, kann ich das selbst festlegen.

      Danke Dir,
      Hotti

      --
      Wenn der Kommentar nicht zum Code passt, kann auch der Code falsch sein.
      1. hi,

        Da müsste ich dann sukzessive 4 byte aus dem Socket lesen... Du bringst mich auf eine Idee. Es ist ja nicht sicher, dass der Webserver genau diese 4 byte als Leerzeile nach dem Header sendet, aber: Wenn ich ein nph-Script (non parsed header) baue, kann ich das selbst festlegen.

        Auf die Schnelle mal ein nph-Script 'hingehauen'. Nach den headers, die ein nph-Script alle selbst ausgeben muss (der Webserver macht hier nüschd), die präparierte Leerzeile:

          
        print pack "CCCC", 0xD, 0xA, 0xD, 0xA;  
        
        

        Erster Test erfolgreich, läuft beim Provider (Linux egal) und bei mir auf XP! Und jetzt ab in die RFCs, morgen wirds ins Reine geschrieben ;)

        Grüße an Alle,
        Horst Schlaflos

    2. moin,

      s. Thema. Es geht um eine HTTP/1.0-Response, die ich direkt aus einem socket lesen möchte (wird eine ziemlich fette binary die Response). Nun sind die Mittelchen, ein Handle zu lesen recht bescheiden, ich muss der read()-Funktion sagen, wieviele Bytes zu lesen sind, wie kann ich da die Leerzeile erkennen, die zwischen headers und body steht?

      Ich versteh dich vermutlich jetzt falsch, aber such doch einfach nach \r\n\r\n bzw. 0D0A0D0A

      Nochmal nachgefragt: Senden alle Webserver (Apache) die Leerzeile nach dem Header in genau dieser Bytefolge?

      Mein XP-Apache (Apache/2.2.14 (Win32)) tut das jedenfalls und auch der Apache meines Providers auf Linux-irgendwas.

      Hotti

      1. Nochmal nachgefragt: Senden alle Webserver (Apache) die Leerzeile nach dem Header in genau dieser Bytefolge?

        Lt. Spezifikation ja - der Header wird durch zwei aufeinanderfolgende CRLF beendet - genauer gesagt durch eine neue Zeile die sofort mit CRLF beendet wird. Da das vorhergehende Header-Feld aber auch mit CRLF beendet wird, entspricht das quasi CRLFCRLF

        "The entity body is separated from the headers by a null line (i.e., a line with nothing preceding the CRLF)"

        ... gleichzeitig steht aber auch folgendes dort:

        http://www.w3.org/Protocols/HTTP/1.0/draft-ietf-http-spec.html#Tolerant

        "The line terminator for HTTP-header fields is the sequence CRLF. However, we recommend that applications, when parsing such headers, recognize a single LF as a line terminator and ignore the leading CR."

        Es kann also gut sein, dass CRLFCRFL vorkommt oder einfach nur LFCRLF oder LFLF

        1. hi,

          "The line terminator for HTTP-header fields is the sequence CRLF. However, we recommend that applications, when parsing such headers, recognize a single LF as a line terminator and ignore the leading CR."

          Es kann also gut sein, dass CRLFCRFL vorkommt oder einfach nur LFCRLF oder LFLF

          Danke Dir! Hab auch gerade RFCs gelesen. Wenn es Abweichungen gibt, lässt sich das ja feststellen. Oder ich nehme ein nph-Script, was definitiv CRLFCRLF vorgibt. Für den Eigenbedarf reicht jedoch ein normales CGI.

          Ansonsten ist soweit schonmal alles in Butter und bewährt sich praktisch ;)

          Viele Grüße,
          Hotti

          --
          Wenn der Kommentar nicht zum Code passt, kann auch der Code falsch sein.