Channel response appends JSON null after context timeout

Abierto Apto para principiantes
#71 0 comentarios 0 reacciones 0 asignados Ver en GitHub

Nadie ha tomado este issue todavía.

Evaluación

Dificultad
2/5
Tiempo estimado
1-3 horas
Aptitud para principiantes
72/100
Tipo de issue
Error
Claridad
Bien especificado
Estado de actividad
Activo
Stack tecnológico
go
Área
api

Línea de trabajo

El error está en responder.go: channelIntoSlice escribe un 504 con http.Error al cancelarse el contexto y devuelve nil, y DefaultResponder sigue llamando a JSON(w, r, nil). Reproduce el problema con el fragmento del issue y luego revisa la rama de canal de DefaultResponder para ver cómo debería detenerse tras el timeout. Está listo cuando el body es exactamente Server Timeout\n y las pruebas existentes del responder siguen pasando.

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

Descripción

When DefaultResponder receives a channel value and the request context is canceled while it waits, it writes a 504 timeout response and appends JSON null to the body. The result is a mixed text/JSON response rather than the timeout body alone.

Reproduced on latest release v1.0.3 and current main commit 14f1cb3d5c2969d6e462632a205eacb6421eb4dc with Go 1.27.1:

package main

import (
    "context"
    "fmt"
    "net/http/httptest"

    "github.com/go-chi/render"
)

func main() {
    ctx, cancel := context.WithCancel(context.Background())
    cancel()
    request := httptest.NewRequest("GET", "/", nil).WithContext(ctx)
    request.Header.Set("Accept", "application/json")
    response := httptest.NewRecorder()
    channel := make(chan string) // open, with no available value
    render.DefaultResponder(response, request, channel)
    fmt.Printf("status=%d content-type=%q body=%q\n",
        response.Result().StatusCode,
        response.Result().Header.Get("Content-Type"),
        response.Body.String())
}

Observed:

status=504 content-type="text/plain; charset=utf-8" body="Server Timeout\nnull\n"

Expected: after sending the timeout response, no second payload should be written. The body should be "Server Timeout\n".

In responder.go, channelIntoSlice calls http.Error(..., 504) and returns nil on cancellation. DefaultResponder then continues to JSON(w, r, nil), which writes the extra null.

Lenguaje dominante
Go
Estrellas
341
Forks
68
Métricas de merge de PR
Sin PR fusionados en 30 d

Preparar el entorno

Este proyecto no incluye contenedor de desarrollo, Dockerfile ni guía de contribución, así que la configuración corre por tu cuenta: empieza por su README y consulta nuestra guía para la primera contribución para los pasos generales.

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.

Más de go-chi/render

Todos los issues de go-chi/render

Issues similares

Más issues de Go

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.