Hacktoberfest 2026: los issues que los mantenedores marcaron para octubre, abiertos y aptos para principiantes. Explorar issues de Hacktoberfest

Core: LowLevelHttpResponse not disconnected when HttpResponse construction throws RuntimeException

Abierto Apto para principiantes
#2,177 0 comentarios 0 reacciones 0 asignados Ver en GitHub

@insaf021 ya está trabajando en esto.

Desde el 30/7/2026.

  • #2178 de @insaf021 — abierto

Evaluación

Dificultad
2/5
Tiempo estimado
1-3 horas
Aptitud para principiantes
84/100
Tipo de issue
Error
Claridad
Bien especificado
Estado de actividad
Tranquilo
Stack tecnológico
java
Área
networking

Línea de trabajo

Empieza en google-http-client/src/main/java/com/google/api/client/http/HttpRequest.java, centrándote en HttpRequest.execute() y su bloque finally. Reproduce el fallo con un LowLevelHttpResponse cuyo getContentEncoding() lance una excepción y, después, ejecuta testExecute_disconnectOnResponseConstructionFailure. Se considera terminado cuando la respuesta de bajo nivel se desconecta si falla la construcción de la respuesta y la prueba de regresión pasa.

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

Descripción

Environment details:

  1. Core — HttpRequest.execute() in google-http-client
  2. OS type and version: Any (not OS-specific)
  3. Java version: Any (reproduces on Java 8+)
  4. google-http-client version(s): reproducible on current main

Steps to reproduce:

  1. Implement a LowLevelHttpResponse whose getContentEncoding() throws a RuntimeException.
  2. Execute an HttpRequest against that transport.
  3. Catch the RuntimeException from execute().
  4. Observe disconnect() was never called on the low-level response.

Code example:

MockLowLevelHttpResponse failingResponse = new MockLowLevelHttpResponse() {
  @Override
  public String getContentEncoding() {
    throw new RuntimeException("simulated failure");
  }
};

HttpTransport transport = new MockHttpTransport() {
  @Override
  public LowLevelHttpRequest buildRequest(String method, String url) throws IOException {
    return new MockLowLevelHttpRequest().setResponse(failingResponse);
  }
};

HttpRequest req = transport.createRequestFactory()
    .buildGetRequest(new GenericUrl("http://example.com"));

try {
  req.execute();
} catch (RuntimeException e) {
  // failingResponse.isDisconnected() == false  <-- BUG: socket leaked
}

Stack trace:
None — silent resource leak, not a crash. The RuntimeException propagates as expected; the
bug is that execute()'s finally block never calls LowLevelHttpResponse#disconnect() here.

External references:

  • HttpRequest#execute(): google-http-client/src/main/java/com/google/api/client/http/HttpRequest.java

Any additional information:
Under sustained error conditions, leaked connections accumulate until the pool is exhausted,
risking DoS/thread starvation. Pre-existing bug, unrelated to security hardening — found
opportunistically during a security audit of this file.

Proposed fix — in execute()'s finally block, add a guarded disconnect():

} finally {
  if (!responseConstructed && lowLevelHttpResponse != null) {
    try {
      InputStream c = lowLevelHttpResponse.getContent();
      if (c != null) c.close();
    } catch (IOException ignored) {}
    try {
      lowLevelHttpResponse.disconnect();
    } catch (IOException ignored) {}
  }
}

Regression test testExecute_disconnectOnResponseConstructionFailure included in the
accompanying PR.

Lenguaje dominante
Java
Estrellas
1.4k
Forks
474
Métricas de merge de PR
Sin PR fusionados en 30 d

Preparar el entorno

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 googleapis/google-http-java-client

Todos los issues de googleapis/google-http-java-client

Issues similares

Más issues de Java

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.