diff options
Diffstat (limited to 'src/main/java/org/openslx/filetransfer/Downloader.java')
-rw-r--r-- | src/main/java/org/openslx/filetransfer/Downloader.java | 36 |
1 files changed, 29 insertions, 7 deletions
diff --git a/src/main/java/org/openslx/filetransfer/Downloader.java b/src/main/java/org/openslx/filetransfer/Downloader.java index 50162fc..5aff94b 100644 --- a/src/main/java/org/openslx/filetransfer/Downloader.java +++ b/src/main/java/org/openslx/filetransfer/Downloader.java @@ -12,12 +12,13 @@ import javax.net.ssl.SSLContext; import net.jpountz.lz4.LZ4FastDecompressor; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; public class Downloader extends Transfer { - private static final Logger log = Logger.getLogger( Downloader.class ); + private static final Logger log = LogManager.getLogger( Downloader.class ); private final LZ4FastDecompressor decompressor = lz4factory.fastDecompressor(); @@ -115,6 +116,7 @@ public class Downloader extends Transfer compressed += compressedLength; uncompressed += decompressedLength; if ( decompressedLength > len ) { + // TODO: Partial reads with buffering, if remote payload is larger than our buffer throw new RuntimeException( "This should never happen! ;)" ); } if ( decompressedLength == compressedLength ) { @@ -167,6 +169,19 @@ public class Downloader extends Transfer } FileRange requestedRange; try { + byte[] incoming = new byte[ 500000 ]; + /* TODO once the Lz4InputStream can handle small buffer sizes / partial reads + for ( int bufsiz = 600; bufsiz >= 100 && incoming == null; bufsiz -= 100 ) { + try { + incoming = new byte[ bufsiz * 1024 ]; + } catch ( OutOfMemoryError e ) { + } + } + if ( incoming == null ) { + log.error( "Could not allocate buffer for receiving." ); + return false; + } + */ while ( ( requestedRange = rangeCallback.get() ) != null ) { if ( requestedRange.startOffset < 0 || requestedRange.startOffset >= requestedRange.endOffset ) { log.error( "Callback supplied bad range (" + requestedRange.startOffset + " to " + requestedRange.endOffset + ")" ); @@ -187,16 +202,23 @@ public class Downloader extends Transfer log.error( "Did not receive meta data from uploading remote peer after requesting range, aborting." ); return false; } + if ( getRemoteError() != null ) { + log.error( "Remote peer sent error: " + getRemoteError() ); + return false; + } FileRange remoteRange = meta.getRange(); - if ( remoteRange == null || !remoteRange.equals( requestedRange ) ) { - log.error( "Confirmed range by remote peer does not match requested range, aborting download." ); + if ( remoteRange == null ) { + log.error( "Remote metadata does not contain range confirmation. " + meta ); + } + if ( !remoteRange.equals( requestedRange ) ) { + log.error( "Confirmed range by remote peer (" + remoteRange + + ") does not match requested range (" + requestedRange + "), aborting download." ); return false; } // Receive requested range int chunkLength = requestedRange.getLength(); // If the uploader sets the COMPRESS field, assume compressed chunk InputStream inStream = meta.peerWantsCompression() ? compressedIn : dataFromServer; - byte[] incoming = new byte[ 500000 ]; // 500kb int hasRead = 0; while ( hasRead < chunkLength ) { int ret; @@ -207,7 +229,7 @@ public class Downloader extends Transfer return false; } } catch ( IOException e ) { - log.error( "Could not read payload from socket" ); + log.error( "Could not read payload from socket", e ); sendErrorCode( "payload read error" ); return false; } @@ -227,7 +249,7 @@ public class Downloader extends Transfer compressedIn.printStats(); try { transferSocket.shutdownOutput(); - } catch ( IOException e ) { + } catch ( Exception e ) { } } finally { this.close( null ); |