Revert "Revert "Merge branch 'master' of https://github.com/mono/mono""
[mono.git] / mcs / class / System / System.Net / HttpWebResponse.cs
index c5b59ced55fdd9c3bf131be5d56cddbc2bbdd642..79e61a436249dc4f6653567b75d6080e397f4c72 100644 (file)
@@ -43,12 +43,8 @@ using System.Text;
 
 namespace System.Net 
 {
-#if MOONLIGHT
-       internal class HttpWebResponse : WebResponse, ISerializable, IDisposable {
-#else
        [Serializable]
        public class HttpWebResponse : WebResponse, ISerializable, IDisposable {
-#endif
                Uri uri;
                WebHeaderCollection webHeaders;
                CookieCollection cookieCollection;
@@ -159,6 +155,9 @@ namespace System.Net
                        }
                }
                
+#if NET_4_5
+               virtual
+#endif
                public CookieCollection Cookies {
                        get {
                                CheckDisposed ();
@@ -203,6 +202,9 @@ namespace System.Net
                        }
                }
                
+#if NET_4_5
+               virtual
+#endif
                public string Method {
                        get {
                                CheckDisposed ();
@@ -231,12 +233,18 @@ namespace System.Net
                        }
                }
                
+#if NET_4_5
+               virtual
+#endif
                public HttpStatusCode StatusCode {
                        get {
                                return statusCode; 
                        }
                }
                
+#if NET_4_5
+               virtual
+#endif
                public string StatusDescription {
                        get {
                                CheckDisposed ();
@@ -269,7 +277,7 @@ namespace System.Net
                        CheckDisposed ();
                        if (stream == null)
                                return Stream.Null;  
-                       if (0 == String.Compare (method, "HEAD", true)) // see par 4.3 & 9.4
+                       if (string.Equals (method, "HEAD", StringComparison.OrdinalIgnoreCase))  // see par 4.3 & 9.4
                                return Stream.Null;  
 
                        return stream;
@@ -311,15 +319,22 @@ namespace System.Net
                void IDisposable.Dispose ()
                {
                        Dispose (true);
-                       GC.SuppressFinalize (this);  
                }
-
+               
+#if NET_4_0
+               protected override void Dispose (bool disposing)
+               {
+                       this.disposed = true;
+                       base.Dispose (true);
+               }
+#else
                void Dispose (bool disposing) 
                {
                        this.disposed = true;
                        if (disposing)
                                Close ();
                }
+#endif
                
                private void CheckDisposed () 
                {
@@ -332,36 +347,50 @@ namespace System.Net
                        if (webHeaders == null)
                                return;
 
-                       string value = webHeaders.Get ("Set-Cookie");
-                       if (value != null) {
-                               SetCookie (value);
+                       //
+                       // Don't terminate response reading on bad cookie value
+                       //
+                       string value;
+                       try {
+                               value = webHeaders.Get ("Set-Cookie");
+                               if (value != null && SetCookie (value))
+                                       return;
+                       } catch {
                        }
 
-                       value = webHeaders.Get ("Set-Cookie2");
-                       if (value != null) {
-                               SetCookie (value);
+                       try {
+                               value = webHeaders.Get ("Set-Cookie2");
+                               if (value != null)
+                                       SetCookie (value);
+                       } catch {
                        }
                }
 
-               void SetCookie (string header)
+               bool SetCookie (string header)
                {
                        if (cookieCollection == null)
                                cookieCollection = new CookieCollection ();
 
+                       bool at_least_one_set = false;
                        var parser = new CookieParser (header);
                        foreach (var cookie in parser.Parse ()) {
                                if (cookie.Domain == "") {
                                        cookie.Domain = uri.Host;
-                                       cookie.ExactDomain = true;
+                                       cookie.HasDomain = false;
                                }
 
-                               if (!CookieContainer.CheckSameOrigin (uri, cookie.Domain))
+                               if (cookie.HasDomain &&
+                                   !CookieContainer.CheckSameOrigin (uri, cookie.Domain))
                                        continue;
 
                                cookieCollection.Add (cookie);
-                               if (cookie_container != null)
+                               if (cookie_container != null) {
                                        cookie_container.Add (uri, cookie);
+                                       at_least_one_set = true;
+                               }
                        }
+
+                       return at_least_one_set;
                }
        }       
 }