private static unsafe string GetVerb(HTTP_REQUEST *request, long fixup) { string verb = null; if ((int)request->Verb > (int)HTTP_VERB.HttpVerbUnknown && (int)request->Verb < (int)HTTP_VERB.HttpVerbMaximum) { verb = HttpVerbs[(int)request->Verb]; } else if (request->Verb == HTTP_VERB.HttpVerbUnknown && request->pUnknownVerb != null) { verb = new string(request->pUnknownVerb + fixup, 0, request->UnknownVerbLength); } return(verb); }
internal static unsafe HTTP_VERB GetKnownVerb(IntPtr memoryBlob, IntPtr originalAddress) { NetEventSource.Enter(null); // Return value. HTTP_VERB verb = HTTP_VERB.HttpVerbUnknown; HTTP_REQUEST *request = (HTTP_REQUEST *)memoryBlob.ToPointer(); if ((int)request->Verb > (int)HTTP_VERB.HttpVerbUnparsed && (int)request->Verb < (int)HTTP_VERB.HttpVerbMaximum) { verb = request->Verb; } NetEventSource.Exit(null); return(verb); }
private unsafe static string GetVerb(HTTP_REQUEST *request, long fixup) { GlobalLog.Enter("HttpApi::GetVerb()"); string verb = null; if ((int)request->Verb > (int)HTTP_VERB.HttpVerbUnknown && (int)request->Verb < (int)HTTP_VERB.HttpVerbMaximum) { verb = HttpVerbs[(int)request->Verb]; } else if (request->Verb == HTTP_VERB.HttpVerbUnknown && request->pUnknownVerb != null) { verb = new string(request->pUnknownVerb + fixup, 0, request->UnknownVerbLength); } GlobalLog.Leave("HttpApi::GetVerb() return:" + ValidationHelper.ToString(verb)); return(verb); }
private static string GetKnownHeader(HTTP_REQUEST *request, long fixup, int headerIndex) { GlobalLog.Enter("HttpApi::GetKnownHeader()"); string header = null; HTTP_KNOWN_HEADER *pKnownHeader = (&request->Headers.KnownHeaders) + headerIndex; GlobalLog.Print("HttpApi::GetKnownHeader() pKnownHeader:0x" + ((IntPtr)pKnownHeader).ToString("x")); GlobalLog.Print("HttpApi::GetKnownHeader() pRawValue:0x" + ((IntPtr)pKnownHeader->pRawValue).ToString("x") + " RawValueLength:" + pKnownHeader->RawValueLength.ToString()); // For known headers, when header value is empty, RawValueLength will be 0 and // pRawValue will point to empty string ("\0") if (pKnownHeader->pRawValue != null) { header = new string(pKnownHeader->pRawValue + fixup, 0, pKnownHeader->RawValueLength); } GlobalLog.Leave("HttpApi::GetKnownHeader() return:" + ValidationHelper.ToString(header)); return(header); }
internal unsafe static HTTP_VERB GetKnownVerb(byte[] memoryBlob, IntPtr originalAddress) { NetEventSource.Enter(null); // Return value. HTTP_VERB verb = HTTP_VERB.HttpVerbUnknown; fixed(byte *pMemoryBlob = memoryBlob) { HTTP_REQUEST *request = (HTTP_REQUEST *)pMemoryBlob; if ((int)request->Verb > (int)HTTP_VERB.HttpVerbUnparsed && (int)request->Verb < (int)HTTP_VERB.HttpVerbMaximum) { verb = request->Verb; } } NetEventSource.Exit(null); return(verb); }
internal static HTTP_VERB GetKnownVerb(byte[] memoryBlob, IntPtr originalAddress) { GlobalLog.Enter("HttpApi::GetKnownVerb()"); // Return value. HTTP_VERB verb = HTTP_VERB.HttpVerbUnknown; fixed(byte *pMemoryBlob = memoryBlob) { HTTP_REQUEST *request = (HTTP_REQUEST *)pMemoryBlob; if ((int)request->Verb > (int)HTTP_VERB.HttpVerbUnparsed && (int)request->Verb < (int)HTTP_VERB.HttpVerbMaximum) { verb = request->Verb; } } GlobalLog.Leave("HttpApi::GetKnownVerb()"); return(verb); }
private static unsafe string?GetKnownHeader(HTTP_REQUEST *request, long fixup, int headerIndex) { string?header = null; HTTP_KNOWN_HEADER *pKnownHeader = (&request->Headers.KnownHeaders) + headerIndex; if (NetEventSource.Log.IsEnabled()) { NetEventSource.Info(null, $"HttpApi::GetKnownHeader() pKnownHeader:0x{(IntPtr)pKnownHeader}"); NetEventSource.Info(null, $"HttpApi::GetKnownHeader() pRawValue:0x{(IntPtr)pKnownHeader->pRawValue} RawValueLength:{pKnownHeader->RawValueLength}"); } // For known headers, when header value is empty, RawValueLength will be 0 and // pRawValue will point to empty string if (pKnownHeader->pRawValue != null) { header = new string(pKnownHeader->pRawValue + fixup, 0, pKnownHeader->RawValueLength); } return(header); }
internal static unsafe IPEndPoint?GetLocalEndPoint(IntPtr memoryBlob, IntPtr originalAddress) { SocketAddress?v4address = new SocketAddress(AddressFamily.InterNetwork, IPv4AddressSize); SocketAddress?v6address = new SocketAddress(AddressFamily.InterNetworkV6, IPv6AddressSize); byte * pMemoryBlob = (byte *)memoryBlob; HTTP_REQUEST *request = (HTTP_REQUEST *)pMemoryBlob; IntPtr address = request->Address.pLocalAddress != null ? (IntPtr)(pMemoryBlob - (byte *)originalAddress + (byte *)request->Address.pLocalAddress) : IntPtr.Zero; CopyOutAddress(address, ref v4address, ref v6address); IPEndPoint?endpoint = null; if (v4address != null) { endpoint = s_any.Create(v4address) as IPEndPoint; } else if (v6address != null) { endpoint = s_ipv6Any.Create(v6address) as IPEndPoint; } return(endpoint); }
internal static extern uint HttpReceiveHttpRequest(SafeHandle requestQueueHandle, ulong requestId, uint flags, HTTP_REQUEST *pRequestBuffer, uint requestBufferLength, uint *pBytesReturned, SafeNativeOverlapped pOverlapped);
internal static unsafe string GetVerb(HTTP_REQUEST *request) { return(GetVerb(request, 0)); }
internal static unsafe string GetKnownHeader(HTTP_REQUEST *request, int headerIndex) { return(GetKnownHeader(request, 0, headerIndex)); }
internal static unsafe uint GetChunks(byte[] memoryBlob, IntPtr originalAddress, ref int dataChunkIndex, ref uint dataChunkOffset, byte[] buffer, int offset, int size) { if (NetEventSource.IsEnabled) { NetEventSource.Enter(null, $"HttpApi::GetChunks() memoryBlob:{memoryBlob}"); } // Return value. uint dataRead = 0; fixed(byte *pMemoryBlob = memoryBlob) { HTTP_REQUEST *request = (HTTP_REQUEST *)pMemoryBlob; long fixup = pMemoryBlob - (byte *)originalAddress; if (request->EntityChunkCount > 0 && dataChunkIndex < request->EntityChunkCount && dataChunkIndex != -1) { HTTP_DATA_CHUNK *pDataChunk = (HTTP_DATA_CHUNK *)(fixup + (byte *)&request->pEntityChunks[dataChunkIndex]); fixed(byte *pReadBuffer = buffer) { byte *pTo = &pReadBuffer[offset]; while (dataChunkIndex < request->EntityChunkCount && dataRead < size) { if (dataChunkOffset >= pDataChunk->BufferLength) { dataChunkOffset = 0; dataChunkIndex++; pDataChunk++; } else { byte *pFrom = pDataChunk->pBuffer + dataChunkOffset + fixup; uint bytesToRead = pDataChunk->BufferLength - (uint)dataChunkOffset; if (bytesToRead > (uint)size) { bytesToRead = (uint)size; } for (uint i = 0; i < bytesToRead; i++) { *(pTo++) = *(pFrom++); } dataRead += bytesToRead; dataChunkOffset += bytesToRead; } } } } //we're finished. if (dataChunkIndex == request->EntityChunkCount) { dataChunkIndex = -1; } } if (NetEventSource.IsEnabled) { NetEventSource.Exit(null); } return(dataRead); }