Ejemplo n.º 1
0
        private static void HandleError(Exception e, HttpReaderState httpReaderState)
        {
            if (httpReaderState != null)
            {
                if (httpReaderState.HttpInboundSocketPipe != null)
                {
                    httpReaderState.HttpInboundSocketPipe.HandleError(e);
                }

                httpReaderState.Dispose();
            }
        }
Ejemplo n.º 2
0
 private static void BeginReceive(HttpReaderState httpReaderState)
 {
     try
     {
         if (httpReaderState != null && httpReaderState.Socket == null)
         {
             httpReaderState.Dispose();
             return;
         }
         httpReaderState.Socket.BeginReceive(httpReaderState.ReceiveBuffer,
                                             0,
                                             httpReaderState.ReceiveBuffer.Length,
                                             SocketFlags.None,
                                             ascDataReceived,
                                             httpReaderState);
     }
     catch (Exception e)
     {
         HandleError(e, httpReaderState);
     }
 }
Ejemplo n.º 3
0
        private static void OnDataReceivedCallback(IAsyncResult asyn)
        {
            HttpReaderState httpReaderState = asyn.AsyncState as HttpReaderState;

            try
            {
                if (httpReaderState.Socket != null && httpReaderState.Socket.Connected &&
                    OnData(httpReaderState, httpReaderState.ReceiveBuffer, 0, httpReaderState.Socket.EndReceive(asyn), (httpReaderState.Socket != null) ? httpReaderState.Socket.Available : 0))

                {
                    BeginReceive(httpReaderState);
                }
                else
                {
                    httpReaderState.HttpInboundSocketPipe.Flush();
                    httpReaderState.Dispose();
                }
            }
            catch (Exception e)
            {
                HandleError(e, httpReaderState);
            }
        }
Ejemplo n.º 4
0
        public override void StartReceive()
        {
            if (IsClosed)
            {
                return;
            }
            Socket           readSocket = null;
            HttpObjectParser parser     = null;

            if (isClient)
            {
                readSocket = this.PipesChain.ChainState.ClientSocket;
                parser     = new HttpRequestParser();
            }
            else
            {
                readSocket = this.PipesChain.ChainState.ServerSocket;
                parser     = new HttpResponseParser();
            }

            HttpReaderState httpReaderState = new HttpReaderState(this, readSocket, parser);

            BeginReceive(httpReaderState);
        }
Ejemplo n.º 5
0
        private static bool OnData(HttpReaderState httpReaderState, byte[] b_buffer, int index, int length, int available)
        {
            lock (httpReaderState)
            {
                if (httpReaderState.HttpObjectParser == null)
                {
                    throw new Exception("Unknown HTTP Object Parser");
                }

                httpReaderState.TotalReceived += length;

                if (!httpReaderState.HttpObjectParser.IsInitiated())
                {
                    if (httpReaderState.TotalReceived > httpReaderState.ReceiveHeaderBuffer.Length)
                    {
                        throw new Exception("Invalid HTTP Header");
                    }

                    System.Array.Copy(b_buffer, index, httpReaderState.ReceiveHeaderBuffer, httpReaderState.TotalReceived - length, length);

                    String header = GetHeader(httpReaderState.ReceiveHeaderBuffer, httpReaderState.TotalReceived);

                    if (header != null)
                    {
                        httpReaderState.HttpObjectParser.Initiate(header);
                        httpReaderState.HttpInboundSocketPipe.PipesChain.ChainState["RAW_HEADER_" + ((httpReaderState.HttpInboundSocketPipe.isClient) ? "REQUEST" : "RESPONSE")] = header;

                        if (httpReaderState.HttpInboundSocketPipe.isClient)
                        {
                            httpReaderState.HttpInboundSocketPipe.PipesChain.ChainState["REQUEST_URI"] = ((HttpRequestParser)httpReaderState.HttpObjectParser).URL;
                        }

                        if (httpReaderState.TotalReceived <= header.Length)
                        {
                            length = 0;
                        }

                        byte[] h_buffer = Encoding.ASCII.GetBytes(header);

                        if (h_buffer.Length != 0)
                        {
                            httpReaderState.HttpObjectParser.OnData(h_buffer, 0, h_buffer.Length, available);
                            httpReaderState.HttpInboundSocketPipe.SendData(h_buffer, 0, h_buffer.Length);
                        }

                        if (httpReaderState.TotalReceived - length < h_buffer.Length)
                        {
                            int skip = h_buffer.Length - (httpReaderState.TotalReceived - length);
                            index  += skip;
                            length -= skip;
                        }
                    }
                }

                if (!httpReaderState.HttpObjectParser.IsInitiated())
                {
                    return(true);
                }

                httpReaderState.HttpObjectParser.OnData(b_buffer, index, length, available);

                if (length > 0)
                {
                    httpReaderState.HttpInboundSocketPipe.SendData(b_buffer, index, length);
                }

                int expectedLength = httpReaderState.HttpObjectParser.GetExpectedLength();

                if (expectedLength == -2)
                {                   //"Continue", Reset reader
                    httpReaderState.HttpInboundSocketPipe.StartReceive();
                    return(false);
                }

                return(expectedLength > httpReaderState.TotalReceived || expectedLength == -1);
            }
        }