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); } } } }
internal HttpWebResponse(Uri responseUri, KnownHttpVerb verb, CoreResponseData coreData, string mediaType, bool usesProxySemantics, DecompressionMethods decompressionMethod) { m_Uri = responseUri; m_Verb = verb; m_MediaType = mediaType; m_UsesProxySemantics = usesProxySemantics; m_ConnectStream = coreData.m_ConnectStream; m_HttpResponseHeaders = coreData.m_ResponseHeaders; m_ContentLength = coreData.m_ContentLength; m_StatusCode = coreData.m_StatusCode; m_StatusDescription = coreData.m_StatusDescription; m_IsVersionHttp11 = coreData.m_IsVersionHttp11; //if the returned contentlength is zero, preemptively invoke calldone on the stream. //this will wake up any pending reads. if (m_ContentLength == 0 && m_ConnectStream is ConnectStream) { ((ConnectStream)m_ConnectStream).CallDone(); } // handle Content-Location header, by combining it with the orginal request. string contentLocation = m_HttpResponseHeaders[HttpKnownHeaderNames.ContentLocation]; if (contentLocation != null) { try { m_Uri = new Uri(m_Uri, contentLocation); } catch (UriFormatException e) { GlobalLog.Assert("Exception on response Uri parsing.", e.ToString()); } } // decompress responses by hooking up a final response Stream - only if user required it if (decompressionMethod != DecompressionMethods.None) { string contentEncoding = m_HttpResponseHeaders[HttpKnownHeaderNames.ContentEncoding]; if (contentEncoding != null) { if (((decompressionMethod & DecompressionMethods.GZip) != 0) && contentEncoding.IndexOf(HttpWebRequest.GZipHeader) != -1) { m_ConnectStream = new GZipWrapperStream(m_ConnectStream, CompressionMode.Decompress); m_ContentLength = -1; // unknown on compressed streams // Setting a response header after parsing will ruin the Common Header optimization. // This seems like a corner case. ContentEncoding could be added as a common header, with a special // property allowing it to be nulled. m_HttpResponseHeaders[HttpKnownHeaderNames.ContentEncoding] = null; } else if (((decompressionMethod & DecompressionMethods.Deflate) != 0) && contentEncoding.IndexOf(HttpWebRequest.DeflateHeader) != -1) { m_ConnectStream = new DeflateWrapperStream(m_ConnectStream, CompressionMode.Decompress); m_ContentLength = -1; // unknown on compressed streams // Setting a response header after parsing will ruin the Common Header optimization. // This seems like a corner case. ContentEncoding could be added as a common header, with a special // property allowing it to be nulled. m_HttpResponseHeaders[HttpKnownHeaderNames.ContentEncoding] = null; } } } }
internal CoreResponseData Clone() { CoreResponseData cloneResponseData = new CoreResponseData(); cloneResponseData.m_StatusCode = m_StatusCode; cloneResponseData.m_StatusDescription = m_StatusDescription; cloneResponseData.m_IsVersionHttp11 = m_IsVersionHttp11; cloneResponseData.m_ContentLength = m_ContentLength; cloneResponseData.m_ResponseHeaders = m_ResponseHeaders; cloneResponseData.m_ConnectStream = m_ConnectStream; return cloneResponseData; }