2012-08-16 4 views
5

La parte di codice seguente scarica un file da qualche URL e lo salva in un file locale. Pezzo di torta. Cosa potrebbe essere sbagliato qui?Chi sta manomettendo il mio flusso di dati?

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 ragione per cui sto postando una domanda qui è perché funziona in 99,999% del tempo e non funziona come previsto ogni volta che c'è un antivirus o un altro software di protezione installato su un computer che esegue questo codice. Io sto indicando ciecamente un dito in quel modo perché ogni volta che lo interrompo (o lo disattivo), il codice funziona di nuovo perfettamente. Il risultato finale di tale interferenza è che l'MD5 del file scaricato non corrisponde al previsto e inizia una nuova saga.

Quindi, la domanda è: è davvero possibile che qualche software di "protezione" intelligente possa alterare il flusso effettivo proveniente dall'URL senza che io ne sia a conoscenza? E se sì - come gestisci questo? (verificato con i prodotti Kasperksy e Norton).


EDIT-1: A quanto pare ho una stretta sul problema e non ha niente a che fare con antivirus. Il download avviene dal server FTP (FileZilla in particolare) e usiamo apache commons ftp sul lato client. Quello che ho fatto è andato al server FTP e terminato la connessione (buttato fuori) nel bel mezzo del download. Mi aspettavo che is.read (..) lanciasse una IOException sul lato client, ma questo non è mai accaduto. Invece, is.read (..) restituisce -1, il che significa che non ci sono più dati provenienti dallo stream. Questo è sicuramente inaspettato e spiega perché a volte ottengo file parziali. Ciò non spiega tuttavia perché a volte i dati vengano alterati.

+1

Definire "barfs". – EJP

+1

Come gestisci le espezioni? Se 'dis.close()' genera un'eccezione, il flusso di output non si chiuderà correttamente, ad esempio. – dacwe

+0

@dacwe: qualsiasi cosa generata da questo metodo è un errore, tutto viene interrotto. Il mistero è che niente viene lanciato, tutto viene scaricato bene. Il problema è che non sono i dati che mi aspetto, la maggior parte delle volte è dimezzato, a volte alterato .. – Dima

risposta

1

Sì, questo mi succede tutto il tempo. Nel mio caso è causato da proxy HTTP trasparente di Websense sulla mia rete aziendale. Il problema peggiore è causato dal fatto che la pagina di blocco viene restituita con 200 OK.

Hai la stessa o simile corruzione ogni volta? Ad esempio, ottieni del codice HTML che spiega perché la richiesta è stata bloccata? Il meglio che si può fare è confrontare i primi byte dei dati scaricati con del testo nella pagina del blocco e generare un'eccezione in questo caso.

Modifica: in base all'aggiornamento, il client FTP è impostato sulla modalità immagine/binario?

+0

Nel mio caso non è un testo, avrei notato cosa viene manomesso. Scarico il pacchetto di installazione binario, quindi è difficile dire quale parte di essa è stata distrutta. Il risultato finale è una confusione binaria e totale di utenti finali che puntano il dito contro di me quando in realtà è qualcosa che si trova sulla loro rete. – Dima

+0

È necessario scrivere i byte errati su disco e visualizzarli. – artbristol

+0

forse è una buona idea .. – Dima