diff --git a/spring-web/src/main/java/org/springframework/http/HttpRange.java b/spring-web/src/main/java/org/springframework/http/HttpRange.java index e3f565abd9..3c35ad6d2d 100644 --- a/spring-web/src/main/java/org/springframework/http/HttpRange.java +++ b/spring-web/src/main/java/org/springframework/http/HttpRange.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2018 the original author or authors. + * Copyright 2002-2019 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -62,24 +62,11 @@ public abstract class HttpRange { Assert.isTrue(resource.getClass() != InputStreamResource.class, "Cannot convert an InputStreamResource to a ResourceRegion"); long contentLength = getLengthFor(resource); - Assert.isTrue(contentLength > 0, "Resource content length should be > 0"); long start = getRangeStart(contentLength); long end = getRangeEnd(contentLength); return new ResourceRegion(resource, start, end - start + 1); } - private static long getLengthFor(Resource resource) { - long contentLength; - try { - contentLength = resource.contentLength(); - Assert.isTrue(contentLength > 0, "Resource content length should be > 0"); - } - catch (IOException ex) { - throw new IllegalArgumentException("Failed to obtain Resource content length", ex); - } - return contentLength; - } - /** * Return the start of the range given the total length of a representation. * @param length the length of the representation @@ -131,8 +118,8 @@ public abstract class HttpRange { *

This method can be used to parse an {@code Range} header. * @param ranges the string to parse * @return the list of ranges - * @throws IllegalArgumentException if the string cannot be parsed, or if - * the number of ranges is greater than 100. + * @throws IllegalArgumentException if the string cannot be parsed + * or if the number of ranges is greater than 100 */ public static List parseRanges(String ranges) { if (!StringUtils.hasLength(ranges)) { @@ -144,7 +131,9 @@ public abstract class HttpRange { ranges = ranges.substring(BYTE_RANGE_PREFIX.length()); String[] tokens = StringUtils.tokenizeToStringArray(ranges, ","); - Assert.isTrue(tokens.length <= MAX_RANGES, "Too many ranges " + tokens.length); + if (tokens.length > MAX_RANGES) { + throw new IllegalArgumentException("Too many ranges: " + tokens.length); + } List result = new ArrayList(tokens.length); for (String token : tokens) { result.add(parseRange(token)); @@ -158,7 +147,7 @@ public abstract class HttpRange { if (dashIdx > 0) { long firstPos = Long.parseLong(range.substring(0, dashIdx)); if (dashIdx < range.length() - 1) { - Long lastPos = Long.parseLong(range.substring(dashIdx + 1, range.length())); + Long lastPos = Long.parseLong(range.substring(dashIdx + 1)); return new ByteRange(firstPos, lastPos); } else { @@ -180,9 +169,8 @@ public abstract class HttpRange { * @param ranges the list of ranges * @param resource the resource to select the regions from * @return the list of regions for the given resource + * @throws IllegalArgumentException if the sum of all ranges exceeds the resource length * @since 4.3 - * @throws IllegalArgumentException if the sum of all ranges exceeds the - * resource length. */ public static List toResourceRegions(List ranges, Resource resource) { if (CollectionUtils.isEmpty(ranges)) { @@ -198,12 +186,25 @@ public abstract class HttpRange { for (ResourceRegion region : regions) { total += region.getCount(); } - Assert.isTrue(total < length, "The sum of all ranges (" + total + ") " + - "should be less than the resource length (" + length + ")"); + if (total >= length) { + throw new IllegalArgumentException("The sum of all ranges (" + total + + ") should be less than the resource length (" + length + ")"); + } } return regions; } + private static long getLengthFor(Resource resource) { + try { + long contentLength = resource.contentLength(); + Assert.isTrue(contentLength > 0, "Resource content length should be > 0"); + return contentLength; + } + catch (IOException ex) { + throw new IllegalArgumentException("Failed to obtain Resource content length", ex); + } + } + /** * Return a string representation of the given list of {@code HttpRange} objects. *

This method can be used to for an {@code Range} header.