AttachBuffer() public method

public AttachBuffer ( ArraySegment buffer ) : void
buffer ArraySegment
return void
Esempio n. 1
0
        private bool TurnServer_Received(ServersManager<TurnConnection> s, TurnConnection c, ref ServerAsyncEventArgs e)
        {
            if (e.LocalEndPoint.Protocol == ServerProtocol.Udp)
            {
                if (TurnMessage.IsTurnMessage(e.Buffer, e.Offset, e.BytesTransferred))
                    TurnServer_TurnDataReceived(ref e);
                else
                    TurnServer_PeerDataReceived(ref e);
            }
            else if (e.LocalEndPoint.Protocol == ServerProtocol.Tcp)
            {
                if (c.Buffer.IsValid)
                {
                    c.Buffer.Resize(Math.Max(4096, c.BytesExpected));

                    if (c.Buffer.CopyTransferredFrom(e, 0) == false)
                        return false;

                    if (c.Buffer.Count < c.BytesExpected)
                        return true;
                }
                else
                {
                    if (e.BytesTransferred < c.BytesExpected)
                        return c.Buffer.CopyTransferredFrom(e, 0);
                }

                int proccessed = 0;

                for (; ; )
                {
                    if (c.Buffer.IsValid)
                    {
                        if (e == null)
                        {
                            e = EventArgsManager.Get();
                            e.CopyAddressesFrom(c);
                        }

                        e.AttachBuffer(c.Buffer);
                        proccessed = 0;
                    }

                    if (e.BytesTransferred - proccessed < c.BytesExpected)
                        return c.Buffer.CopyTransferredFrom(e, proccessed);

                    switch (c.Phase)
                    {
                        case TcpPhase.WaitingFirstXpacket:

                            if (pseudoTlsMessage.IsBeginOfClientHello(e.Buffer, e.Offset, FirstXpacketLength))
                            {
                                c.Phase = TcpPhase.WaitingClientHello;
                                c.BytesExpected = PseudoTlsMessage.ClientHelloLength;
                            }
                            else
                            {
                                c.Phase = TcpPhase.WaitingTcpFrame;
                                c.BytesExpected = TcpFramingHeader.TcpFramingHeaderLength;

                                if (FirstXpacketLength <= TcpFramingHeader.TcpFramingHeaderLength)
                                    goto case TcpPhase.WaitingTcpFrame;
                            }
                            break;

                        case TcpPhase.WaitingClientHello:

                            if (pseudoTlsMessage.IsClientHello(e.Buffer, e.Offset) == false)
                                return false;

                            var x = EventArgsManager.Get();

                            x.CopyAddressesFrom(e);
                            x.Count = PseudoTlsMessage.ServerHelloHelloDoneLength;

                            pseudoTlsMessage.GetServerHelloHelloDoneBytes(x.Buffer, x.Offset);

                            s.SendAsync(x);

                            proccessed += c.BytesExpected;
                            c.Phase = TcpPhase.WaitingTcpFrame;
                            c.BytesExpected = TcpFramingHeader.TcpFramingHeaderLength;

                            break;

                        case TcpPhase.WaitingTcpFrame:

                            TcpFramingHeader tcpHeader;
                            if (TcpFramingHeader.TryParse(e.Buffer, e.Offset, out tcpHeader) == false)
                                return false;

                            proccessed += c.BytesExpected;
                            c.Phase = (tcpHeader.Type == TcpFrameType.ControlMessage) ?
                                TcpPhase.WaitingTurnControlMessage : TcpPhase.WaitingTurnEndToEndData;
                            c.BytesExpected = tcpHeader.Length;

                            break;

                        case TcpPhase.WaitingTurnEndToEndData:
                        case TcpPhase.WaitingTurnControlMessage:

                            if (e.BytesTransferred - proccessed < c.BytesExpected)
                                if (c.Buffer.CopyTransferredFrom(e, proccessed + c.BytesExpected) == false)
                                    return false;

                            e.Count -= proccessed;
                            e.Offset += proccessed;
                            e.BytesTransferred = c.BytesExpected;

                            if (c.Phase == TcpPhase.WaitingTurnEndToEndData)
                                TurnServer_PeerDataReceived(ref e);
                            else
                                TurnServer_TurnDataReceived(ref e);

                            proccessed = e.BytesTransferred;

                            c.Phase = TcpPhase.WaitingTcpFrame;
                            c.BytesExpected = TcpFramingHeader.TcpFramingHeaderLength;

                            break;

                        default:
                            throw new NotImplementedException();
                    }
                }
            }
            else
                throw new NotImplementedException();

            return true;
        }
