package api import ( "bytes" "crypto/sha1" "encoding/hex" "io" "net/http" "os" "path/filepath" "github.com/gin-gonic/gin" ) var CHUNK_SIZE int64 = 1 << 20 func (s *Service) PrepareStore() { d, err := os.Stat(s.Config.StorePath) if err != nil { s.LogErr.Fatal("Store", err) } if !d.IsDir() { s.LogErr.Fatal("Store", ErrStorePathNotADirectory) } } func (s *Service) FileCreate(c *gin.Context) { var originalChecksum = c.Param("original_checksum") c.JSON(http.StatusOK, gin.H{ "original_checksum": originalChecksum, }) } func (s *Service) FileChunk(c *gin.Context) { var ( originalChecksum = c.Param("original_checksum") part = c.Param("part") partChecksum = c.Param("part_checksum") ) if len(originalChecksum) != 40 || len(partChecksum) != 40 { s.Error(c, http.StatusBadRequest, ErrStoreBadChecksum) return } if c.Request.ContentLength > CHUNK_SIZE { s.Error(c, http.StatusBadRequest, ErrStoreBadChunkSize) return } b := bytes.NewBuffer([]byte{}) io.Copy(b, c.Request.Body) c.Request.Body.Close() f, err := os.Create(filepath.Join(s.Config.StorePath, "test")) if err != nil { s.Error(c, http.StatusInternalServerError, err) return } f.Write(b.Bytes()) f.Close() sum := sha1.New() sum.Write(b.Bytes()) r := hex.EncodeToString(sum.Sum(nil)) if partChecksum != r { s.Error(c, http.StatusBadRequest, ErrStoreWrongPartChecksum) return } c.JSON(http.StatusOK, gin.H{ "original_checksum": originalChecksum, "part": part, "part_checksum": partChecksum, "body": gin.H{ "checksum": r, "size": b.Len(), }, }) }