private unsafe void UpdateDataChunk()
{
if (_dataChunks == null)
{
_dataChunks = new Interop.HttpApi.HTTP_DATA_CHUNK[2];
_dataChunksGCHandle = GCHandle.Alloc(_dataChunks, GCHandleType.Pinned);
_dataChunks[0] = new Interop.HttpApi.HTTP_DATA_CHUNK();
_dataChunks[0].DataChunkType = Interop.HttpApi.HTTP_DATA_CHUNK_TYPE.HttpDataChunkFromMemory;
_dataChunks[1] = new Interop.HttpApi.HTTP_DATA_CHUNK();
_dataChunks[1].DataChunkType = Interop.HttpApi.HTTP_DATA_CHUNK_TYPE.HttpDataChunkFromMemory;
}
Debug.Assert(_buffer == null || _bufferList == null, "Either 'm_Buffer' or 'm_BufferList' MUST be NULL.");
Debug.Assert(_shouldCloseOutput || _buffer != null || _bufferList != null, "Either 'm_Buffer' or 'm_BufferList' MUST NOT be NULL.");
// The underlying byte[] m_Buffer or each m_BufferList[].Array are pinned already
if (_buffer != null)
{
UpdateDataChunk(0, _buffer, _offset, _count);
UpdateDataChunk(1, null, 0, 0);
_dataChunkCount = 1;
}
else if (_bufferList != null)
{
Debug.Assert(_bufferList != null && _bufferList.Count == 2,
"'m_BufferList' MUST NOT be NULL and have exactly '2' items at this point.");
UpdateDataChunk(0, _bufferList[0].Array, _bufferList[0].Offset, _bufferList[0].Count);
UpdateDataChunk(1, _bufferList[1].Array, _bufferList[1].Offset, _bufferList[1].Count);
_dataChunkCount = 2;
}
else
{
Debug.Assert(_shouldCloseOutput, "'m_ShouldCloseOutput' MUST be 'true' at this point.");
_dataChunks = null;
}
}