Esempio n. 2
0
		private void SendWriter(ServerAsyncEventArgs r, HttpMessageWriter writer)
		{
			r.Count = writer.Count;
			r.OffsetOffset = writer.OffsetOffset;
			r.AttachBuffer(writer.Detach());

			SendAsync(r, false);
		}
Esempio n. 3
0
        private bool DecryptData(ref ServerAsyncEventArgs e, Server <C> .Connection <C> connection)
        {
            SspiContext     sspiContext   = connection.SspiContext;
            SecBufferDescEx secBufferDesc = sspiContext.SecBufferDesc5;

            if (sspiContext.Buffer.IsValid && e != null && !sspiContext.Buffer.CopyTransferredFrom(e, 0))
            {
                return(false);
            }
            SecurityStatus securityStatus2;

            while (true)
            {
                secBufferDesc.Buffers[0].BufferType = BufferType.SECBUFFER_DATA;
                if (sspiContext.Buffer.IsValid)
                {
                    this.SetSecBuffer(ref secBufferDesc.Buffers[0], sspiContext);
                }
                else
                {
                    this.SetSecBuffer(ref secBufferDesc.Buffers[0], e);
                }
                secBufferDesc.Buffers[1].SetBufferEmpty();
                secBufferDesc.Buffers[2].SetBufferEmpty();
                secBufferDesc.Buffers[3].SetBufferEmpty();
                secBufferDesc.Buffers[4].SetBufferEmpty();
                SecurityStatus securityStatus = Sspi.SafeDecryptMessage(ref sspiContext.Handle, ref secBufferDesc, 0u, null);
                int            bufferIndex    = secBufferDesc.GetBufferIndex(BufferType.SECBUFFER_EXTRA, 0);
                int            bufferIndex2   = secBufferDesc.GetBufferIndex(BufferType.SECBUFFER_DATA, 0);
                securityStatus2 = securityStatus;
                if (securityStatus2 != SecurityStatus.SEC_E_OK)
                {
                    break;
                }
                if (bufferIndex2 < 0)
                {
                    return(false);
                }
                if (sspiContext.Buffer.IsInvalid)
                {
                    if (bufferIndex >= 0 && !sspiContext.Buffer.CopyFrom(secBufferDesc.Buffers[bufferIndex]))
                    {
                        return(false);
                    }
                    e.Offset           = secBufferDesc.Buffers[bufferIndex2].Offset;
                    e.BytesTransferred = secBufferDesc.Buffers[bufferIndex2].Size;
                    e.SetMaxCount();
                    if (!this.OnReceived(connection, ref e))
                    {
                        return(false);
                    }
                }
                else
                {
                    ArraySegment <byte> buffer = sspiContext.Buffer.Detach();
                    if (bufferIndex >= 0 && !sspiContext.Buffer.CopyFrom(secBufferDesc.Buffers[bufferIndex]))
                    {
                        return(false);
                    }
                    ServerAsyncEventArgs serverAsyncEventArgs = EventArgsManager.Get();
                    base.PrepareEventArgs(connection, serverAsyncEventArgs);
                    serverAsyncEventArgs.AttachBuffer(buffer);
                    serverAsyncEventArgs.Offset           = secBufferDesc.Buffers[bufferIndex2].Offset;
                    serverAsyncEventArgs.BytesTransferred = secBufferDesc.Buffers[bufferIndex2].Size;
                    serverAsyncEventArgs.SetMaxCount();
                    bool flag = this.OnReceived(connection, ref serverAsyncEventArgs);
                    if (serverAsyncEventArgs != null)
                    {
                        EventArgsManager.Put(serverAsyncEventArgs);
                    }
                    if (!flag)
                    {
                        return(false);
                    }
                }
                if (bufferIndex < 0)
                {
                    return(true);
                }
            }
            return(securityStatus2 != SecurityStatus.SEC_I_RENEGOTIATE && securityStatus2 == (SecurityStatus)2148074264u && (!sspiContext.Buffer.IsInvalid || sspiContext.Buffer.CopyTransferredFrom(e, 0)));
        }