diff options
| author | Shulhan <ms@kilabit.info> | 2024-04-24 15:09:33 +0700 |
|---|---|---|
| committer | Shulhan <ms@kilabit.info> | 2024-04-24 15:09:33 +0700 |
| commit | f5aa31cc48e78816d6eec75a03be4abdd7cb6649 (patch) | |
| tree | 8692e5e0b186407ec779b137397aa21fa81e790d /key_form_input.go | |
| parent | 9e7d6accdee5e0620bd9605d0cb225444671e1ce (diff) | |
| download | gorankusu-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.go | 80 |
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. |
