yaxc/internal/server/request_post.go

71 lines
1.6 KiB
Go
Raw Normal View History

2021-03-24 23:11:23 +08:00
package server
import (
2021-03-25 21:25:51 +08:00
"errors"
2021-03-26 18:18:40 +08:00
"fmt"
2021-03-25 21:11:01 +08:00
"github.com/darmiel/yaxc/internal/common"
2021-03-24 23:11:23 +08:00
"github.com/gofiber/fiber/v2"
2021-03-26 18:18:40 +08:00
"strings"
2021-03-24 23:11:23 +08:00
"time"
)
2021-03-25 21:25:51 +08:00
var errEncryptionNotEnabled = errors.New("encryption not enabled")
2021-03-24 23:11:23 +08:00
func (s *yAxCServer) handlePostAnywhere(ctx *fiber.Ctx) (err error) {
2021-03-26 18:18:40 +08:00
path := strings.TrimSpace(ctx.Params("anywhere"))
2021-03-24 23:11:23 +08:00
2021-03-27 23:42:28 +08:00
// validate path
if !common.ValidateAnywherePath(path) {
return ctx.Status(400).SendString("ERROR: Invalid path")
}
2021-03-25 21:11:01 +08:00
// Read content
2021-03-24 23:11:23 +08:00
bytes := ctx.Body()
2021-03-24 23:33:28 +08:00
if s.MaxBodyLength > 0 && len(bytes) > s.MaxBodyLength {
2021-03-24 23:11:23 +08:00
return s.errBodyLen
}
content := string(bytes)
2021-03-25 21:11:01 +08:00
// TTL
2021-03-24 23:11:23 +08:00
ttl := s.DefaultTTL
if q := ctx.Query("ttl"); q != "" {
if ttl, err = time.ParseDuration(q); err != nil {
return
}
}
2021-03-25 21:11:01 +08:00
// Encryption
if q := ctx.Query("secret"); q != "" {
2021-03-25 21:25:51 +08:00
if !s.EnableEncryption {
return errEncryptionNotEnabled
}
2021-03-25 21:11:01 +08:00
// fail on error
encrypt, err := common.Encrypt(content, q)
if err != nil {
return err
}
content = string(encrypt)
}
// Check if ttl is valid
2021-03-24 23:33:28 +08:00
if (s.MinTTL != 0 && s.MinTTL > ttl) || (s.MaxTTL != 0 && s.MaxTTL < ttl) {
2021-03-24 23:11:23 +08:00
return ctx.Status(400).SendString("ERROR: TTL out of range")
}
2021-03-26 20:26:25 +08:00
hash := common.MD5Hash(content)
2021-03-26 18:18:40 +08:00
2021-03-25 21:11:01 +08:00
// Set contents
2021-03-26 18:18:40 +08:00
errVal := s.Backend.Set(path, content, ttl)
errHsh := s.Backend.SetHash(path, hash, ttl)
2021-03-24 23:11:23 +08:00
2021-03-26 18:18:40 +08:00
if errVal != nil || errHsh != nil {
2021-03-26 20:26:25 +08:00
log.Warning("ERROR saving Value / MD5Hash:", errVal, errHsh)
2021-03-27 23:42:28 +08:00
return ctx.Status(500).SendString(
2021-03-26 18:18:40 +08:00
fmt.Sprintf("ERROR (Val): %v\nERROR (Hsh): %v", errVal, errHsh))
2021-03-25 21:11:01 +08:00
}
log.Debug(ctx.IP(), "updated", path, "with hash", hash)
2021-03-24 23:11:23 +08:00
return ctx.Status(200).SendString(content)
2021-03-24 23:11:23 +08:00
}