Получение двоичного HTTP GET параметра в Play Framework - PullRequest
3 голосов
/ 03 февраля 2011

Мне нужно получить двоичные данные в запросе GET от Play Framework. Используется для получения info_hash от клиентов BitTorrent.

Я так понимаю:

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

К сожалению, все символы не ascii заменены на 0x3f.

P.S. Я могу получить параметры в кодировке URL-адреса из Http.Request.current (). Querystring, но это плохая идея.

Обновление: Я переопределяю метод play.data.parsing.UrlEncodedParser.parse(InputStream is) в моем варианте, где в параметре используется ISO-8859-1 вместо жестко закодированного UTF-8, как в оригинале, и все работает как надо. Но я все еще ищу лучший способ, потому что я не хочу редактировать исходные тексты фреймворка.

1 Ответ

1 голос
/ 21 марта 2011

Согласно http://wiki.theory.org/BitTorrent_Tracker_Protocol:

info_hash

20-байтовый хэш sha1 закодированной формы информационного значения из файла metainfo.

Сумма SHA1 выглядит следующим образом: 92a11182a8405cbd8d25cd3cc3334fc6155bec06

Каждая последующая пара байтов в представлении байта.Хотя само это представление может быть закодировано, это , а не URL-кодирование байтов для info_hash.

Поэтому вам необходимо преобразовать каждую пару символов из String в байт.Если вы найдете библиотеку, которая делает это вместо этого, придерживайтесь этого.Если нет, не стесняйтесь использовать этот код:

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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...