81 lines
1.6 KiB
Go
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(),
|
|
},
|
|
})
|
|
}
|