6
votes

IDhttp.get retourner http1.1 / 403 interdit

J'essaie d'accéder à un fichier update.txt sur mon site Web, à l'aide d'un programme compilé DELPHIXE et du composant IDHTTP.

Le code que j'utilise est comme suit: P>

HandleRedirects := true;
HTTPOptions [hoForceEncodeParams];
ProtocolVersion := pv1_1;
Request.UserAgent := Mozilla/5.0 (compatible; Test)


0 commentaires

3 Réponses :


6
votes

403 signifie que vous n'avez pas la permission d'accéder à l'URL demandée. Le serveur nécessite probablement de fournir un nom d'utilisateur / mot de passe, d'autant plus que vous utilisez un fichier .htaccess. Utilisez le request.Asername et request.password propriétés pour cela. Quant à la raison pour laquelle le navigateur ne demande pas de nom d'utilisateur / mot de passe, je suppose que le navigateur les a mis en cache d'un accès antérieur.

BTW, votre SpeedButtonUpdateclick () a une fuite de mémoire. Vous créez un nouvel objet TIDHTTP mais vous ne le libérez pas.


9 commentaires

Bonjour Remy, je n'ai aucun nom d'utilisateur ou mot de passe mis en place pour le site. Je peux accéder à l'URL d'un WebBrowser sur un autre PC, cela ne m'appartient pas. THX pour la fuite de mémoire .. Juste exemple de code, mais vous êtes correct, il doit être libéré.


Ensuite, utilisez un sniffer de paquet, tel que WireShark, pour voir quelles demandes HTTP ressemblent à votre navigateur et à Tidhttp, puis à les comparer à des différences. Vêve, peut-être que votre serveur n'aime pas la valeur de la requête .useragent que vous utilisez. Certains serveurs sont sensibles à l'utilisateur.


J'étais inquiet pour la demande.useragent aussi et j'ai essayé de nombreuses variantes, sans aucun succès.


Bonjour Remy, en fait, le problème mie avec moi. Comme vous pouvez le constater dans le code, je crée Tidhttp, mais je ne changeais pas sa demande.useragent, mais le composant IDHTTP1 que j'avais abandonné sur la forme, donc la valeur par défaut Mozilla / 3.0 (compatible; bibliothèque indy) a été envoyée, Et pas ce que je pensais être envoyé tout le long. Donc, toutes les modifications que je faisais dans le composant.Properties et les tests ne traversaient jamais. Ajouter cette ligne de code l'a fait après la création du LidHTTP: lidhttp.request.useragent: = 'Mozilla / 5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident / 5.0; MAAU)'; Thx adrian


@Remy Lebeau - Teamb, 403 est interdit, 401 est pour un défi de compétence.


401 est utilisé pour demander des informations d'identification dans un format particulier spécifié par "l'authentification www". 403 est utilisé lorsque la demande est rejetée, comme si les informations d'identification appropriées ont été spécifiées mais non valables pour la ressource demandée.


Lorsque vous utilisez la fonction Get () d'Indy - Si vous définissez la propriété userAgent, comme indiqué dans Suivi Réponse, la demande aura les informations d'identification correctes et ne recevra pas une erreur 403.


Modification de la requête .UserAgent n'affecte pas la manière dont Indy envoie des informations d'identification de quelque manière que ce soit, il n'affecte que les demandes de processus certains HTTP.


FYI, I Il y a quelques minutes il y a quelques minutes enregistré dans une mise à jour où le fidhttp.request.useragent est maintenant personnalisable. Il existe un nouveau giddefaulTuseragent de variable globale dans le iDhttheaderinfo.pas unité. Au lieu de définir fidhttp.request.useragent séparément pour chaque Tidhttp objet utilisé, vous pouvez maintenant définir giddefaulTuseragent une fois au démarrage du programme et chaque TIDHTTP DEMANDE L'utilisera (vous pouvez toujours utiliser fidhttp.request.useragent pour remplacer le userAgent sur une base de requête, si nécessaire).



10
votes

Je rencontre exactement le même problème lorsque vous utilisez la fonction Get () d'Indy ().

Il est plus que probable que vous obteniez cette erreur, car vous n'avez pas défini la propriété userAgent et le site Web sachant que vous n'acceptez pas le Fichier en tant que navigateur Bouchez une bagarre. P>

function CheckUpdates: String;
var lIdHttp: TIdHTTP;
begin
  lIdHttp := TIdHTTP.Create(nil);
  //avoid getting '403 Forbidden' by setting UserAgent
  lIdHttp.Request.UserAgent :=
      'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:12.0) Gecko/20100101 Firefox/12.0';
  result := lIdHttp.Get('http://www.test.com/test_down_load/update.txt');
end;


0 commentaires

-1
votes

Les réponses données n'ont pas fonctionné pour moi avant de les mettre tous ensemble.

//add Request.Username and supply the correct mysql username
tidHttpObject.Request.Username := 'username';

//do the same for the password
tidHttpObject.Request.Password := 'password';

//then add a UserAgent property with the string below
tidHttpObject.Request.UserAgent :=  'Mozilla/5.0 (Windows NT 6.1; WOW64;
rv:12.0) Gecko/20100101 Firefox/12.0';

//finally call the get() url method of the tidHttp object
Result :=  tidHttpObject.Get(url);


0 commentaires