Java: HttpURLConnection and ignored setRequestProperty headers

Si usas HttpURLConnection es posible que haya ciertas cabeceras que no puedas usar mediante setRequestProperty (esto no siempre fué así, fue un cambio q añadieron en Java 1.6.0_22, sin aviso ni documentación oficial que yo haya encontrado), quizá por una cuestion de seguridad en Applets/Navegadores Java?.

Aquí está el origen del problema:

sun.net.www.protocol.http.HttpURLConnection
/*
 * Restrict setting of request headers through the public api
 * consistent with JavaScript XMLHttpRequest2 with a few
 * exceptions. Disallowed headers are silently ignored for
 * backwards compatibility reasons rather than throwing a
 * SecurityException. For example, some applets set the
 * Host header since old JREs did not implement HTTP 1.1.
 * Additionally, any header starting with Sec- is
 * disallowed.
 *
 * The following headers are allowed for historical reasons:
 *
 * Accept-Charset, Accept-Encoding, Cookie, Cookie2, Date,
 * Referer, TE, User-Agent, headers beginning with Proxy-.
 *
 * The following headers are allowed in a limited form:
 *
 * Connection: close
 *
 * See http://www.w3.org/TR/XMLHttpRequest2.
 */
private static final boolean allowRestrictedHeaders;
private static final String[] restrictedHeaders = {
    /* Restricted by XMLHttpRequest2 */
    //"Accept-Charset",
    //"Accept-Encoding",
    "Access-Control-Request-Headers",
    "Access-Control-Request-Method",
    "Connection", /* close is allowed */
    "Content-Length",
    //"Cookie",
    //"Cookie2",
    "Content-Transfer-Encoding",
    //"Date",
    //"Expect",
    "Host",
    "Keep-Alive",
    "Origin",
    // "Referer",
    // "TE",
    "Trailer",
    "Transfer-Encoding",
    "Upgrade",
    //"User-Agent",
    "Via"
};
// ... cut ...

static {
  // ... cut ...
  allowRestrictedHeaders = ((Boolean)java.security.AccessController.doPrivileged(
    new sun.security.action.GetBooleanAction(
      "sun.net.http.allowRestrictedHeaders"))).booleanValue();
  // ... cut ...
}

Así, por ejemplo, si quieres hacer una peticion HTTP PUT/POST con el body comprimido usando un HttpURLConnection + GZIPOutputStream con su correspondiente setRequestProperty(“Content-Transfer-Encoding”, “gzip”); cuando llegue al servidor no será capaz de entender los datos.

El workarround, definir la System Property:

-Dsun.net.http.allowRestrictedHeaders=true

Habría sido buena idea añadir un comentario en el metodo “setRequestProperty”, verdad?

Referencias:
Java BUG#6996110: Won’t Fix
Source of HttpURLConnection

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: