Exemplo n.º 1
0
        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);
        }
Exemplo n.º 2
0
        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);
        }
Exemplo n.º 3
0
        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);
        }
Exemplo n.º 4
0
        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);
        }
Exemplo n.º 5
0
        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);
        }
Exemplo n.º 6
0
        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);
        }
Exemplo n.º 7
0
        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);
        }
Exemplo n.º 8
0
        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);
        }
Exemplo n.º 9
0
 internal static extern uint HttpReceiveHttpRequest(SafeHandle requestQueueHandle, ulong requestId, uint flags, HTTP_REQUEST *pRequestBuffer, uint requestBufferLength, uint *pBytesReturned, SafeNativeOverlapped pOverlapped);
Exemplo n.º 10
0
 internal static unsafe string GetVerb(HTTP_REQUEST *request)
 {
     return(GetVerb(request, 0));
 }
Exemplo n.º 11
0
 internal static unsafe string GetKnownHeader(HTTP_REQUEST *request, int headerIndex)
 {
     return(GetKnownHeader(request, 0, headerIndex));
 }
Exemplo n.º 12
0
        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);
        }