internal uint QueueBeginGetContext() { uint statusCode = UnsafeNclNativeMethods.ErrorCodes.ERROR_SUCCESS; bool retry; do { retry = false; uint bytesTransferred = 0; statusCode = HttpApi.HttpReceiveHttpRequest( Server.RequestQueue.Handle, _nativeRequestContext.RequestId, // Small perf impact by not using HTTP_RECEIVE_REQUEST_FLAG_COPY_BODY // if the request sends header+body in a single TCP packet (uint)HttpApiTypes.HTTP_FLAGS.NONE, _nativeRequestContext.NativeRequest, _nativeRequestContext.Size, &bytesTransferred, _nativeRequestContext.NativeOverlapped); if (statusCode == UnsafeNclNativeMethods.ErrorCodes.ERROR_INVALID_PARAMETER && _nativeRequestContext.RequestId != 0) { // we might get this if somebody stole our RequestId, // set RequestId to 0 and start all over again with the buffer we just allocated // BUGBUG: how can someone steal our request ID? seems really bad and in need of fix. _nativeRequestContext.RequestId = 0; retry = true; } else if (statusCode == UnsafeNclNativeMethods.ErrorCodes.ERROR_MORE_DATA) { // the buffer was not big enough to fit the headers, we need // to read the RequestId returned, allocate a new buffer of the required size // (uint)backingBuffer.Length - AlignmentPadding AllocateNativeRequest(bytesTransferred); retry = true; } else if (statusCode == UnsafeNclNativeMethods.ErrorCodes.ERROR_SUCCESS && HttpSysListener.SkipIOCPCallbackOnSuccess) { // IO operation completed synchronously - callback won't be called to signal completion. IOCompleted(this, statusCode, bytesTransferred); } }while (retry); return(statusCode); }