OpenAPITools / OpenAPITools/openapi-generator

[BUG] [GOLANG] [Client] Multiple file upload compile error (missing for loop and imports)

Open
#11,341 0 comments 5 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

Issue: Bug
Dominant language
Java
Stars
26.8k
Forks
7.7k
PR merge metrics
PR metrics pending

Description

Bug Report Checklist
  • Have you provided a full/minimal spec to reproduce the issue?
  • Have you validated the input using an OpenAPI validator (example)?
  • Have you tested with the latest master to confirm the issue still exists?
  • Have you searched for related issues/PRs?
  • What's the actual output vs expected output?
  • [Optional] Sponsorship to speed up the bug fix or feature request (example)
Description

My following config is to describe an HTTP request POST for multiple file multipart upload.

I fixed the generated code to fix and it work!

Compilation error:

./api_default.go:1070:8: []*os.File used as value
./api_default.go:1070:11: undefined: os
./api_default.go:1083:54: undefined: os
./api_default.go:1159:26: undefined: os

Fix proposal below

openapi-generator version
openapi-generator-cli 5.4.0-SNAPSHOT
  commit : 7129cde
  built  : 2022-01-13T16:33:11Z
  source : https://github.com/openapitools/openapi-generator
  docs   : https://openapi-generator.tech/
OpenAPI declaration file content or url
openapi: 3.0.0
info:
  title: test
  description:test
  version: 4.0.0
servers:
  - url: 'https://api.alldebrid.com/v4'
    description: 'Optional server description, e.g. Main (production) server'
paths:
  /magnet/upload/file:
    post:
      summary: Upload torrent files.
      description: >-
        Upload torrent files.
        This endpoint should be POSTed on.
        It expects a multipart formdata file upload.
      parameters:
        - in: query
          name: agent
          schema:
            type: string
            default: open-alldebrid
          required: true
          description: Your software user-agent.
        - in: query
          name: apikey
          schema:
            type: string
          required: true
          description: User apikey.
      requestBody:
        content:
          multipart/form-data:
            schema:
              type: object
              properties:
                "[]file":
                  type: array
                  items:
                    type: string
                    format: binary
      responses:
        '200':
          description: >-
            This endpoint retrieves a complete list of all available hosts for
            this user
          content:
            application/json:
              schema:
                type: object
                properties:
                  status:
                    type: string
                    example: success
