[Go] Fix for 'Invalid code for files array in multipart/form-data request'… (#8103)

* Fix for 'Invalid code for files array in multipart/form-data request' (OpenAPITools#8093)

* Executed ensure-up-to-date

* Replaced spaces with tabs.
This commit is contained in:
Aliaksei Zhuk 2020-12-10 13:48:45 +03:00 committed by GitHub
parent f2d8e3a25b
commit 9e5610488f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 88 additions and 22 deletions

View File

@ -228,7 +228,7 @@ public class GoServerCodegen extends AbstractGoCodegen {
for (CodegenOperation operation : operations) { for (CodegenOperation operation : operations) {
for (CodegenParameter param : operation.allParams) { for (CodegenParameter param : operation.allParams) {
// import "os" if the operation uses files // import "os" if the operation uses files
if (!addedOSImport && "*os.File".equals(param.dataType)) { if (!addedOSImport && ("*os.File".equals(param.dataType) || ("[]*os.File".equals(param.dataType)))) {
imports.add(createMapping("import", "os")); imports.add(createMapping("import", "os"));
addedOSImport = true; addedOSImport = true;
} }

View File

@ -66,7 +66,7 @@ func (c *{{classname}}Controller) {{nickname}}(w http.ResponseWriter, r *http.Re
} }
{{/isInteger}}{{^isLong}}{{^isInteger}} {{/isInteger}}{{^isLong}}{{^isInteger}}
{{paramName}} := {{#isArray}}strings.Split({{/isArray}}query.Get("{{paramName}}"){{#isArray}}, ","){{/isArray}}{{/isInteger}}{{/isLong}}{{/isQueryParam}}{{#isFormParam}}{{#isFile}} {{paramName}} := {{#isArray}}strings.Split({{/isArray}}query.Get("{{paramName}}"){{#isArray}}, ","){{/isArray}}{{/isInteger}}{{/isLong}}{{/isQueryParam}}{{#isFormParam}}{{#isFile}}
{{paramName}}, err := ReadFormFileToTempFile(r, "{{paramName}}") {{#isArray}}{{paramName}}, err := ReadFormFilesToTempFiles(r, "{{paramName}}"){{/isArray}}{{^isArray}}{{paramName}}, err := ReadFormFileToTempFile(r, "{{paramName}}"){{/isArray}}
if err != nil { if err != nil {
w.WriteHeader(500) w.WriteHeader(500)
return return

View File

@ -7,9 +7,9 @@ import (
"net/http" "net/http"
"os" "os"
"strconv" "strconv"
{{#featureCORS}} {{#featureCORS}}
"github.com/gorilla/handlers" "github.com/gorilla/handlers"
{{/featureCORS}} {{/featureCORS}}
"github.com/gorilla/mux" "github.com/gorilla/mux"
) )
@ -37,9 +37,9 @@ func NewRouter(routers ...Router) *mux.Router {
var handler http.Handler var handler http.Handler
handler = route.HandlerFunc handler = route.HandlerFunc
handler = Logger(handler, route.Name) handler = Logger(handler, route.Name)
{{#featureCORS}} {{#featureCORS}}
handler = handlers.CORS()(handler) handler = handlers.CORS()(handler)
{{/featureCORS}} {{/featureCORS}}
router. router.
Methods(route.Method). Methods(route.Method).
@ -66,28 +66,61 @@ func EncodeJSONResponse(i interface{}, status *int, w http.ResponseWriter) error
// ReadFormFileToTempFile reads file data from a request form and writes it to a temporary file // ReadFormFileToTempFile reads file data from a request form and writes it to a temporary file
func ReadFormFileToTempFile(r *http.Request, key string) (*os.File, error) { func ReadFormFileToTempFile(r *http.Request, key string) (*os.File, error) {
r.ParseForm() _, fileHeader, err := r.FormFile(key)
formFile, _, err := r.FormFile(key) if err != nil {
return nil, err
}
return readFileHeaderToTempFile(fileHeader)
}
// ReadFormFilesToTempFiles reads files array data from a request form and writes it to a temporary files
func ReadFormFilesToTempFiles(r *http.Request, key string) ([]*os.File, error) {
if err := r.ParseMultipartForm(32 << 20); err != nil {
return nil, err
}
files := make([]*os.File, 0, len(r.MultipartForm.File[key]))
for _, fileHeader := range r.MultipartForm.File[key] {
file, err := readFileHeaderToTempFile(fileHeader)
if err != nil {
return nil, err
}
files = append(files, file)
}
return files, nil
}
// readFileHeaderToTempFile reads multipart.FileHeader and writes it to a temporary file
func readFileHeaderToTempFile(fileHeader *multipart.FileHeader) (*os.File, error) {
formFile, err := fileHeader.Open()
if err != nil { if err != nil {
return nil, err return nil, err
} }
defer formFile.Close() defer formFile.Close()
file, err := ioutil.TempFile("tmp", key)
if err != nil {
return nil, err
}
defer file.Close()
fileBytes, err := ioutil.ReadAll(formFile) fileBytes, err := ioutil.ReadAll(formFile)
if err != nil { if err != nil {
return nil, err return nil, err
} }
file, err := ioutil.TempFile("", fileHeader.Filename)
if err != nil {
return nil, err
}
defer file.Close()
file.Write(fileBytes) file.Write(fileBytes)
return file, nil return file, nil
} }
// parseInt64Parameter parses a sting parameter to an int64 // parseInt64Parameter parses a sting parameter to an int64
func parseInt64Parameter(param string) (int64, error) { func parseInt64Parameter(param string) (int64, error) {
return strconv.ParseInt(param, 10, 64) return strconv.ParseInt(param, 10, 64)

View File

@ -68,28 +68,61 @@ func EncodeJSONResponse(i interface{}, status *int, w http.ResponseWriter) error
// ReadFormFileToTempFile reads file data from a request form and writes it to a temporary file // ReadFormFileToTempFile reads file data from a request form and writes it to a temporary file
func ReadFormFileToTempFile(r *http.Request, key string) (*os.File, error) { func ReadFormFileToTempFile(r *http.Request, key string) (*os.File, error) {
r.ParseForm() _, fileHeader, err := r.FormFile(key)
formFile, _, err := r.FormFile(key) if err != nil {
return nil, err
}
return readFileHeaderToTempFile(fileHeader)
}
// ReadFormFilesToTempFiles reads files array data from a request form and writes it to a temporary files
func ReadFormFilesToTempFiles(r *http.Request, key string) ([]*os.File, error) {
if err := r.ParseMultipartForm(32 << 20); err != nil {
return nil, err
}
files := make([]*os.File, 0, len(r.MultipartForm.File[key]))
for _, fileHeader := range r.MultipartForm.File[key] {
file, err := readFileHeaderToTempFile(fileHeader)
if err != nil {
return nil, err
}
files = append(files, file)
}
return files, nil
}
// readFileHeaderToTempFile reads multipart.FileHeader and writes it to a temporary file
func readFileHeaderToTempFile(fileHeader *multipart.FileHeader) (*os.File, error) {
formFile, err := fileHeader.Open()
if err != nil { if err != nil {
return nil, err return nil, err
} }
defer formFile.Close() defer formFile.Close()
file, err := ioutil.TempFile("tmp", key)
if err != nil {
return nil, err
}
defer file.Close()
fileBytes, err := ioutil.ReadAll(formFile) fileBytes, err := ioutil.ReadAll(formFile)
if err != nil { if err != nil {
return nil, err return nil, err
} }
file, err := ioutil.TempFile("", fileHeader.Filename)
if err != nil {
return nil, err
}
defer file.Close()
file.Write(fileBytes) file.Write(fileBytes)
return file, nil return file, nil
} }
// parseInt64Parameter parses a sting parameter to an int64 // parseInt64Parameter parses a sting parameter to an int64
func parseInt64Parameter(param string) (int64, error) { func parseInt64Parameter(param string) (int64, error) {
return strconv.ParseInt(param, 10, 64) return strconv.ParseInt(param, 10, 64)