Пример #1
0
        //
        // This method assumes that InnerStream type == typeof(NetwokrStream)
        // It will produce a set of buffers for one MultipleWrite call
        //
        private void StartWriting(SplitWritesState splitWrite, SplitWriteAsyncProtocolRequest asyncRequest)
        {
            while (!splitWrite.IsDone)
            {
                // request a write IO slot
                if (_SslState.CheckEnqueueWrite(asyncRequest))
                {
                    // operation is async and has been queued, return.
                    return;
                }

                byte[] lastHandshakePayload = null;
                if (_SslState.LastPayload != null)
                {
                    //
                    // !!! LastPayload Only used in TlsStream for HTTP and it needs re-work for a general case !!!
                    //
                    lastHandshakePayload = _SslState.LastPayload;
                    _SslState.LastPayloadConsumed();
                }

                BufferOffsetSize[] buffers = splitWrite.GetNextBuffers();
                buffers = EncryptBuffers(buffers, lastHandshakePayload);

                if (asyncRequest != null)
                {
                    // prepare for the next request
                    IAsyncResult ar = ((NetworkStream)(_SslState.InnerStream)).BeginMultipleWrite(buffers, _MulitpleWriteCallback, asyncRequest);
                    if (!ar.CompletedSynchronously)
                    {
                        return;
                    }

                    ((NetworkStream)(_SslState.InnerStream)).EndMultipleWrite(ar);
                }
                else
                {
                    ((NetworkStream)(_SslState.InnerStream)).MultipleWrite(buffers);
                }

                // release write IO slot
                _SslState.FinishWrite();
            }

            if (asyncRequest != null)
            {
                asyncRequest.CompleteUser();
            }
        }
Пример #2
0
        //
        // Combined sync/async write method. For sync case asyncRequest==null
        //
        private void ProcessWrite(BufferOffsetSize[] buffers, SplitWriteAsyncProtocolRequest asyncRequest)
        {
            _SslState.CheckThrow(authSuccessCheck: true, shutdownCheck: true);

            foreach (BufferOffsetSize buffer in buffers)
            {
                ValidateParameters(buffer.Buffer, buffer.Offset, buffer.Size);
            }

            if (Interlocked.Exchange(ref _NestedWrite, 1) == 1)
            {
                throw new NotSupportedException(SR.GetString(SR.net_io_invalidnestedcall, (asyncRequest != null? "BeginWrite":"Write"), "write"));
            }

            bool failed = false;

            try
            {
                SplitWritesState splitWrite = new SplitWritesState(buffers);
                if (asyncRequest != null)
                {
                    asyncRequest.SetNextRequest(splitWrite, _ResumeAsyncWriteCallback);
                }

                StartWriting(splitWrite, asyncRequest);
            }
            catch (Exception e)
            {
                _SslState.FinishWrite();

                failed = true;
                if (e is IOException)
                {
                    throw;
                }
                throw new IOException(SR.GetString(SR.net_io_write), e);
            }
            finally
            {
                if (asyncRequest == null || failed)
                {
                    _NestedWrite = 0;
                }
            }
        }
Пример #3
0
        private void ProcessWrite(BufferOffsetSize[] buffers, SplitWriteAsyncProtocolRequest asyncRequest)
        {
            foreach (BufferOffsetSize size in buffers)
            {
                this.ValidateParameters(size.Buffer, size.Offset, size.Size);
            }
            if (Interlocked.Exchange(ref this._NestedWrite, 1) == 1)
            {
                throw new NotSupportedException(SR.GetString("net_io_invalidnestedcall", new object[] { (asyncRequest != null) ? "BeginWrite" : "Write", "write" }));
            }
            bool flag = false;

            try
            {
                SplitWritesState splitWritesState = new SplitWritesState(buffers);
                if (asyncRequest != null)
                {
                    asyncRequest.SetNextRequest(splitWritesState, _ResumeAsyncWriteCallback);
                }
                this.StartWriting(splitWritesState, asyncRequest);
            }
            catch (Exception exception)
            {
                this._SslState.FinishWrite();
                flag = true;
                if (exception is IOException)
                {
                    throw;
                }
                throw new IOException(SR.GetString("net_io_write"), exception);
            }
            finally
            {
                if ((asyncRequest == null) || flag)
                {
                    this._NestedWrite = 0;
                }
            }
        }
