Tengo un sistema de cliente/servidor que realiza comunicación utilizando XML transferido utilizando solicitudes y respuestas HTTP con el cliente utilizando Perl's LWP y el servidor que ejecuta Perl's CGI.pm a través de Apache. Además, el flujo se cifra con SSL con certificados tanto para el servidor como para todos los clientes.Comprimir solicitud HTTP con LWP, Apache y mod_deflate
Este sistema funciona bien, excepto que periódicamente el cliente necesita enviar grandes cantidades de datos. Una solución obvia sería comprimir los datos del lado del cliente, enviarlos y descomprimirlos en el servidor. En lugar de implementarlo yo mismo, esperaba utilizar la descompresión de entrada mod_deflate de Apache como se describe en here.
La descripción advierte:
Si se evalúa el cuerpo de la petición a sí mismo, no confían en la cabecera Content-Length! El encabezado Content-Length refleja la longitud de los datos entrantes del cliente y no el número de bytes de la secuencia de datos descomprimida.
Así que si proporciono un valor de longitud del contenido que coincida con el tamaño de los datos comprimidos, los datos se truncarán. Esto se debe a que mod_deflate descomprime la secuencia, pero CGI.pm solo lee el límite de longitud del contenido.
Como alternativa, si trato de ser más listo y anular el encabezado Content-Length con el tamaño de datos descomprimido, LWP se queja y restablece el valor a la longitud comprimida, dejándome con el mismo problema.
Finalmente, intenté hackear la parte de LWP que hace la corrección. El código original es:
# Set (or override) Content-Length header
my $clen = $request_headers->header('Content-Length');
if (defined($$content_ref) && length($$content_ref)) {
$has_content = length($$content_ref);
if (!defined($clen) || $clen ne $has_content) {
if (defined $clen) {
warn "Content-Length header value was wrong, fixed";
hlist_remove(\@h, 'Content-Length');
}
push(@h, 'Content-Length' => $has_content);
}
}
elsif ($clen) {
warn "Content-Length set when there is no content, fixed";
hlist_remove(\@h, 'Content-Length');
}
Y me cambió la línea de empuje para:
push(@h, 'Content-Length' => $clen);
Desafortunadamente esto causa algunos problemas en el contenido (trunca o no) ni siquiera llegar a mi script CGI.
¿Alguien ha hecho esto? Encontré this que comprime un archivo antes de cargarlo, pero no comprime una solicitud genérica.