gin/binding/multipart_form.go

57 lines
1.2 KiB
Go

// Copyright 2026 Gin Core Team. All rights reserved.
// Use of this source code is governed by a MIT style
// license that can be found in the LICENSE file.
package binding
import (
"errors"
"mime"
"net/http"
"net/url"
)
func parseMultipartForm(req *http.Request, maxMemory int64) error {
err := req.ParseMultipartForm(maxMemory)
if err == nil || !errors.Is(err, http.ErrNotMultipart) {
return err
}
mediaType, _, parseErr := mime.ParseMediaType(req.Header.Get("Content-Type"))
if parseErr != nil || mediaType != MIMEMultipartMixed {
return err
}
reader, readerErr := req.MultipartReader()
if readerErr != nil {
return readerErr
}
form, readErr := reader.ReadForm(maxMemory)
if readErr != nil {
return readErr
}
req.MultipartForm = form
if req.PostForm == nil {
req.PostForm = make(url.Values)
}
for key, values := range form.Value {
req.PostForm[key] = append(req.PostForm[key], values...)
}
if req.Form == nil {
req.Form = make(url.Values, len(req.PostForm))
for key, values := range req.PostForm {
req.Form[key] = append(req.Form[key], values...)
}
}
if req.URL != nil {
for key, values := range req.URL.Query() {
req.Form[key] = append(req.Form[key], values...)
}
}
return nil
}