url кодирует хеш для протокола bittorent

Я пытаюсь создать info_hash битторент-протокола для связи с трекером.

Но я продолжаю получать неверную ошибку info_hash. Проблема, похоже, связана с частью моего кода, закодированной с помощью urlencode, но я не уверен.

Я генерирую sha1 закодированного metainfo.info и использую axiosотправить свое объявление .

Кодирует ли axios дополнительно параметр, какой лучший способ urlencode для массива 20 байт?

Ниже моего кода:

      const axios = require('axios').default;
const bencode = require('bencode');
const crypto = require('crypto');
const urlencode = require('urlencode');

class TrackerMessenger {
    constructor(metainfo) {
        this.url = metainfo.announce.toString();
        this.info = this.unbufferer(metainfo.info);
        // this.info = metainfo.info;
        // console.log(this.info)
        this.left = metainfo.info?.files?.length || metainfo.info?.length;

    }

    async announce(peer_id, hostinfos) {

        const port = hostinfos.port;
        const compact = 1;
        const event = 'started';
        const trackerid = undefined;

        // console.log(encodeURIComponent(this.info_hash))
        let hash = this.urlencode(this.info_hash);


        const res = await axios.get(this.url, {
            params: {
                info_hash: hash,
                peer_id,
                port,
                left: this.left,
                compact,
                event,
                trackerid
            }
        });

        console.log(res.data);

        return res;
    }

    get info_hash() {
        let info = bencode.encode(this.info).toString('utf8');

        const info_hash = crypto.createHash('sha1').update(info, 'utf8').digest();

        console.log(info_hash.length);


        return info_hash;
    }

    unbufferer(obj) {
        const unbuffered = {};
        Object.entries(obj).forEach(entry => {
            const [key, value] = entry;
            
            unbuffered[key] = this.unbuffer(value);
        });

        return unbuffered;
    }

    unbuffer(value) {
        let result = undefined;
        if(value == undefined)
            return result;

        if(typeof value === 'object')
            result = this.unbufferer(value);
        else if(Array.isArray(value))
            result = value.forEach(item => this.unbuffer(item)); 
        else
            result = (Buffer.isBuffer(value))? value.toString('utf8'): value;

        return result;
    }

    urlencode(buffer) {
        return urlencode(buffer);
    }
}

module.exports = TrackerMessenger;

0 ответов

Другие вопросы по тегам