Browse Source

2008-02-17 Daniel Nauck <[email protected]>

	* HttpWebResponse.cs: refactored cookie expires parsing to
	allow all common expires datetime formats.


svn path=/trunk/mcs/; revision=95967
Daniel Nauck 18 years ago
parent
commit
8f6285d8e3
2 changed files with 38 additions and 21 deletions
  1. 5 0
      mcs/class/System/System.Net/ChangeLog
  2. 33 21
      mcs/class/System/System.Net/HttpWebResponse.cs

+ 5 - 0
mcs/class/System/System.Net/ChangeLog

@@ -1,3 +1,8 @@
+2008-02-17  Daniel Nauck  <[email protected]>
+
+	* HttpWebResponse.cs: refactored cookie expires parsing to
+	allow all common expires datetime formats.
+
 2008-02-09  Daniel Nauck  <[email protected]>
 
 	* HttpWebResponse.cs: convert UTC/GMT Expires DateTime from a cookie

+ 33 - 21
mcs/class/System/System.Net/HttpWebResponse.cs

@@ -8,6 +8,7 @@
 //
 // (c) 2002 Lawrence Pit
 // (c) 2003 Ximian, Inc. (http://www.ximian.com)
+// (c) 2008 Daniel Nauck
 //
 
 //
@@ -413,27 +414,7 @@ namespace System.Net
 					if (cookie.Expires != DateTime.MinValue)
 						break;
 
-					//If no Expires is set, use cookie as session cookie (expires is DateTime.MinValue)
-					DateTime cookieExpiresUtc = DateTime.MinValue;
-					try {
-						cookieExpiresUtc = DateTime.ParseExact (val, "r", CultureInfo.InvariantCulture);
-					} catch {
-						try { 
-						cookieExpiresUtc = DateTime.ParseExact (val,
-								"ddd, dd'-'MMM'-'yyyy HH':'mm':'ss 'GMT'",
-								CultureInfo.InvariantCulture);
-						} catch {}
-					}
-
-					//convert UTC/GMT time to local time
-#if NET_2_0
-					cookieExpiresUtc = DateTime.SpecifyKind (cookieExpiresUtc, DateTimeKind.Utc);
-					cookie.Expires = TimeZone.CurrentTimeZone.ToLocalTime (cookieExpiresUtc);
-#else
-					//DateTime.Kind is only available on .NET 2.0, so do some calculation
-					TimeSpan localOffset = TimeZone.CurrentTimeZone.GetUtcOffset (cookieExpiresUtc.Date);
-					cookie.Expires = cookieExpiresUtc.Add (localOffset);
-#endif
+					cookie.Expires = TryParseCookieExpires (val);
 					break;
 				case "PATH":
 					cookie.Path = val;
@@ -471,6 +452,37 @@ namespace System.Net
 			foreach (string cookie_str in cookies)
 				SetCookie (cookie_str);
 		}
+
+		string[] cookieExpiresFormats =
+			new string[] { "r",
+					"ddd, dd'-'MMM'-'yyyy HH':'mm':'ss 'GMT'",
+					"ddd, dd'-'MMM'-'yy HH':'mm':'ss 'GMT'" };
+
+		DateTime TryParseCookieExpires (string value)
+		{
+			if (value == null || value.Length == 0)
+				return DateTime.MinValue;
+
+			for (int i = 0; i <= cookieExpiresFormats.Length; i++)
+			{
+				try {
+					DateTime cookieExpiresUtc = DateTime.ParseExact (value, cookieExpiresFormats [i], CultureInfo.InvariantCulture);
+
+					//convert UTC/GMT time to local time
+#if NET_2_0
+					cookieExpiresUtc = DateTime.SpecifyKind (cookieExpiresUtc, DateTimeKind.Utc);
+					return TimeZone.CurrentTimeZone.ToLocalTime (cookieExpiresUtc);
+#else
+					//DateTime.Kind is only available on .NET 2.0, so do some calculation
+					TimeSpan localOffset = TimeZone.CurrentTimeZone.GetUtcOffset (cookieExpiresUtc.Date);
+					return cookieExpiresUtc.Add (localOffset);
+#endif
+				} catch {}
+			}
+
+			//If we can't parse Expires, use cookie as session cookie (expires is DateTime.MinValue)
+			return DateTime.MinValue;
+		}
 	}	
 
 	class CookieParser {