mirror of
https://github.com/ipfs/kubo.git
synced 2025-07-04 13:27:14 +08:00
gateway: custom seeker for files
License: MIT Signed-off-by: Łukasz Magiera <magik6k@gmail.com>
This commit is contained in:
@ -372,7 +372,31 @@ func (i *gatewayHandler) getOrHeadHandler(ctx context.Context, w http.ResponseWr
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type sizeReadSeeker interface {
|
||||||
|
Size() uint64
|
||||||
|
|
||||||
|
io.ReadSeeker
|
||||||
|
}
|
||||||
|
|
||||||
|
type sizeSeeker struct {
|
||||||
|
sizeReadSeeker
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *sizeSeeker) Seek(offset int64, whence int) (int64, error) {
|
||||||
|
if whence == io.SeekEnd && offset == 0 {
|
||||||
|
return int64(s.Size()), nil
|
||||||
|
}
|
||||||
|
|
||||||
|
return s.sizeReadSeeker.Seek(offset, whence)
|
||||||
|
}
|
||||||
|
|
||||||
func (i *gatewayHandler) serverFile(w http.ResponseWriter, req *http.Request, name string, modtime time.Time, content io.ReadSeeker) {
|
func (i *gatewayHandler) serverFile(w http.ResponseWriter, req *http.Request, name string, modtime time.Time, content io.ReadSeeker) {
|
||||||
|
if sp, ok := content.(sizeReadSeeker); ok {
|
||||||
|
content = &sizeSeeker{
|
||||||
|
sizeReadSeeker: sp,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
http.ServeContent(w, req, name, modtime, content)
|
http.ServeContent(w, req, name, modtime, content)
|
||||||
//TODO: check for errors in ServeContent.. somehow
|
//TODO: check for errors in ServeContent.. somehow
|
||||||
|
|
||||||
|
@ -188,6 +188,9 @@ func (dr *pbDagReader) Seek(offset int64, whence int) (int64, error) {
|
|||||||
if offset < 0 {
|
if offset < 0 {
|
||||||
return -1, errors.New("Invalid offset")
|
return -1, errors.New("Invalid offset")
|
||||||
}
|
}
|
||||||
|
if offset == dr.offset {
|
||||||
|
return offset, nil
|
||||||
|
}
|
||||||
|
|
||||||
// Grab cached protobuf object (solely to make code look cleaner)
|
// Grab cached protobuf object (solely to make code look cleaner)
|
||||||
pb := dr.pbdata
|
pb := dr.pbdata
|
||||||
@ -239,6 +242,10 @@ func (dr *pbDagReader) Seek(offset int64, whence int) (int64, error) {
|
|||||||
return offset, nil
|
return offset, nil
|
||||||
case io.SeekCurrent:
|
case io.SeekCurrent:
|
||||||
// TODO: be smarter here
|
// TODO: be smarter here
|
||||||
|
if offset == 0 {
|
||||||
|
return dr.offset, nil
|
||||||
|
}
|
||||||
|
|
||||||
noffset := dr.offset + offset
|
noffset := dr.offset + offset
|
||||||
return dr.Seek(noffset, io.SeekStart)
|
return dr.Seek(noffset, io.SeekStart)
|
||||||
case io.SeekEnd:
|
case io.SeekEnd:
|
||||||
|
Reference in New Issue
Block a user