Esempio n. 1
0
        protected override void ScanHeaderFieldValue(HeaderBuffer headerBuffer, string decapitalizedFieldName, int startOffset)
        {
            switch (decapitalizedFieldName)
            {
            case "host":
                // save its value, but its span is unnecessary
                if (this.HostEndPoint == null)
                {
                    string hostValue = HeaderBuffer.TrimHeaderFieldValue(headerBuffer.ReadFieldASCIIValue(false));
                    this.HostEndPoint = Util.ParseEndPoint(hostValue, canOmitPort: true);
                }
                else
                {
                    headerBuffer.SkipField();
                }
                this.HostSpan = new Span(startOffset, headerBuffer.CurrentOffset);
                break;

            case "proxy-authorization":
                // save its span, but its value is unnecessary
                headerBuffer.SkipField();
                this.ProxyAuthorizationSpan = new Span(startOffset, headerBuffer.CurrentOffset);
                break;

            default:
                base.ScanHeaderFieldValue(headerBuffer, decapitalizedFieldName, startOffset);
                break;
            }
        }
Esempio n. 2
0
        protected virtual void ScanHeaderFieldValue(HeaderBuffer headerBuffer, string decapitalizedFieldName, int startOffset)
        {
            // argument checks
            Debug.Assert(headerBuffer != null);

            string value;

            switch (decapitalizedFieldName)
            {
            case "content-length":
                value = headerBuffer.ReadFieldASCIIValue(decapitalize: false);
                this.ContentLength = HeaderBuffer.ParseHeaderFieldValueAsLong(value);
                break;

            case "transfer-encoding":
                value = headerBuffer.ReadFieldASCIIValue(decapitalize: true);
                if (HeaderBuffer.IsChunkedSpecified(value) == false)
                {
                    throw MessageBuffer.CreateBadRequestException();
                }
                this.ContentLength = -1;                                // -1 means 'chunked'
                break;

            default:
                // just skip
                headerBuffer.SkipField();
                break;
            }
        }
Esempio n. 3
0
        protected virtual bool ScanHeaderField(HeaderBuffer headerBuffer)
        {
            // argument checks
            Debug.Assert(headerBuffer != null);

            // read the first byte
            bool emptyLine;
            Func <byte, bool> hasInterest = (b) => {
                char c = Char.ToLower((char)b);
                return(IsInterestingHeaderFieldFirstChar(c));
            };

            byte firstByte = headerBuffer.ReadFieldNameFirstByte();

            if (firstByte == MessageBuffer.CR || hasInterest(firstByte) == false)
            {
                // no interest, just skip this line
                emptyLine = headerBuffer.SkipField(firstByte);
            }
            else
            {
                // scan this field
                int    startOffset            = headerBuffer.CurrentOffset - 1;         // Note we have already read one byte
                string decapitalizedFieldName = headerBuffer.ReadFieldName(firstByte);
                ScanHeaderFieldValue(headerBuffer, decapitalizedFieldName, startOffset);
                emptyLine = false;
            }

            return(emptyLine);
        }