64 lines
1.2 KiB
Go
64 lines
1.2 KiB
Go
package main
|
|
|
|
import (
|
|
"io/ioutil"
|
|
"net/http"
|
|
"strings"
|
|
)
|
|
|
|
const formFieldName = "file"
|
|
const maxMemory int64 = 1024 * 1024 * 64
|
|
|
|
const ImageSourceTypeBody ImageSourceType = "payload"
|
|
|
|
type BodyImageSource struct {
|
|
Config *SourceConfig
|
|
}
|
|
|
|
func NewBodyImageSource(config *SourceConfig) ImageSource {
|
|
return &BodyImageSource{config}
|
|
}
|
|
|
|
func (s *BodyImageSource) Matches(r *http.Request) bool {
|
|
return r.Method == http.MethodPost || r.Method == http.MethodPut
|
|
}
|
|
|
|
func (s *BodyImageSource) GetImage(r *http.Request) ([]byte, error) {
|
|
if isFormBody(r) {
|
|
return readFormBody(r)
|
|
}
|
|
return readRawBody(r)
|
|
}
|
|
|
|
func isFormBody(r *http.Request) bool {
|
|
return strings.HasPrefix(r.Header.Get("Content-Type"), "multipart/")
|
|
}
|
|
|
|
func readFormBody(r *http.Request) ([]byte, error) {
|
|
err := r.ParseMultipartForm(maxMemory)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
file, _, err := r.FormFile(formFieldName)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
defer file.Close()
|
|
|
|
buf, err := ioutil.ReadAll(file)
|
|
if len(buf) == 0 {
|
|
err = ErrEmptyBody
|
|
}
|
|
|
|
return buf, err
|
|
}
|
|
|
|
func readRawBody(r *http.Request) ([]byte, error) {
|
|
return ioutil.ReadAll(r.Body)
|
|
}
|
|
|
|
func init() {
|
|
RegisterSource(ImageSourceTypeBody, NewBodyImageSource)
|
|
}
|