openapi-generators / openapi-generators/openapi-python-client

Support for multiple content types in error response

Abierto
#1,248 0 comentarios 0 reacciones 0 asignados Ver en GitHub

Nadie ha tomado este issue todavía.

Lenguaje dominante
Python
Estrellas
2k
Forks
293
Merge medio
34 min
PR fusionados (30 d)
1

Descripción

Describe the bug
Similar to previous issues about multiple content types support like https://github.com/openapi-generators/openapi-python-client/issues/453 or https://github.com/openapi-generators/openapi-python-client/issues/1004

For a single endpoint, the same error code can be returned by different piece of software. For example, an application can return error details as application/json but have some infra elements in front (cloud gateway/load balancer/reverse proxy/firewall) that can block request and also return their own errors in their own format text/json/xml (usually for network errors 401,403,502,503,504).

In my use case, I realized a firewall can sometimes block requests and returns a text/plain with a string Access Forbidden. So I'm trying to represent that in my OpenAPI spec so the generated client can handle these errors properly without crashing, and this works for some of the other openapi generators. But it doesn't work well with this python client, because the content type is not validated in the generated code. It only depends on the first content declared in the schema and seems to ignore the other ones.

So I'm getting the following implementation:

if response.status_code == 403:
  response_403 = APIError.from_dict(response.json())

Which works for json error, but json parsing throw an exception if it's something else (like text/plain)

And if I declare text/plain before application/json, I get:

if response.status_code == 403:
  response_403 = response.text

But in that case, I'm losing any detail about the json error.

What I expect here, is something similar to the oapi-codegen golang implementation.
If there are multiple content types defined for an error code, check that the response content type match before handling it.
So each content type can coexist and be handled separately.

case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 403:
    // this is a json error
    var dest APIError
    if err := json.Unmarshal(bodyBytes, &dest); err != nil {
      return nil, err
    }
    response.JSON403 = &dest
case rsp.StatusCode == 403:    
    ... // default case for text/plain error

OpenAPI Spec File

403:
  description: Forbidden
  content:
    application/json:
      schema:
        $ref: '#/components/schemas/APIError'
    text/plain:
      schema:
        type: string

Desktop (please complete the following information):

  • OS: macOS 14.7.4
  • Python Version: 3.11.88
  • openapi-python-client version: 0.24.3

Guía de contribución

Abrir la guía de contribución

Primeros pasos

  1. Lee el issue completo y luego la guía de contribución del proyecto.
  2. Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
  3. Haz un fork del repositorio y trabaja en una rama.
  4. Abre un pull request que haga referencia al número del issue.

Línea de trabajo

Usa la respuesta 403 de OpenAPI proporcionada con application/json y text/plain para reproducir el comportamiento actual del cliente generado. Inspecciona la ruta de respuesta de error del cliente generado y ejecuta la generación relevante del cliente y las pruebas de respuestas, si están disponibles. Se considera terminado cuando el cliente generado selecciona el tratamiento a partir del Content-Type de la respuesta, de modo que los detalles JSON sigan estando disponibles sin intentar analizar text/plain como JSON.

Escrito por el modelo de indexación a partir del texto del issue.

Evaluación

Stack tecnológico
python
Área
api
Tipo de issue
Error
Dificultad
4/5
Tiempo estimado
3-5 días
Estado de actividad
Estancado
Claridad
Bastante claro
Aptitud para principiantes
45/100

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.