コード例 #1
0
ファイル: AsyncHttpServer.cs プロジェクト: sp00x/internetpack
        private void HeaderLinesCallback(IAsyncResult ar)
        {
            String lHeaderLine;

            try
            {
                lHeaderLine = this.DataConnection.EndReadLine(ar);
            }
            catch (ConnectionClosedException)
            {
                Done();
                return;
            }
            catch (SocketException)
            {
                Done();
                return;
            }
            catch (ObjectDisposedException)
            {
                Done();
                return;
            }

            // HTTP Request Type is already known
            String  lHttpMethod  = this.fContext.CurrentRequest.Header.RequestType;
            Boolean lRequireBody = (lHttpMethod == "POST") || (lHttpMethod == "PUT") || (lHttpMethod == "MERGE");

            Boolean lHaveData = true;

            while (lHaveData)
            {
                lHaveData = false;
                if (lHeaderLine == "")
                {
                    // we've got the last line. Process it
                    if (lRequireBody)
                    {
                        Int64 lContentLength;
#if FULLFRAMEWORK
                        if (!Int64.TryParse(fContext.CurrentRequest.Header.GetHeaderValue("Content-Length"), out lContentLength))
#else
                        if (!LongHelper.TryParse(fContext.CurrentRequest.Header.GetHeaderValue("Content-Length"), out lContentLength))
#endif
                        { lContentLength = 0; }

                        if (lContentLength > ((AsyncHttpServer)this.Owner).MaxPostSize)
                        {
                            this.SendInvalidRequest(new Exception("Content-Length too large"));
                            return;
                        }

                        try
                        {
                            ((AsyncHttpServer)this.Owner).TriggerBeforeHaveData(new AsyncHttpRequestEventArgs(this.DataConnection, this.fContext));
                        }
                        catch (Exception ex)
                        {
                            this.SendInvalidRequest(ex);
                            return;
                        }

                        if (this.fContext.ResponseSent)
                        {
                            return;                             // already triggered the required functions.
                        }
                        try
                        {
                            Byte[] lData = new Byte[(Int32)lContentLength];
                            DataConnection.BeginRead(lData, 0, (Int32)lContentLength, WantBodyCallback, lData);
                        }
                        catch (SocketException)
                        {
                            Done();
                        }
                        catch (ObjectDisposedException)
                        {
                            Done();
                        }

                        return;
                    }
                    else
                    {
                        try
                        {
                            this.fOwner.TriggerHttpRequest(new AsyncHttpRequestEventArgs(this.DataConnection, this.fContext));
                            return;
                        }
                        catch (Exception ex)
                        {
                            this.SendInvalidRequest(ex);
                            return;
                        }
                    }
                }

                if (fContext.CurrentRequest.Header.Count >= fContext.CurrentRequest.Header.MaxHeaderLines && fContext.CurrentRequest.Header.MaxHeaderLinesEnabled)
                {
                    SendInvalidRequest();
                    return;
                }

                Int32 lPosition = lHeaderLine.IndexOf(":", StringComparison.Ordinal);
                if (lPosition == -1)
                {
                    SendInvalidRequest();
                    return;
                }

                String lName  = lHeaderLine.Substring(0, lPosition);
                String lValue = null;
                if (lHeaderLine.Length > lPosition + 1)
                {
                    lValue = lHeaderLine.Substring(lPosition + 2);
                }

                fContext.CurrentRequest.Header.SetHeaderValue(lName, lValue);
                lHeaderLine = DataConnection.BufferReadLine();
                if (lHeaderLine != null)
                {
                    lHaveData = true;
                    continue;
                }

                try
                {
                    DataConnection.BeginReadLine(HeaderLinesCallback, null);
                }
                catch (SocketException)
                {
                    Done();
                }
                catch (ObjectDisposedException)
                {
                    Done();
                }
            }
        }
コード例 #2
0
ファイル: AsyncHttpServer.cs プロジェクト: sp00x/internetpack
        private void ResponseBodyCallback(IAsyncResult ar)
        {
            try
            {
                DataConnection.EndWrite(ar);

                if (ar.AsyncState is Stream)
                {
                    Stream lData = (Stream)ar.AsyncState;
                    Int32  lLen  = lData.Read(fBodyBuffer, 0, fBodyBuffer.Length);
                    if (lLen != 0)
                    {
                        DataConnection.BeginWrite(fBodyBuffer, 0, lLen, ResponseBodyCallback, lData);
                        return;
                    }
                }
                else if (ar.AsyncState is Byte[])
                {
                    Byte[] lData = (Byte[])ar.AsyncState;
                    Int32  lLen  = fBodyBuffer.Length;
                    if (fBodyOffset + lLen > lData.Length)
                    {
                        lLen = lData.Length - fBodyOffset;
                    }
                    if (lLen != 0)
                    {
                        Array.Copy(lData, fBodyOffset, fBodyBuffer, 0, lLen);
                        fBodyOffset += lLen;
                        DataConnection.BeginWrite(fBodyBuffer, 0, lLen, ResponseBodyCallback, lData);
                        return;
                    }
                }
            }
            catch (ConnectionClosedException)
            {
                this.fOwner.TriggerHttpResponseFailed(new AsyncHttpRequestEventArgs(this.DataConnection, this.fContext));
                Done();
                return;
            }
            catch (SocketException)
            {
                this.fOwner.TriggerHttpResponseFailed(new AsyncHttpRequestEventArgs(this.DataConnection, this.fContext));
                Done();
                return;
            }
            catch (ObjectDisposedException)
            {
                this.fOwner.TriggerHttpResponseFailed(new AsyncHttpRequestEventArgs(this.DataConnection, this.fContext));
                Done();
                return;
            }

            //AsyncHttpContext lOldContext = fContext;

            fContext = this.fOwner.NewContext(this);
            try
            {
                DataConnection.BeginReadLine(HeaderFirstLineCallback, null);
            }
            catch (SocketException)
            {
                this.fOwner.TriggerHttpResponseFailed(new AsyncHttpRequestEventArgs(this.DataConnection, this.fContext));
                Done();
                return;
            }

            catch (ObjectDisposedException)
            {
                this.fOwner.TriggerHttpResponseFailed(new AsyncHttpRequestEventArgs(this.DataConnection, this.fContext));
                Done();
                return;
            }
            this.fOwner.TriggerHttpResponseSent(new AsyncHttpRequestEventArgs(this.DataConnection, this.fContext));
        }
コード例 #3
0
        private void ResponseBodyCallback(IAsyncResult ar)
        {
            try
            {
                DataConnection.EndWrite(ar);

                if (ar.AsyncState is Stream)
                {
                    Stream lData = (Stream)ar.AsyncState;
                    Int32  lLen  = lData.Read(fBodyBuffer, 0, fBodyBuffer.Length);
                    if (lLen != 0)
                    {
                        DataConnection.BeginWrite(fBodyBuffer, 0, lLen, new AsyncCallback(ResponseBodyCallback), lData);
                        return;
                    }
                }
                else if (ar.AsyncState is Byte[])
                {
                    Byte[] lData = (Byte[])ar.AsyncState;
                    Int32  lLen  = fBodyBuffer.Length;
                    if (fBodyOffset + lLen > lData.Length)
                    {
                        lLen = lData.Length - fBodyOffset;
                    }
                    if (lLen != 0)
                    {
                        Array.Copy(lData, fBodyOffset, fBodyBuffer, 0, lLen);
                        fBodyOffset += lLen;
                        DataConnection.BeginWrite(fBodyBuffer, 0, lLen, new AsyncCallback(ResponseBodyCallback), lData);
                        return;
                    }
                }
            }
            catch (ConnectionClosedException)
            {
                ((AsyncHttpServer)Owner).TriggerOnHttpResponseFailed(DataConnection, fContext);
                return;
            }
            catch (SocketException)
            {
                ((AsyncHttpServer)Owner).TriggerOnHttpResponseFailed(DataConnection, fContext);
                return;
            }
            catch (ObjectDisposedException)
            {
                ((AsyncHttpServer)Owner).TriggerOnHttpResponseFailed(DataConnection, fContext);
                return;
            }

            AsyncHttpContext lOldContext = fContext;

            fContext = ((AsyncHttpServer)Owner).NewContext(this);
            try
            {
                DataConnection.BeginReadLine(new AsyncCallback(HeaderFirstLineCallback), null);
            }
            catch (SocketException)
            {
                ((AsyncHttpServer)Owner).TriggerOnHttpResponseFailed(DataConnection, fContext);
                return;
            }

            catch (ObjectDisposedException)
            {
                ((AsyncHttpServer)Owner).TriggerOnHttpResponseFailed(DataConnection, fContext);
                return;
            }
            ((AsyncHttpServer)Owner).TriggerOnHttpResponseSent(DataConnection, lOldContext);

            return;
        }