Example #1
0
        int ParseHttpRequestHeader(Internal.RecvIO recvIO)
        {
            //start from pos0
            int readpos = 0;
            int lim     = recvIO.BytesTransferred - 1;
            int i       = 0;

            for (; i <= lim; ++i)
            {
                //just read
                if (recvIO.ReadByte(i) == '\r' &&
                    recvIO.ReadByte(i + 1) == '\n')
                {
                    //each line
                    //translate
                    if (i - readpos < 512)
                    {
                        //copy
                        recvIO.CopyTo(readpos, tmpReadBuffer, i - readpos);
                        //translate
                        string line = Encoding.UTF8.GetString(tmpReadBuffer, 0, i - readpos);
                        readpos = i + 2;
                        i++; //skip \n
                        //translate header ***
                        if (line == "")
                        {
                            //complete http header
                            parseState = HttpParsingState.Body;
                            return(readpos);
                        }
                        else
                        {
                            //parse header line
                            AddReqHeader(line);
                        }
                    }
                    else
                    {
                        //just skip?
                        //skip too long line
                        readpos = i + 2;
                        i++; //skip \n
                    }
                }
            }
            return(readpos);
        }
Example #2
0
        void ProcessHtmlPostBody(int readpos, Internal.RecvIO recvIO)
        {
            //parse body
            int transferedBytes = recvIO.BytesTransferred;
            int remaining       = transferedBytes - readpos;

            if (!IsMsgBodyComplete)
            {
                int wantBytes = ContentLength - contentByteCount;
                if (wantBytes <= remaining)
                {
                    //complete here
                    byte[] buff = new byte[wantBytes];
                    recvIO.CopyTo(readpos, buff, wantBytes);
                    //add to req
                    AddMsgBody(buff, 0, wantBytes);
                    //complete
                    this.parseState = HttpParsingState.Complete;
                    return;
                }
                else
                {
                    //continue read
                    if (remaining > 0)
                    {
                        byte[] buff = new byte[remaining];
                        recvIO.CopyTo(readpos, buff, remaining);
                        //add to req
                        AddMsgBody(buff, 0, remaining);
                    }

                    return;
                }
            }
            this.parseState = HttpParsingState.Complete;
        }
Example #3
0
        /// <summary>
        /// add and parse data
        /// </summary>
        /// <param name="buffer"></param>
        internal ProcessReceiveBufferResult LoadData(Internal.RecvIO recvIO)
        {
            switch (parseState)
            {
            case HttpParsingState.Head:
            {
                //find html header
                int readpos = ParseHttpRequestHeader(recvIO);
                //check if complete or not
                if (parseState == HttpParsingState.Body)
                {
                    ProcessHtmlPostBody(readpos, recvIO);
                }
            }
            break;

            case HttpParsingState.Body:
                ProcessHtmlPostBody(0, recvIO);
                break;

            case HttpParsingState.Complete:
                break;

            default:
                throw new NotSupportedException();
            }

            if (parseState == HttpParsingState.Complete)
            {
                return(ProcessReceiveBufferResult.Complete);
            }
            else
            {
                return(ProcessReceiveBufferResult.NeedMore);
            }
        }