levu: URL & Leerzeichen

Hallo,

ich will einen Mini-Webserver schreiben, der aber auch ein eigenes (HTTP-ähnliches) Protokoll unterstützt. Nun frage ich mich gerade, wie die erste Zeile beim Webserver ankommt.

So: "GET /a b c.html" oder so: "GET /a%20b%20c.html"

Der Grund ist, dass ich eigentlich vorhatte, die erste Zeile durch Leerzeichen zu parsen, da das eigene Protokoll mehrere Argumente kennt (z.B. "COMMAND arg1 arg2 arg3"). Kann man sich drauf verlassen, dass der Browser die Leerzeichen %20-encodet?

mfg, Flo

--
sh:) fo:| ch:? rl:( br:^ n4:| ie:{ mo:| va:} de:> zu:} fl:{ ss:) ls:< js:|
  1. Hi,

    So: "GET /a b c.html" oder so: "GET /a%20b%20c.html"

    Der Grund ist, dass ich eigentlich vorhatte, die erste Zeile durch Leerzeichen zu parsen, da das eigene Protokoll mehrere Argumente kennt (z.B. "COMMAND arg1 arg2 arg3"). Kann man sich drauf verlassen, dass der Browser die Leerzeichen %20-encodet?

    Welche Art von Anfragen und "Syntax" dieser *dein* Protkoll unterstuetzt, definierst du.
    Wie Clients zu antworten ist, die nach dieser Definition fehlerhafte Anfragen stellen, ebenfalls.

    MfG ChrisB

    --
    „This is the author's opinion, not necessarily that of Starbucks.“
    1. Hallo,

      Welche Art von Anfragen und "Syntax" dieser *dein* Protkoll unterstuetzt, definierst du.

      diese_s_ http://www.duden-suche.de/suche/trefferliste.php?suchbegriff[AND=protokoll&suche=homepage&treffer_pro_seite=10&modus=title&level=125&x=0&y=0@title=das, nicht der]
      HTTP unterstützt er auch (soll-wert) aber ich habe die Befürchtung, dass dateinamen getrennt werden, wenn ich am leerzeichen trenne (ist-wert)

      Wie Clients zu antworten ist, die nach dieser Definition fehlerhafte Anfragen stellen, ebenfalls.

      Das HTTP mag ja gültig sein. ich will mein (noch nicht fertig definiertes Protokoll) so machen, dass der Server HTTP verarbeiten kann, aber es wäre das einfachste, die "Argumente" am Leerzeichen zu trennen.

      mfg, Flo

      --
      sh:) fo:| ch:? rl:( br:^ n4:| ie:{ mo:| va:} de:> zu:} fl:{ ss:) ls:< js:|
      1. Hi,

        Welche Art von Anfragen und "Syntax" dieser *dein* Protkoll unterstuetzt, definierst du.
        diese_s_ http://www.duden-suche.de/suche/trefferliste.php?suchbegriff[AND=protokoll&suche=homepage&treffer_pro_seite=10&modus=title&level=125&x=0&y=0@title=das, nicht der]

        lies Chris' Satz nochmal durch, und versuche die Grammatik zu verstehen. Dann wirst du feststellen, dass "dieser" richtig war, weil es sich nicht auf "Protokoll" bezieht, sondern auf "Anfragen". Und zwar im Genitiv.

        ich will mein (noch nicht fertig definiertes Protokoll) so machen, dass der Server HTTP verarbeiten kann, aber es wäre das einfachste, die "Argumente" am Leerzeichen zu trennen.

        Ich kenne deine speziellen Anforderungen nicht. Aber ich würde dir raten, eher den Schrägstrich '/' als Trennzeichen zu nehmen. Das ist ein ganz alltägliches und gültiges Zeichen in URLs, kann also nicht mit anderen Beschränkungen kollidieren.

        So long,
         Martin

        --
        Hannes würfelt abends immer, ob er den Abend mit seiner Frau zuhause verbringt oder in die Kneipe geht. Wenn er eine 6 würfelt, geht er in die Kneipe.
        Gestern musste er 37mal würfeln.
        1. Hallo,

          Dann würde die URL ja getrennt werden. Es muss ein Zeichen sein, was in einer URL nicht vorkommen kann.

          Grammatik hab ich auch kapiert^^

          mfg, Flo

          --
          sh:) fo:| ch:? rl:( br:^ n4:| ie:{ mo:| va:} de:> zu:} fl:{ ss:) ls:< js:|
          1. Hi,

            Dann würde die URL ja getrennt werden. Es muss ein Zeichen sein, was in einer URL nicht vorkommen kann.

            Nun, deshalb nutzt HTTP ja bspw. das Leerzeichen.

            http://www.w3.org/Protocols/rfc2616/rfc2616-sec5.html
            The Request-Line begins with a method token, followed by the Request-URI and the protocol version, and ending with CRLF. The elements are separated by SP characters. No CR or LF is allowed except in the final CRLF sequence.
                    Request-Line   = Method SP Request-URI SP HTTP-Version CRLF

            SP steht fuer Space.

            MfG ChrisB

            --
            „This is the author's opinion, not necessarily that of Starbucks.“
            1. Hallo,

              Danke, genau die Info hab ich gebraucht :)

              mfg, Flo

              --
              sh:) fo:| ch:? rl:( br:^ n4:| ie:{ mo:| va:} de:> zu:} fl:{ ss:) ls:< js:|
          2. Hi,

            Dann würde die URL ja getrennt werden.

            was meinst du mit "getrennt"?

            Es muss ein Zeichen sein, was in einer URL nicht vorkommen kann.

            Nein, eben nicht. Wenn ich so eine Aufgabe hätte, würde ich darauf achten, dass mein neues Protokoll mit HTTP kompatibel bleibt. Und dann muss es sich auch den Regeln von HTTP fügen. Ein Request (ein Kommando) könnte dann z.B. so aussehen:

            GET /command/param1/param2/param3

            Das wäre mit HTTP kompatibel, und deine Server-Applikation könnte den Request auf "/command" am Anfang prüfen, und dann die einzelnen Parameter an den Slashes abtrennen.
            Mit den Leerzeichen würdest du dagegen riskieren, dass dein Protokoll auf dem Übertragungsweg z.B. durch einen Proxy verstümmelt wird, weil es nicht den Regeln von HTTP entspricht.

            Grammatik hab ich auch kapiert^^

            Na fein. :-)

            Ciao,
             Martin

            --
            Ich liebe Politiker auf Wahlplakaten.
            Sie sind tragbar, geräuschlos, und leicht wieder zu entfernen.
              (Loriot, deutscher Satiriker)
            1. Hallo,

              GET /command/param1/param2/param3 HTTP/1.1

              Das würde ja heißen, dass es in die folgenden Tokens zerlegt werden würde (/ als trenner):

              • "GET "
              • "command"
              • "param1"
                ...
              • " HTTP"
              • "1.1"

              Während bei einem Leerzeichen:

              • "GET"
              • "/command/.../"
              • "HTTP/1.1"

              Ich will nicht nur die URL zur Werteübergabe nutzen, sondern die ganze erste Zeile :)

              mfg, Flo

              --
              sh:) fo:| ch:? rl:( br:^ n4:| ie:{ mo:| va:} de:> zu:} fl:{ ss:) ls:< js:|