@Test public void shouldReturnLengthForASingeRange() { Range range = new Range(333L, 1234L); String boundary = "BBBOOUUNNNDDAARRYY"; String contentType = "application/pdf"; long totalLength = 12345L; long computedLength = rangePartHeaderSerializer.getPartHeadersLength(Collections.singletonList(range), boundary, contentType, totalLength); assertThat(computedLength, is(0L)); }
@Test public void shouldReturnLengthForMultipleRanges() { Range range = new Range(333L, 1234L); String boundary = "BBBOOUUNNNDDAARRYY"; String contentType = "application/pdf"; long totalLength = 12345L; RangePartHeader rangePartHeader = new RangePartHeader(range, boundary, contentType, totalLength); String serialized = rangePartHeaderSerializer.serialize(rangePartHeader); long serializedLength = serialized.length(); long computedLength = rangePartHeaderSerializer.getPartHeadersLength(Arrays.asList(range, range), boundary, contentType, totalLength); long firstLineLength = "\r\n".length(); long lastLineLength = ("\r\n--" + boundary + "--\r\n\r\n").length(); assertThat(computedLength, is(firstLineLength + 2 * serializedLength + lastLineLength)); } }
public byte[] getSliceForRanges(byte[] input, List<Range> ranges) { long totalLength = rangeHelper.getTotalLength(ranges); long headersPartLength = rangePartHeaderSerializer.getPartHeadersLength(ranges, BOUNDARY, CONTENT_TYPE, TOTAL_LENGTH); byte[] output = new byte[(int) (totalLength + headersPartLength)]; random.nextBytes(output); int destPos = 0; for (Range range : ranges) { if (ranges.size() > 1) { destPos += appendRangePartHeader(output, destPos, range); } destPos += appendRangeSlice(input, output, destPos, range); } if (ranges.size() > 1) { appendLastBoundaryDeliminator(output, destPos); } return output; }
} else { boundary = StringUtilities.generateRandom(); response.setContentLength(rangePartHeaderSerializer.getPartHeadersLength(ranges, boundary, contentType, file.length()) + rangeLength);