3 votes

Obtenir le paramètre GET binaire HTTP dans Play Framework

J'ai besoin d'obtenir des données binaires dans une requête GET avec Play Framework. Cela est utilisé pour obtenir info_hash à partir des clients BitTorrent.

Je le récupère comme ceci :

byte[] infoHash = params.get("info_hash").getBytes("ISO-8859-1")

Malheureusement, tous les symboles non-ascii sont remplacés par 0x3f.

P.S. Je peux obtenir les paramètres encodés en URL à partir de Http.Request.current().querystring, mais c'est une mauvaise idée.

Mise à jour : J'ai remplacé la méthode play.data.parsing.UrlEncodedParser.parse(InputStream is) avec ma variante où j'ai utilisé ISO-8859-1 comme paramètre au lieu de l'UTF-8 codé en dur comme dans l'original et tout fonctionne comme il se doit. Mais je recherche toujours une meilleure façon, car je ne veux pas modifier les sources du framework.

1voto

Leonel Points 8174

Selon http://wiki.theory.org/BitTorrent_Tracker_Protocol:

info_hash

Le hachage sha1 de 20 octets de la forme bencodée de la valeur info du fichier metainfo.

Un somme SHA1 ressemble à ceci : 92a11182a8405cbd8d25cd3cc3334fc6155bec06

Chaque paire successive d'octets dans la représentation d'un octet. Bien que cette représentation elle-même pourrait être encodée, ce n'est pas un encodage d'URL des octets pour l'info_hash.

Vous devez donc convertir chaque paire de caractères de la chaîne en un octet. Si vous trouvez une bibliothèque qui le fait à la place, suivez-la. Sinon, n'hésitez pas à utiliser ce code:

byte[] decode(String enc) {
    if (enc.length() % 2 != 0) throw new NumberFormatException();

    byte arr[] = new byte[enc.length() / 2];
    int c = 0;
    for (int i = 0; i < enc.length(); i += 2) {
        arr[c++] = Integer.valueOf(enc.substring(i, i + 2), 16).byteValue();
    }
    return arr;
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X