Tu peor escenario no es tan malo como crees.
Ya está analizando la fuente RSS, por lo que ya tiene las URL de la imagen. Digamos que tiene una URL de imagen como http://otherdomain.com/someimage.jpg
. Vuelve a escribir esta URL como https://mydomain.com/imageserver?url=http://otherdomain.com/someimage.jpg&hash=abcdeafad
. De esta manera, el navegador siempre realiza una solicitud a través de https, por lo que se deshace de los problemas.
La siguiente parte: cree una página proxy o un servlet que haga lo siguiente:
- Lea el parámetro de URL de la cadena de consulta y verifique el hash
- Descargue la imagen del servidor y vuelva a enviarla por proxy al navegador
- Opcionalmente, caché la imagen en el disco
Esta solución tiene algunas ventajas. No es necesario descargar la imagen al momento de crear el html. No es necesario que almacene las imágenes localmente. Además, eres apátrida; la url contiene toda la información necesaria para servir la imagen.
Finalmente, el parámetro hash es por seguridad; solo desea que su servlet sirva imágenes para las URL que ha construido. Entonces, cuando crees la URL, calcúlala md5(image_url + secret_key)
y añádela como el parámetro hash. Antes de entregar la solicitud, vuelva a calcular el hash y compárelo con lo que se le pasó. Dado que solo usted conoce la clave_secreta, nadie más puede construir URL válidas.
Si está desarrollando en Java, el Servlet son solo unas pocas líneas de código. Debería poder transferir el siguiente código a cualquier otra tecnología de back-end.
/*
targetURL is the url you get from RSS feeds
request and response are wrt to the browser
Assumes you have commons-io in your classpath
*/
protected void proxyResponse (String targetURL, HttpServletRequest request,
HttpServletResponse response) throws IOException {
GetMethod get = new GetMethod(targetURL);
get.setFollowRedirects(true);
/*
* Proxy the request headers from the browser to the target server
*/
Enumeration headers = request.getHeaderNames();
while(headers!=null && headers.hasMoreElements())
{
String headerName = (String)headers.nextElement();
String headerValue = request.getHeader(headerName);
if(headerValue != null)
{
get.addRequestHeader(headerName, headerValue);
}
}
/*Make a request to the target server*/
m_httpClient.executeMethod(get);
/*
* Set the status code
*/
response.setStatus(get.getStatusCode());
/*
* proxy the response headers to the browser
*/
Header responseHeaders[] = get.getResponseHeaders();
for(int i=0; i<responseHeaders.length; i++)
{
String headerName = responseHeaders[i].getName();
String headerValue = responseHeaders[i].getValue();
if(headerValue != null)
{
response.addHeader(headerName, headerValue);
}
}
/*
* Proxy the response body to the browser
*/
InputStream in = get.getResponseBodyAsStream();
OutputStream out = response.getOutputStream();
/*
* If the server sends a 204 not-modified response, the InputStream will be null.
*/
if (in !=null) {
IOUtils.copy(in, out);
}
}