Votre pire scénario n'est pas aussi mauvais que vous le pensez.
Vous analysez déjà le flux RSS, vous disposez donc déjà des URL des images. Supposons que vous ayez une URL d'image comme http://otherdomain.com/someimage.jpg
. Vous réécrivez cette URL sous la forme https://mydomain.com/imageserver?url=http://otherdomain.com/someimage.jpg&hash=abcdeafad
. De cette façon, le navigateur fait toujours la demande via https, vous évitant ainsi les problèmes.
La partie suivante - créez une page proxy ou un servlet qui effectue les opérations suivantes -
- Lisez le paramètre url de la chaîne de requête et vérifiez le hachage
- Téléchargez l'image depuis le serveur et renvoyez-la au navigateur par proxy
- Si vous le souhaitez, mettez en cache l'image sur le disque
Cette solution présente certains avantages. Vous n'êtes pas obligé de télécharger l'image au moment de la création du html. Vous n'êtes pas obligé de stocker les images localement. De plus, vous êtes apatride; l'url contient toutes les informations nécessaires pour servir l'image.
Enfin, le paramètre de hachage est pour la sécurité; vous voulez que votre servlet ne serve des images que pour les URL que vous avez construites. Ainsi, lorsque vous créez l'url, calculez-la md5(image_url + secret_key)
et ajoutez-la en tant que paramètre de hachage. Avant de servir la requête, recalculez le hachage et comparez-le à ce qui vous a été transmis. Puisque la clé secret_key n'est connue que de vous, personne d'autre ne peut construire d'URL valides.
Si vous développez en java, le servlet n'est que quelques lignes de code. Vous devriez pouvoir porter le code ci-dessous sur toute autre technologie 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);
}
}