/* * Copyright 2012 E.J.I.E., S.A. * * Licencia con arreglo a la EUPL, Versión 1.1 exclusivamente (la «Licencia»); * Solo podrá usarse esta obra si se respeta la Licencia. * Puede obtenerse una copia de la Licencia en * * http://ec.europa.eu/idabc/eupl.html * * Salvo cuando lo exija la legislación aplicable o se acuerde por escrito, * el programa distribuido con arreglo a la Licencia se distribuye «TAL CUAL», * SIN GARANTÍAS NI CONDICIONES DE NINGÚN TIPO, ni expresas ni implícitas. * Véase la Licencia en el idioma concreto que rige los permisos y limitaciones * que establece la Licencia. */ package com.ejie.x38.util; import java.io.IOException; import javax.servlet.ServletOutputStream; import javax.servlet.ServletRequest; import javax.servlet.http.HttpServletResponse; /** * Clase de utilidades para realizar la emulación de llamadas XHR utilizando iframes. * * @author UDA * */ public class IframeXHREmulationUtils { public static final String PARAM_EMULATE_IFRAME_HTTP_STATUS = "_emulate_iframe_http_status"; /** * Comprueba si es necesario realizar la emulación. La emulación se indica * mediante la presencia en la request del parámetro * PARAM_EMULATE_IFRAME_HTTP_STATUS. * * @param request * Petición HTTP. * @return <b>true</b> o <b>false</b> dependiendo si es necesaria o no * realizar la emulación. */ public static boolean isIframeEmulationRequired(ServletRequest request){ String emulate_iframe_http_status = request.getParameter(IframeXHREmulationUtils.PARAM_EMULATE_IFRAME_HTTP_STATUS); if (emulate_iframe_http_status!=null && Boolean.TRUE.toString().equals(emulate_iframe_http_status.toLowerCase())){ return true; } return false; } /** * @see IframeXHREmulationUtils.writeIframeHttpStatus */ public static void writeIframeHttpStatus(HttpServletResponse response, byte[] data, int httpStatusCode) throws IOException{ IframeXHREmulationUtils.writeIframeHttpStatus(response, data, httpStatusCode, null); } /** * Escribe en la respuesta de la petición el mensaje correspondiente al * contenido y el código de estado http indicados.</br> El contenido enviado * en la request para permitir la emulación se arropa dentro de un textárea * en cuyos atributos <i>status</i> y <i>statusText</i> se incluye la * información de los errores http. La estructura enviada es la siguiente: * * <pre> * * <textarea status="406" statusText="NotAcceptable"> * ["Contenido de la respuesta en formato json"] * </textarea> * * </pre> * * @param response * Respuesta HTTP. * @param data * Información que debe ser incluida en la respuesta. * @param httpStatusCode * Código de error de estado HTTP. * @param httpStatusCodeText * Textp del código de error de estado HTTP. * @throws IOException * Excepción producida en operaciones I/O. */ public static void writeIframeHttpStatus(HttpServletResponse response, byte[] data, int httpStatusCode, String httpStatusCodeText) throws IOException{ ServletOutputStream outputStream = response.getOutputStream(); response.setStatus(HttpServletResponse.SC_OK); response.setContentType("text/plain"); response.setCharacterEncoding("UTF-8"); outputStream.write("<textarea ".getBytes()); outputStream.write("status=\"".getBytes()); outputStream.write(String.valueOf(httpStatusCode).getBytes()); outputStream.write("\" ".getBytes()); outputStream.write("statusText=\"".getBytes()); if (httpStatusCodeText!=null){ outputStream.write(httpStatusCodeText.getBytes()); } outputStream.write("\">".getBytes()); outputStream.write(data); outputStream.write("</textarea>".getBytes()); outputStream.flush(); outputStream.close(); response.flushBuffer(); } }