2010-09-15 6 views
5

Je décode les paquets http. Et j'ai fait face à un problème qui pose problème. Quand je reçois un paquet http, il a un en-tête et un corps. Quand transefer-encoding est segmenté, je ne sais pas quoi faire?Décodage http fragmenté dans Java?

Existe-t-il une API ou une classe utile pour décoder les données dans JAVA?

Et si quelqu'un, expérimenté sur le décodage http, s'il vous plaît montrez-moi un moyen de le faire?

Répondre

11

Utilisez un client HTTP complet comme Apache HttpComponents Client ou simplement Java SE fourni java.net.URLConnection (mini tutorial here). Les deux le manipule de manière totalement transparente et vous donne un "normal" InputStream en arrière. HttpClient à son tour vient également avec un ChunkedInputStream que vous venez de décorer votre InputStream avec.

Si vous insistez vraiment pour créer une bibliothèque pour cela, alors je suggère de créer une classe comme ChunkedInputStream extends InputStream et d'écrire la logique en conséquence. Vous pouvez trouver plus de détails comment l'analyser en this Wikipedia article.

+0

En fait, je fais décodage http déconnecté et j'ai juste l'en-tête et le corps du paquet http. Et je vais décoder le paquet. Mais j'ai besoin d'une api qui obtient l'en-tête et le corps et me donne des données décodées. Y a-t-il donc de l'API? – CodingForever

+0

L'article Wikipédia contient des détails sur l'aspect d'un morceau. Vous pouvez simplement diviser sur CRLF (\ r \ n). Ce sont les octets 10 et 13. La première partie est alors l'en-tête qui représente la longueur du bloc en hexadécimal. La deuxième partie est alors la donnée de morceau elle-même. Vous venez de collecter et de concaténer tous ces morceaux. Le 'ChunkedInputStream' fait exactement cela. – BalusC

+0

parce que votre réponse est juste. – CodingForever

1

Apache HttpComponents

Oh, et si nous parlons du côté client, HttpUrlConnection le fait aussi.

+0

Je vais déconnecter déconnecté http (paquets déjà capturés) et j'ai juste un en-tête et un corps. J'ai donc besoin d'une API qui n'obtient que l'en-tête et le corps et qui me donne des données décodées. Y a-t-il des API comme celle-ci? – CodingForever

1

Si vous recherchez une API simple, essayez la bibliothèque Jodd Http (http://jodd.org/doc/http.html). Il gère l'encodage de transfert Chunked pour vous et vous obtenez le corps entier comme une chaîne de retour.

De la documentation:

HttpRequest httpRequest = HttpRequest.get("http://jodd.org"); 
HttpResponse response = httpRequest.send(); 

System.out.println(response); 
1

Voici alternative rapide et sale qui ne nécessite aucune dépendance à l'exception d'Oracle JRE:

private static byte[] unchunk(byte[] content) throws IOException { 
    ByteArrayInputStream bais = new ByteArrayInputStream(content); 
    ChunkedInputStream cis = new ChunkedInputStream(bais, new HttpClient() {}, null); 
    return readFully(cis); 
} 

Il utilise le même sun.net.www.http.ChunkedInputStream que java.net.HttpURLConnection fait derrière la scène. Cette implémentation ne fournit pas d'exceptions détaillées (numéros de ligne) sur un format de contenu erroné.

Fonctionne avec Java 8 mais pourrait échouer avec la prochaine version. Tu as été prévenu.

Cela pourrait être utile pour le prototypage. Vous pouvez choisir n'importe quelle implémentation readFully de Convert InputStream to byte array in Java.