package httprange
import (
)
var _ interface {
io.ReaderAt
io.Reader
io.Seeker
io.Closer
} = (*BytesResourceReader)(nil)
type BytesResource struct {
Length int64
Ranger Ranger
}
func ( *BytesResource) ( context.Context) *BytesResourceReader {
, := context.WithCancelCause()
:= &BytesReader{
Context: ,
Ranger: .Ranger,
}
return &BytesResourceReader{
Reader: ,
Cancel: ,
Length: .Length,
}
}
type BytesResourceReader struct {
Reader io.ReaderAt
Cancel context.CancelCauseFunc
Length int64
Offset int64
}
func ( *BytesResourceReader) ( []byte, int64) (int, error) {
if < 0 {
return 0, errors.New("httprange: negative read offset")
}
if >= .Length {
return 0, io.EOF
}
, := .slice(, )
, := .Reader.ReadAt(, )
switch {
case && == nil:
= io.EOF
case ! && == io.EOF:
= io.ErrUnexpectedEOF
}
return ,
}
func ( *BytesResourceReader) ( []byte, int64) ([]byte, bool) {
:= .Length -
if int64(len()) > {
return [:], true
}
return , int64(len()) ==
}
func ( *BytesResourceReader) ( []byte) (int, error) {
, := .ReadAt(, .Offset)
.Offset += int64()
return ,
}
func ( *BytesResourceReader) ( int64, int) (int64, error) {
switch {
case io.SeekStart:
case io.SeekCurrent:
+= .Offset
case io.SeekEnd:
+= .Length
default:
return 0, errors.New("httprange: invalid seek whence")
}
if < 0 || > .Length {
return 0, errors.New("httprange: invalid seek offset")
}
.Offset =
return , nil
}
func ( *BytesResourceReader) () error {
.Cancel(errBytesResourceReaderClosed)
return nil
}