reflector.go/server/http/routes.go

86 lines
2 KiB
Go
Raw Normal View History

2021-05-21 05:49:02 +02:00
package http
import (
"net/http"
"sync"
"time"
2021-05-21 05:49:02 +02:00
"github.com/gin-gonic/gin"
"github.com/lbryio/lbry.go/v2/extras/errors"
"github.com/lbryio/reflector.go/shared"
2021-05-21 19:09:02 +02:00
"github.com/lbryio/reflector.go/internal/metrics"
2021-05-21 05:49:02 +02:00
"github.com/lbryio/reflector.go/store"
)
func (s *Server) getBlob(c *gin.Context) {
waiter := &sync.WaitGroup{}
waiter.Add(1)
enqueue(&blobRequest{c: c, finished: waiter})
waiter.Wait()
}
func (s *Server) HandleGetBlob(c *gin.Context) {
start := time.Now()
2021-05-21 05:49:02 +02:00
hash := c.Query("hash")
if s.missesCache.Has(hash) {
serialized, err := shared.NewBlobTrace(time.Since(start), "http").Serialize()
if err != nil {
_ = c.AbortWithError(http.StatusInternalServerError, errors.Err(err))
return
}
c.Header("Via", serialized)
c.AbortWithStatus(http.StatusNotFound)
return
}
2021-05-21 05:49:02 +02:00
blob, trace, err := s.store.Get(hash)
if err != nil {
serialized, serializeErr := trace.Serialize()
if serializeErr != nil {
_ = c.AbortWithError(http.StatusInternalServerError, errors.Prefix(serializeErr.Error(), err))
return
}
c.Header("Via", serialized)
if errors.Is(err, store.ErrBlobNotFound) {
_ = s.missesCache.Set(hash, true)
2021-05-21 05:49:02 +02:00
c.AbortWithStatus(http.StatusNotFound)
return
}
_ = c.AbortWithError(http.StatusInternalServerError, err)
return
}
serialized, err := trace.Serialize()
if err != nil {
_ = c.AbortWithError(http.StatusInternalServerError, err)
return
}
2021-05-21 19:09:02 +02:00
metrics.MtrOutBytesHttp.Add(float64(len(blob)))
metrics.BlobDownloadCount.Inc()
metrics.HttpDownloadCount.Inc()
2021-05-21 05:49:02 +02:00
c.Header("Via", serialized)
c.Header("Content-Disposition", "filename="+hash)
c.Data(http.StatusOK, "application/octet-stream", blob)
}
func (s *Server) hasBlob(c *gin.Context) {
hash := c.Query("hash")
has, err := s.store.Has(hash)
if err != nil {
_ = c.AbortWithError(http.StatusInternalServerError, err)
return
}
if has {
c.Status(http.StatusNoContent)
return
}
c.Status(http.StatusNotFound)
}
2021-06-12 00:56:57 +02:00
func (s *Server) recoveryHandler(c *gin.Context, err interface{}) {
c.JSON(500, gin.H{
"title": "Error",
"err": err,
})
}