Seu pior cenário não é tão ruim quanto você pensa.
Você já está analisando o feed RSS, então já tem os URLs das imagens. Digamos que você tenha um URL de imagem como http://otherdomain.com/someimage.jpg
. Você reescreve este URL comohttps://mydomain.com/imageserver?url=http://otherdomain.com/someimage.jpg&hash=abcdeafad
. Dessa forma, o navegador sempre faz solicitação por https, para você se livrar dos problemas.
A próxima parte - crie uma página de proxy ou servlet que faça o seguinte -
- Leia o parâmetro url da string de consulta e verifique o hash
- Baixe a imagem do servidor e faça proxy de volta para o navegador
- Opcionalmente, armazene a imagem em cache no disco
Essa solução tem algumas vantagens. Você não precisa baixar a imagem no momento de criar o html. Você não precisa armazenar as imagens localmente. Além disso, você não tem estado; o url contém todas as informações necessárias para veicular a imagem.
Finalmente, o parâmetro hash é para segurança; você só deseja que seu servlet forneça imagens para urls que você construiu. Então, quando você cria o url, calculemd5(image_url + secret_key)
e acrescente-o como o parâmetro hash. Antes de atender à solicitação, calcule novamente o hash e compare-o com o que foi passado para você. Já que a secret_key só é conhecida por você, ninguém mais pode construir urls válidas.
Se você está desenvolvendo em java, o Servlet é apenas algumas linhas de código. Você deve conseguir portar o código abaixo em qualquer outra tecnologia 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);
}
}