Improve Range handling.

* allowing to GET last n bytes.
* start from GET range now spec conform (to field empty instead of Long.MAX_VALUE)
This commit is contained in:
Sebastian Annies 2011-08-09 16:15:54 +02:00
parent 46a42c22d8
commit 5843d5fee9
6 changed files with 55 additions and 7 deletions

View File

@ -51,11 +51,11 @@ public class BlobToHttpGetOptions implements Function<org.jclouds.blobstore.opti
httpOptions.ifUnmodifiedSince(from.getIfUnmodifiedSince());
}
for (String range : from.getRanges()) {
String[] firstLast = range.split("\\-");
if (firstLast.length == 2)
String[] firstLast = range.split("\\-", 2);
if (!firstLast[0].isEmpty() && !firstLast[1].isEmpty())
httpOptions.range(Long.parseLong(firstLast[0]), Long.parseLong(firstLast[1]));
else if (range.startsWith("-"))
httpOptions.tail(Long.parseLong(firstLast[0]));
else if (firstLast[0].isEmpty() && !firstLast[1].isEmpty())
httpOptions.tail(Long.parseLong(firstLast[1]));
else
httpOptions.startAt(Long.parseLong(firstLast[0]));
}

View File

@ -72,6 +72,16 @@ public class GetOptions {
return this;
}
/**
* download the specified range of the object starting from the end of the object.
*/
public GetOptions tail(long length) {
checkArgument(length >= 0, "length must be >= 0");
getRanges().add(String.format("-%d", length));
return this;
}
/**
* Only return the object if it has changed since this time.
* <p />

View File

@ -103,6 +103,29 @@ public class BlobToHttpGetOptionsTest {
assertEquals(fn.apply(in), expected);
}
@Test
public void testRangesTail(){
org.jclouds.blobstore.options.GetOptions in = new org.jclouds.blobstore.options.GetOptions();
in.tail(1024);
GetOptions expected = new GetOptions();
expected.tail(1024);
assertEquals(fn.apply(in), expected);
}
@Test
public void testRangesStart(){
org.jclouds.blobstore.options.GetOptions in = new org.jclouds.blobstore.options.GetOptions();
in.startAt(1024);
GetOptions expected = new GetOptions();
expected.startAt(1024);
assertEquals(fn.apply(in), expected);
}
@Test(expectedExceptions = { NullPointerException.class, IllegalStateException.class })
public void testNullIsBad() {

View File

@ -136,6 +136,21 @@ public class GetOptionsTest {
assertEquals(options.getRanges(), ImmutableList.of("0-5", "10-100"));
}
@Test
public void testRangeStartAt() {
GetOptions options = new GetOptions();
options.startAt(5);
assertEquals(options.getRanges(), ImmutableList.of("5-"));
}
@Test
public void testRangeTail() {
GetOptions options = new GetOptions();
options.tail(5);
assertEquals(options.getRanges(), ImmutableList.of("-5"));
}
@Test
public void testNoRange() {
GetOptions options = new GetOptions();

View File

@ -80,7 +80,7 @@ public class GetOptions extends BaseHttpRequestOptions {
*/
public GetOptions startAt(long start) {
checkArgument(start >= 0, "start must be >= 0");
ranges.add(String.format("%d-%d", start, Long.MAX_VALUE));
ranges.add(String.format("%d-", start));
return this;
}

View File

@ -155,13 +155,13 @@ public class GetOptionsTest {
public void testStartAt() {
GetOptions options = new GetOptions();
options.startAt(100);
assertEquals(options.getRange(), "bytes=100-9223372036854775807");
assertEquals(options.getRange(), "bytes=100-");
}
@Test
public void testStartAtStatic() {
GetOptions options = startAt(100);
assertEquals(options.getRange(), "bytes=100-9223372036854775807");
assertEquals(options.getRange(), "bytes=100-");
}
@Test(expectedExceptions = IllegalArgumentException.class)