368 {
369 alpn = ApplicationProtocolInfo.None;
370 if (extensionData.
Length < 2)
371 {
372 return false;
373 }
375 ReadOnlySpan<byte> readOnlySpan = extensionData.
Slice(2);
376 if (num != readOnlySpan.Length)
377 {
378 return false;
379 }
380 while (!readOnlySpan.IsEmpty)
381 {
382 byte b = readOnlySpan[0];
383 if (readOnlySpan.Length < b + 1)
384 {
385 return false;
386 }
387 ReadOnlySpan<byte> span = readOnlySpan.Slice(1, b);
388 if (b == 2)
389 {
390 if (span.SequenceEqual(SslApplicationProtocol.Http2.Protocol.Span))
391 {
392 alpn |= ApplicationProtocolInfo.Http2;
393 }
394 else
395 {
396 alpn |= ApplicationProtocolInfo.Other;
397 }
398 }
399 else if (b == SslApplicationProtocol.Http11.Protocol.Length && span.SequenceEqual(SslApplicationProtocol.Http11.Protocol.Span))
400 {
401 alpn |= ApplicationProtocolInfo.Http11;
402 }
403 else
404 {
405 alpn |= ApplicationProtocolInfo.Other;
406 }
407 readOnlySpan = readOnlySpan.Slice(b + 1);
408 }
409 return true;
410 }
static ushort ReadUInt16BigEndian(ReadOnlySpan< byte > source)
ReadOnlySpan< T > Slice(int start)