func (r *HttpReadSeeker) Read(p []byte) (n int, err error) {
	if r.r == nil {
		err = r.rangeRequest()
	}
	if r.r != nil {
		n, err = r.r.Read(p)
		r.pos += int64(n)
	}
	return
}
Read reads from the response body. It does a range request if Seek was called before.

May return ErrRangeRequestsNotSupported, ErrInvalidRange or ErrContentHasChanged
package httprs
import (
	"context"
	"errors"
	"fmt"
	"io"
	"io/ioutil"
	"net/http"
	"github.com/mitchellh/copystructure"
)
const shortSeekBytes = 1024
type HttpReadSeeker struct {
	c       *http.Client
	req     *http.Request
	res     *http.Response
	ctx     context.Context
	r       io.ReadCloser
	pos     int64
	canSeek bool
	Requests int
}
var _ io.ReadCloser = (*HttpReadSeeker)(nil)
var _ io.Seeker = (*HttpReadSeeker)(nil)
var (
	ErrNoContentLength = errors.New("Content-Length was not set")
	ErrRangeRequestsNotSupported = errors.New("Range requests are not supported by the remote server")
	ErrInvalidRange = errors.New("Invalid range")
	ErrContentHasChanged = errors.New("Content has changed since first request")
)
func NewHttpReadSeeker(res *http.Response, client ...*http.Client) *HttpReadSeeker {
	r := &HttpReadSeeker{
		req:     res.Request,
		ctx:     res.Request.Context(),
		res:     res,
		r:       res.Body,
		canSeek: (res.Header.Get("Accept-Ranges") == "bytes"),
	}
	if len(client) > 0 {
		r.c = client[0]
	} else {
		r.c = http.DefaultClient
	}
	return r
}
func (r *HttpReadSeeker) Clone() (*HttpReadSeeker, error) {
	req, err := copystructure.Copy(r.req)
	if err != nil {
		return nil, err
	}
	return &HttpReadSeeker{
		req:     req.(*http.Request),
		res:     r.res,
		r:       nil,
		canSeek: r.canSeek,
		c:       r.c,
	}, nil
}