diff options
Diffstat (limited to 'internal/httprange/http_reader.go')
-rw-r--r-- | internal/httprange/http_reader.go | 23 |
1 files changed, 7 insertions, 16 deletions
diff --git a/internal/httprange/http_reader.go b/internal/httprange/http_reader.go index 467256a0..589351fa 100644 --- a/internal/httprange/http_reader.go +++ b/internal/httprange/http_reader.go @@ -18,15 +18,12 @@ var ( ErrNotFound = errors.New("resource not found") // ErrRangeRequestsNotSupported is returned by Seek and Read - // when the remote server does not allow range requests (Accept-Ranges was not set) - ErrRangeRequestsNotSupported = errors.New("range requests are not supported by the remote server") + // when the remote server does not allow range requests for a given request parameters + ErrRangeRequestsNotSupported = errors.New("requests range is not supported by the remote server") // ErrInvalidRange is returned by Read when trying to read past the end of the file ErrInvalidRange = errors.New("invalid range") - // ErrContentHasChanged is returned by Read when the content has changed since the first request - ErrContentHasChanged = errors.New("content has changed since first request") - // seek errors no need to export them errSeekInvalidWhence = errors.New("invalid whence") errSeekOutsideRange = errors.New("outside of range") @@ -106,21 +103,12 @@ func (r *Reader) prepareRequest() (*http.Request, error) { return nil, ErrInvalidRange } - req, err := http.NewRequest("GET", r.Resource.URL, nil) + req, err := r.Resource.Request() if err != nil { return nil, err } req = req.WithContext(r.ctx) - - if r.Resource.ETag != "" { - req.Header.Set("ETag", r.Resource.ETag) - } else if r.Resource.LastModified != "" { - // Last-Modified should be a fallback mechanism in case ETag is not present - // https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Last-Modified - req.Header.Set("If-Range", r.Resource.LastModified) - } - req.Header.Set("Range", fmt.Sprintf("bytes=%d-%d", r.offset, r.rangeStart+r.rangeSize-1)) return req, nil @@ -133,14 +121,17 @@ func (r *Reader) setResponse(res *http.Response) error { // some servers return 200 OK for bytes=0- // TODO: should we handle r.Resource.Last-Modified as well? if r.offset > 0 || r.Resource.ETag != "" && r.Resource.ETag != res.Header.Get("ETag") { - return ErrContentHasChanged + r.Resource.setError(ErrRangeRequestsNotSupported) + return ErrRangeRequestsNotSupported } case http.StatusNotFound: + r.Resource.setError(ErrNotFound) return ErrNotFound case http.StatusPartialContent: // Requested `Range` request succeeded https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/206 break case http.StatusRequestedRangeNotSatisfiable: + r.Resource.setError(ErrRangeRequestsNotSupported) return ErrRangeRequestsNotSupported default: return fmt.Errorf("httprange: read response %d: %q", res.StatusCode, res.Status) |