private Range getRange(final String[] values) throws MalformedInputException { try { return new Range(Long.parseLong(values[0].trim()), Long.parseLong(values[1].trim())); } catch (NumberFormatException e) { throw new MalformedInputException("Invalid range value, unable to parse numeric values " + e.getMessage()); } } }
String partHeader = serialize(new RangePartHeader(new Range(0L, 0L), boundary, contentType, 0L)); int partHeaderWithoutDigits = partHeader.length() - RANGE_DIGITS_LENGTH; partHeadersLength += NEW_LINE.length() + partHeaderWithoutDigits + Long.toString(range.getFrom()).length() + Long.toString(range.getTo()).length() + Long.toString(totalLength).length();
/** * Tells whether the ranges are satisfiable for the given stream length. * * @param ranges * @param streamLength * @return */ public boolean isSatisfiable(final Iterable<Range> ranges, final long streamLength) { for (Range range : ranges) { if (range.getTo() >= streamLength || !isRangeValid(range)) { return false; } } return true; } }
private String getRanges(final List<Range> ranges) { StringBuilder rangesString = new StringBuilder(); int counter = 0; for (Range range : ranges) { rangesString.append(range.getFrom()).append("-").append(range.getTo()); if (++counter < ranges.size()) { rangesString.append(","); } } return rangesString.toString(); } }
/** * {@inheritDoc} */ @Override public String serialize(final RangePartHeader input) { StringBuilder stringBuilder = new StringBuilder(); stringBuilder.append(DASH_DASH) .append(input.getBoundary()) .append(NEW_LINE) .append(Headers.HEADER_CONTENT_TYPE) .append(": ") .append(input.getContentType()) .append(NEW_LINE) .append(Headers.HEADER_CONTENT_RANGE) .append(": bytes ") .append(input.getRange().getFrom()) .append("-") .append(input.getRange().getTo()) .append("/") .append(input.getTotalLength()) .append(NEW_LINE) .append(NEW_LINE); return stringBuilder.toString(); }
@Test public void shouldNotBeSatisfiable() { assertThat(rangeHelper.isSatisfiable(Collections.singletonList(new Range(0, 0)), 0), is(false)); assertThat(rangeHelper.isSatisfiable(Collections.singletonList(new Range(0, 1)), 1), is(false)); assertThat(rangeHelper.isSatisfiable(Collections.singletonList(new Range(0, 2)), 1), is(false)); assertThat(rangeHelper.isSatisfiable(Collections.singletonList(new Range(-1, 0)), 0), is(false)); assertThat(rangeHelper.isSatisfiable(Collections.singletonList(new Range(-1, 0)), 55), is(false)); assertThat(rangeHelper.isSatisfiable(Collections.singletonList(new Range(50, 49)), 0), is(false)); }
@Test public void shouldParseMultipleValues() throws MalformedInputException { RangeParser rangeParser = new RangeParser(); List<Range> rageList = rangeParser.parse("bytes=1-100,200-301"); assertThat(rageList.size(), is(2)); assertThat(rageList.get(0).getFrom(), is(1L)); assertThat(rageList.get(0).getTo(), is(100L)); assertThat(rageList.get(1).getFrom(), is(200L)); assertThat(rageList.get(1).getTo(), is(301L)); }
@Test public void shouldComputeLength() { assertThat(rangeHelper.getRangeLength(new Range(0, 0)), is(1L)); assertThat(rangeHelper.getRangeLength(new Range(0, 10)), is(11L)); assertThat(rangeHelper.getRangeLength(new Range(2, 3)), is(2L)); assertThat(rangeHelper.getRangeLength(new Range(11, 12)), is(2L)); }
@Test public void shouldParseMultipleValuesSpaceSeparated() throws MalformedInputException { RangeParser rangeParser = new RangeParser(); List<Range> rageList = rangeParser.parse("bytes=1-100, 200-301"); assertThat(rageList.size(), is(2)); assertThat(rageList.get(0).getFrom(), is(1L)); assertThat(rageList.get(0).getTo(), is(100L)); assertThat(rageList.get(1).getFrom(), is(200L)); assertThat(rageList.get(1).getTo(), is(301L)); }
@Test public void shouldBeSatisfiable() { assertThat(rangeHelper.isSatisfiable(Collections.singletonList(new Range(0, 0)), 1), is(true)); assertThat(rangeHelper.isSatisfiable(Collections.singletonList(new Range(0, 1)), 2), is(true)); assertThat(rangeHelper.isSatisfiable(Collections.singletonList(new Range(0, 2)), 3), is(true)); }
@Test public void shouldParseBasicValue() throws MalformedInputException { RangeParser rangeParser = new RangeParser(); List<Range> rageList = rangeParser.parse("bytes=1-100"); assertThat(rageList.size(), is(1)); assertThat(rageList.get(0).getFrom(), is(1L)); assertThat(rageList.get(0).getTo(), is(100L)); }