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); }
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); }