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; } }
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; } }
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); }