Generation Details
[main] INFO  o.o.codegen.DefaultGenerator - Generating with dryRun=false
[main] INFO  o.o.codegen.DefaultGenerator - OpenAPI Generator: go (client)
[main] INFO  o.o.codegen.DefaultGenerator - Generator 'go' is considered stable.
[main] INFO  o.o.c.languages.AbstractGoCodegen - Environment variable GO_POST_PROCESS_FILE not defined so Go code may not be properly formatted. To define it, try `export GO_POST_PROCESS_FILE="/usr/local/bin/gofmt -w"` (Linux/Mac)
[main] INFO  o.o.c.languages.AbstractGoCodegen - NOTE: To enable file post-processing, 'enablePostProcessFile' must be set to `true` (--enable-post-process-file for CLI).
[main] INFO  o.o.codegen.DefaultGenerator - Model inline_object not generated since it's marked as unused (due to form parameters) and `skipFormModel` (global property) set to true (default)
[main] INFO  o.o.codegen.TemplateManager - writing file /local/model_inline_response_200.go
[main] INFO  o.o.codegen.TemplateManager - writing file /local/docs/InlineResponse200.md
[main] INFO  o.o.codegen.TemplateManager - writing file /local/model_inline_response_200_1.go
[main] INFO  o.o.codegen.TemplateManager - writing file /local/docs/InlineResponse2001.md
[main] INFO  o.o.codegen.TemplateManager - writing file /local/model_inline_response_200_10.go
[main] INFO  o.o.codegen.TemplateManager - writing file /local/docs/InlineResponse20010.md
[main] INFO  o.o.codegen.TemplateManager - writing file /local/model_inline_response_200_10_data.go
[main] INFO  o.o.codegen.TemplateManager - writing file /local/docs/InlineResponse20010Data.md
[main] INFO  o.o.codegen.TemplateManager - writing file /local/model_inline_response_200_10_data_error.go
[main] INFO  o.o.codegen.TemplateManager - writing file /local/docs/InlineResponse20010DataError.md
[main] INFO  o.o.codegen.TemplateManager - writing file /local/model_inline_response_200_10_data_magnets.go
[main] INFO  o.o.codegen.TemplateManager - writing file /local/docs/InlineResponse20010DataMagnets.md
[main] INFO  o.o.codegen.TemplateManager - writing file /local/model_inline_response_200_10_error.go
[main] INFO  o.o.codegen.TemplateManager - writing file /local/docs/InlineResponse20010Error.md
[main] INFO  o.o.codegen.TemplateManager - writing file /local/model_inline_response_200_11.go
[main] INFO  o.o.codegen.TemplateManager - writing file /local/docs/InlineResponse20011.md
[main] INFO  o.o.codegen.TemplateManager - writing file /local/model_inline_response_200_11_data.go
[main] INFO  o.o.codegen.TemplateManager - writing file /local/docs/InlineResponse20011Data.md
[main] INFO  o.o.codegen.TemplateManager - writing file /local/model_inline_response_200_11_data_error.go
[main] INFO  o.o.codegen.TemplateManager - writing file /local/docs/InlineResponse20011DataError.md
[main] INFO  o.o.codegen.TemplateManager - writing file /local/model_inline_response_200_11_data_files.go
[main] INFO  o.o.codegen.TemplateManager - writing file /local/docs/InlineResponse20011DataFiles.md
[main] INFO  o.o.codegen.TemplateManager - writing file /local/model_inline_response_200_1_data.go
[main] INFO  o.o.codegen.TemplateManager - writing file /local/docs/InlineResponse2001Data.md
[main] INFO  o.o.codegen.TemplateManager - writing file /local/model_inline_response_200_2.go
[main] INFO  o.o.codegen.TemplateManager - writing file /local/docs/InlineResponse2002.md
[main] INFO  o.o.codegen.TemplateManager - writing file /local/model_inline_response_200_2_data.go
[main] INFO  o.o.codegen.TemplateManager - writing file /local/docs/InlineResponse2002Data.md
[main] INFO  o.o.codegen.TemplateManager - writing file /local/model_inline_response_200_3.go
[main] INFO  o.o.codegen.TemplateManager - writing file /local/docs/InlineResponse2003.md
[main] INFO  o.o.codegen.TemplateManager - writing file /local/model_inline_response_200_3_data.go
[main] INFO  o.o.codegen.TemplateManager - writing file /local/docs/InlineResponse2003Data.md
[main] INFO  o.o.codegen.TemplateManager - writing file /local/model_inline_response_200_3_data_user.go
[main] INFO  o.o.codegen.TemplateManager - writing file /local/docs/InlineResponse2003DataUser.md
[main] INFO  o.o.codegen.TemplateManager - writing file /local/model_inline_response_200_3_data_user_limited_hosters_quotas.go
[main] INFO  o.o.codegen.TemplateManager - writing file /local/docs/InlineResponse2003DataUserLimitedHostersQuotas.md
[main] INFO  o.o.codegen.TemplateManager - writing file /local/model_inline_response_200_4.go
[main] INFO  o.o.codegen.TemplateManager - writing file /local/docs/InlineResponse2004.md
[main] INFO  o.o.codegen.TemplateManager - writing file /local/model_inline_response_200_4_data.go
[main] INFO  o.o.codegen.TemplateManager - writing file /local/docs/InlineResponse2004Data.md
[main] INFO  o.o.codegen.TemplateManager - writing file /local/model_inline_response_200_5.go
[main] INFO  o.o.codegen.TemplateManager - writing file /local/docs/InlineResponse2005.md
[main] INFO  o.o.codegen.TemplateManager - writing file /local/model_inline_response_200_5_data.go
[main] INFO  o.o.codegen.TemplateManager - writing file /local/docs/InlineResponse2005Data.md
[main] INFO  o.o.codegen.TemplateManager - writing file /local/model_inline_response_200_5_data_infos.go
[main] INFO  o.o.codegen.TemplateManager - writing file /local/docs/InlineResponse2005DataInfos.md
[main] INFO  o.o.codegen.TemplateManager - writing file /local/model_inline_response_200_5_error.go
[main] INFO  o.o.codegen.TemplateManager - writing file /local/docs/InlineResponse2005Error.md
[main] INFO  o.o.codegen.TemplateManager - writing file /local/model_inline_response_200_6.go
[main] INFO  o.o.codegen.TemplateManager - writing file /local/docs/InlineResponse2006.md
[main] INFO  o.o.codegen.TemplateManager - writing file /local/model_inline_response_200_6_data.go
[main] INFO  o.o.codegen.TemplateManager - writing file /local/docs/InlineResponse2006Data.md
[main] INFO  o.o.codegen.TemplateManager - writing file /local/model_inline_response_200_6_error.go
[main] INFO  o.o.codegen.TemplateManager - writing file /local/docs/InlineResponse2006Error.md
[main] INFO  o.o.codegen.TemplateManager - writing file /local/model_inline_response_200_7.go
[main] INFO  o.o.codegen.TemplateManager - writing file /local/docs/InlineResponse2007.md
[main] INFO  o.o.codegen.TemplateManager - writing file /local/model_inline_response_200_7_data.go
[main] INFO  o.o.codegen.TemplateManager - writing file /local/docs/InlineResponse2007Data.md
[main] INFO  o.o.codegen.TemplateManager - writing file /local/model_inline_response_200_7_data_streams.go
[main] INFO  o.o.codegen.TemplateManager - writing file /local/docs/InlineResponse2007DataStreams.md
[main] INFO  o.o.codegen.TemplateManager - writing file /local/model_inline_response_200_7_error.go
[main] INFO  o.o.codegen.TemplateManager - writing file /local/docs/InlineResponse2007Error.md
[main] INFO  o.o.codegen.TemplateManager - writing file /local/model_inline_response_200_8.go
[main] INFO  o.o.codegen.TemplateManager - writing file /local/docs/InlineResponse2008.md
[main] INFO  o.o.codegen.TemplateManager - writing file /local/model_inline_response_200_8_data.go
[main] INFO  o.o.codegen.TemplateManager - writing file /local/docs/InlineResponse2008Data.md
[main] INFO  o.o.codegen.TemplateManager - writing file /local/model_inline_response_200_8_data_streams.go
[main] INFO  o.o.codegen.TemplateManager - writing file /local/docs/InlineResponse2008DataStreams.md
[main] INFO  o.o.codegen.TemplateManager - writing file /local/model_inline_response_200_9.go
[main] INFO  o.o.codegen.TemplateManager - writing file /local/docs/InlineResponse2009.md
[main] INFO  o.o.codegen.TemplateManager - writing file /local/model_inline_response_200_9_data.go
[main] INFO  o.o.codegen.TemplateManager - writing file /local/docs/InlineResponse2009Data.md
[main] INFO  o.o.codegen.TemplateManager - writing file /local/model_inline_response_200_9_error.go
[main] INFO  o.o.codegen.TemplateManager - writing file /local/docs/InlineResponse2009Error.md
[main] INFO  o.o.codegen.TemplateManager - writing file /local/model_inline_response_200_data.go
[main] INFO  o.o.codegen.TemplateManager - writing file /local/docs/InlineResponse200Data.md
[main] INFO  o.o.codegen.TemplateManager - writing file /local/model_inline_response_200_data_hosts.go
[main] INFO  o.o.codegen.TemplateManager - writing file /local/docs/InlineResponse200DataHosts.md
[main] INFO  o.o.codegen.TemplateManager - writing file /local/model_inline_response_200_data_redirectors.go
[main] INFO  o.o.codegen.TemplateManager - writing file /local/docs/InlineResponse200DataRedirectors.md
[main] INFO  o.o.codegen.TemplateManager - writing file /local/model_inline_response_200_data_streams.go
[main] INFO  o.o.codegen.TemplateManager - writing file /local/docs/InlineResponse200DataStreams.md
[main] WARN  o.o.codegen.DefaultCodegen - Empty operationId found for path: get /hosts. Renamed to auto-generated operationId: hostsGet
[main] WARN  o.o.codegen.DefaultCodegen - Empty operationId found for path: get /hosts/domains. Renamed to auto-generated operationId: hostsDomainsGet
[main] WARN  o.o.codegen.DefaultCodegen - Empty operationId found for path: get /hosts/priority. Renamed to auto-generated operationId: hostsPriorityGet
[main] WARN  o.o.codegen.DefaultCodegen - Empty operationId found for path: get /user. Renamed to auto-generated operationId: userGet
[main] WARN  o.o.codegen.DefaultCodegen - Empty operationId found for path: get /user/hosts. Renamed to auto-generated operationId: userHostsGet
[main] WARN  o.o.codegen.DefaultCodegen - Empty operationId found for path: get /user/notification/clear. Renamed to auto-generated operationId: userNotificationClearGet
[main] WARN  o.o.codegen.DefaultCodegen - Empty operationId found for path: get /link/infos. Renamed to auto-generated operationId: linkInfosGet
[main] WARN  o.o.codegen.DefaultCodegen - Empty operationId found for path: get /link/redirector. Renamed to auto-generated operationId: linkRedirectorGet
[main] WARN  o.o.codegen.DefaultCodegen - Empty operationId found for path: get /link/unlock. Renamed to auto-generated operationId: linkUnlockGet
[main] WARN  o.o.codegen.DefaultCodegen - Empty operationId found for path: get /link/streaming. Renamed to auto-generated operationId: linkStreamingGet
[main] WARN  o.o.codegen.DefaultCodegen - Empty operationId found for path: get /link/delayed. Renamed to auto-generated operationId: linkDelayedGet
[main] WARN  o.o.codegen.DefaultCodegen - Empty operationId found for path: get /magnet/upload. Renamed to auto-generated operationId: magnetUploadGet
[main] WARN  o.o.codegen.DefaultCodegen - Empty operationId found for path: post /magnet/upload/file. Renamed to auto-generated operationId: magnetUploadFilePost
[main] WARN  o.o.codegen.DefaultCodegen - Could not compute datatypeWithEnum from *os.File, null
[main] INFO  o.o.codegen.TemplateManager - writing file /local/api_default.go
[main] INFO  o.o.codegen.TemplateManager - writing file /local/docs/DefaultApi.md
[main] INFO  o.o.codegen.TemplateManager - writing file /local/api/openapi.yaml
[main] INFO  o.o.codegen.TemplateManager - writing file /local/README.md
[main] INFO  o.o.codegen.TemplateManager - Ignored /local/git_push.sh (Ignored by rule in ignore file.)
[main] INFO  o.o.codegen.TemplateManager - Ignored /local/.gitignore (Ignored by rule in ignore file.)
[main] INFO  o.o.codegen.TemplateManager - writing file /local/configuration.go
[main] INFO  o.o.codegen.TemplateManager - writing file /local/client.go
[main] INFO  o.o.codegen.TemplateManager - writing file /local/response.go
[main] INFO  o.o.codegen.TemplateManager - Ignored /local/go.mod (Ignored by rule in ignore file.)
[main] INFO  o.o.codegen.TemplateManager - Ignored /local/go.sum (Ignored by rule in ignore file.)
[main] INFO  o.o.codegen.TemplateManager - writing file /local/.travis.yml
[main] INFO  o.o.codegen.TemplateManager - writing file /local/utils.go
[main] INFO  o.o.codegen.TemplateManager - Skipped /local/.openapi-generator-ignore (Skipped by supportingFiles options supplied by user.)
[main] INFO  o.o.codegen.TemplateManager - writing file /local/.openapi-generator/VERSION
[main] INFO  o.o.codegen.TemplateManager - writing file /local/.openapi-generator/FILES
################################################################################
# Thanks for using OpenAPI Generator.                                          #
# Please consider donation to help us maintain this project 🙏                 #
# https://opencollective.com/openapi_generator/donate                          #
################################################################################
Steps to reproduce

