416 if piece not downloaded

pull/5/head
Zlatin Balevsky 2019-06-21 16:03:20 +01:00
parent d1c8328080
commit ab5fea9216
2 changed files with 18 additions and 2 deletions

View File

@ -74,4 +74,8 @@ class Pieces {
synchronized int donePieces() { synchronized int donePieces() {
done.cardinality() done.cardinality()
} }
synchronized boolean isDownloaded(int piece) {
done.get(piece)
}
} }

View File

@ -19,19 +19,31 @@ class ContentUploader extends Uploader {
private final File file private final File file
private final ContentRequest request private final ContentRequest request
private final Mesh mesh private final Mesh mesh
private final int pieceSize
ContentUploader(File file, ContentRequest request, Endpoint endpoint, Mesh mesh) { ContentUploader(File file, ContentRequest request, Endpoint endpoint, Mesh mesh, int pieceSize) {
super(endpoint) super(endpoint)
this.file = file this.file = file
this.request = request this.request = request
this.mesh = mesh this.mesh = mesh
this.pieceSize = pieceSize
} }
@Override @Override
void respond() { void respond() {
OutputStream os = endpoint.getOutputStream() OutputStream os = endpoint.getOutputStream()
Range range = request.getRange() Range range = request.getRange()
if (range.start >= file.length() || range.end >= file.length()) { boolean satisfiable = true
final long length = file.length()
if (range.start >= length || range.end >= length)
satisfiable = false
if (satisfiable) {
int startPiece = length / range.start
int endPiece = length / range.end
for (int i = startPiece; i < endPiece; i++)
satisfiable &= mesh.pieces.isDownloaded(i)
}
if (!satisfiable) {
os.write("416 Range Not Satisfiable\r\n".getBytes(StandardCharsets.US_ASCII)) os.write("416 Range Not Satisfiable\r\n".getBytes(StandardCharsets.US_ASCII))
writeMesh(request.downloader) writeMesh(request.downloader)
os.write("\r\n".getBytes(StandardCharsets.US_ASCII)) os.write("\r\n".getBytes(StandardCharsets.US_ASCII))