コード例 #1
0
ファイル: FramingCodec.cs プロジェクト: tian1ll1/WPF_Examples
        public static ArraySegment<byte> Encode(Uri uri, ArraySegment<byte> messageBuffer, BufferManager bufferManager)
        {
            byte[] uriBuffer = UnicodeEncoding.Unicode.GetBytes(uri.ToString());
            byte[] uriLengthBuffer = EncodeInt(uriBuffer.Length);
            byte[] payloadLengthBuffer = EncodeInt(messageBuffer.Count);

            // Encode the following fields:
            // Uri length (4 bytes)
            // Uri (size specified by uri length)
            // Payload length (4 bytes)
            // Payload (size specified by payload length)
            byte[] buffer = bufferManager.TakeBuffer(uriLengthBuffer.Length + uriBuffer.Length +
                payloadLengthBuffer.Length + messageBuffer.Count);

            int destOffset = 0;
            Buffer.BlockCopy(uriLengthBuffer, 0, buffer, destOffset, uriLengthBuffer.Length);
            destOffset += uriLengthBuffer.Length;
            Buffer.BlockCopy(uriBuffer, 0, buffer, destOffset, uriBuffer.Length);
            destOffset += uriBuffer.Length;
            Buffer.BlockCopy(payloadLengthBuffer, 0, buffer, destOffset, payloadLengthBuffer.Length);
            destOffset += payloadLengthBuffer.Length;
            Buffer.BlockCopy(messageBuffer.Array, messageBuffer.Offset, buffer, destOffset, messageBuffer.Count);

            bufferManager.ReturnBuffer(messageBuffer.Array);
            return new ArraySegment<byte>(buffer);
        }
コード例 #2
0
        public static IObservable<DisposableByteBuffer> ToFrameStreamObservable(this Stream stream, BufferManager bufferManager)
        {
            return Observable.Create<DisposableByteBuffer>(async (observer, token) =>
            {
                var headerBuffer = new byte[sizeof(int)];

                try
                {
                    while (!token.IsCancellationRequested)
                    {
                        if (await stream.ReadBytesCompletelyAsync(headerBuffer, headerBuffer.Length, token) != headerBuffer.Length)
                            break;
                        var length = BitConverter.ToInt32(headerBuffer, 0);

                        var buffer = bufferManager.TakeBuffer(length);
                        if (await stream.ReadBytesCompletelyAsync(buffer, length, token) != length)
                            break;

                        observer.OnNext(new DisposableByteBuffer(buffer, length, Disposable.Create(() => bufferManager.ReturnBuffer(buffer))));
                    }

                    observer.OnCompleted();
                }
                catch (Exception error)
                {
                    observer.OnError(error);
                }
            });
        }
コード例 #3
0
 public LidgrenNetChannel(NetConnection connection, BufferManager bufferManager)
 {
     _connection = connection;
     _bufferManager = bufferManager;
     _buffer = _bufferManager.TakeBuffer(1024*1024);
     _stream = new MemoryStream(_buffer);
     _writer = new BinaryWriter(_stream);
 }
コード例 #4
0
ファイル: ManagedBuffer.cs プロジェクト: modulexcite/WcfEx
 /// <summary>
 /// Initializes a new buffer instance
 /// </summary>
 /// <param name="manager">
 /// The manager for this buffer
 /// </param>
 /// <param name="size">
 /// The size of the buffer to allocate, in bytes
 /// </param>
 public ManagedBuffer(BufferManager manager, Int32 size)
 {
     if (manager == null)
     throw new ArgumentNullException("manager");
      if (size <= 0)
     throw new ArgumentException("data");
      this.manager = manager;
      this.data = new ArraySegment<Byte>(manager.TakeBuffer(size));
 }
コード例 #5
0
            public override ArraySegment <byte> WriteMessage(Message message, int maxMessageSize, BufferManager bufferManager, int messageOffset)
            {
                if (message == null)
                {
                    throw new ArgumentNullException("message");
                }

                if (bufferManager == null)
                {
                    throw new ArgumentNullException("bufferManager");
                }

                if (maxMessageSize < 0)
                {
                    throw new ArgumentOutOfRangeException("maxMessageSize");
                }

                if (messageOffset < 0)
                {
                    throw new ArgumentOutOfRangeException("messageOffset");
                }

                if (messageOffset > maxMessageSize)
                {
                    throw new ArgumentException(
                              string.Format(
                                  CultureInfo.CurrentCulture,
                                  SR.ParameterMustBeLessThanOrEqualSecondParameter,
                                  "messageOffset",
                                  "maxMessageSize"));
                }

                message.Properties.Encoder = this;

                HttpResponseMessage response = GetHttpResponseMessageOrThrow(message);

                if (response.Content == null)
                {
                    return(new ArraySegment <byte>());
                }

                byte[] messageBytes  = response.Content.ReadAsByteArray();
                int    messageLength = messageBytes.Length;
                int    totalLength   = messageLength + messageOffset;

                if (totalLength > maxMessageSize)
                {
                    throw new QuotaExceededException();
                }

                byte[] totalBytes = bufferManager.TakeBuffer(totalLength);
                Array.Copy(messageBytes, 0, totalBytes, messageOffset, totalLength - messageOffset);
                return(new ArraySegment <byte>(totalBytes, messageOffset, messageLength));
            }
コード例 #6
0
ファイル: BufferedWriteStream.cs プロジェクト: yrest/wcf
 private void EnsureBufferAllocated()
 {
     if (_buffer == null)
     {
         if (_bufferManager != null)
         {
             _buffer = _bufferManager.TakeBuffer(_bufferSize);
         }
         else
         {
             _buffer = new byte[_bufferSize];
         }
     }
 }
