fromBytes static method
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);
}