fromBytes static method

HTTPSResponseRecord fromBytes({
  1. required String name,
  2. required int ttl,
  3. required Uint8List bytes,
  4. required int offset,
  5. required int length,
})

Implementation

static HTTPSResponseRecord fromBytes({
    required String name,
    required int ttl,
    required Uint8List bytes,
    required int offset,
    required int length }) {

    if (length < 3) {
        throw FormatException('Invalid HTTPS record: expected at least 3 bytes, got $length');
    }

    final int priority = (bytes[offset] << 8) | bytes[offset + 1];
    int i = offset + 2;

    // Leer nombre objetivo (targetName)
    final (offs, hostname) = DNSHelper.parseDomainName(bytes, i);
    i = offs;

    final Map<int, Uint8List> encoded = { };
    while (i < offset + length) {
        if (i + 4 > bytes.length) {
            break;
        }

        final int key = (bytes[i] << 8) | bytes[i + 1];
        final int valueLength = (bytes[i + 2] << 8) | bytes[i + 3];
        i += 4;

        if (i + valueLength > bytes.length) {
            break;
        }

        encoded[key] = bytes.sublist(i, i + valueLength);
        i += valueLength;
    }

    final Map<int, String> knownKeys = {
        1: 'alpn',
        3: 'port',
        4: 'ipv4hint',
        6: 'ipv6hint',
    };

    final Map<String, String> decoded = { };
    for (final entry in encoded.entries) {
        final key = entry.key;
        final val = entry.value;
        final name = knownKeys[key] ?? 'key$key';
        late String value;

        switch (key) {
            case 1:
                value = _decodeAlpn(val);
                break;
            case 3:
                value = _decodePort(val);
                break;
            case 4:
                value = _decodeIPv4Hint(val);
                break;
            case 6:
                value = _decodeIPv6Hint(val);
                break;
            default:
                value = val.map((b) => b.toRadixString(16).padLeft(2, '0')).join('');
        }

        decoded[name] = value;
    }

    return HTTPSResponseRecord(
        name: name,
        ttl: ttl,
        priority: priority,
        targetName: hostname,
        params: decoded);
}