コード例 #7
0
        public BufferedMemoryStream(BufferManager bufferManager, int capacity)
        {
            if (bufferManager == null)
                throw new ArgumentNullException("bufferManager");
            if (capacity < 0)
                throw new ArgumentOutOfRangeException("capacity", "Must be positive.");

            _bufferManager = bufferManager;
            _isWriter = true;

            _buffer = _bufferManager.TakeBuffer(capacity);
            _capacity = _buffer.Length;
            _length = 0;
            _isOpen = true;
        }
            private ArraySegment <byte> AddSessionInformationToMessage(ArraySegment <byte> messageData, BufferManager bufferManager, int maxMessageSize)
            {
                int num = 0;

                byte[] array = messageData.Array;
                if (this.writerSession.HasNewStrings)
                {
                    IList <XmlDictionaryString> newStrings = this.writerSession.GetNewStrings();
                    for (int i = 0; i < newStrings.Count; i++)
                    {
                        int byteCount = Encoding.UTF8.GetByteCount(newStrings[i].Value);
                        num += IntEncoder.GetEncodedSize(byteCount) + byteCount;
                    }
                    int num4 = messageData.Offset + messageData.Count;
                    int num5 = maxMessageSize - num4;
                    if ((num5 - num) < 0)
                    {
                        throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new QuotaExceededException(System.ServiceModel.SR.GetString("MaxSentMessageSizeExceeded", new object[] { maxMessageSize })));
                    }
                    int bufferSize = (messageData.Offset + messageData.Count) + num;
                    if (array.Length < bufferSize)
                    {
                        byte[] dst = bufferManager.TakeBuffer(bufferSize);
                        Buffer.BlockCopy(array, messageData.Offset, dst, messageData.Offset, messageData.Count);
                        bufferManager.ReturnBuffer(array);
                        array = dst;
                    }
                    Buffer.BlockCopy(array, messageData.Offset, array, messageData.Offset + num, messageData.Count);
                    int num7 = messageData.Offset;
                    for (int j = 0; j < newStrings.Count; j++)
                    {
                        string s    = newStrings[j].Value;
                        int    num9 = Encoding.UTF8.GetByteCount(s);
                        num7 += IntEncoder.Encode(num9, array, num7);
                        num7 += Encoding.UTF8.GetBytes(s, 0, s.Length, array, num7);
                    }
                    this.writerSession.ClearNewStrings();
                }
                int encodedSize = IntEncoder.GetEncodedSize(num);
                int offset      = messageData.Offset - encodedSize;
                int count       = (encodedSize + messageData.Count) + num;

                IntEncoder.Encode(num, array, offset);
                return(new ArraySegment <byte>(array, offset, count));
            }
コード例 #9
0
        public override ArraySegment<byte> WriteMessage(Message message, int maxMessageSize, BufferManager bufferManager, int messageOffset)
        {
            MemoryStream stream = new MemoryStream();
            XmlWriter writer = XmlWriter.Create(stream, this.writerSettings);
            message.WriteMessage(writer);
            writer.Close();

            byte[] messageBytes = stream.GetBuffer();
            int messageLength = (int)stream.Position;
            stream.Close();

            int totalLength = messageLength + messageOffset;
            byte[] totalBytes = bufferManager.TakeBuffer(totalLength);
            Array.Copy(messageBytes, 0, totalBytes, messageOffset, messageLength);

            ArraySegment<byte> byteArray = new ArraySegment<byte>(totalBytes, messageOffset, messageLength);
            return byteArray;
        }
コード例 #10
0
 public override Message ReadMessage(ArraySegment<byte> buffer, BufferManager bufferManager, string contentType)
 {
     var bytes = new byte[buffer.Count];
     Array.Copy(buffer.Array, buffer.Offset, bytes, 0, bytes.Length);
     var message = new UTF8Encoding(true).GetString(bytes);
     // Сохраняем ответ в файл содержащий actor
     File.WriteAllText("D:\\TrueClientResponseActor.xml", message);
     var m = message.Replace("s:actor=\"" + SMEVActor + "\"", "");
     var bytes2 = new UTF8Encoding().GetBytes(m);
     // Сохраняем ответ в файл уже без actor
     File.WriteAllBytes("D:\\TrueClientResponse.xml", bytes2);
     var length = bytes2.Length;
     const int zero = 0;
     var num = length + zero;
     var array = bufferManager.TakeBuffer(num);
     Array.Copy(bytes2, 0, array, zero, num);
     buffer = new ArraySegment<byte>(array, zero, num);
     return innerEncoder.ReadMessage(buffer, bufferManager, contentType);
 }
コード例 #11
0
        public override ArraySegment <byte> WriteMessage(
            Message message, int maxMessageSize,
            BufferManager bufferManager, int messageOffset)
        {
            VerifyMessageVersion(message);

            ArraySegment <byte> seg = new ArraySegment <byte> (
                bufferManager.TakeBuffer(maxMessageSize),
                messageOffset, maxMessageSize);
            XmlWriterSettings s = new XmlWriterSettings();

            s.Encoding = encoding;
            using (XmlWriter w = XmlWriter.Create(
                       new MemoryStream(seg.Array, seg.Offset, seg.Count), s)) {
                message.WriteMessage(
                    XmlDictionaryWriter.CreateDictionaryWriter(w));
            }
            return(seg);
        }
コード例 #12
0
        public ArraySegment<byte> WriteMessage(MessageEncoder encoder, Message message, int maxMessageSize, BufferManager bufferManager, int messageOffset)
        {
            MemoryStream stream = new MemoryStream();
            var writer = new StreamWriter(stream);

            writer = xmlToCvsTranslator.Translate(message.GetReaderAtBodyContents(), writer);
            writer.Flush();

            byte[] messageBytes = stream.GetBuffer();
            int messageLength = (int)stream.Position;
            int totalLength = messageLength + messageOffset;
            byte[] totalBytes = bufferManager.TakeBuffer(totalLength);
            Array.Copy(messageBytes, 0, totalBytes, messageOffset, messageLength);

            ArraySegment<byte> byteArray = new ArraySegment<byte>(totalBytes, messageOffset, messageLength);
            writer.Close();

            return byteArray;
        }
コード例 #13
0
        public void Reinitialize(int initialSize, int maxSizeQuota, int effectiveMaxSize, BufferManager bufferManager)
        {
            Contract.Assert(!_initialized, "Clear must be called before re-initializing stream");

            if (bufferManager == null)
            {
                throw Error.ArgumentNull("bufferManager");
            }

            _theMaxSizeQuota = maxSizeQuota;
            _maxSize = effectiveMaxSize;
            _bufferManager = bufferManager;
            _currentChunk = bufferManager.TakeBuffer(initialSize);
            _currentChunkSize = 0;
            _totalSize = 0;
            _chunkCount = 1;
            _chunks[0] = _currentChunk;
            _initialized = true;
        }
コード例 #14
0
        internal static void DecompressBuffer(ref ArraySegment <byte> buffer, BufferManager bufferManager, CompressionFormat compressionFormat, long maxReceivedMessageSize)
        {
            MemoryStream memoryStream        = new MemoryStream(buffer.Array, buffer.Offset, buffer.Count);
            int          maxDecompressedSize = (int)Math.Min(maxReceivedMessageSize, int.MaxValue);

            using (BufferManagerOutputStream bufferedOutStream = new BufferManagerOutputStream(SR.MaxReceivedMessageSizeExceeded, 1024, maxDecompressedSize, bufferManager))
            {
                bufferedOutStream.Write(buffer.Array, 0, buffer.Offset);

                byte[] tempBuffer = bufferManager.TakeBuffer(DecompressBlockSize);
                try
                {
                    using (Stream ds = compressionFormat == CompressionFormat.GZip ?
                                       (Stream) new GZipStream(memoryStream, CompressionMode.Decompress) :
                                       (Stream) new DeflateStream(memoryStream, CompressionMode.Decompress))
                    {
                        while (true)
                        {
                            int bytesRead = ds.Read(tempBuffer, 0, DecompressBlockSize);
                            if (bytesRead > 0)
                            {
                                bufferedOutStream.Write(tempBuffer, 0, bytesRead);
                            }
                            else
                            {
                                break;
                            }
                        }
                    }
                }
                finally
                {
                    bufferManager.ReturnBuffer(tempBuffer);
                }

                int    length            = 0;
                byte[] decompressedBytes = bufferedOutStream.ToArray(out length);
                bufferManager.ReturnBuffer(buffer.Array);
                buffer = new ArraySegment <byte>(decompressedBytes, buffer.Offset, length - buffer.Offset);
            }
        }
コード例 #15
0
        internal static void DecompressBuffer(ref ArraySegment<byte> buffer, BufferManager bufferManager, CompressionFormat compressionFormat, long maxReceivedMessageSize)
        {
            MemoryStream memoryStream = new MemoryStream(buffer.Array, buffer.Offset, buffer.Count);
            int maxDecompressedSize = (int)Math.Min(maxReceivedMessageSize, int.MaxValue);

            using (BufferManagerOutputStream bufferedOutStream = new BufferManagerOutputStream(SR.MaxReceivedMessageSizeExceeded, 1024, maxDecompressedSize, bufferManager))
            {
                bufferedOutStream.Write(buffer.Array, 0, buffer.Offset);

                byte[] tempBuffer = bufferManager.TakeBuffer(DecompressBlockSize);
                try
                {
                    using (Stream ds = compressionFormat == CompressionFormat.GZip ?
                        (Stream)new GZipStream(memoryStream, CompressionMode.Decompress) :
                        (Stream)new DeflateStream(memoryStream, CompressionMode.Decompress))
                    {
                        while (true)
                        {
                            int bytesRead = ds.Read(tempBuffer, 0, DecompressBlockSize);
                            if (bytesRead > 0)
                            {
                                bufferedOutStream.Write(tempBuffer, 0, bytesRead);
                            }
                            else
                            {
                                break;
                            }
                        }
                    }
                }
                finally
                {
                    bufferManager.ReturnBuffer(tempBuffer);
                }

                int length = 0;
                byte[] decompressedBytes = bufferedOutStream.ToArray(out length);
                bufferManager.ReturnBuffer(buffer.Array);
                buffer = new ArraySegment<byte>(decompressedBytes, buffer.Offset, length - buffer.Offset);
            }
        }
コード例 #16
0
        public string TestSendUDPToService(string ipaddress,int port)
        {
            Socket socket = new Socket(SocketType.Dgram, ProtocolType.Udp);

            m_bufferManager = BufferManager.CreateBufferManager(100 * 1024, 1024);
            for(int i =0 ;i<=50;i++)
            {
                AsyncClientToken asyncClientToken = new AsyncClientToken();
                //asyncClientToken.HandlerReturnData = handlerReturnData;
                asyncClientToken.Socket = socket;
                //asyncClientToken.MessageID = messageID;
                asyncClientToken.IP = ipaddress;
                asyncClientToken.Port = port;
                asyncClientToken.Buffer = m_bufferManager.TakeBuffer(1024);

                IPEndPoint ipe = new IPEndPoint(IPAddress.Parse(asyncClientToken.IP), asyncClientToken.Port);
                int sendCount = Encoding.UTF8.GetBytes("TestSendUDPToService" + i.ToString(), 0, ("TestSendUDPToService" + i.ToString()).Length, asyncClientToken.Buffer, 0);
                CommonVariables.LogTool.Log(DateTime.Now.ToString(CommonFlag.F_DateTimeFormat) + "   Send:" + asyncClientToken.IP + asyncClientToken.Port.ToString() + "TestSendUDPToService" + i.ToString());
                socket.BeginSendTo(asyncClientToken.Buffer, 0, sendCount, SocketFlags.None, ipe, new AsyncCallback(SendCallback), asyncClientToken);
            }

            return null;
        }
コード例 #17
0
        public ArraySegment<byte> WriteMessage(MessageEncoder encoder, Message message, int maxMessageSize, BufferManager bufferManager, int messageOffset)
        {
            MemoryStream stream = new MemoryStream();
            StreamWriter sw = new StreamWriter(stream);

            string methodName = null;
            if (message.Properties.ContainsKey(JSONPBehavior.Name))
            {
                methodName = ((JSONPMessageProperty) (message.Properties[JSONPBehavior.Name])).MethodName;
            }

            if (methodName != null)
            {
                sw.Write(methodName + "( ");
                sw.Flush();
            }

            XmlWriter writer = JsonReaderWriterFactory.CreateJsonWriter(stream);
            message.WriteMessage(writer);
            writer.Flush();
            if (methodName != null)
            {
                sw.Write(" );");
                sw.Flush();
            }

            byte[] messageBytes = stream.GetBuffer();
            int messageLength = (int) stream.Position;
            int totalLength = messageLength + messageOffset;
            byte[] totalBytes = bufferManager.TakeBuffer(totalLength);
            Array.Copy(messageBytes, 0, totalBytes, messageOffset, messageLength);

            ArraySegment<byte> byteArray = new ArraySegment<byte>(totalBytes, messageOffset, messageLength);
            writer.Close();

            return byteArray;
        }
コード例 #18
0
        public static IObservable<DisposableByteBuffer> ToFrameClientObservable(this Socket socket, SocketFlags socketFlags, BufferManager bufferManager, Selector selector)
        {
            return Observable.Create<DisposableByteBuffer>(observer =>
            {
                var headerState = new BufferState(new byte[sizeof(int)], 0, sizeof(int));
                var contentState = new BufferState(null, 0, -1);

                var selectMode = socketFlags.HasFlag(SocketFlags.OutOfBand) ? SelectMode.SelectError : SelectMode.SelectRead;

                selector.AddCallback(selectMode, socket, _ =>
                {
                    try
                    {
                        if (headerState.Length > 0)
                        {
                            headerState.Advance(socket.Receive(headerState.Bytes, headerState.Offset, headerState.Length, socketFlags));

                            if (headerState.Length == 0)
                            {
                                contentState.Length = BitConverter.ToInt32(headerState.Bytes, 0);
                                contentState.Offset = 0;
                                contentState.Bytes = bufferManager.TakeBuffer(contentState.Length);
                            }
                        }

                        if (contentState.Bytes != null)
                        {
                            contentState.Advance(socket.Receive(contentState.Bytes, contentState.Offset, contentState.Length, socketFlags));

                            if (contentState.Length == 0)
                            {
                                var managedBuffer = contentState.Bytes;
                                var length = contentState.Offset;
                                observer.OnNext(new DisposableByteBuffer(managedBuffer, length, Disposable.Create(() => bufferManager.ReturnBuffer(managedBuffer))));

                                contentState.Bytes = null;

                                headerState.Length = headerState.Offset;
                                headerState.Offset = 0;
                            }
                        }
                    }
                    catch (Exception exception)
                    {
                        if (!exception.IsWouldBlock())
                            observer.OnError(exception);
                    }
                });

                return Disposable.Create(() => selector.RemoveCallback(SelectMode.SelectRead, socket));
            });
        }
コード例 #19
0
        //Helper method to decompress an array of bytes
        static ArraySegment<byte> DecompressBuffer(ArraySegment<byte> buffer, BufferManager bufferManager)
        {
            MemoryStream memoryStream = new MemoryStream(buffer.Array, buffer.Offset, buffer.Count);
            MemoryStream decompressedStream = new MemoryStream();
            int totalRead = 0;
            int blockSize = 1024;
            byte[] tempBuffer = bufferManager.TakeBuffer(blockSize);
            using (GZipStream gzStream = new GZipStream(memoryStream, CompressionMode.Decompress))
            {
                while (true)
                {
                    int bytesRead = gzStream.Read(tempBuffer, 0, blockSize);
                    if (bytesRead == 0)
                        break;
                    decompressedStream.Write(tempBuffer, 0, bytesRead);
                    totalRead += bytesRead;
                }
            }
            bufferManager.ReturnBuffer(tempBuffer);

            byte[] decompressedBytes = decompressedStream.ToArray();
            byte[] bufferManagerBuffer = bufferManager.TakeBuffer(decompressedBytes.Length + buffer.Offset);
            Array.Copy(buffer.Array, 0, bufferManagerBuffer, 0, buffer.Offset);
            Array.Copy(decompressedBytes, 0, bufferManagerBuffer, buffer.Offset, decompressedBytes.Length);

            ArraySegment<byte> byteArray = new ArraySegment<byte>(bufferManagerBuffer, buffer.Offset, decompressedBytes.Length);
            bufferManager.ReturnBuffer(buffer.Array);

            return byteArray;
        }
コード例 #20
0
        /// <summary>
        /// Decompress a buffer
        /// </summary>
        /// <param name="buffer"></param>
        /// <param name="bufferManager"></param>
        /// <returns></returns>
        private static ArraySegment<byte> DecompressBuffer(ArraySegment<byte> buffer, BufferManager bufferManager)
        {
            // Create a new memory stream, and copy into it the buffer to decompress
            MemoryStream memoryStream = new MemoryStream(buffer.Array, buffer.Offset, buffer.Count);

            // Create a memory stream to store the decompressed data
            MemoryStream decompressedStream = new MemoryStream();

            // The totalRead stores the number of decompressed bytes
            int totalRead = 0;

            int blockSize = 1024;

            // Allocate a temporary buffer to use with the decompression
            byte[] tempBuffer = bufferManager.TakeBuffer(blockSize);

            // Uncompress the compressed data
            using (GZipStream gzStream = new GZipStream(memoryStream, CompressionMode.Decompress))
            {
                while (true)
                {
                    // Read from the compressed data stream
                    int bytesRead = gzStream.Read(tempBuffer, 0, blockSize);
                    if (bytesRead == 0)
                        break;
                    // Write to the decompressed data stream
                    decompressedStream.Write(tempBuffer, 0, bytesRead);
                    totalRead += bytesRead;
                }
            }

            // Release the temporary buffer
            bufferManager.ReturnBuffer(tempBuffer);

            // Convert the decompressed data stream into bytes array
            byte[] decompressedBytes = decompressedStream.ToArray();

            // Allocate a new buffer to store the message
            byte[] bufferManagerBuffer = bufferManager.TakeBuffer(decompressedBytes.Length + buffer.Offset);

            // Copy the bytes that comes before the compressed message in the buffer argument
            Array.Copy(buffer.Array, 0, bufferManagerBuffer, 0, buffer.Offset);

            // Copy the decompressed data
            Array.Copy(decompressedBytes, 0, bufferManagerBuffer, buffer.Offset, decompressedBytes.Length);

            // Create a new ArraySegment that points to the new message buffer
            ArraySegment<byte> byteArray = new ArraySegment<byte>(bufferManagerBuffer, buffer.Offset, decompressedBytes.Length);

            // Release the original message buffer
            bufferManager.ReturnBuffer(buffer.Array);

            return byteArray;
        }
コード例 #21
0
            public override ArraySegment<byte> WriteMessage(Message message, int maxMessageSize, BufferManager bufferManager, int messageOffset)
            {
                if (message == null)
                {
                    throw new ArgumentNullException("message");
                }

                if (bufferManager == null)
                {
                    throw new ArgumentNullException("bufferManager");
                }

                if (maxMessageSize < 0)
                {
                    throw new ArgumentOutOfRangeException("maxMessageSize");
                }

                if (messageOffset < 0)
                {
                    throw new ArgumentOutOfRangeException("messageOffset");
                }

                if (messageOffset > maxMessageSize)
                {
                    throw new ArgumentException(
                        string.Format(
                            CultureInfo.CurrentCulture,
                            SR.ParameterMustBeLessThanOrEqualSecondParameter,
                            "messageOffset",
                            "maxMessageSize"));
                }

                message.Properties.Encoder = this;

                HttpResponseMessage response = GetHttpResponseMessageOrThrow(message);

                if (response.Content == null)
                {
                    return new ArraySegment<byte>();
                }

                byte[] messageBytes = response.Content.ReadAsByteArray();
                int messageLength = messageBytes.Length;
                int totalLength = messageLength + messageOffset;
                if (totalLength > maxMessageSize)
                {
                    throw new QuotaExceededException();
                }

                byte[] totalBytes = bufferManager.TakeBuffer(totalLength);
                Array.Copy(messageBytes, 0, totalBytes, messageOffset, totalLength - messageOffset);
                return new ArraySegment<byte>(totalBytes, messageOffset, messageLength);
            }
コード例 #22
0
            //Helper method to compress an array of bytes
            private static ArraySegment<byte> CompressBuffer(ArraySegment<byte> buffer, BufferManager bufferManager,
                int messageOffset,
                CompressionAlgorithm compressionAlgorithm)
            {
                var memoryStream = new MemoryStream();

                using (Stream compressedStream = compressionAlgorithm == CompressionAlgorithm.GZip
                                                     ? new GZipStream(memoryStream, CompressionMode.Compress, true)
                                                     : (Stream)
                                                       new DeflateStream(memoryStream, CompressionMode.Compress, true)
                    )
                {
                    compressedStream.Write(buffer.Array, buffer.Offset, buffer.Count);
                }

                byte[] compressedBytes = memoryStream.ToArray();
                int totalLength = messageOffset + compressedBytes.Length;
                byte[] bufferedBytes = bufferManager.TakeBuffer(totalLength);

                Array.Copy(compressedBytes, 0, bufferedBytes, messageOffset, compressedBytes.Length);

                bufferManager.ReturnBuffer(buffer.Array);
                var byteArray = new ArraySegment<byte>(bufferedBytes, messageOffset,
                                                       compressedBytes.Length);

                return byteArray;
            }
コード例 #23
0
ファイル: Downloader.cs プロジェクト: Azure/azure-powershell
        private byte[] EnsureReadAsSize(Stream stream, int size, BufferManager manager)
        {
            byte[] buffer = manager.TakeBuffer(size);
            int byteRead = 0;
            int totalRead = 0;
            int sizeLeft = size;
            do
            {
                byteRead = stream.Read(buffer, totalRead, sizeLeft);
                totalRead += byteRead;
                if (totalRead == size)
                {
                    break;
                }

                sizeLeft = sizeLeft - byteRead;
            } while (true);

            return buffer;
        }
コード例 #24
0
        protected override Message DecodeMessage(byte[] buffer, ref int offset, ref int size, ref bool isAtEOF, TimeSpan timeout)
        {
            while (size > 0)
            {
                int bytesRead = _decoder.Decode(buffer, offset, size);
                if (bytesRead > 0)
                {
                    if (EnvelopeBuffer != null)
                    {
                        if (!object.ReferenceEquals(buffer, EnvelopeBuffer))
                        {
                            System.Buffer.BlockCopy(buffer, offset, EnvelopeBuffer, EnvelopeOffset, bytesRead);
                        }

                        EnvelopeOffset += bytesRead;
                    }

                    offset += bytesRead;
                    size   -= bytesRead;
                }

                switch (_decoder.CurrentState)
                {
                case ClientFramingDecoderState.Fault:
                    _channel.Session.CloseOutputSession(_channel.GetInternalCloseTimeout());
                    throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(FaultStringDecoder.GetFaultException(_decoder.Fault, _channel.RemoteAddress.Uri.ToString(), _messageEncoder.ContentType));

                case ClientFramingDecoderState.End:
                    isAtEOF = true;
                    return(null);    // we're done

                case ClientFramingDecoderState.EnvelopeStart:
                    int envelopeSize = _decoder.EnvelopeSize;
                    if (envelopeSize > _maxBufferSize)
                    {
                        throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(
                                  ExceptionHelper.CreateMaxReceivedMessageSizeExceededException(_maxBufferSize));
                    }
                    EnvelopeBuffer = _bufferManager.TakeBuffer(envelopeSize);
                    EnvelopeOffset = 0;
                    EnvelopeSize   = envelopeSize;
                    break;

                case ClientFramingDecoderState.EnvelopeEnd:
                    if (EnvelopeBuffer != null)
                    {
                        Message message = null;
                        try
                        {
                            IDisposable activity = ClientDuplexConnectionReader.CreateProcessActionActivity();
                            using (activity)
                            {
                                message = _messageEncoder.ReadMessage(new ArraySegment <byte>(EnvelopeBuffer, 0, EnvelopeSize), _bufferManager);
                            }
                        }
                        catch (XmlException xmlException)
                        {
                            throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(
                                      new ProtocolException(SR.MessageXmlProtocolError, xmlException));
                        }
                        EnvelopeBuffer = null;
                        return(message);
                    }
                    break;
                }
            }
            return(null);
        }
コード例 #25
0
            private ArraySegment<byte> AddSessionInformationToMessage(ArraySegment<byte> messageData, BufferManager bufferManager, int maxMessageSize)
            {
                int dictionarySize = 0;
                byte[] buffer = messageData.Array;

                if (_writerSession.HasNewStrings)
                {
                    IList<XmlDictionaryString> newStrings = _writerSession.GetNewStrings();
                    for (int i = 0; i < newStrings.Count; i++)
                    {
                        int utf8ValueSize = Encoding.UTF8.GetByteCount(newStrings[i].Value);
                        dictionarySize += IntEncoder.GetEncodedSize(utf8ValueSize) + utf8ValueSize;
                    }

                    int messageSize = messageData.Offset + messageData.Count;
                    int remainingMessageSize = maxMessageSize - messageSize;
                    if (remainingMessageSize - dictionarySize < 0)
                    {
                        string excMsg = SR.Format(SR.MaxSentMessageSizeExceeded, maxMessageSize);
                        if (WcfEventSource.Instance.MaxSentMessageSizeExceededIsEnabled())
                        {
                            WcfEventSource.Instance.MaxSentMessageSizeExceeded(excMsg);
                        }
                        throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new QuotaExceededException(excMsg));
                    }

                    int requiredBufferSize = messageData.Offset + messageData.Count + dictionarySize;
                    if (buffer.Length < requiredBufferSize)
                    {
                        byte[] newBuffer = bufferManager.TakeBuffer(requiredBufferSize);
                        Buffer.BlockCopy(buffer, messageData.Offset, newBuffer, messageData.Offset, messageData.Count);
                        bufferManager.ReturnBuffer(buffer);
                        buffer = newBuffer;
                    }

                    Buffer.BlockCopy(buffer, messageData.Offset, buffer, messageData.Offset + dictionarySize, messageData.Count);

                    int offset = messageData.Offset;
                    for (int i = 0; i < newStrings.Count; i++)
                    {
                        string newString = newStrings[i].Value;
                        int utf8ValueSize = Encoding.UTF8.GetByteCount(newString);
                        offset += IntEncoder.Encode(utf8ValueSize, buffer, offset);
                        offset += Encoding.UTF8.GetBytes(newString, 0, newString.Length, buffer, offset);
                    }

                    _writerSession.ClearNewStrings();
                }

                int headerSize = IntEncoder.GetEncodedSize(dictionarySize);
                int newOffset = messageData.Offset - headerSize;
                int newSize = headerSize + messageData.Count + dictionarySize;
                IntEncoder.Encode(dictionarySize, buffer, newOffset);
                return new ArraySegment<byte>(buffer, newOffset, newSize);
            }
コード例 #26
0
 public override ArraySegment<byte> WriteMessage(Message message, int maxMessageSize, BufferManager bufferManager, int messageOffset)
 {
     var array = innerEncoder.WriteMessage(message, maxMessageSize, bufferManager, messageOffset).Array;
     var messageText = Encoding.UTF8.GetString(array);
     var xmlDocument = new XmlDocument();
     // Сохраняем запрос без actor
     File.WriteAllText("D:\\TrueClientRequest.xml", messageText);
     xmlDocument.LoadXml(messageText);
     var prefixOfNamespace = xmlDocument.FirstChild.GetPrefixOfNamespace(Soap11Namespace);
     if (string.IsNullOrEmpty(prefixOfNamespace))
         throw new XmlException(string.Format("Не найден префикс пространста имен {0}", Soap11Namespace));
     var elementsByTagName = xmlDocument.GetElementsByTagName("Security", "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd");
     if (elementsByTagName.Count == 0)
         throw new NullReferenceException("Не найден подпись под документом.");
     var attribute = xmlDocument.CreateAttribute(prefixOfNamespace + ":actor", Soap11Namespace);
     attribute.Value = SMEVActor;
     var xmlAttributeCollection = elementsByTagName[0].Attributes;
     if (xmlAttributeCollection != null)
     {
         xmlAttributeCollection.Append(attribute);
     }
     var memoryStream = new MemoryStream();
     var w = XmlWriter.Create(memoryStream);
     xmlDocument.Save(w);
     // Сохраняем запрос с actor
     File.WriteAllText("D:\\TrueClientRequestActor.xml", xmlDocument.InnerXml);
     w.Flush();
     var buffer = memoryStream.GetBuffer();
     var num = (int)memoryStream.Position;
     memoryStream.Close();
     var bufferSize = num + messageOffset;
     var array2 = bufferManager.TakeBuffer(bufferSize);
     Array.Copy(buffer, 0, array2, messageOffset, num);
     return new ArraySegment<byte>(array2, messageOffset, num);
 }
コード例 #27
0
        private static byte[] ReadBytes(Stream stream, IndexRange rangeToRead, BufferManager manager)
        {
            stream.Seek(rangeToRead.StartIndex, SeekOrigin.Begin);

            var bufferSize = (int)rangeToRead.Length;
            var buffer = manager.TakeBuffer(bufferSize);

            for (int bytesRead = stream.Read(buffer, 0, bufferSize);
                 bytesRead < bufferSize;
                 bytesRead += stream.Read(buffer, bytesRead, bufferSize - bytesRead))
            {
            }
            return buffer;
        }
コード例 #28
0
ファイル: BufferManager.cs プロジェクト: Potapy4/dotnet-wcf
 public override byte[] TakeBuffer(int bufferSize)
 {
     return(_innerBufferManager.TakeBuffer(bufferSize));
 }
コード例 #29
0
            public override ArraySegment<byte> WriteMessage(Message message, int maxMessageSize, BufferManager bufferManager, int messageOffset)
            {
                ArraySegment<byte> byteArray = new ArraySegment<byte>();
                MemoryStream stream = new MemoryStream();
                StreamWriter sw = new StreamWriter(stream);
                XmlWriter writer = null;
                byte[] messageBytes = null;
                int messageLength = 0;
                int totalLength  = 0;
                byte[] totalBytes = null;

                string methodName = null;
                string headerType = null;

                if (message.Properties.ContainsKey(JSONPMessageProperty.Name))
                {
                    methodName = ((JSONPMessageProperty)(message.Properties[JSONPMessageProperty.Name])).MethodName;
                    headerType = ((JSONPMessageProperty)(message.Properties[JSONPMessageProperty.Name])).HeaderType;
                }

                if (headerType == null)
                {
                    writer = XmlWriter.Create(sw);
                    message.WriteMessage(writer);
                    writer.Close();

                    messageBytes = stream.GetBuffer();
                    messageLength = (int)stream.Position;
                    stream.Close();

                    totalLength = messageLength + messageOffset;
                    totalBytes = bufferManager.TakeBuffer(totalLength);
                    Array.Copy(messageBytes, 0, totalBytes, messageOffset, messageLength);

                    byteArray = new ArraySegment<byte>(totalBytes, messageOffset, messageLength);
                }
                else
                {
                    if (methodName == null)
                    {
                        if (headerType.Contains("text/xml") || headerType.Contains("application/xml"))
                        {
                            writer = XmlWriter.Create(sw);
                            message.WriteMessage(writer);
                            writer.Close();

                            messageBytes = stream.GetBuffer();
                            messageLength = (int)stream.Position;
                            stream.Close();

                            totalLength = messageLength + messageOffset;
                            totalBytes = bufferManager.TakeBuffer(totalLength);
                            Array.Copy(messageBytes, 0, totalBytes, messageOffset, messageLength);

                            byteArray = new ArraySegment<byte>(totalBytes, messageOffset, messageLength);

                        }
                        else if (headerType.Contains("application/json"))
                        {
                            writer = JsonReaderWriterFactory.CreateJsonWriter(stream);
                            message.WriteMessage(writer);
                            writer.Flush();

                            messageBytes = stream.GetBuffer();
                            messageLength = (int)stream.Position;
                            stream.Close();
                            writer.Close();

                            totalLength = messageLength + messageOffset;
                            totalBytes = bufferManager.TakeBuffer(totalLength);
                            Array.Copy(messageBytes, 0, totalBytes, messageOffset, messageLength);

                            byteArray = new ArraySegment<byte>(totalBytes, messageOffset, messageLength);
                        }
                    }
                    else //if there is a JSONP request - check header
                    {

                        sw.Write(methodName + "( ");
                        sw.Flush();

                        writer = JsonReaderWriterFactory.CreateJsonWriter(stream);
                        message.WriteMessage(writer);
                        writer.Flush();
                        sw.Write(" );");
                        sw.Flush();

                        messageBytes = stream.GetBuffer();
                        messageLength = (int)stream.Position;
                        totalLength = messageLength + messageOffset;
                        totalBytes = bufferManager.TakeBuffer(totalLength);
                        Array.Copy(messageBytes, 0, totalBytes, messageOffset, messageLength);

                        byteArray = new ArraySegment<byte>(totalBytes, messageOffset, messageLength);
                        writer.Close();
                    }
                }

                return byteArray;
            }
コード例 #30
0
            //Helper method to decompress an array of bytes
            private static ArraySegment<byte> DecompressBuffer(ArraySegment<byte> buffer, BufferManager bufferManager,
                CompressionAlgorithm compressionAlgorithm)
            {
                var memoryStream = new MemoryStream(buffer.Array, buffer.Offset, buffer.Count);
                var decompressedStream = new MemoryStream();
                //int totalRead = 0;
                const int blockSize = 1024;
                byte[] tempBuffer = bufferManager.TakeBuffer(blockSize);
                using (Stream compressedStream = compressionAlgorithm == CompressionAlgorithm.GZip
                                                     ? new GZipStream(memoryStream, CompressionMode.Decompress)
                                                     : (Stream)
                                                       new DeflateStream(memoryStream, CompressionMode.Decompress))
                {
                    while (true)
                    {
                        int bytesRead = compressedStream.Read(tempBuffer, 0, blockSize);
                        if (bytesRead == 0)
                            break;
                        decompressedStream.Write(tempBuffer, 0, bytesRead);
                        //totalRead += bytesRead;
                    }
                }
                bufferManager.ReturnBuffer(tempBuffer);

                byte[] decompressedBytes = decompressedStream.ToArray();
                byte[] bufferManagerBuffer = bufferManager.TakeBuffer(decompressedBytes.Length + buffer.Offset);
                Array.Copy(buffer.Array, 0, bufferManagerBuffer, 0, buffer.Offset);
                Array.Copy(decompressedBytes, 0, bufferManagerBuffer, buffer.Offset, decompressedBytes.Length);

                var byteArray = new ArraySegment<byte>(bufferManagerBuffer, buffer.Offset,
                                                       decompressedBytes.Length);
                bufferManager.ReturnBuffer(buffer.Array);

                return byteArray;
            }
コード例 #31
0
        /// <summary>
        /// Compress a buffer
        /// </summary>
        /// <param name="buffer"></param>
        /// <param name="bufferManager"></param>
        /// <param name="messageOffset"></param>
        /// <returns></returns>
        private static ArraySegment<byte> CompressBuffer(ArraySegment<byte> buffer, BufferManager bufferManager, int messageOffset)
        {
            // Create a memory stream for the final message
            MemoryStream memoryStream = new MemoryStream();

            // Copy the bytes that should not be compressed into the stream
            memoryStream.Write(buffer.Array, 0, messageOffset);

            // Compress the message into the stream
            using (GZipStream gzStream = new GZipStream(memoryStream, CompressionMode.Compress, true))
            {
                gzStream.Write(buffer.Array, messageOffset, buffer.Count);
            }

            // Convert the stream into a bytes array
            byte[] compressedBytes = memoryStream.ToArray();

            // Allocate a new buffer to hold the new bytes array
            byte[] bufferedBytes = bufferManager.TakeBuffer(compressedBytes.Length);

            // Copy the compressed data into the allocated buffer
            Array.Copy(compressedBytes, 0, bufferedBytes, 0, compressedBytes.Length);

            // Release the original buffer we got as an argument
            bufferManager.ReturnBuffer(buffer.Array);

            // Create a new ArraySegment that points to the new message buffer
            ArraySegment<byte> byteArray = new ArraySegment<byte>(bufferedBytes, messageOffset, compressedBytes.Length - messageOffset);

            return byteArray;
        }
コード例 #32
0
        public override Message ReadMessage(ArraySegment<byte> buffer, BufferManager bufferManager, string contentType)
        {
            var msgContents = new byte[buffer.Count];
            Array.Copy(buffer.Array, buffer.Offset, msgContents, 0, msgContents.Length);
            var reader = XmlReader.Create(new MemoryStream(msgContents));
            var xmlDocument = new XmlDocument
            {
                PreserveWhitespace = true
            };
            xmlDocument.Load(reader);

            LogMessage(xmlDocument, true);

            var nodeList = xmlDocument.GetElementsByTagName(
               "Security", "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd");

            #if DEBUG
            // Для тестов должна быть как минимум 1 подпись
            if (nodeList.Count < 1)
            {
                return CreateErrorMessage(bufferManager, contentType, "SMEV-100008",
                                          "Не найдена подпись документа");
            }
            #endif

            #if (!DEBUG)
            // В сообщении из СМЭВ должно быть как минимум 2 подписи
            if (nodeList.Count < 2)
            {
                return CreateErrorMessage(bufferManager, contentType, "SMEV-100008",
                                          "Не найдена подпись документа");
            }
            #endif

            var xmlDocument2 = new XmlDocument
            {
                PreserveWhitespace = false
            };
            xmlDocument2.LoadXml(xmlDocument.OuterXml);

            // Проверяем подпись
            if (!(Signer.CheckSignature(xmlDocument) || Signer.CheckSignature(xmlDocument2)))
            {
                return CreateErrorMessage(bufferManager, contentType, "SMEV-100003",
                                          "Неверная ЭП сообщения");
            }

            var bytes = new UTF8Encoding().GetBytes(xmlDocument.OuterXml);
            var length = bytes.Length;
            var array = bufferManager.TakeBuffer(length);
            Array.Copy(bytes, 0, array, 0, length);
            buffer = new ArraySegment<byte>(array, 0, length);
            return _innerEncoder.ReadMessage(buffer, bufferManager, contentType);
        }
コード例 #33
0
ファイル: TextMessageEncoder.cs プロジェクト: nlhepler/mono
		public override ArraySegment<byte> WriteMessage (
			Message message, int maxMessageSize,
			BufferManager bufferManager, int messageOffset)
		{
			VerifyMessageVersion (message);

			ArraySegment<byte> seg = new ArraySegment<byte> (
				bufferManager.TakeBuffer (maxMessageSize),
				messageOffset, maxMessageSize);
			XmlWriterSettings s = new XmlWriterSettings ();
			s.Encoding = encoding;
			s.CheckCharacters = false;
			using (XmlWriter w = XmlWriter.Create (
				new MemoryStream (seg.Array, seg.Offset, seg.Count), s)) {
				message.WriteMessage (
					XmlDictionaryWriter.CreateDictionaryWriter (w));
			}
			return seg;
		}
コード例 #34
0
 private Message CreateMessage(XmlDocument xmlDocument, BufferManager bufferManager, string contentType)
 {
     var bytes = new UTF8Encoding().GetBytes(xmlDocument.InnerXml);
     var length = bytes.Length;
     const int destinationIndex = 0;
     var bufferSize = length + destinationIndex;
     var buffer4 = bufferManager.TakeBuffer(bufferSize);
     Array.Copy(bytes, 0, buffer4, destinationIndex, bufferSize);
     var buffer = new ArraySegment<byte>(buffer4, destinationIndex, bufferSize);
     return _innerEncoder.ReadMessage(buffer, bufferManager, contentType);
 }
コード例 #35
0
        /// <inheritdoc />
        public override ArraySegment<byte> WriteMessage(Message message, int maxMessageSize, BufferManager bufferManager, int messageOffset)
        {
            // Produce the basic stream
            var stream = new MemoryStream();
            message.XmlToStream(writerSettings, stream);

            // Apply the transformers
            stream = Transform(stream);

            // Now produce the final version of the message.
            var streamBuffer = stream.GetBuffer();
            var messageLength = (int)stream.Position;

            // And log it
            LogMessage(stream);
            stream.Close();

            var totalLength = messageLength + messageOffset;
            var wcfBuffer = bufferManager.TakeBuffer(totalLength);
            Array.Copy(streamBuffer, 0, wcfBuffer, messageOffset, messageLength);

            var byteArray = new ArraySegment<byte>(wcfBuffer, messageOffset, messageLength);
            return byteArray;
        }
コード例 #36
0
 public override ArraySegment<byte> WriteMessage(Message message, int maxMessageSize, BufferManager bufferManager, int messageOffset)
 {
     var arraySegment = _innerEncoder.WriteMessage(message, maxMessageSize, bufferManager, messageOffset);
     var buffer1 = new byte[arraySegment.Count];
     Array.Copy(arraySegment.Array, arraySegment.Offset, buffer1, 0, buffer1.Length);
     var reader = XmlReader.Create(new MemoryStream(buffer1));
     var xmlDocument = new XmlDocument();
     xmlDocument.Load(reader);
     var memoryStream = new MemoryStream();
     var w = XmlWriter.Create(memoryStream, new XmlWriterSettings
     {
         OmitXmlDeclaration = true,
         Encoding = new UTF8Encoding(false)
     });
     xmlDocument.Save(w);
     LogMessage(xmlDocument, false);
     w.Flush();
     var buffer2 = memoryStream.GetBuffer();
     var num = (int)memoryStream.Position;
     memoryStream.Close();
     var bufferSize = num + messageOffset;
     var array = bufferManager.TakeBuffer(bufferSize);
     Array.Copy(buffer2, 0, array, messageOffset, num);
     return new ArraySegment<byte>(array, messageOffset, num);
 }
コード例 #37
0
        //Helper method to compress an array of bytes
        static ArraySegment<byte> CompressBuffer(ArraySegment<byte> buffer, BufferManager bufferManager, int messageOffset)
        {
            MemoryStream memoryStream = new MemoryStream();

            using (GZipStream gzStream = new GZipStream(memoryStream, CompressionMode.Compress, true))
            {
                gzStream.Write(buffer.Array, buffer.Offset, buffer.Count);
            }

            byte[] compressedBytes = memoryStream.ToArray();
            int totalLength = messageOffset + compressedBytes.Length;
            byte[] bufferedBytes = bufferManager.TakeBuffer(totalLength);

            Array.Copy(compressedBytes, 0, bufferedBytes, messageOffset, compressedBytes.Length);

            bufferManager.ReturnBuffer(buffer.Array);
            ArraySegment<byte> byteArray = new ArraySegment<byte>(bufferedBytes, messageOffset, bufferedBytes.Length - messageOffset);

            return byteArray;
        }
コード例 #38
0
 public byte[] Take(int bufferSize)
 {
     return(_internalBufferManager.TakeBuffer(bufferSize));
 }