2010-04-07 17 views
6

Estoy expirando algún problema con uno de mis servicios de fuente de datos. Como dice en los encabezados de respuesta HTTP que se ejecuta en Apache-Coyote/1.1. servidor da respuestas con Transfer-Encoding: fragmentada, aquí respuestas de ejemplo:Tomcat gzip mientras problema fragmentado

HTTP/1.1 200 OK 
Server: Apache-Coyote/1.1 
Content-Type: text/xml;charset=utf-8 
Transfer-Encoding: chunked 
Content-Encoding: gzip 
Date: Tue, 30 Mar 2010 06:13:52 GMT 

Y es un problema cuando estoy solicitando servidor para enviar solicitud gzipped a menudo no envía respuesta completa. Recibo una respuesta, veo el último fragmento recibido, pero luego, al desacoplarlo, veo que la respuesta es parcial. Nunca he visto ese comportamiento con gzip desactivado en los encabezados de solicitud.

Así que mi pregunta es: ¿es el problema común de Tomcat? tal vez uno de ellos es mod que está haciendo compresión? ¿O tal vez sea algún tipo de problema de proxy? No puedo hablar sobre versiones de Tomcat o qué mod de gzip usan, pero no dudes en preguntar, intentaré preguntarle a mi proveedor de servicios.

Gracias.

+0

¿Qué cliente/biblioteca está utilizando para realizar la solicitud? – Asaph

+0

¿Puedes publicar los encabezados de tus solicitudes? – Asaph

+0

Estoy usando mi propia implementación parcial de HTTP, ya que dije que funciona bien sin codificación gzip y en la mayoría de los casos funciona bien para gzipped, ¡pero como 30% de las respuestas gzip son basura después de la descompresión! Mi petición como: POSTAL http://example.com/Service HTTP/1.1 Content-Length: 1081 Content-Encoding: gzip Accept-Encoding: gzip Anfitrión: example.com User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; .NET CLR 1.1.4322; .NET CLR 1.0.3705) Autorización: básico UENDN0IySjpTb3KxdWE3YjJq SOAPAction: http://example.com/Service // y aquí va mi solicitud comprimida .. – hoodoos

Respuesta

2

Dado que la duración del contenido de una respuesta comprimida es impredecible y es potencialmente cara y lenta para comprimirla completamente en la memoria primero, calcule la longitud y luego transmita la respuesta comprimida de la memoria, el servidor web promedio los enviará en fragmentos utilizando Transfer-Encoding:chunkedsin a Content-Length encabezado.

Dado que es un cliente HTTP de cosecha propia, parece que no maneja las solicitudes fragmentadas correctamente. Debe determinar el encabezado de respuesta Transfer-Encoding y si es igual a chunked, entonces debe analizarlo como una secuencia fragmentada.

Puede aprender de los enlaces de especificación HTTP antes mencionados y de Wikipedia cómo analizar una secuencia en bloque. Cada fragmento consta de un encabezado que indica la longitud del fragmento en hexadecimal, luego un CRLF, luego el contenido real del fragmento y luego un CRLF. Esto se repite hasta que un fragmento con un encabezado denota la longitud del fragmento de 0. Necesita separar los trozos por separado y luego pegarlos.

Para guardar todo el tedioso trabajo de codificación (probablemente también para el remanente de su propio cliente HTTP), le recomiendo echar un vistazo a Apache HttpComponents Client.

+0

Funciona perfectamente con otros sitios, y con este servicio si apago el gzipping. De hecho, instalé tomcat en mi máquina de trabajo y tampoco entrega contenido a veces. Me encantaría pensar que es mi problema, pero si utilizo .net wrapper para llamar a los métodos de este servicio (no mi implementación http), tampoco puede obtener una respuesta XML completa a veces igual que el cliente mío. ¿Estás familiarizado con Tomcat? – hoodoos

+0

¿Cómo está seguro de que el problema está en Tomcat y no en la aplicación del servidor que se ejecuta en Tomcat?Si miramos en esta dirección por la causa, verificaría si no hay ningún código Java (servlet) que gzips manualmente la salida usando 'GzipOutputStream' y, si es así, entonces compruebe si invoca apropiadamente' close() ' en la salida de salida. – BalusC

+0

en realidad, era realmente mi código haciendo eliminación de fragmentos :) extraño que no expirience con otros servidores web luego Tomcat! buscaré más para encontrar la diferencia realmente. – hoodoos

Cuestiones relacionadas