just generate with this config for Golang client api

Name the file alldebrid.yaml

docker run -u "$UID:$GID" --rm -v "${PWD}:/local" openapitools/openapi-generator-cli:latest generate \
    -i /local/alldebrid.yaml \
    -g go \
    -o /local/ \
    --additional-properties=packageName=openalldebrid
Related issues/PRs

Maybe related also:

https://github.com/OpenAPITools/openapi-generator/issues/505

Suggest a fix

Actual generated code:

        var fileLocalVarFile []*os.File
	if r.file != nil {
		fileLocalVarFile = *r.file
	}
	if fileLocalVarFile != nil {
		fbs, _ := _ioutil.ReadAll(fileLocalVarFile)
		fileLocalVarFileBytes = fbs
		fileLocalVarFileName = fileLocalVarFile.Name()
		fileLocalVarFile.Close()
	}
	formFiles = append(formFiles, formFile{fileBytes: fileLocalVarFileBytes, fileName: fileLocalVarFileName, formFileName: fileLocalVarFormFileName})

Fix on generated code

import "os"

...

        var fileLocalVarFile []*os.File
	if r.file != nil {
		fileLocalVarFile = *r.file
	}
	if fileLocalVarFile != nil {
		for _, file := range fileLocalVarFile { 
			fbs, _ := _ioutil.ReadAll(file) 
			fileLocalVarFileBytes = fbs
			fileLocalVarFileName = file.Name()
			file.Close()

			formFiles = append(formFiles, formFile{fileBytes: fileLocalVarFileBytes, fileName: fileLocalVarFileName, formFileName: fileLocalVarFormFileName})
		}
	}

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Research direction

Reproduce the issue with the supplied OpenAPI 3 multipart/form-data specification using the Go client generator. Inspect the generated api_default.go around lines 1070, 1083, and 1159, where compilation reports the missing os references and multiple-file handling error. Done when the generated client compiles and supports the described multiple-file upload.

Written by the indexing model from the issue text.

Assessment

Tech stack
go, openapi
Domain
api, tooling
Issue type
Bug
Difficulty
3/5
Estimated time
1-2 days
Activity status
Stale
Clarity
Mostly clear
Newbie friendliness
42/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.