Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[BUG][kotlin][jvm-spring-webclient] multipart/form-data request is broken #19799

Closed
5 of 6 tasks
nschimmrich opened this issue Oct 7, 2024 · 0 comments · Fixed by #19811
Closed
5 of 6 tasks

[BUG][kotlin][jvm-spring-webclient] multipart/form-data request is broken #19799

nschimmrich opened this issue Oct 7, 2024 · 0 comments · Fixed by #19811

Comments

@nschimmrich
Copy link
Contributor

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

When generating a kotlin client for a multipart/form-data request with the jvm-spring-webclient library, the api client returns the following error: Content type 'multipart/form-data' not supported for bodyType=java.util.Collections$SingletonMap<?, ?>.
This is because of a bug introduced by #11911 and it was fixed for the okhttp library with this pull request #13435.

openapi-generator version

7.8.0

OpenAPI declaration file content or url

Here is a minimal spec for a multipart/form-data file upload.

openapi: '3.0.1'
info:
  version: 1.0.0
  title: Multipart upload request issue
paths:
  /multipart-upload:
    post:
      tags:
        - multipart
      description: Multipart upload request issue
      operationId: multipartUpload
      requestBody:
        content:
          multipart/form-data:
            schema:
              type: object
              required:
                - file
              properties:
                file:
                  description: "a file"
                  type: string
                  format: binary
      responses:
        '200':
          description: Successful operation
Generation Details

kotlin, jvm-spring-webclient

Related issues/PRs

#11911
#13435

Suggest a fix

Here is how the ApiClient is generated. Only the relevant method is shown.

open class ApiClient(protected val client: WebClient) {

// [...]

    private fun <I : Any> WebClient.RequestBodySpec.body(requestConfig: RequestConfig<I>) =
        apply { if (requestConfig.body != null) bodyValue(requestConfig.body) }

// [...]

}

Here is how a working solution might look like:

open class ApiClient(protected val client: WebClient) {

// [...]

    private fun <I : Any> WebClient.RequestBodySpec.body(requestConfig: RequestConfig<I>): WebClient.RequestBodySpec {
        when {
            requestConfig.headers[HttpHeaders.CONTENT_TYPE] == MediaType.MULTIPART_FORM_DATA_VALUE -> {
                val builder = MultipartBodyBuilder()
                (requestConfig.body as Map<String, PartConfig<*>>).forEach { (name, part) ->
                    if (part.body != null) {
                        val partHeaders = part.headers.toMutableMap()
                        val partBuilder = builder.part(name, part.body)
                        partHeaders.forEach { partBuilder.header(it.key, it.value) }
                    }
                }
                return apply { bodyValue(builder.build()) }
            }
            else -> {
                return apply { if (requestConfig.body != null) bodyValue(requestConfig.body) }
            }
        }
    }

// [...]

}

I will try to make a PR with this fix in the following days.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
1 participant