Ensure success status code in HttpClient.Get*Async().
authorMartin Baulig <martin.baulig@gmail.com>
Mon, 16 Jul 2012 22:33:01 +0000 (00:33 +0200)
committerMartin Baulig <martin.baulig@gmail.com>
Mon, 16 Jul 2012 22:33:01 +0000 (00:33 +0200)
* HttpClient.cs: GetByteArrayAsync(), GetStreamAsync() and GetStringAsync()
  must check for a success status code.
* HttpClientHandler.cs: Always set HttpWebRequest.AllowAutoRedirect; its default
  value is true.
* HttpClientTest.cs: Add new tests for this.

mcs/class/System.Net.Http/System.Net.Http/HttpClient.cs
mcs/class/System.Net.Http/System.Net.Http/HttpClientHandler.cs
mcs/class/System.Net.Http/Test/System.Net.Http/HttpClientTest.cs

index 57f555528668ee2893d00cb7e9832809b5d72cec..7f77b85072d1c2d2501b3064ee84017fa56029cd 100644 (file)
@@ -297,36 +297,42 @@ namespace System.Net.Http
                public async Task<byte[]> GetByteArrayAsync (string requestUri)
                {
                        var resp = await GetAsync (requestUri, HttpCompletionOption.ResponseContentRead).ConfigureAwait (false);
+                       resp.EnsureSuccessStatusCode ();
                        return await resp.Content.ReadAsByteArrayAsync ().ConfigureAwait (false);
                }
 
                public async Task<byte[]> GetByteArrayAsync (Uri requestUri)
                {
                        var resp = await GetAsync (requestUri, HttpCompletionOption.ResponseContentRead).ConfigureAwait (false);
+                       resp.EnsureSuccessStatusCode ();
                        return await resp.Content.ReadAsByteArrayAsync ().ConfigureAwait (false);
                }
 
                public async Task<Stream> GetStreamAsync (string requestUri)
                {
                        var resp = await GetAsync (requestUri, HttpCompletionOption.ResponseContentRead).ConfigureAwait (false);
+                       resp.EnsureSuccessStatusCode ();
                        return await resp.Content.ReadAsStreamAsync ().ConfigureAwait (false);
                }
 
                public async Task<Stream> GetStreamAsync (Uri requestUri)
                {
                        var resp = await GetAsync (requestUri, HttpCompletionOption.ResponseContentRead).ConfigureAwait (false);
+                       resp.EnsureSuccessStatusCode ();
                        return await resp.Content.ReadAsStreamAsync ().ConfigureAwait (false);
                }
 
                public async Task<string> GetStringAsync (string requestUri)
                {
                        var resp = await GetAsync (requestUri, HttpCompletionOption.ResponseContentRead).ConfigureAwait (false);
+                       resp.EnsureSuccessStatusCode ();
                        return await resp.Content.ReadAsStringAsync ().ConfigureAwait (false);
                }
 
                public async Task<string> GetStringAsync (Uri requestUri)
                {
                        var resp = await GetAsync (requestUri, HttpCompletionOption.ResponseContentRead).ConfigureAwait (false);
+                       resp.EnsureSuccessStatusCode ();
                        return await resp.Content.ReadAsStringAsync ().ConfigureAwait (false);
                }
        }
index 3e23d15f9edca96b0c2d77c89e58479ea06efa48..0aac77805f4db1419a9cdafb366974065bcc10b6 100644 (file)
@@ -218,6 +218,8 @@ namespace System.Net.Http
                        if (allowAutoRedirect) {
                                wr.AllowAutoRedirect = true;
                                wr.MaximumAutomaticRedirections = maxAutomaticRedirections;
+                       } else {
+                               wr.AllowAutoRedirect = false;
                        }
 
                        wr.AutomaticDecompression = automaticDecompression;
index 819c797be612966766a5de64c44b0a89fae97b5f..8334289ed001cf691ae57f879fc6d170f1532e0a 100644 (file)
@@ -664,6 +664,56 @@ namespace MonoTests.System.Net.Http
                        Assert.That (client.GetStringAsync ("Computer").Result != null);
                }
 
+               [Test]
+               public void GetByteArray_ServerError ()
+               {
+                       var listener = CreateListener (l => {
+                               var response = l.Response;
+                               response.StatusCode = 500;
+                               l.Response.OutputStream.WriteByte (72);
+                       });
+
+                       try {
+                               var client = new HttpClient ();
+                               try {
+                                       client.GetByteArrayAsync (LocalServer).Wait ();
+                                       Assert.Fail ("#1");
+                               } catch (AggregateException e) {
+                                       Assert.IsInstanceOfType (typeof (HttpRequestException), e.InnerException, "#2");
+                               }
+                       } finally {
+                               listener.Close ();
+                       }
+               }
+
+               [Test]
+               public void DisallowAutoRedirect ()
+               {
+                       var listener = CreateListener (l => {
+                               var request = l.Request;
+                               var response = l.Response;
+                               
+                               response.StatusCode = (int)HttpStatusCode.Moved;
+                               response.RedirectLocation = "http://xamarin.com/";
+                       });
+
+                       try {
+                               var chandler = new HttpClientHandler ();
+                               chandler.AllowAutoRedirect = false;
+                               var client = new HttpClient (chandler);
+
+                               try {
+                                       client.GetStringAsync (LocalServer).Wait ();
+                                       Assert.Fail ("#1");
+                               } catch (AggregateException e) {
+                                       Assert.IsInstanceOfType (typeof (HttpRequestException), e.InnerException, "#2");
+                               }
+                       } finally {
+                               listener.Abort ();
+                               listener.Close ();
+                       }
+               }
+
                HttpListener CreateListener (Action<HttpListenerContext> contextAssert)
                {
                        var l = new HttpListener ();