Exemplo n.º 1
0
        /// <summary>
        /// Create an <see cref="HttpMessage.Response"/> object out of the response from a
        /// service.
        /// </summary>
        /// <param name="serviceBaseUri">The real service's base Uri.</param>
        /// <param name="response">The response from the service.</param>
        /// <returns>An <see cref="HttpMessage.Response"/> object containing the response.</returns>
        private static HttpMessage.Response ConstructResponseInfo(
            Uri serviceBaseUri,
            HttpWebResponse response)
        {
            HttpMessage.Response responseInfo = new HttpMessage.Response();

            // Copy the response status code
            responseInfo.StatusCode = response.StatusCode;

            // Copy all relevant headers to the response
            responseInfo.Headers = new HttpMessage.HeaderCollection();
            foreach (string headerKey in response.Headers.AllKeys)
            {
                if (!headerKey.Equals("Transfer-Encoding", StringComparison.OrdinalIgnoreCase) &&
                    !headerKey.Equals("Content-Length", StringComparison.OrdinalIgnoreCase))
                {
                    responseInfo.Headers.Add(new HttpMessage.Header()
                    {
                        Name  = headerKey,
                        Value = response.Headers[headerKey]
                    });
                }
            }

            // Copy response cookies
            responseInfo.Cookies = new HttpMessage.CookieCollection();
            foreach (Cookie cookie in response.Cookies)
            {
                Uri cookieHostUri     = new Uri(serviceBaseUri.Scheme + Uri.SchemeDelimiter + serviceBaseUri.Host);
                Uri cookieUri         = new Uri(cookieHostUri, cookie.Path);
                Uri cookieRelativeUri = serviceBaseUri.MakeRelativeUri(cookieUri);
                responseInfo.Cookies.Add(new HttpMessage.Cookie
                {
                    Name        = cookie.Name,
                    Value       = cookie.Value,
                    RelativeUri = cookieRelativeUri
                });
            }

            // Copy response stream
            using (StreamReader reader = new StreamReader(response.GetResponseStream()))
            {
                responseInfo.ResponseText = reader.ReadToEnd();
            }

            return(responseInfo);
        }
Exemplo n.º 2
0
        /// <summary>
        /// Constructs the response from the specified <see cref="HttpMessage.Response"/>.
        /// </summary>
        /// <param name="responseInfo">The object that contains all info about the response.</param>
        /// <param name="baseUri">The base Uri for the response.</param>
        /// <param name="response">The response object to construct.</param>
        private static void ConstructListenerResponse(
            HttpMessage.Response responseInfo,
            Uri baseUri,
            HttpListenerResponse response)
        {
            // Set the status code
            response.StatusCode = (int)responseInfo.StatusCode;

            // Copy relevant response headers
            foreach (HttpMessage.Header header in responseInfo.Headers)
            {
                response.Headers[header.Name] = header.Value;
            }

            // Copy response cookies
            foreach (HttpMessage.Cookie responseCookie in responseInfo.Cookies)
            {
                Cookie cookie    = new Cookie(responseCookie.Name, responseCookie.Value);
                Uri    cookieUri = responseCookie.RelativeUri;
                if (!cookieUri.IsAbsoluteUri)
                {
                    cookieUri = new Uri(baseUri, cookieUri);
                }

                cookie.Domain = cookieUri.Host;
                cookie.Path   = cookieUri.LocalPath;
                response.Cookies.Add(cookie);
            }

            // Copy response stream
            byte[] responseBytes = Encoding.UTF8.GetBytes(responseInfo.ResponseText);
            response.ContentLength64 = responseBytes.Length;
            using (BinaryWriter writer = new BinaryWriter(response.OutputStream))
            {
                writer.Write(responseBytes);
            }
        }