private HttpWebRequest CreateWebRequest(string Url, string Request, CredentialHandler CredentialHandler = null)
        {
            // Return a web request for the given URL
            HttpWebRequest oReq = (HttpWebRequest)WebRequest.Create(Url);

            if (!(CredentialHandler == null))
            {
                CredentialHandler.ApplyCredentialsToHttpWebRequest(oReq);
            }
            oReq.AllowAutoRedirect = false;
            oReq.Method            = "POST";
            UTF8Encoding encoding = new UTF8Encoding();

            byte[] bRequest = encoding.GetBytes(Request);
            oReq.ContentType   = "text/xml; charset=utf-8";
            oReq.ContentLength = bRequest.Length;
            Stream oReqStream = oReq.GetRequestStream();

            oReqStream.Write(bRequest, 0, bRequest.Length);
            oReqStream.Close();
            oReq.Headers.Add("charset", "utf-8");

            if (_logger != null)
            {
                LogHeaders(oReq.Headers, "AutodiscoverRequestHeaders", Url);
                _logger.Log(Request, "AutodiscoverRequest");
            }

            return(oReq);
        }
Esempio n. 2
0
        public string SendRequest(string sRequest, out string sError, CookieCollection oCookies = null)
        {
            // Send the request and return the response
            _requestName = ClassLogger.ReadMethodFromRequest(sRequest);
            sError       = "";

            if (String.IsNullOrEmpty(_targetURL))
            {
                sError = "No target server specified";
                return("");
            }

            string sResponse = "";
            SecurityProtocolType currentSecurityProtocol = ServicePointManager.SecurityProtocol;

            ServicePointManager.SecurityProtocol = _securityProtocol;
            HttpWebRequest oWebRequest = null;

            try
            {
                oWebRequest = (HttpWebRequest)WebRequest.Create(_targetURL);
            }
            catch (Exception ex)
            {
                sError = ex.Message;
                return("");
            }
            oWebRequest.UserAgent = String.Format("{1}/{0}", Application.ProductVersion, Application.ProductName);
            if (_bypassWebProxy)
            {
                oWebRequest.Proxy = null;
            }

            // Set authentication
            _credentialHandler.ApplyCredentialsToHttpWebRequest(oWebRequest);
            _credentialHandler.LogCredentials(_logger);

            oWebRequest.ContentType = "text/xml;charset=\"utf-8\"";
            oWebRequest.Accept      = "text/xml";
            if (_httpHeaders.Count > 0)
            {
                foreach (string[] header in _httpHeaders)
                {
                    try
                    {
                        switch (header[0].ToLower())
                        {
                        case "user-agent":
                            oWebRequest.UserAgent = header[1];
                            break;

                        case "content-type":
                            oWebRequest.ContentType = header[1];
                            break;

                        case "accept":
                            oWebRequest.Accept = header[1];
                            break;

                        default:
                            oWebRequest.Headers[header[0]] = header[1];
                            break;
                        }
                    }
                    catch { }
                }
            }

            // We add a client-request-id header so that we can easily match request/response
            string clientRequestId = oWebRequest.Headers.Get("client-request-id");

            if (String.IsNullOrEmpty(clientRequestId))
            {
                clientRequestId = Guid.NewGuid().ToString();
                oWebRequest.Headers["client-request-id"] = clientRequestId;
            }
            StringBuilder sTimings = new StringBuilder();

            sTimings.AppendLine("Latency (latency shown in milliseconds, times are in ticks)").AppendLine();
            sTimings.AppendLine($"client-request-id: {clientRequestId}").AppendLine();

            if (String.IsNullOrEmpty(oWebRequest.Headers.Get("return-client-request-id")))
            {
                oWebRequest.Headers["return-client-request-id"] = "true";
            }

            oWebRequest.Method = "POST";
            XmlDocument oSOAPRequest = new XmlDocument();

            if (!String.IsNullOrEmpty(sRequest))
            {
                try
                {
                    oSOAPRequest.LoadXml(sRequest);
                }
                catch (Exception ex)
                {
                    sError    = ex.Message;
                    sResponse = "Request was invalid XML (not sent): " + ex.Message + "\n\r\n\r" + sRequest;
                    Log(sResponse, "Response");
                    return("");
                }
            }

            oWebRequest.CookieContainer = new CookieContainer();
            if (!(oCookies == null))
            {
                // Add cookies to the request
                foreach (Cookie oCookie in oCookies)
                {
                    try
                    {
                        oWebRequest.CookieContainer.Add(oCookie);
                    }
                    catch { }
                }
                LogCookies(oCookies, "Request Cookies");
            }

            LogSSLSettings();

            Stream stream = null;

            try
            {
                stream = oWebRequest.GetRequestStream();
            }
            catch (Exception ex)
            {
                // Failed to send request
                sError    = ex.Message;
                sResponse = "Error occurred: " + ex.Message + "\n\r\n\r";
            }

            if (stream == null)
            {
                // Failed to obtain request stream
                if (String.IsNullOrEmpty(sError))
                {
                    sError = "Failed to open connection";
                }
                if (!String.IsNullOrEmpty(sResponse))
                {
                    Log(sResponse, "Response");
                }
                return("");
            }

            DateTime requestSendStartTime = DateTime.Now;

            if (!string.IsNullOrEmpty(sRequest))
            {
                oSOAPRequest.Save(stream);
            }
            stream.Close();
            DateTime requestSendEndTime = DateTime.Now;

            LogHeaders(oWebRequest.Headers, "Request Headers", _targetURL);
            Log(oSOAPRequest.OuterXml, "Request", clientRequestId);

            oWebRequest.Expect = "";

            DateTime     responseReceiveEndTime   = DateTime.MinValue;
            DateTime     responseReceiveStartTime = DateTime.Now;
            IAsyncResult asyncResult = oWebRequest.BeginGetResponse(null, null);

            asyncResult.AsyncWaitHandle.WaitOne();

            WebResponse oWebResponse = null;

            try
            {
                oWebResponse           = oWebRequest.EndGetResponse(asyncResult);
                responseReceiveEndTime = DateTime.Now;
                _lastResponseHeaders   = oWebResponse.Headers;
                LogHeaders(oWebResponse.Headers, "Response Headers", "", (oWebResponse as HttpWebResponse));
                _responseCookies = (oWebResponse as HttpWebResponse).Cookies;
                LogCookies(_responseCookies, "Response Cookies");
            }
            catch (Exception ex)
            {
                responseReceiveEndTime = DateTime.Now;
                if (ex is WebException)
                {
                    WebException wex = ex as WebException;
                    sError = wex.Message;
                    if (!(wex.Response == null))
                    {
                        using (StreamReader oReader = new StreamReader(wex.Response.GetResponseStream()))
                        {
                            sResponse = oReader.ReadToEnd();
                        }
                        _lastResponseHeaders = wex.Response.Headers;
                        LogHeaders(wex.Response.Headers, "Response Headers", "", (wex.Response as HttpWebResponse));
                    }
                }
                else
                {
                    sError = ex.Message;
                }
            }
            try
            {
                using (StreamReader oReader = new StreamReader(oWebResponse.GetResponseStream()))
                {
                    sResponse += oReader.ReadToEnd();
                }
            }
            catch { }

            try
            {
                oWebResponse.Close();
            }
            catch { }
            Log(sResponse, "Response", clientRequestId);

            sTimings.AppendLine($"Request start: {(long)(requestSendStartTime.Ticks/10000)}");
            sTimings.AppendLine($"Request complete: {(long)(requestSendEndTime.Ticks/10000)}");
            sTimings.AppendLine($"Request latency: {(long)((requestSendEndTime.Ticks- requestSendStartTime.Ticks) / 10000)}").AppendLine();
            sTimings.AppendLine($"Response start: {(long)(responseReceiveStartTime.Ticks / 10000)}");
            sTimings.AppendLine($"Response complete: {(long)(responseReceiveEndTime.Ticks / 10000)}");
            sTimings.AppendLine($"Response latency: {(long)((responseReceiveEndTime.Ticks - responseReceiveStartTime.Ticks) / 10000)}").AppendLine();
            sTimings.AppendLine($"Total time taken (includes processing time): {(long)((responseReceiveEndTime.Ticks - requestSendStartTime.Ticks) / 10000)}");
            Log(sTimings.ToString(), "Latency Report");

            return(sResponse);
        }