diff --git a/src/ADAL.Common/HttpWebRequestWrapper.cs b/src/ADAL.Common/HttpWebRequestWrapper.cs index edd58f0f5..eb86236f9 100644 --- a/src/ADAL.Common/HttpWebRequestWrapper.cs +++ b/src/ADAL.Common/HttpWebRequestWrapper.cs @@ -16,6 +16,7 @@ // limitations under the License. //---------------------------------------------------------------------- +using System; using System.IO; using System.Net; using System.Threading.Tasks; @@ -26,6 +27,8 @@ internal class HttpWebRequestWrapper : IHttpWebRequest { private readonly HttpWebRequest request; + private int timeoutInMilliSeconds = 30000; + public HttpWebRequestWrapper(string uri) { this.request = (HttpWebRequest)WebRequest.Create(uri); @@ -73,6 +76,14 @@ public WebHeaderCollection Headers } } + public int TimeoutInMilliSeconds + { + set + { + this.timeoutInMilliSeconds = value; + } + } + public async Task GetResponseSyncOrAsync(CallState callState) { if (this.BodyParameters != null) @@ -86,10 +97,42 @@ public async Task GetResponseSyncOrAsync(CallState callState) #if ADAL_NET if (callState != null && callState.CallSync) { + this.request.Timeout = this.timeoutInMilliSeconds; return NetworkPlugin.HttpWebRequestFactory.CreateResponse(this.request.GetResponse()); } + + Task getResponseTask = this.request.GetResponseAsync(); + System.Threading.ThreadPool.RegisterWaitForSingleObject( + ((IAsyncResult)getResponseTask).AsyncWaitHandle, + delegate (object state, bool timedOut) + { + if (timedOut) + { + ((HttpWebRequest)state).Abort(); + } + }, + this.request, + this.timeoutInMilliSeconds, + true); + + return NetworkPlugin.HttpWebRequestFactory.CreateResponse(await getResponseTask); +#else + var timer = Windows.System.Threading.ThreadPoolTimer.CreateTimer( + delegate + { + this.request.Abort(); + }, + TimeSpan.FromMilliseconds(this.timeoutInMilliSeconds)); + + try + { + return NetworkPlugin.HttpWebRequestFactory.CreateResponse(await this.request.GetResponseAsync()); + } + finally + { + timer.Cancel(); + } #endif - return NetworkPlugin.HttpWebRequestFactory.CreateResponse(await this.request.GetResponseAsync()); } public async Task GetRequestStreamSyncOrAsync(CallState callState) diff --git a/tests/Test.ADAL.NET.Unit/Test.ADAL.NET.Unit.csproj b/tests/Test.ADAL.NET.Unit/Test.ADAL.NET.Unit.csproj index 7c53c0eeb..c01943078 100644 --- a/tests/Test.ADAL.NET.Unit/Test.ADAL.NET.Unit.csproj +++ b/tests/Test.ADAL.NET.Unit/Test.ADAL.NET.Unit.csproj @@ -17,6 +17,8 @@ False UnitTest TEST_ADAL_NET + ..\..\ + true true @@ -45,7 +47,23 @@ true + + False + ..\..\packages\Microsoft.Owin.2.1.0\lib\net45\Microsoft.Owin.dll + + + False + ..\..\packages\Microsoft.Owin.Host.HttpListener.2.1.0\lib\net45\Microsoft.Owin.Host.HttpListener.dll + + + False + ..\..\packages\Microsoft.Owin.Hosting.2.1.0\lib\net45\Microsoft.Owin.Hosting.dll + + + False + ..\..\packages\Owin.1.0\lib\net40\Owin.dll + @@ -137,6 +155,7 @@ valid_cert2.pfx PreserveNewest + @@ -158,6 +177,13 @@ + + + + This project references NuGet package(s) that are missing on this computer. Enable NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}. + + +