@cryptotaxi247 / kubo / commits / 3fbb77153

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: