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); } }
public override byte[] TakeBuffer(int bufferSize) { return(_innerBufferManager.TakeBuffer(bufferSize)); }
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); }