OpenAPITools / OpenAPITools/openapi-generator

[BUG][Go] Latest Go client generator incorrectly handles explode keyword for query parameters

Open
#14,089 4 comments 2 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

In v6.2.1 exploded and unexploded query parameter lists are handled correctly by the Go client generator. This is an example of a URL that has been created by an example client. explode is a query parameter with explode=true. noexplode is a query parameter with explode=false:

/v1/dummy?explode=e1&explode=e2&noexplode=n1%2Cn2

The same code generates this URL with the latest Docker image. The unexploded parameter list is exploded, whilst the exploded parameter list has reflect.Value value for each supplied value:

/v1/dummy?explode=reflect.Value+value&explode=reflect.Value+value&noexplode=n1&noexplode=n2
openapi-generator version

Works as expected in v6.2.1. Bug observed with latest Docker image (uploaded to DockerHub on Nov 20, 2022 at 9:15 am).

OpenAPI declaration file content or url
openapi: 3.0.0
info:
  title: Explode demo
  version: 1.0.0
servers:
  - url: http://api.example.com/v1
paths:
  /dummy:
    get:
      summary: Dummy endpoint.
      description: Dummy endpoint to highlight explode.
      parameters:
        - name: explode
          in: query
          description: Parameters that should be exploded.
          explode: true
          schema:
            type: array
            items:
              type: string
        - name: noexplode
          in: query
          description: Parameters that should not be exploded
          explode: false
          schema:
            type: array
            items:
              type: string
      responses:
        '200':    # status code
          description: Dummy response
Generation Details

Generated client using Docker image:

docker run --rm -v "${PWD}:/local" openapitools/openapi-generator-cli:latest generate -i /local/explode.yaml -g go -o /local/out/go
Steps to reproduce

I used a main.go based on an auto-generated example in out/go/docs/DefaultApi.md. configuration.Debug is set to true to enable printing of URLs:

package main

import (
	"context"
	"fmt"
	"os"

	openapiclient "example.com/autogen/openapi"
)

func main() {
	explode := []string{"e1", "e2"}   // []string | Parameters that should be exploded. (optional)
	noexplode := []string{"n1", "n2"} // []string | Parameters that should not be exploded (optional)

	configuration := openapiclient.NewConfiguration()
	configuration.Debug = true

	apiClient := openapiclient.NewAPIClient(configuration)
	r, err := apiClient.DefaultApi.DummyGet(context.Background()).Explode(explode).Noexplode(noexplode).Execute()
	if err != nil {
		fmt.Fprintf(os.Stderr, "Error when calling `DefaultApi.DummyGet``: %v\n", err)
		fmt.Fprintf(os.Stderr, "Full HTTP response: %v\n", r)
	}
}

I used the replace keyword in the go.mod file to point to the autogenerated client library:

replace example.com/autogen/openapi => ./out/go

Building and running main.go shows the malformed URL. The actual query fails due to using a dummy host.

$ go run main.go 
2022/11/22 11:33:27 
GET /v1/dummy?explode=reflect.Value+value&explode=reflect.Value+value&noexplode=n1&noexplode=n2 HTTP/1.1
...

Rebuilding the client with latest-release version of Docker image results in correct URL:

$ go run main.go 
2022/11/22 11:29:33 
GET /v1/dummy?explode=e1&explode=e2&noexplode=n1%2Cn2 HTTP/1.1
...
Related issues/PRs

Can't find any.

Suggest a fix

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

Start with the OpenAPI declaration in explode.yaml and reproduce generation using the documented Docker command with the Go generator. Inspect the generated client and the request path exercised by main.go, comparing the latest output with v6.2.1 or latest-release. Done means exploded query values remain separate and unexploded values remain comma-separated, without reflect.Value text.

Written by the indexing model from the issue text.

Assessment

Tech stack
docker, go
Domain
api, tooling
Issue type
Bug
Difficulty
4/5
Estimated time
3-5 days
Activity status
Stale
Clarity
Clearly specified
Newbie friendliness
48/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.