gateway: custom seeker for files
License: MIT Signed-off-by: Łukasz Magiera <magik6k@gmail.com>
Łukasz Magiera committed
Oct 18, 2017 at 22:25 UTC
3fbb77153b676c773dd12821cf46be1ed351f65f
2 files changed
+31
core/corehttp/gateway_handler.go
+24
@@ -372,7 +372,31 @@ func (i *gatewayHandler) getOrHeadHandler(ctx context.Context, w http.ResponseWr
372
}
373
}
374
375
+type sizeReadSeeker interface {
376
+ Size() uint64
377
+
378
+ io.ReadSeeker
379
+}
380
+
381
+type sizeSeeker struct {
382
+ sizeReadSeeker
383
+}
384
+
385
+func (s *sizeSeeker) Seek(offset int64, whence int) (int64, error) {
386
+ if whence == io.SeekEnd && offset == 0 {
387
+ return int64(s.Size()), nil
388
+ }
389
+
390
+ return s.sizeReadSeeker.Seek(offset, whence)
391
+}
392
+
393
func (i *gatewayHandler) serverFile(w http.ResponseWriter, req *http.Request, name string, modtime time.Time, content io.ReadSeeker) {
394
+ if sp, ok := content.(sizeReadSeeker); ok {
395
+ content = &sizeSeeker{
396
+ sizeReadSeeker: sp,
397
+ }
398
+ }
399
+
400
http.ServeContent(w, req, name, modtime, content)
401
//TODO: check for errors in ServeContent.. somehow
402
unixfs/io/pbdagreader.go
+7
@@ -188,6 +188,9 @@ func (dr *pbDagReader) Seek(offset int64, whence int) (int64, error) {
188
if offset < 0 {
189
return -1, errors.New("Invalid offset")
190
}
191
+ if offset == dr.offset {
192
+ return offset, nil
193
+ }
194
195
// Grab cached protobuf object (solely to make code look cleaner)
196
pb := dr.pbdata
@@ -239,6 +242,10 @@ func (dr *pbDagReader) Seek(offset int64, whence int) (int64, error) {
242
return offset, nil
243
case io.SeekCurrent:
244
// TODO: be smarter here
245
+ if offset == 0 {
246
+ return dr.offset, nil
247
+ }
248
+
249
noffset := dr.offset + offset
250
return dr.Seek(noffset, io.SeekStart)
251
case io.SeekEnd: