Esempio n. 1
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);
            }
        }
Esempio n. 2
0
 public override byte[] TakeBuffer(int bufferSize)
 {
     return(_innerBufferManager.TakeBuffer(bufferSize));
 }
Esempio n. 3
0
                protected override Message DecodeMessage(byte[] buffer, ref int offset, ref int size, ref bool isAtEof, TimeSpan timeout)
                {
                    while (!isAtEof && 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 ServerSessionDecoder.State.EnvelopeStart:
                            int envelopeSize = decoder.EnvelopeSize;
                            if (envelopeSize > maxBufferSize)
                            {
                                base.SendFault(FramingEncodingString.MaxMessageSizeExceededFault, timeout);

                                throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(
                                          MaxMessageSizeStream.CreateMaxReceivedMessageSizeExceededException(maxBufferSize));
                            }
                            EnvelopeBuffer = bufferManager.TakeBuffer(envelopeSize);
                            EnvelopeOffset = 0;
                            EnvelopeSize   = envelopeSize;
                            break;

                        case ServerSessionDecoder.State.EnvelopeEnd:
                            if (EnvelopeBuffer != null)
                            {
                                Message message = null;

                                try
                                {
                                    message = messageEncoder.ReadMessage(new ArraySegment <byte>(EnvelopeBuffer, 0, EnvelopeSize), bufferManager, contentType);
                                }
                                catch (XmlException xmlException)
                                {
                                    throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(
                                              new ProtocolException(SR.Format(SR.MessageXmlProtocolError), xmlException));
                                }

                                EnvelopeBuffer = null;
                                return(message);
                            }
                            break;

                        case ServerSessionDecoder.State.End:
                            isAtEof = true;
                            break;
                        }
                    }

                    return(null);
                }