2012-08-16 6 views
5

El fragmento de código siguiente descarga un archivo de alguna URL y lo guarda en un archivo local. Pedazo de pastel. ¿Qué podría estar mal aquí?¿Quién está manipulando mi secuencia de datos?

protected long download(ProgressMonitor montitor) throws Exception{ 
    long size = 0; 
    DataInputStream dis = new DataInputStream(is); 
    int read = 0; 
    byte[] chunk = new byte[chunkSize]; 
    while((read = dis.read(chunk)) != -1){ 
     os.write(chunk, 0, read); 
     size += read; 
     if(montitor != null) 
      montitor.worked(read); 
    } 

    chunk = null; 
    dis.close(); 
    os.flush(); 
    os.close(); 
    return size; 
} 

La razón por la que estoy publicando una pregunta aquí es porque funciona en el 99,999% de las veces y no funciona como se espera cada vez que hay un antivirus o algún otro software de protección instalado en un equipo que ejecuta el código. Estoy señalando ciegamente un dedo de esa manera porque cada vez que lo detengo (o lo deshabilito), el código funciona perfectamente de nuevo. El resultado final de tal interferencia es que el MD5 del archivo descargado no coincide con el esperado, y comienza una saga completamente nueva.

Entonces, la pregunta es: ¿es realmente posible que algún software inteligente de "protección" altere la transmisión actual proveniente de la URL sin que yo lo sepa? Y si es así, ¿cómo lidias con esto? (verificado con los productos Kasperksy y Norton).


EDITAR-1: Al parecer tengo una bodega en el problema y que no tiene nada que ver con los antivirus. La descarga se realiza desde el servidor FTP (FileZilla en particular) y utilizamos apache commons ftp en el lado del cliente. Lo que hice fue al servidor FTP y finalicé la conexión (expulsado) en medio de la descarga. Esperaba que is.read (..) arrojara una IOException en el lado del cliente, pero esto nunca sucedió. En cambio, is.read (..) devuelve -1, lo que significa que no hay más datos procedentes de la transmisión. Esto es definitivamente inesperado y explica por qué a veces obtengo archivos parciales. Esto no explica por qué a veces los datos también se alteran.

+1

Define 'barfs'. – EJP

+1

¿Cómo manejas las excepciones? Si 'dis.close()' arroja una excepción, la secuencia de salida no se cerrará correctamente, por ejemplo. – dacwe

+0

@dacwe: lo que sea que se arroje de este método es una falla, todo se cancela. El misterio es que no se arroja nada, todo se descarga bien. El problema es que no son los datos que espero, la mayoría de las veces se reduce a la mitad, a veces alterado. – Dima

Respuesta

1

Sí, esto me sucede todo el tiempo. En mi caso, esto se debe a un proxy HTTP transparente de Websense en mi red corporativa. El peor problema lo causa la página de bloque que se devuelve con 200 OK.

¿Obtiene la misma o similar corrupción cada vez? Por ejemplo, ¿obtiene algo de HTML explicando por qué se bloqueó la solicitud? Lo mejor que probablemente pueda hacer es comparar los primeros bytes de los datos descargados con algún texto en la página de bloques y lanzar una excepción en este caso.

Editar: según su actualización, ¿tiene el cliente de FTP configurado en modo de imagen/binario?

+0

En mi caso, no es un texto, me habría dado cuenta de qué es exactamente lo que se manipula. Descargo el paquete de instalación binaria, por lo que es difícil saber qué parte de él se arruinó. El resultado final es una confusión binaria corrupta y total de los usuarios finales que me señalan con el dedo cuando en realidad es algo que se encuentra en su red. – Dima

+0

Necesita escribir los bytes incorrectos en el disco y echarles un vistazo. – artbristol

+0

tal vez es una buena idea ... – Dima

Cuestiones relacionadas