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 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 override void ScanHeaderFieldValue(HeaderBuffer headerBuffer, string decapitalizedFieldName, int startOffset) { switch (decapitalizedFieldName) { case "content-length": case "transfer-encoding": // Do not parse these header fields in response of HEAD method // otherwise it will be blocked to try to read body stream after this. if (this.Request?.Method != "HEAD") { base.ScanHeaderFieldValue(headerBuffer, decapitalizedFieldName, startOffset); } break; case "connection": // ToDo: exact parsing string value = headerBuffer.ReadFieldASCIIValue(false); if (value.Contains("close")) { this.KeepAliveEnabled = false; } else if (value.Contains("keep-alive")) { this.KeepAliveEnabled = true; } break; case "proxy-authenticate": // save its span and value this.ProxyAuthenticateValue = headerBuffer.ReadFieldASCIIValue(false); this.ProxyAuthenticateSpan = new Span(startOffset, headerBuffer.CurrentOffset); break; default: base.ScanHeaderFieldValue(headerBuffer, decapitalizedFieldName, startOffset); break; } }