public void ServerData(object sender, BytesSegment bs) { if (serverDone || bs.Len == 0) { return; } serverDone = true; if (sBuf != null) { bs.CopyTo(sBuf, 0, bs.Len, sProg); sProg += bs.Len; if (sProg < sBuf.Length) { goto CONTINUE_READ; } else { bs = new BytesSegment(sBuf, 0, sProg); } } if (Tls.Version != 0) { var hello = new TlsStream.ServerHello(); try { TlsStream.ParseServerHelloRecord(bs, ref hello, out var size); if (size > bs.Len) { if (sBuf != null) { throw new Exception("sBuf != null"); } sBuf = new byte[size]; bs.CopyTo(sBuf); sProg = bs.Len; goto CONTINUE_READ; } } catch (Exception e) { if (hello.Version != 0) { TlsError = true; Logging.exception(e, Logging.Level.Warning, "parsing tls server hello from " + sender); } } Tls.Version = Math.Min(Tls.Version, hello.Version); Tls.Alpn = hello.Alpn; } sBuf = null; return; CONTINUE_READ: serverDone = false; return; }