2014-10-24 8 views
6

Ich versuche, eine byte[] in Java zu analysieren, die eine Darstellung einer HTTP-Antwort ist. Es gibt diese Frage Is there any simple http response parser for Java?, die genau meine Frage ist, aber die akzeptierte Antwort hilft mir nicht. Wenn ich mir http://hc.apache.org/httpcomponents-core-ga/httpcore/apidocs/org/apache/http/io/HttpMessageParser.html anschaue, verstehe ich nicht, wie mir das weiterhilft. dieserparse HTTP Antwort Bytes in Java

+0

Welche Mechanismus bietet Ihnen mit diesem Byte-Array? Welche Methode verwenden Sie, um tatsächlich mit dem HTTP-Server zu kommunizieren? – user3062946

+0

Die Daten stammen von WARC-Dateien, die mit einem Webcrawler gesammelt wurden. Ich weiß, dass es eine Bibliothek gibt, die die gesamte WARC-Datei analysiert, aber ich verwende sie mit diesem Hadoop-Mapper https://github.com/ept/warc-hadoop, der sein eigenes WARCRecord-Format verwendet. Es gibt mehrere Routen, aber ich denke, das Parsen einer HTTP-Antwort sollte machbar sein. – Gijs

+0

Die verknüpften Dokumente sagen: "Diese Bibliothek führt derzeit kein Parsing der Daten innerhalb von Datensätzen aus, z. B. die HTTP-Header oder den HTML-Text. Sie können die Antwort des Servers einfach als Array von Bytes lesen hinzugefügt in zukünftigen Versionen. " - Bedeutet das, dass das Byte-Array nur verwendet werden kann, um einen String zu erstellen, der die textliche HTTP-Antwort anzeigt? – user3062946

Antwort

8

Ich hoffe, das sollten Sie

String s = "HTTP/1.1 200 OK\r\n" + 
     "Content-Length: 100\r\n" + 
     "Content-Type: text/plain\r\n" + 
     "Server: some-server\r\n" + 
     "\r\n"; 
SessionInputBufferImpl sessionInputBuffer = new SessionInputBufferImpl(new HttpTransportMetricsImpl(), 2048); 
sessionInputBuffer.bind(new ByteArrayInputStream(s.getBytes(Consts.ASCII))); 
DefaultHttpResponseParser responseParser = new DefaultHttpResponseParser(sessionInputBuffer); 
HttpResponse response = responseParser.parse(); 
System.out.println(response); 

Dieser Code erzeugt die folgende Ausgabe erhalten begonnen:

HTTP/1.1 200 OK [Content-Length: 100, Content-Type: text/plain, Server: some-server] 
+2

Danke! Das bringt mich in Schwung. – Gijs

0

Check out: https://github.com/ipinyol/proxy-base

Dies ist ein einfacher in hohem Maße konfigurierbar HTTP-Proxy. Die Methode readHeader der Klasse org.mars.proxybase.ProxyThread analysiert die HTTP-Header bei einem DataInputStream (der bytes liest) und gibt ein Objekt vom Typ Header mit Informationen zum Header zurück.

Wahrscheinlich wissen Sie auch, dass Sie entweder eine Inhaltslängendefinition in der Kopfzeile haben oder Daten chunked haben, die Sie in der http-Antwort nach Blöcken lesen müssen. Die Methoden readContent und readContentByChunk der gleichen Klasse führen das Lesen des Inhalts durch. Sie können den Code selbst erkunden und entsprechend modifizieren.

+0

Danke.Ich hoffe, es gibt einen weniger arbeitsintensiven Weg, aber ich könnte versuchen, dies zu tun, wenn es sonst nichts gibt. – Gijs