Beste Weg, um zu analysieren, HTTP-Header vom HTTP-request-String verwenden keine 3rd-party-libs (Core Java)
Gegebene HTTP-request-header, hat jemand Vorschläge oder weiß vorhandener code richtig Parsen der header? Ich bin versucht, dies zu tun mit Core Java-only, keine third-party-libs
Edit:
Versuchen zu finden, die key-Felder aus diesem String zum Beispiel:
GET /HTTP/1.1 User-Agent: curl/7.19.7 (x86_64-pc-linux-gnu) libcurl/7.19.7 OpenSSL/0.9.8 k zlib/1.2.3.3 libidn/1.15 Host: localhost:9000Accept: /
Wollen, analysieren Sie die Methode und Methode
- Definiere "richtig analysiert". Tun Sie ablehnen, wenn der Kopf sagt etwas anderes als das, was Sie erwarten? Außerhalb, dass Sie wäre am besten gedient, Blick in die Java-Socket-Programmierung, das Lesen der raw-bits aus der Leitung.
- Ich kann empfangen header und speichern Sie es als String, was ich jetzt versuche herauszufinden, der beste Weg, um eine Analyse der header, um wichtige Felder wie: Veranstalter, Methode, usw. GET / HTTP/1.1 User-Agent: curl/7.19.7 (x86_64-pc-linux-gnu) libcurl/7.19.7 OpenSSL/0.9.8 k zlib/1.2.3.3 libidn/1.15 Host: localhost:9000Accept: /
Du musst angemeldet sein, um einen Kommentar abzugeben.
Starten Sie durch Lesen und verstehen der HTTP-Spezifikation.
Die request-Zeile und Header werden getrennt durch CR-LF-Sequenzen (bytes mit den dezimalen Wert 13 und 10), so dass Sie können Lesen Sie den Strom und trennen Sie jede Zeile. Ich glauben, dass die Header müssen codiert werden, die in US-ASCII, so können Sie einfach konvertieren von bytes zu Zeichen und anfügen an ein
StringBuilder
(aber überprüfen die Spezifikation: es kann zulassen, dass ISO-8859-1 oder eine andere Codierung).Ende der Header ist gekennzeichnet durch CR-LF-CR-LF.
Ihre verketteten one-line-string ist nicht ein HTTP-header.
Einem richtigen HTTP-request-Nachricht sollte wie folgt Aussehen (nicht immer)
Finden Sie hier http://www.w3.org/Protocols/rfc2616/rfc2616-sec5.html
Wenn Sie möchten, implementieren Sie einen HTTP-server, ohne jegliche Hilfe von Sevlets, Java ee Container, sollten Sie Sockets verwenden.
Dies ist NICHT der einzige Fall, für HTTP-Nachricht Verträge.
Schrieb ich eine Bibliothek, RawHTTP, deren einziger Zweck es ist, analysieren von HTTP-Nachrichten (Anfragen und Antworten).
Wenn Sie nicht möchten, verwenden Sie eine Bibliothek, Sie könnte eine Kopie der Quelle in Ihre eigene code-Basis, ausgehend von dieser: https://github.com/renatoathaydes/rawhttp/blob/a6588b116a4008e5b5840d4eb66374c0357b726d/rawhttp-core/src/main/java/com/athaydes/rawhttp/core/RawHttp.java#L52
Dies teilt die Zeilen der HTTP-Nachricht alle den Weg an das Ende der Metadaten-Abschnitte (start-line + Header).
Mit der Liste der Metadaten Linien zur hand, können Sie rufen dann die
parseHeaders
Methode, die die Header für Sie. Sie können leicht anpassen, die zu der gerade wieder eineMap<String, List<String>>
zu vermeiden, dass auch importieren Sie die header-Klassen.Sagte, dass... RawHTTP hat keine Abhängigkeiten, so würde ich es einfach verwenden, stattdessen 🙂 aber bis zu Sie.
Ich bin mit der guava-Bibliothek einschließen, um die Voraussetzungen für meine Methoden. Sie können Sie zu entfernen zugunsten von null überprüft.