À L'Aide De IdHTTP1.Obtenez avec Delphi et Indy 9/10 sur un serveur web renvoie l'exception
J'ai un problème de réception d'un favicon.ico à partir d'un serveur web à l'aide de Delphi et Indy 9/10. Les autres serveurs ne fonctionnent bien. Le problème n'est pas avec ce serveur web, comme wget utilitaire de ligne de commande obtient le fichier correctement.
voici le résultat de wget:
c:\a>wget http://perforce.eigenbase.org:8080/favicon.ico
SYSTEM_WGETRC = c:/progra~1/wget/etc/wgetrc
syswgetrc = c:/progra~1/wget/etc/wgetrc
--2013-01-27 00:12:39-- http://perforce.eigenbase.org:8080/favicon.ico
Resolving perforce.eigenbase.org... 72.14.190.177
Connecting to perforce.eigenbase.org|72.14.190.177|:8080... connected.
HTTP request sent, awaiting response... 200 No headers, assuming HTTP/0.9
Length: unspecified
Saving to: `favicon.ico'
[ <=> ] 2.862 --.-K/s in 0s
2013-01-27 00:12:40 (143 MB/s) - `favicon.ico' saved [2862]
Voici mon Delphi Indy 9/10 exemple de code. Il génère une "fermeture de la Connexion Gracieusement" l'Exception", et le résultat est une chaîne vide.
procedure TForm1.Button1Click(Sender: TObject);
var s: string;
begin
s := '';
try
s := IdHTTP1.Get('http://perforce.eigenbase.org:8080/favicon.ico');
except
on E: Exception do
begin
{$IFDEF DEBUG}ShowMessage('get error:'+E.Message){$ENDIF};
end;
end;
ShowMessage(IntToStr(Length(s)));
end;
Si j'essaie de le même code avec un autre serveur, par exemple:
s := IdHTTP1.Get('http://www.google.com/favicon.ico');
tout fonctionne bien.
Est-il une solution pour obtenir le http://perforce.eigenbase.org:8080/favicon.ico fichier à l'aide de IdHTTP1.Obtenir à partir du serveur?
Request.UserAgent
de votre IdHTTP1
composant par exemple pour Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; SLCC1
et vous serez amende. Le serveur est en rejetant vous (de façon officielle) juste parce que vous agissez en tant que par défaut Mozilla/3.0 (compatible; Indy Library)
agent (tout à fait une politique cruelle, mais il le fait).De toute façon, vous n'avez pas à recevoir la
Get
réponse comme une chaîne de caractères. Puisque vous êtes évidemment le téléchargement d'un fichier, que vous ne serez pas afficher sous forme de texte (pourquoi souhaitez-vous afficher une icône dans un fichier texte), mais vous aurez peut-être de les enregistrer ou de les manipuler avec elle comme avec un fichier, vous pouvez utiliser le Get
la surcharge, qui reçoit la réponse à un flux de données.OriginalL'auteur Casady | 2013-01-26
Vous devez vous connecter pour publier un commentaire.
La raison
TIdHTTP
est défaut est à cause de cette information clé qui wget est de déclaration:Dans un HTTP 0.9 réponse, le code statut HTTP de la ligne et les en-têtes ne sont pas présents à tous, seulement le fichier raw de données par lui-même, terminé par une déconnexion. wget soutient que, mais
TIdHTTP
n'a pas (alors même que le fonctionnaire HTTP 1.0 et HTTP 1.1 spécifications besoin d'aide pour reconnaître HTTP 0.9 réponses) .TIdHTTP
prend uniquement en charge le protocole HTTP 1.0 et 1.1 messages formatés, qui nécessitent l'utilisation d'un statut HTTP de la ligne et les en-têtes. Pour quelque raison que ce soit, ce serveur est le choix d'envoyer un HTTP 0.9 réponse pour IndyUserAgent
, mais c'est le choix d'envoyer un de HTTP 1.0 réponse pour Internet Explorer UserAgents à la place. Impair.La solution à court terme est de faire ce que @TLama dit. Réglage de la
TIdHTTP.Request.UserAgent
propriété pour imiter Internet Explorer permet deTIdHTTP.Get()
de fonctionner correctement:La solution à long terme serait de mettre à jour
TIdHTTP
à l'appui HTTP 0.9 réponses, même si elles sont très rare de rencontrer aujourd'hui. J'ai ouvert les billets en Indy problème de tracker pour que.OriginalL'auteur Remy Lebeau