summaryrefslogtreecommitdiffstats
path: root/src/main/java/org/openslx/filetransfer/Downloader.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/org/openslx/filetransfer/Downloader.java')
-rw-r--r--src/main/java/org/openslx/filetransfer/Downloader.java36
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 );