2022-02-13 18:51:38 +01:00

81 lines
1.6 KiB
Go

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(),
},
})
}