diff --git a/dotnet/src/dotnetframework/GxClasses/Domain/GxHttpClient.cs b/dotnet/src/dotnetframework/GxClasses/Domain/GxHttpClient.cs index 547e0e1f8..e361d5770 100644 --- a/dotnet/src/dotnetframework/GxClasses/Domain/GxHttpClient.cs +++ b/dotnet/src/dotnetframework/GxClasses/Domain/GxHttpClient.cs @@ -356,12 +356,25 @@ void buildUrl() sHost = sHost.Substring(0, sHost.Length - 1); } sBaseUrl = _baseUrl; - if (!string.IsNullOrEmpty(sBaseUrl) && sBaseUrl.StartsWith("/")) - sBaseUrl = sBaseUrl.Substring(1, sBaseUrl.Length - 1); - _url = _scheme + sHost + sPort + "/" + sBaseUrl; + if (IsAbsolute(sBaseUrl)) + { + _url = sBaseUrl; + } + else + { + if (!string.IsNullOrEmpty(sBaseUrl) && sBaseUrl.StartsWith("/")) + sBaseUrl = sBaseUrl.Substring(1, sBaseUrl.Length - 1); + + _url = _scheme + sHost + sPort + "/" + sBaseUrl; + } if (_url.EndsWith("/")) _url = _url.Substring(0, _url.Length - 1); } + bool IsAbsolute(string url) + { + return Uri.IsWellFormedUriString(url, UriKind.Absolute); + } + public void ClearHeaders() { _headers.Clear(); @@ -744,10 +757,17 @@ bool UseOldHttpClient(string name) return true; #if !NETCORE - string requestUrl = GetRequestURL(name); - Uri uri = new Uri(requestUrl); - if (!uri.IsDefaultPort) - return true; + try + { + string requestUrl = GetRequestURL(name); + Uri uri = new Uri(requestUrl); + if (!uri.IsDefaultPort) + return true; + } + catch (Exception e) + { + GXLogging.Warn(log, "UseOldHttpClient", e); + } #endif return false; } @@ -756,6 +776,7 @@ public void Execute(string method, string name) { if (UseOldHttpClient(name)) { + GXLogging.Debug(log, "Using legacy GxHttpClient"); WebExecute(method, name); } else @@ -1019,10 +1040,17 @@ public string GetRequestURL(string name) return name; else { - if (!string.IsNullOrEmpty(name) && name.IndexOf('/') == 0) - return _url + name; + if (IsAbsolute(name)) + { + return name; + } else - return _url + "/" + name; + { + if (!string.IsNullOrEmpty(name) && name.IndexOf('/') == 0) + return _url + name; + else + return _url + "/" + name; + } } } #if !NETCORE @@ -1188,6 +1216,13 @@ private void WebExecute(string method, string name) } } #endif + catch (Exception e) + { + GXLogging.Warn(log, "Error Execute", e); + _errCode = 1; + _errDescription = e.Message; + } + _receiveData = Array.Empty(); if (resp != null) diff --git a/dotnet/test/DotNetCoreUnitTest/HttpClient/StreamHandling.cs b/dotnet/test/DotNetCoreUnitTest/HttpClient/StreamHandling.cs index cf1db2e0f..7e65acf61 100644 --- a/dotnet/test/DotNetCoreUnitTest/HttpClient/StreamHandling.cs +++ b/dotnet/test/DotNetCoreUnitTest/HttpClient/StreamHandling.cs @@ -31,8 +31,50 @@ public void CreateHttpClient() Assert.True(client.ToString().Length > 0); } + } + [Fact] + public void HttpClientAbsoluteURLOnExecute() + { + using (GxHttpClient client = new GxHttpClient()) + { + string url = "https://www.google.com/"; + client.Port = 80; + client.Execute("GET", url); + string requestUrl = client.GetRequestURL(url); + Assert.Equal(client.StatusCode, (short)System.Net.HttpStatusCode.OK); + Assert.True(Uri.IsWellFormedUriString(requestUrl, UriKind.Absolute), "GetRequestURL is an invalid url which will cause Invalid URI at execute"); + + } + } + [Fact] + public void HttpClientRelativeURLOnExecute_1() + { + using (GxHttpClient client = new GxHttpClient()) + { + string url = "imghp"; + client.Port = 80; + client.BaseURL = "https://www.google.com/"; + client.Execute("GET", url); + string requestUrl = client.GetRequestURL(url); + Assert.Equal(client.StatusCode, (short)System.Net.HttpStatusCode.OK); + Assert.True(Uri.IsWellFormedUriString(requestUrl, UriKind.Absolute), "GetRequestURL is an invalid url which will cause Invalid URI at execute"); + } + } + [Fact] + public void HttpClientRelativeURLOnExecute_2() + { + using (GxHttpClient client = new GxHttpClient()) + { + string url = "/imghp"; + client.Port = 80; + client.BaseURL = "https://www.google.com"; + client.Execute("GET", url); + string requestUrl = client.GetRequestURL(url); + Assert.Equal(client.StatusCode, (short)System.Net.HttpStatusCode.OK); + Assert.True(Uri.IsWellFormedUriString(requestUrl, UriKind.Absolute), "GetRequestURL is an invalid url which will cause Invalid URI at execute"); + } } } }