aboutsummaryrefslogtreecommitdiff
path: root/key_form_input.go
diff options
context:
space:
mode:
authorShulhan <ms@kilabit.info>2024-04-24 15:09:33 +0700
committerShulhan <ms@kilabit.info>2024-04-24 15:09:33 +0700
commitf5aa31cc48e78816d6eec75a03be4abdd7cb6649 (patch)
tree8692e5e0b186407ec779b137397aa21fa81e790d /key_form_input.go
parent9e7d6accdee5e0620bd9605d0cb225444671e1ce (diff)
downloadgorankusu-f5aa31cc48e78816d6eec75a03be4abdd7cb6649.tar.xz
all: refactoring form input for multipart form-data
This changes replace handling type for storing multipart form-data from "map[string][]byte" to [*multipart.Form] based on changes on module "pakakeh.go".
Diffstat (limited to 'key_form_input.go')
-rw-r--r--key_form_input.go80
1 files changed, 56 insertions, 24 deletions
diff --git a/key_form_input.go b/key_form_input.go
index 61cbe41..7a0c571 100644
--- a/key_form_input.go
+++ b/key_form_input.go
@@ -4,11 +4,14 @@
package gorankusu
import (
+ "fmt"
+ "mime/multipart"
"net/http"
"net/url"
"strconv"
"strings"
+ libhttp "git.sr.ht/~shulhan/pakakeh.go/lib/http"
"git.sr.ht/~shulhan/pakakeh.go/lib/math/big"
)
@@ -69,38 +72,67 @@ func (kfi KeyFormInput) ToJSONObject() (data map[string]interface{}) {
return data
}
-// ToMultipartFormData convert the KeyFormInput into map of string and raw
-// bytes.
-func (kfi KeyFormInput) ToMultipartFormData() (data map[string][]byte) {
- data = make(map[string][]byte, len(kfi))
+// ToMultipartFormData convert the KeyFormInput into [*multipart.Form].
+func (kfi KeyFormInput) ToMultipartFormData() (data *multipart.Form, err error) {
+ var logp = `ToMultipartFormData`
+
+ data = &multipart.Form{
+ Value: map[string][]string{},
+ File: map[string][]*multipart.FileHeader{},
+ }
if len(kfi) == 0 {
- return data
+ return data, nil
}
- for k, fi := range kfi {
- if fi.Kind == FormInputKindFile {
- var name string
- if len(fi.Filename) != 0 {
- name = fi.FormDataName(FormDataFilename)
- data[name] = []byte(fi.Filename)
- }
- if len(fi.Filetype) != 0 {
- name = fi.FormDataName(FormDataFiletype)
- data[name] = []byte(fi.Filetype)
- }
- name = fi.FormDataName(FormDataFilesize)
- data[name] = []byte(strconv.FormatInt(fi.Filesize, 10))
+ var (
+ k string
+ fi FormInput
+ listValue []string
+ )
+ for k, fi = range kfi {
+ if fi.Kind != FormInputKindFile {
+ listValue = data.Value[k]
+ listValue = append(listValue, fi.Value)
+ data.Value[k] = listValue
+ continue
+ }
+
+ // Process form with type File.
- name = fi.FormDataName(FormDataFilemodms)
- data[name] = []byte(strconv.FormatInt(fi.Filemodms, 10))
+ var (
+ filename string
+ fieldname string
+ )
- name = fi.FormDataName(FormDataFilecontent)
- data[name] = []byte(fi.Value)
+ if len(fi.Filename) != 0 {
+ filename = fi.Filename
} else {
- data[k] = []byte(fi.Value)
+ filename = k
}
+
+ if len(fi.Filetype) != 0 {
+ fieldname = fi.FormDataName(FormDataFiletype)
+ data.Value[fieldname] = []string{fi.Filetype}
+ }
+
+ fieldname = fi.FormDataName(FormDataFilesize)
+ data.Value[fieldname] = []string{strconv.FormatInt(fi.Filesize, 10)}
+
+ fieldname = fi.FormDataName(FormDataFilemodms)
+ data.Value[fieldname] = []string{strconv.FormatInt(fi.Filemodms, 10)}
+
+ var fh *multipart.FileHeader
+
+ fh, err = libhttp.CreateMultipartFileHeader(filename, []byte(fi.Value))
+ if err != nil {
+ return nil, fmt.Errorf(`%s: %w`, logp, err)
+ }
+
+ var listFH = data.File[k]
+ listFH = append(listFH, fh)
+ data.File[k] = listFH
}
- return data
+ return data, nil
}
// ToURLValues convert the KeyFormInput to the standard url.Values.