Il tuo scenario peggiore non è così grave come pensi.
Stai già analizzando il feed RSS, quindi hai già gli URL delle immagini. Supponi di avere un URL immagine come http://otherdomain.com/someimage.jpg
. Riscrivi questo URL come https://mydomain.com/imageserver?url=http://otherdomain.com/someimage.jpg&hash=abcdeafad
. In questo modo, il browser effettua sempre richieste tramite https, in modo da eliminare i problemi.
La parte successiva: creare una pagina proxy o un servlet che esegue le seguenti operazioni:
- Leggere il parametro url dalla stringa di query e verificare l'hash
- Scarica l'immagine dal server e inviala nuovamente al browser
- Facoltativamente, memorizzare nella cache l'immagine su disco
Questa soluzione presenta alcuni vantaggi. Non è necessario scaricare l'immagine al momento della creazione dell'html. Non è necessario memorizzare le immagini in locale. Inoltre, sei apolide; l'url contiene tutte le informazioni necessarie per servire l'immagine.
Infine, il parametro hash è per la sicurezza; vuoi solo che il tuo servlet serva immagini per gli URL che hai costruito. Quindi, quando crei l'URL, calcolalo md5(image_url + secret_key)
e aggiungilo come parametro hash. Prima di servire la richiesta, ricalcola l'hash e confrontalo con ciò che ti è stato passato. Poiché secret_key è noto solo a te, nessun altro può costruire URL validi.
Se stai sviluppando in java, il Servlet è solo poche righe di codice. Dovresti essere in grado di trasferire il codice seguente su qualsiasi altra tecnologia di 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);
}
}