IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Web & réseau Delphi Discussion :

WebSocket HTML5 et Delphi


Sujet :

Web & réseau Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2009
    Messages
    76
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2009
    Messages : 76
    Par défaut WebSocket HTML5 et Delphi
    Bonjour,

    Voilà avec la sortie des socket avec l'api d'HTML5. J'ai voulu comprendre un peut et essayer de le faire marcher avec un serveur en DELPHI.

    Alors côté navigateur tout bas bien j'envoie un requête le problème c'est que le serveur n'arrive pas à me répondre.
    Donc côté serveur:

    Voilà ma réponse:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
      s := 'HTTP/1.1 101 WebSocket Protocol Handshake' + #13#10 
        +  'Upgrade: WebSocket' + #13#10
        +  'Connection: Upgrade' + #13#10
        +  'Sec-WebSocket-Location: ws://.......' + #13#10
        +  'Sec-WebSocket-Origin: http://localhost' + #13#10
        +  'Sec-WebSocket-Protocol: sample' + #13#10
        + #13#10 + md5rep;
    Le "md5rep" lui est réaliser comme il se doit normalement avec les deux key de la requête et concaténés à la troisième key.

    Mais le ça ne marche pas je comprend pas

    help

  2. #2
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 026
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14 026
    Par défaut
    Delphi ? Version ?
    Delphi On Rails ? ce n'est plus du Delphi mais du Ruby (c'est tout aussi éloigné de Delphi que l'est Delphi For PHP)

    Quel navigateur ? utilise FF4 ou Chrome pour un début de compatibilité du client avec les WebSockets !
    C'est tout de même très frais comme techno !

    Qu'est ce qui ne fonctionne pas ?
    Cette étape correspond à la phase de négociation du protocol, pour effectuer la connexion bi-directionnel en HTTP, ensuite, il y aura la phase d'acceptation du protocol (selon la version) puis après, c'est un peu tout le monde fait ce qu'il veut, principalement du streaming avec les composants HTML5 !
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  3. #3
    Expert éminent
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Par défaut
    aucune idée

    comme à chaque fois que j'étudie un protocole, je fais toujours un client et un serveur...et idéalement je me trouve un client et un serveur déjà faits...ça me permet de tester des deux côtés du protocole et de repérer plus facilement mes erreurs.
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  4. #4
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2009
    Messages
    76
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2009
    Messages : 76
    Par défaut
    Merci de votre aide alors,

    J'utilise DELPHI 7 et Chrome comme navigateur !

    Le problème vient surrment de la clé que je renvoie..

    Bizarre tout de même car j'ai fait ce qu'il fallait, le client reçoit comme si le serveur était fermé, or le serveur lui reçoit bien la requête donc c'est vraiment dans ma réponse...

    L'entête ma l'air correcte donc seul problème qui peut y avoir c'est le md5 que je revoie qui ne ne doit pas aller ?

  5. #5
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 026
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14 026
    Par défaut
    As-tu essayé une version sans clé ?
    As-tu essayé une version avec une clé volontairement incorrect ?
    Pour voir si le comportement est similaire à celui que tu observes ?

    Quel est ta fonction de MD5 ?

    Sinon, ta syntaxe est déjà une version obsolète !
    Il semble que Chrome soit le seul qui supporte encore cette forme ! Je sais une source basique comme wikipedia est pas toujours fiable, mais cela peut-être aussi une explication à ton problème, tu as peut-être une version qui ne le supporte plus !
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  6. #6
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2009
    Messages
    76
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2009
    Messages : 76
    Par défaut
    Une version sans clé ? Comment je fais pour envoyé sans clé il va me refusé car pour moi j'avais compris qu'il fallait renvoyé la clé pour que le client accepte?

    Je pense que le problème vient lors de la conversion au format binaire en 32bit:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
      for i := 0 to 3 do
      begin
        n1 := chr((p1 shr ((i and 7) shl 3)) and $ff) + n1;  
      end;
    Quant-à ma fonction md5:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    function TForm1.md5(const Input: String): String;
    var
      hCryptProvider: HCRYPTPROV;
      hHash: HCRYPTHASH;
      bHash: array[0..$7f] of Byte;
      dwHashBytes: Cardinal;
      pbContent: PByte;
      i: Integer;
     
    begin
      dwHashBytes := 16;
      pbContent := Pointer(PChar(Input));
     
      Result := '';
     
      if CryptAcquireContext(@hCryptProvider, nil, nil, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT or CRYPT_MACHINE_KEYSET) then
      begin
        if CryptCreateHash(hCryptProvider, CALG_MD5, 0, 0, @hHash) then
        begin
          if CryptHashData(hHash, pbContent, Length(Input) * sizeof(Char), 0) then
          begin
            if CryptGetHashParam(hHash, HP_HASHVAL, @bHash[0], @dwHashBytes, 0) then
            begin
              for i := 0 to dwHashBytes - 1 do
              begin
                Result := Result + Format('%.2x', [bHash[i]]);
              end;
            end;
          end;
          CryptDestroyHash(hHash);
        end;
     
        CryptReleaseContext(hCryptProvider, 0);
      end;
     
      Result := AnsiLowerCase(Result);
    end;

  7. #7
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 026
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14 026
    Par défaut
    Citation Envoyé par shadow578 Voir le message
    Une version sans clé ? Comment je fais pour envoyé sans clé il va me refusé car pour moi j'avais compris qu'il fallait renvoyé la clé pour que le client accepte?
    C'est pour une ANALYSE !
    Tester les comportements d'erreur est très instructifs, souvent plus que de tester de nombreux cas dont le comportement n'est pas prévisible car incorrect !
    C'est le principe du TDD ! On écrit les Tests qui valident ou invalident une fonction avant de la coder, cela permet de garantir la spec !

    Format Binaire ???
    Semble que c'est une simple conversion de nombre

    1- As-tu retirer tous caractères autre que des Nombres dans ta clé ?
    2- As-tu diviser le nombre obtenu par le nombre d'espace ?

    Sec-WebSocket-Key1: 4 @1 46546xW%0l 1 5
    Sec-WebSocket-Key2: 12998 5 Y3 1 .P00
    8 Dernier Octets : ^n:ds[4U
    4146546015 / 5
    1299853100 / 5
    ^n:ds[4U
    Bon, je suis pas RainMan, je sais pas calculé ça !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
    Key1, Key2 : Longword; // Normalement, les clés ne dépassent pas 32bits !
    Key1BE, Key2BE : Longword;
    NbSpace1, NbSpace2: Byte;
    Token : string;
     
     
    Key1 := WebSocketKeyToInt32(StringKey1);
    Key2 := WebSocketKeyToInt32(StringKey1);
    Key1BE := SwapLongword(Key1); // Semble que c'est du Big Endian !
    Key2BE := SwapLongword(Key2);
     
    SetLength(S, 16);
    CopyMemory(@Token[1], @Key1BE, 4);
    CopyMemory(@Token[5], @Key2BE, 4);
    CopyMemory(@Token[9], @ContentRequest[Length(ContentRequest) - 8 + 1], 8); // ContentRequest la chaine contenant le message, ^n:ds[4U étant les 8 derniers caractères
     
    ContentResponse := md5(Token);
    WebSocketKeyToInt32, va compter les espaces, concaténer tous les chiffres dans une chainer puis convertir en Entier 64 bits, diviser par le nombre d'espace, normalement le résultat doit être un entier 32 bits

    code tapé à l'arrache sur le forum

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    function WebSocketKeyToInt32(S: String): Longword;
    var
      StrValue: string;
      Int64Value: Int64;
      SpaceCount: Byte;
    begin
      StrValue := '';
      SpaceCount := 0;
     
      for i := 1 to length(S) do
      begin
        if S[i] in ['0'..'9'] then
         StrValue = StrValue + S[i]; // En Delphi 7, je te conseil soit d'utiliser FastMM soit de pre-compter les chiffres, les réalloctions de chaine c'est très lent ! 
        else
          if S[i] = ' ' then  
            Inc(SpaceCount);
      end;
     
      Int64Value := StrToInt64(StrValue);
      Result := Int64Value div SpaceCount;
    end;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
       function SwapLongword(Value: Longword): Longword;
       {$IFDEF PUREPASCAL}
       type
          TMapLongword = array[0..3] of Byte;
       begin
          TMapLongword(Result)[0] := TMapLongword(Value)[3];
          TMapLongword(Result)[1] := TMapLongword(Value)[2];
          TMapLongword(Result)[2] := TMapLongword(Value)[1];
          TMapLongword(Result)[3] := TMapLongword(Value)[0];
       {$ELSE}
       asm
        BSWAP EAX
      {$ENDIF}
       end;
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  8. #8
    Membre émérite
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    737
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 737
    Par défaut
    Citation Envoyé par ShaiLeTroll Voir le message
    Delphi On Rails ? ce n'est plus du Delphi mais du Ruby (c'est tout aussi éloigné de Delphi que l'est Delphi For PHP)
    http://code.google.com/p/delphionrails/

    celui la : c'est bien du Delphi (Pascal)

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    74
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 74
    Par défaut
    Pour ceux qui cherchent encore une solution (comme moi il y a encore 5 minutes ) :

    Code Delphi : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    uses
      ..., IdBaseComponent, IdCoder, IdCoder3to4, IdCoderMIME, IdHashSHA1, IdGlobal;
     
    ...
     
    function GetWebSocketAcceptKey(const WebSocketKey: string): string;
    const
      cMagicString = '258EAFA5-E914-47DA-95CA-C5AB0DC85B11';
    var
      HashSHA1: TIdHashSHA1;
    begin
      Result := '';
     
      HashSHA1 := TIdHashSHA1.Create;
      try
        Result := TIdEncoderMIME.EncodeBytes(HashSHA1.HashString(WebSocketKey + cMagicString, TIdTextEncoding.Default));
      finally
        HashSHA1.Free;
      end;
    end;

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. HTML5 : Microsoft propose des modules pour Websocket et IndexedDB
    Par Idelways dans le forum Balisage (X)HTML et validation W3C
    Réponses: 6
    Dernier message: 06/01/2011, 11h18
  2. Réponses: 4
    Dernier message: 22/12/2010, 15h06
  3. Où héberger une application en PHP/HTML5/WebSocket ?
    Par z4k4r14 dans le forum Hébergement
    Réponses: 0
    Dernier message: 21/11/2010, 18h55

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo