public CoreResponseData(StatusLineValues values, HttpResponseHeaders headers,Stream connectStream) { this.StatusCode = (HttpStatusCode)values.StatusCode; this.StatusDescription = values.StatusDescription; this.ContentLength = values.ContentLength; if (values.MajorVersion == 1 && values.MinorVersion == 1) { this.HttpVersion = HttpVersion.HTTP11; } else if (values.MajorVersion == 2 && values.MinorVersion == 0) { this.HttpVersion = HttpVersion.HTTP20; } this.ResponseHeaders = headers; this.ConnectStream = connectStream; }
internal HttpResponse(Uri responseUri, HttpMethod method, CoreResponseData coreData, DecompressionMethods decompressionMethod) { _uri = responseUri; _method = method; _coreResponseData = coreData; _connectStream = coreData.ConnectStream; _headers = coreData.ResponseHeaders; _statusCode = coreData.StatusCode; _contentLength = coreData.ContentLength; _statusDescription = coreData.StatusDescription; _version = coreData.HttpVersion; //if (this.m_ContentLength == 0L && this.m_ConnectStream is ConnectStream) //{ // ((ConnectStream)this.m_ConnectStream).CallDone(); //} var text = _headers[HttpHeaderNames.ContentLocation]; if (text != null) { try { Uri uri; if (Uri.TryCreate(_uri, text, out uri)) { _uri = uri; } } catch { } } if (decompressionMethod != DecompressionMethods.None) { if ((text = _headers[HttpHeaderNames.ContentEncoding]) != null) { if ((decompressionMethod & DecompressionMethods.GZip) == DecompressionMethods.GZip && text.IndexOf(HttpRequest.GZipHeader, 0, StringComparison.OrdinalIgnoreCase) >= 0) { _connectStream = new GZipStream(_connectStream, CompressionMode.Decompress); _contentLength = -1L; _headers.SetInternal(HttpHeaderNames.TransferEncoding, null); } else if ((decompressionMethod & DecompressionMethods.Deflate) == DecompressionMethods.Deflate && text.IndexOf(HttpRequest.DeflateHeader, 0, StringComparison.OrdinalIgnoreCase) >= 0) { _connectStream = new DeflateStream(_connectStream, CompressionMode.Decompress); _contentLength = -1L; _headers.SetInternal(HttpHeaderNames.TransferEncoding, null); } } } }
private DataParseStatus ParseResponseData(ArraySegment<byte> data, ref int bytesScanned, ref bool requestDone) { var result = DataParseStatus.NeedMoreData; requestDone = false; switch (_readState) { case ReadState.Start: { _readState = ReadState.StatusLine; _statusState = BeforeVersionNumbers; _totalResponseHeadersLength = 0; _statusLineValues = new StatusLineValues() { MajorVersion = 0, MinorVersion = 0, StatusCode = 0, StatusDescription = "" }; goto case ReadState.StatusLine; } case ReadState.StatusLine: { var parseStatus = this.ParseStatusLine(data, ref bytesScanned); if (parseStatus == DataParseStatus.Done) { _readState = ReadState.Headers; _responseHeaders = new HttpResponseHeaders(); goto case ReadState.Headers; } else if (parseStatus != DataParseStatus.NeedMoreData) { result = parseStatus; break; } break; } case ReadState.Headers: { if (bytesScanned >= data.Count) { //need more data break; } var parseStatus = _responseHeaders.ParseHeaders(data, ref bytesScanned, ref _totalResponseHeadersLength, _maximumResponseHeadersLength); if (parseStatus == DataParseStatus.Invalid || parseStatus == DataParseStatus.DataTooBig) { result = parseStatus; break; } else if (parseStatus == DataParseStatus.Done) { //if StatusCode is BadRequest or Continue goto case ReadState.Data; } break; } case ReadState.Data: { requestDone = true; result = DataParseStatus.Done; break; } } return result; }