2010-09-15 12 views
5

Estoy decodificando paquetes http. Y me enfrenté a un problema en ese pedazo de problema. Cuando obtengo un paquete http, tiene un encabezado y un cuerpo. Cuando la codificación transefer está fragmentada, ¿no sé qué hacer?Descodificación HTTP fragmentada en Java?

¿Existe una API o clase útil para dechunk los datos en JAVA?

Y si alguien, experimentado sobre decodificación http, ¿por favor muéstrame una manera de cómo hacer esto?

Respuesta

11

Utilice un cliente HTTP completo como Apache HttpComponents Client o solo el Java SE proporcionado java.net.URLConnection (mini tutorial here). Ambos lo manejan de forma totalmente transparente y le da una vuelta "normal" InputStream. HttpClient a su vez también viene con un ChunkedInputStream con el que solo tiene que decorar su InputStream.

Si realmente insiste en homegrowing una biblioteca para esto, entonces sugiero crear una clase como ChunkedInputStream extends InputStream y escribir la lógica en consecuencia. Puede encontrar más detalles sobre cómo analizarlo en this Wikipedia article.

+0

En realidad, hago decodificación http sin conexión y solo tengo el encabezado y el cuerpo del paquete http. Y decodificaré el paquete. Pero necesito una API que obtenga encabezado y cuerpo y me da datos decodificados. ¿Hay alguna pregunta? – CodingForever

+0

El artículo de Wikipedia contiene detalles de cómo se ve un trozo. Básicamente puedes simplemente dividir en CRLF (\ r \ n). Son los bytes 10 y 13. La primera parte es entonces el encabezado que representa la longitud del fragmento en hexadecimal. La segunda parte es entonces la información del fragmento en sí. Simplemente recolectas y concatenas todos esos trozos. El 'ChunkedInputStream' hace exactamente eso. – BalusC

+0

porque su respuesta es correcta. – CodingForever

1

Apache HttpComponents

Ah, y si estamos hablando de la parte del cliente, HttpUrlConnection hace esto también.

+0

Voy a desconectar la decodificación http (paquetes ya capturados) y tengo solo un encabezado y un cuerpo. Entonces, necesito una API que solo tenga encabezado y cuerpo, y me da datos decodificados. ¿Hay alguna API como esta? – CodingForever

1

Si está buscando una API simple, pruebe Jodd Http biblioteca (http://jodd.org/doc/http.html). Maneja la codificación de transferencia Chunked para usted y obtiene todo el cuerpo como una cadena de vuelta.

A partir de los documentos:

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

System.out.println(response); 
1

Aquí es alternativa rápida y sucia, que no requiere la dependencia a excepción de 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); 
} 

Se utiliza el mismo sun.net.www.http.ChunkedInputStream como java.net.HttpURLConnection hace detrás de la escena.

Esta implementación no proporciona excepciones detalladas (números de línea) en el formato de contenido incorrecto.

Funciona con Java 8 pero podría fallar con la próxima versión. Has sido advertido.

Podría ser útil para el prototipado.

Puede elegir cualquier implementación readFully de Convert InputStream to byte array in Java.

Cuestiones relacionadas