Example #1
0
        void OnReceiveData(IAsyncResult ar)
        {
            if (processingThread == null)
            {
                processingThread = System.Threading.Thread.CurrentThread;
            }
            lock (socket)
            {
                try
                {
                    idleTime = 0;
                    if (!isConnected)
                    {
                        return;
                    }

                    int dataLen = stream.EndRead(ar);

#if DUMP
                    System.Diagnostics.Debug.Write(Encoding.Default.GetString(buffer, 0, dataLen));
                    System.Diagnostics.Debug.WriteLine("+++++++++++++++++++++++");
#endif

                    if (dataLen < 1)
                    {
                        Disconnect();
                        return;
                    }

                    if (textBuf != null)
                    {
                        if (textBuf.Length > 0x8000)
                        {
                            Disconnect();
                            return;
                        }
                    }

                    for (int bufPos = 0; bufPos < dataLen; bufPos++)
                    {
                        if (request == null)
                        {
                            request = new HttpRequest(this);
                            textBuf = new StringBuilder(buffer.Length);
                        }

                        if (request.Mode == HttpRequest.DataMode.Text)
                        {
                            int len = FindByte(buffer, bufPos, dataLen, 10);
                            if (len != -1)
                            {
                                textBuf.Append(Encoding.Default.GetString(buffer, bufPos, len + 1 - bufPos));
                                request.ProcessLine(textBuf.ToString().Trim('\r', '\n'));
                                textBuf.Length = 0;
                                bufPos         = len;
                            }
                            else
                            {
                                textBuf.Append(Encoding.Default.GetString(buffer, bufPos, dataLen - bufPos));
                                bufPos = dataLen;
                            }
                        }

                        if (request.Mode == HttpRequest.DataMode.Binary)
                        {
                            request.ProcessData(buffer, bufPos, dataLen - bufPos);
                            bufPos = dataLen;
                        }

                        if (request.IsRequestFinished)
                        {
                            preventTimeout = true;
                            bool forceDisconnect = false;
                            try
                            {
                                server.OnRequestReceived(this, request);
                            }
                            catch (HttpRequestException e)
                            {
                                request.Response.ResponseCode = e.ResponseCode;
                                //TODO: custom error messages, fix forceDisconnect prior to implementing HTTPS
                                if (e.ResponseCode == "500")
                                {
                                    server.Log.WriteLine(e.ToString());
                                }
                                forceDisconnect = true;
                            }
                            request.SendResponse();
                            ConnectionMode modeTemp = request.ConnectionMode;

                            string requestVer = request.HttpVersion;

                            request.Dispose();
                            request        = null;
                            idleTime       = 0;
                            preventTimeout = false;

                            //TODO: don't disconnect 1.0... wget is being sending weird headers, do this workaround for now
                            if (modeTemp == ConnectionMode.Close || forceDisconnect || requestVer == "1.0")
                            {
                                Disconnect();
                                return;
                            }
                        }
                    }

                    if (isConnected)
                    {
                        stream.BeginRead(buffer, 0, buffer.Length, new AsyncCallback(OnReceiveData), this);
                    }
                }
                catch (SocketException)
                {
                    Disconnect();
                }
                catch (IOException e)
                {
                    Disconnect();
                    if (!(e.InnerException is SocketException))
                    {
#if !DEBUG
                        server.Log.WriteLine("Error: " + e.ToString());
#else
                        throw;
#endif
                    }
                }
                catch (System.Threading.ThreadAbortException)
                {
                    Disconnect();
                }
#if !DEBUG
                catch (Exception e)
                {
                    server.Log.WriteLine("Error: " + e.ToString());
                    Disconnect();
                }
#endif
            }
        }