/// <inheritdoc/> public UdpActions DetectRequestType(ReadOnlySpan <byte> bytes) { if (bytes.Length < 8) { return(UdpActions.Unknown); } var protoOrConnectionId = _util.GetLong(bytes.Slice(0, 8)); if (protoOrConnectionId == UdpConstants.ProtocolId) { return(ValidateConnectRequest(bytes) ? UdpActions.Connect : UdpActions.Unknown); } if (bytes.Length < 12) { return(UdpActions.Unknown); } var action = _util.GetInt(bytes.Slice(8, 4)); switch (action) { case (int)UdpActions.Announce: return(ValidateAnnounceRequest(bytes) ? UdpActions.Announce : UdpActions.Unknown); case (int)UdpActions.Scrape: return(ValidateScrapeRequest(bytes) ? UdpActions.Scrape : UdpActions.Unknown); default: return(UdpActions.Unknown); } }
/// <inheritdoc/> public ConnectResponse DeserializeConnectResponse(ReadOnlySpan <byte> bytes) { if (_validator != null && !_validator.ValidateConnectResponse(bytes)) { throw new ArgumentException(MalformedFormat); } var transactionId = _util.GetInt(bytes.Slice(4, 4)); var connectionId = _util.GetLong(bytes.Slice(8, 8)); return(new ConnectResponse(connectionId, transactionId)); }