PDA

Ver la Versión Completa : Obtener la información de un fichero sin llegar a descargarlo


bucanero
04-01-2016, 19:20:28
Hola,

El tema es que tengo una serie de ficheros que se van descargando de distintos servidores webs y almacenando en nuestro servidor en local, estos ficheros cuando se modifican en la web, debo de actualizarlos también en local. Para determinar cuando se han modificado en el servidor utilizo la siguiente función:

function TMainForm.GetURLFileInfo(const AURL:String; var FileSize:Int64; var FileHash:String):Boolean;
begin
result:=false;
with TIdURI, IdHTTP1 do
try
try
Head(URLEncode(URLDecode(AURL)));
result:=(ResponseCode=200);
except
on E: EIdHTTPProtocolException do
logs.Error(E, 'GetURLFileInfo('+AURL+')');
end;
finally
if result then begin
//devuelve el tamaño del fichero en el servidor WEB
FileSize:=Response.ContentLength;
//devuelve un hash (especie de MD5) del fichero en el servidor WEB
FileHash:=Response.ETAG;
end else begin
FileSize:=0;
FileHash:='';
end;
end;
end;

En teoría (depende de los servidores y de su configuración) devuelve cierta meta-información de los ficheros tal como el tamaño del fichero en bytes y una especie de HASH del contenido del fichero, de tal forma que sin necesidad de descargar el fichero realmente, puedo comprobar si ha sido modificado o no.

El principal problema que estoy teniendo es con el propio componente TIDHTP de las INDY, que al llamar al procedimiento HEAD, este no realiza ningún redirecionamiento para aquellas URLs que lo solicitan. Aunque si la llamada se hace con GET si obtengo los datos correctamente. ¿Se puede hacer redireccionamiento con HEAD?

Por otro lado en un par de servidores de unos aproximadamente siete u ocho con los que trabajo actualmente y solo con algunos ficheros, no en todos, el tamaño de fichero que obtengo no es el correcto, la diferencias son de muy pocos bytes, pero no llega a coincidir. ¿Es realmente este parametro fiable?

Agradezco si alguien puede decirme algo al respecto
Un Saludo

rruz
05-01-2016, 04:48:06
Intenta estableciendo el valor de la propiedad HandleRedirects a True (HandleRedirects:=True;)

bucanero
05-01-2016, 09:51:25
Gracias rruz por responder

No lo especifique en el mensaje anterior, pero si esta activa la propiedad HandleRedirects , ya que al hacer el GET sobre la misma URL, se realizan todos los redireccionamientos para descargar el fichero sin problemas.

pongo aqui la configuracion del TIDHTTP

with IdHTTP1 do
begin
Name := 'IdHTTP1';
Intercept := IdConnectionIntercept1;
IOHandler := IdSSLIOHandlerSocketOpenSSL1;
AllowCookies := True;
HandleRedirects := True;
RedirectMaximum := 50;
HTTPOptions := [hoForceEncodeParams];
OnRedirect := IdHTTP1Redirect;
CookieManager := IdCookieManager1;
Compressor := IdCompressorZLib1;
end;


y el error que estoy obteniendo cuando intento acceder a esta URL es 405: HTTP/1.1 405 Method Not Allowed


¿hay alguna forma de poder saber la URL de redirección sin llegar a descargar el contenido?