Allow HTTP range past EOF

Fixes #683
This commit is contained in:
Justine Tunney 2022-11-07 05:52:24 -08:00
parent 52f1db7220
commit 4de2cf34e6
No known key found for this signature in database
GPG key ID: BE714B4575D6E328
2 changed files with 20 additions and 5 deletions

View file

@ -77,8 +77,11 @@ bool ParseHttpRange(const char *p, size_t n, long resourcelength,
if (n) return false; if (n) return false;
if (start < 0) return false; if (start < 0) return false;
if (length < 1) return false; if (length < 1) return false;
if (start > resourcelength) return false;
if (__builtin_add_overflow(start, length, &ending)) return false; if (__builtin_add_overflow(start, length, &ending)) return false;
if (ending > resourcelength) return false; if (ending > resourcelength) {
length = resourcelength - start;
}
*out_start = start; *out_start = start;
*out_length = length; *out_length = length;
return true; return true;

View file

@ -46,7 +46,11 @@ TEST(ParseHttpRange, testEmptyRangeOfOneByteFile_itWorks) {
TEST(ParseHttpRange, testEmptyRangeOfEmptyFile_outOfRange) { TEST(ParseHttpRange, testEmptyRangeOfEmptyFile_outOfRange) {
long start, length; long start, length;
const char *s = "bytes=0-0"; const char *s = "bytes=0-0"; // requesting 1 byte, but have 0
EXPECT_TRUE(ParseHttpRange(s, strlen(s), 0, &start, &length));
EXPECT_EQ(0, start);
EXPECT_EQ(0, length);
s = "bytes=1-1"; // but this can't be truncated
EXPECT_FALSE(ParseHttpRange(s, strlen(s), 0, &start, &length)); EXPECT_FALSE(ParseHttpRange(s, strlen(s), 0, &start, &length));
EXPECT_EQ(0, start); EXPECT_EQ(0, start);
EXPECT_EQ(0, length); EXPECT_EQ(0, length);
@ -94,10 +98,10 @@ TEST(ParseHttpRange, testFromEnd) {
TEST(ParseHttpRange, testOutOfRange) { TEST(ParseHttpRange, testOutOfRange) {
long start, length; long start, length;
const char *s = "bytes=0-100"; const char *s = "bytes=0-100"; // requesting 101 bytes, but have 100
EXPECT_FALSE(ParseHttpRange(s, strlen(s), 100, &start, &length)); EXPECT_TRUE(ParseHttpRange(s, strlen(s), 100, &start, &length));
EXPECT_EQ(0, start); EXPECT_EQ(0, start);
EXPECT_EQ(0, length); EXPECT_EQ(100, length);
} }
TEST(ParseHttpRange, testInvalidRange) { TEST(ParseHttpRange, testInvalidRange) {
@ -131,3 +135,11 @@ TEST(ParseHttpRange, testMultipartRange_notImplemented) {
EXPECT_EQ(0, start); EXPECT_EQ(0, start);
EXPECT_EQ(0, length); EXPECT_EQ(0, length);
} }
TEST(ParseHttpRange, rangeTooLong_shortensToActualLength) {
long start, length;
const char *s = "bytes=0-134217727";
EXPECT_TRUE(ParseHttpRange(s, strlen(s), 1000, &start, &length));
EXPECT_EQ(0, start);
EXPECT_EQ(1000, length);
}