IdHTTP... Question technique

Signaler
Messages postés
135
Date d'inscription
jeudi 22 mars 2007
Statut
Membre
Dernière intervention
25 juillet 2008
-
 Utilisateur anonyme -
Bonjour c'est encore moi :P !! (eh oui),,,
Jaurais besoin daide sur la composante idHTTP de Indy (jutilise la v10).
Bon je vous met dans le contexte.
Je suis entrain de faire un peti programme pour envoyer des SMS ... rassurer vous rien de louche dans ceci ,,, je possede un mobile (evidemment ;) ) quand je recois bcp de sms ,, et que je suis pres de mon ordi ,,, je prefere passer par le site de mon fournisseur (Fido.ca) pour envoyer des sms gratuitement aulieu de payer 10 cents a tout les reponse que je fais sur mon mobile (oui je sais je suis cheap hehe mais a ex: 20 reponse sa fait quand meme 2$ !) de toute facon cest tjrs plus rapide reecrire sur un clavier dordinateur que sur un mobile.

Donc voici mon code en question qui me pose probleme:

procedure TForm1.Button1Click(Sender: TObject);
Var
  aStream,astream2: TMemoryStream;
  Params,Params2: TStringStream;
  id,day,hrs,min,month:string;
  cookie1: Tidcookiemanager;
begin
  cookie1:= Tidcookiemanager.Create(Form1); // au debut javais mi un composant sur ma form mais a force dassayer plein de truc
  month:=formatdatetime('m',now); // (suite) cest plus simple le cree «dynamiquement»
  day:=formatdatetime('d',now); // ici japel la date et temps pour remplir dans l'url pour le post cest necessaire davoir la bonne date
  hrs:=formatdatetime('hh',now);
  min:=formatdatetime('nn',now);
  aStream := TMemoryStream.create;
  aStream2 := TMemoryStream.create;
  Params := TStringStream.create('');
  Params2 := TStringStream.create('');
  if (length(edit1.Text)<>3) or (length(edit2.Text)<>3) or (length(edit3.Text)<>4) then //bon ici c du code pas important pour verifier
// si javais pas faite une erreur dans le numero de mobile avant denvoyer le sms
  begin
  showmessage('Invalid Destination Mobile Number!');
  exit;
  end;  if (edit6.Text '') and (edit7.Text '') and (edit8.Text = '') then //ici verifie si les case de mon # de rapel (ex: mon mobile) sont bien rempli
  begin
  edit6.Text := '000';
  edit7.Text := '000';
  edit8.Text := '0000';
  end;
  try
    with http do  // Etape #1 ,, premier POST
    begin
      CookieManager: = cookie1;
      Params.WriteString(URLEncode('directoryChoice= -1&'));
      Params.WriteString(URLEncode('rcptAreaCode=' + edit1.text + '&'));
      Params.WriteString(URLEncode('rcptPhone=' + edit2.Text + edit3.text + '&'));
      Params.WriteString(URLEncode('senderName='+edit6.Text + edit7.Text + edit8.Text + '&sendWhen=now&sendDateRef=&'));
      Params.WriteString(URLEncode('sendDateMonth=5&sendDateDay=25&sendHour=23&sendMinute=45&'));
      Params.WriteString(URLEncode('messageText=' + memo1.Text+ '&'));
      Params.WriteString(URLEncode('charCount=' + edit5.Text+ '&'));
      Params.WriteString(URLEncode('sendBtn.x='+IntToStr(rnd(97)) + '&sendBtn.y='+IntToStr(rnd(17))));
      Request.ContentType := 'application/x-www-form-urlencoded';
      try
        Post('http://fido.ca/portal/web2fido/compose.do', Params, aStream);
      except
        on E: Exception do
          showmessage('Error encountered during POST: ' + E.Message);
      end;
    end;
  params.Free;
  astream.Free;
  except
  end;
Id:=cookie1.CookieCollection.Items[0].CookieText; //Mon cookie en question avec sont index etant 0
  try
    with http do //Etape #2 deuxieme POST
    begin
      CookieManager: = cookie1;
      Params2.WriteString(URLEncode('sendBtn.x='+IntToStr(rnd(53)) + '&sendBtn.y='+IntToStr(rnd(17))));
      Request.ContentType := 'application/x-www-form-urlencoded';
      Request.CustomHeaders.Add('Cookie: '+ID); //Rajoute le cookie dans POST
      try
        Post('http://fido.ca/portal/web2fido/send.do', Params2, aStream2);

      except
        on E: Exception do
          showmessage('Error encountered during POST: ' + E.Message);
      end;
    end;
  params2.Free;
  astream2.Free;
  except
  end;
cookie1.free;
end;