Пример #4
0
 private void StartWriting(SplitWritesState splitWrite, SplitWriteAsyncProtocolRequest asyncRequest)
 {
     while (!splitWrite.IsDone)
     {
         if (this._SslState.CheckEnqueueWrite(asyncRequest))
         {
             return;
         }
         byte[] lastHandshakePayload = null;
         if (this._SslState.LastPayload != null)
         {
             lastHandshakePayload = this._SslState.LastPayload;
             this._SslState.LastPayloadConsumed();
         }
         BufferOffsetSize[] nextBuffers = splitWrite.GetNextBuffers();
         nextBuffers = this.EncryptBuffers(nextBuffers, lastHandshakePayload);
         if (asyncRequest != null)
         {
             IAsyncResult asyncResult = ((NetworkStream)this._SslState.InnerStream).BeginMultipleWrite(nextBuffers, _MulitpleWriteCallback, asyncRequest);
             if (!asyncResult.CompletedSynchronously)
             {
                 return;
             }
             ((NetworkStream)this._SslState.InnerStream).EndMultipleWrite(asyncResult);
         }
         else
         {
             ((NetworkStream)this._SslState.InnerStream).MultipleWrite(nextBuffers);
         }
         this._SslState.FinishWrite();
     }
     if (asyncRequest != null)
     {
         asyncRequest.CompleteUser();
     }
 }
Пример #5
0
 internal void SetNextRequest(SplitWritesState splitWritesState, AsyncProtocolCallback callback)
 {
     SplitWritesState = splitWritesState;
     SetNextRequest(null, 0, 0, callback);
 }
Пример #6
0
        //
        // This method assumes that InnerStream type == typeof(NetwokrStream)
        // It will produce a set of buffers for one MultipleWrite call
        //
        private void StartWriting(SplitWritesState splitWrite, SplitWriteAsyncProtocolRequest asyncRequest)
        {
            while (!splitWrite.IsDone)
            {
                // request a write IO slot
                if (_SslState.CheckEnqueueWrite(asyncRequest))
                {
                    // operation is async and has been queued, return.
                    return;
                }

                byte[] lastHandshakePayload = null;
                if (_SslState.LastPayload != null)
                {
                    //
                    // !!! LastPayload Only used in TlsStream for HTTP and it needs re-work for a general case !!!
                    //
                    lastHandshakePayload = _SslState.LastPayload;
                    _SslState.LastPayloadConsumed();
                }

                BufferOffsetSize[] buffers = splitWrite.GetNextBuffers();
                buffers = EncryptBuffers(buffers, lastHandshakePayload);

                if (asyncRequest != null)
                {
                    // prepare for the next request
                    IAsyncResult ar = ((NetworkStream)(_SslState.InnerStream)).BeginMultipleWrite(buffers, _MulitpleWriteCallback, asyncRequest);
                    if (!ar.CompletedSynchronously)
                        return;

                    ((NetworkStream)(_SslState.InnerStream)).EndMultipleWrite(ar);
                }
                else
                {
                    ((NetworkStream)(_SslState.InnerStream)).MultipleWrite(buffers);
                }

                // release write IO slot
                _SslState.FinishWrite();

            }

            if (asyncRequest != null)
                asyncRequest.CompleteUser();
        }
Пример #7
0
        //
        // Combined [....]/async write method. For [....] case asyncRequest==null
        //
        private void ProcessWrite(BufferOffsetSize[] buffers, SplitWriteAsyncProtocolRequest asyncRequest)
        {
            foreach (BufferOffsetSize buffer in buffers)
            {
                ValidateParameters(buffer.Buffer, buffer.Offset, buffer.Size);
            }

            if (Interlocked.Exchange(ref _NestedWrite, 1) == 1)
            {
                throw new NotSupportedException(SR.GetString(SR.net_io_invalidnestedcall, (asyncRequest != null? "BeginWrite":"Write"), "write"));
            }

            bool failed = false;
            try
            {
                SplitWritesState splitWrite = new SplitWritesState(buffers);
                if (asyncRequest != null)
                    asyncRequest.SetNextRequest(splitWrite, _ResumeAsyncWriteCallback);

                StartWriting(splitWrite, asyncRequest);
            }
            catch (Exception e)
            {
                _SslState.FinishWrite();

                failed = true;
                if (e is IOException) {
                    throw;
                }
                throw new IOException(SR.GetString(SR.net_io_write), e);
            }
            finally
            {
                if (asyncRequest == null || failed)
                {
                    _NestedWrite = 0;
                }
            }
        }
Пример #8
0
 internal void SetNextRequest(SplitWritesState splitWritesState, AsyncProtocolCallback callback)
 {
     SplitWritesState = splitWritesState;
     SetNextRequest(null, 0, 0,callback);
 }