fix contentRangeRegexp to accept unknown total size (#4892)

This commit is contained in:
Milos Gajdos
2026-06-19 07:58:23 -07:00
committed by GitHub
2 changed files with 42 additions and 1 deletions

View File

@@ -19,7 +19,7 @@ import (
)
var (
contentRangeRegexp = regexp.MustCompile(`bytes ([0-9]+)-([0-9]+)/([0-9]+|\\*)`)
contentRangeRegexp = regexp.MustCompile(`^bytes ([0-9]+)-([0-9]+)/([0-9]+|\*)$`)
// ErrWrongCodeForByteRange is returned if the client sends a request
// with a Range header but the server returns a 2xx or 3xx code other

View File

@@ -145,3 +145,44 @@ func TestContentEncoding(t *testing.T) {
})
}
}
func TestSeekWithUnknownTotalSize(t *testing.T) {
t.Parallel()
content := make([]byte, 128)
rand.New(rand.NewSource(1)).Read(content)
s := httptest.NewServer(http.HandlerFunc(func(rw http.ResponseWriter, r *http.Request) {
// Respond to a range request with a 206 whose Content-Range
// reports an unknown complete length ("*"), as permitted by
// RFC 7233.
var start int
if _, err := fmt.Sscanf(r.Header.Get("Range"), "bytes=%d-", &start); err != nil || start < 0 || start > len(content) {
rw.WriteHeader(http.StatusBadRequest)
return
}
rw.Header().Set("Content-Range", fmt.Sprintf("bytes %d-%d/*", start, len(content)-1))
rw.Header().Set("Content-Length", fmt.Sprintf("%d", len(content)-start))
rw.WriteHeader(http.StatusPartialContent)
_, _ = rw.Write(content[start:])
}))
defer s.Close()
rs := NewHTTPReadSeeker(t.Context(), http.DefaultClient, s.URL, func(r *http.Response) error { return nil })
defer rs.Close()
const offset = 64
if _, err := rs.Seek(offset, io.SeekStart); err != nil {
t.Fatal(err)
}
b, err := io.ReadAll(rs)
if err != nil {
t.Fatal(err)
}
expected := content[offset:]
if !bytes.Equal(b, expected) {
t.Errorf("unexpected content: got %d bytes, expected %d", len(b), len(expected))
}
}