public Stream IssueRequest(string url, Method method, string body, HttpHeader[] headers)
        {
            if ( _exceptionToThrow != null )
                throw _exceptionToThrow;

            if (!string.IsNullOrEmpty(_validUrl) && !_validUrl.Equals(url))
                throw new Exception("Invalid URL used");

            if (_method != method)
            {
                string msg = string.Format("Invalid Method: {0}", method.Name);
                throw new Exception(msg);
            }

            return _response;
        }
 /// <summary>
 /// Issue a requet to the networking implementation
 /// </summary>
 /// <param name="url">The URL to request</param>
 /// <param name="method">The HTTP method to use</param>
 /// <param name="body">The request body to send</param>
 /// <param name="headers">Optional headers to add to the request</param>
 /// <returns>The response body</returns>
 public Stream IssueRequest(string url, Method method, string body, HttpHeader[] headers)
 {
     return _requestor.IssueRequest(url, method, body, headers);
 }
 /// <summary>
 /// Issue a requet to the networking implementation
 /// </summary>
 /// <param name="url">The URL to request</param>
 /// <param name="method">The HTTP method to use</param>
 /// <param name="body">The request body to send</param>
 /// <param name="headers">Optional headers to add to the request</param>
 /// <returns>void</returns>
 public void IssueRequestIgnoreResponse(
     string url,
     Method method,
     string body,
     HttpHeader[] headers)
 {
     _requestor.IssueRequest(url, method, body, headers).Close();
 }
        /// <summary>
        /// Issue a request to the URL and return the response
        /// </summary>
        /// <param name="url">The URL to make a request to</param>
        /// <param name="method">The HTTP verb to use</param>
        /// <param name="body">The request body to use</param>
        /// <param name="headers">Optional headers to add to the request</param>
        /// <returns>The response body</returns>
        public Stream IssueRequest(string url, Method method, string body, HttpHeader[] headers)
        {
            int remainingAttempts = maxRedirects;

            while (remainingAttempts > 0)
            {
                log.DebugFormat(
                    "Issuing WebDAV Request: {0} to {1} - Group {2}",
                    method.Name, url, connectionGroup);

                HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(url);

                // Handle redirects manually
                request.AllowAutoRedirect = false;
                request.KeepAlive = true;

                // This is necesssary to make Windows Authentication
                // use keep alive. Due to the large number of
                // connections we may make to Exchange, if we don't do this,
                // the process may exhaust the supply of available ports. To keep
                // this "safe", requests are isolated by connection pool. See:
                // http://msdn2.microsoft.com/en-us/library/system.net.httpwebrequest.unsafeauthenticatedconnectionsharing.aspx
                request.UnsafeAuthenticatedConnectionSharing = true;
                request.ConnectionGroupName = connectionGroup;


                // BUG: Exchange sometimes serves different content based on the user agent so
                // we have to fake being IE?!?!?!
                request.UserAgent =
                    "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; SV1; .NET CLR 2.0.50727)";

                request.Credentials = credentials;
                request.Method = method.Name;
                request.Accept = "*/*";
                if (headers != null)
                {
                    foreach (HttpHeader httpHeader in headers)
                    {
                        request.Headers.Add(httpHeader.Name, httpHeader.Value);
                    }
                }

                // Set request body if t here is one
                if (!string.IsNullOrEmpty(body))
                {
                    byte[] bodyBytes = Encoding.UTF8.GetBytes(body);

                    request.ContentType = "text/xml";

                    using (Stream writer = request.GetRequestStream())
                    {
                        writer.Write(bodyBytes, 0, bodyBytes.Length);
                        writer.Close();
                    }
                }

                HttpWebResponse response = (HttpWebResponse)request.GetResponse();
                switch (response.StatusCode)
                {
                    case HttpStatusCode.Found:
                    case HttpStatusCode.Moved:
                    case HttpStatusCode.RedirectKeepVerb:
                    case HttpStatusCode.RedirectMethod:
                        url = response.GetResponseHeader("Location");

                        if (response.GetResponseStream() != null)
                            response.GetResponseStream().Close();
                        response.Close();

                        if (!string.IsNullOrEmpty(ConfigCache.ExchangeDefaultDomain))
                        {
                            // If a default domain is provided, don't redirect outside it
                            Uri uri = new Uri(url);
                            if (!uri.Host.EndsWith(ConfigCache.ExchangeDefaultDomain))
                            {
                                throw new WebException("Cannot redirect outside the default domain");
                            }
                        }

                        log.DebugFormat(
                            "Redirect: {0} to {1} status {2}",
                            method, url, response.StatusCode);

                        // Preserve the credentials and verb though all types
                        // of redirects for WebDAV
                        remainingAttempts--;
                        break;

                    default:
                        return response.GetResponseStream();
                }
            }

            return new MemoryStream();
        }