Mon fournisseur me demande dans la page web de remplir les champs que je fait a letape #1 (voir ci dessus) ,apres menvoi un cookie que je store dans idcookiemanager et demande une confirmation sur une deuxieme page (ete vous sur de lenvoyer ? ).
Bon alors mon probleme cest que tout fonctionne quand jenvoi le premier message ,,, apres quand je veut en reecrire un autre le cookie de mon ancienne session est tjrs dans cookiemanager donc je ne recoit pas le nouveau cookie que je suis suposer recevoir et la lenvoi echou car le serveur ne comprend pas pourquoi jai tjrs le vieux cookie.

jai assasyer differente methode meme de «Destroy» le cookiemanager a lafin de lenvoy et de le recree au prochain envoie.
cookie1.cookiecollection.delete(0)  (on me demande lindex ,, surement celui du cookie que je veux deleter ... mais sa ne marche pas jai lu sur indy que cookiecollection etais Read-Only donc je ne sais plus quoi faire !!

merci davoir pris votre temps pour avoir lu cet immense message !

Je serais ravi si qqn avais une idee ,,, un conseil

Bonne journee,
Laurent

5 réponses

Messages postés
135
Date d'inscription
jeudi 22 mars 2007
Statut
Membre
Dernière intervention
25 juillet 2008

ah oui je veux preciser ,, je peu envoyer un SMS ,, le seul moyen den envoyer un autre cest de fermer mon programme et de le reouvrir donc le probleme vient vraiment du cookie (jai verifier leur valeur entre chaque envoi le premier cest correct mais le deuxieme , troisieme envoit il garde la meme valeur que le premier envoi )

Laurent
Messages postés
135
Date d'inscription
jeudi 22 mars 2007
Statut
Membre
Dernière intervention
25 juillet 2008

Bon j'ai vu qui a pas tant de monde que sa qui utilise idHTTP(ou indy)!!!
pour l'instant j'ai trouver comme solution de detruire le composant idHTTP a chaque envoi et de le recree sa fonctionne mais je doute que sa soit la meilleur methode pour annuler un cookie !! je laisse le thread ouvert si qqn aurais une suggestion !

Merci quand meme
Laurent !

Salut

Plutot que de libérer ton IdHTTP pourquoi ne pas libérer ton cookie :

procedure TForm1.Button1Click(Sender: TObject);
Var
  aStream,astream2: TMemoryStream;
  Params,Params2: TStringStream;
  id,day,hrs,min,month:string;
  cookie1: Tidcookiemanager;
begin
If Assigned(Cookie1) then Cookie1.Free,
cookie1:=Tidcookiemanager.Create(Form1);
.........
End;

@+
Messages postés
135
Date d'inscription
jeudi 22 mars 2007
Statut
Membre
Dernière intervention
25 juillet 2008

Salut,
j'avais deja assayer (c'est deja dans le code en haut regarde mais dune diferente facon)

cookie1: Tidcookiemanager;
begin
  cookie1:=Tidcookiemanager.Create(Form1); //

[...]
  params2.Free;
  astream2.Free;
  except
  end;
cookie1.free;
end;

quand je «free» et recree seulement mon cookiemanager sa me donner une erreur :

---------------------------
Fido SMS
---------------------------
List index out of bounds (0)
---------------------------
OK  
---------------------------

je pense que cest pcq
Id:=cookie1.CookieCollection.Items[0].CookieText;
nexiste plus en fesant sa ! car idHTTP se rapel davoir storer un cookie a cette index lah dans le click precedant !
donc moi quand je free idhttp et cookiemanager et je les recree sa marche ... serieusement je doute vrm que indy recommande ceci pour effacer un cookie ...

[...]
en passant merci pour ton pti bout de code:
If Assigned(Cookie1) then Cookie1.Free,
cookie1:=Tidcookiemanager.Create(Form1);

oups en regardant ton code je me pose une question ...
cest bien pour que tout ton code soit grouper ensemble sauf que example si je click sur le boutton une fois,, bon les deux composants sont cree MAIS si je quitte le programme il sont Free automatiquement ou faut je le fasse manuellement ?
car moi javais mit le FREE a la fin de la commande du boutton donc apres lenvoi il sont automatiquement detruit!

Laurent

Salut Laurent,

Arff désolé mais je vois pas ou tu libère ton cookie dans ton source. Tu libère ton idHTTP qui effectivement libère ton cookie.

Ensuite je penserai plus pour un changement du ID à chaque fois que tu utilises ton object cookie1 (voir les handles).

Pour répondre à ta question, voila la modif que je te propose

procedure TForm1.Button1Click(Sender: TObject);
Var
IdCook:Tidcookiemanager;
Begin
If  assigned(IdCook) then FreeAndNil(IdCook);//Ou IdCook.Free;
IdCook:=Tidcookiemanager.Create(Self);
  Try
  //Ton code
  Finally
  FreeAndNil(IdCook);
  End;
End;

Là tu es sur que ton cookie sera détruit avant d'etre reconstruit à chaque clique, et il sera détruit (normalement) à la fin de la procedure OnClick (Double sécuritée ). Normalement ca devrait marché : il n'y a pas de raison ou alors le probleme vient du TidHTTP.

@+