Fixed handling cookies in different system languages.

fixes #896... hopefully
pull/2/head
Taloth Saldono 9 years ago
parent d37b24cd0b
commit aac4938598

@ -1,17 +1,19 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Globalization;
using System.IO; using System.IO;
using System.Net; using System.Net;
using System.Threading;
using FluentAssertions; using FluentAssertions;
using Moq;
using NLog;
using NUnit.Framework; using NUnit.Framework;
using NzbDrone.Common.Cache; using NzbDrone.Common.Cache;
using NzbDrone.Common.Http; using NzbDrone.Common.Http;
using NzbDrone.Common.Http.Dispatchers;
using NzbDrone.Common.TPL;
using NzbDrone.Test.Common; using NzbDrone.Test.Common;
using NzbDrone.Test.Common.Categories; using NzbDrone.Test.Common.Categories;
using NLog;
using NzbDrone.Common.TPL;
using Moq;
using NzbDrone.Common.Http.Dispatchers;
namespace NzbDrone.Common.Test.Http namespace NzbDrone.Common.Test.Http
{ {
@ -309,30 +311,43 @@ namespace NzbDrone.Common.Test.Http
.Verify(v => v.PostResponse(It.IsAny<HttpResponse>()), Times.Once()); .Verify(v => v.PostResponse(It.IsAny<HttpResponse>()), Times.Once());
} }
public void should_parse_malformed_cloudflare_cookie() [TestCase("en-US")]
[TestCase("es-ES")]
public void should_parse_malformed_cloudflare_cookie(string culture)
{ {
// the date is bad in the below - should be 13-Jul-2016 var origCulture = Thread.CurrentThread.CurrentCulture;
string malformedCookie = @"__cfduid=d29e686a9d65800021c66faca0a29b4261436890790; expires=Wed, 13-Jul-16 16:19:50 GMT; path=/; HttpOnly"; Thread.CurrentThread.CurrentCulture = CultureInfo.GetCultureInfo(culture);
string url = "http://eu.httpbin.org/response-headers?Set-Cookie=" + Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo(culture);
System.Uri.EscapeUriString(malformedCookie); try
{
// the date is bad in the below - should be 13-Jul-2016
string malformedCookie = @"__cfduid=d29e686a9d65800021c66faca0a29b4261436890790; expires=Wed, 13-Jul-16 16:19:50 GMT; path=/; HttpOnly";
string url = "http://eu.httpbin.org/response-headers?Set-Cookie=" +
System.Uri.EscapeUriString(malformedCookie);
var requestSet = new HttpRequest(url); var requestSet = new HttpRequest(url);
requestSet.AllowAutoRedirect = false; requestSet.AllowAutoRedirect = false;
requestSet.StoreResponseCookie = true; requestSet.StoreResponseCookie = true;
var responseSet = Subject.Get(requestSet); var responseSet = Subject.Get(requestSet);
var request = new HttpRequest("http://eu.httpbin.org/get"); var request = new HttpRequest("http://eu.httpbin.org/get");
var response = Subject.Get<HttpBinResource>(request); var response = Subject.Get<HttpBinResource>(request);
response.Resource.Headers.Should().ContainKey("Cookie"); response.Resource.Headers.Should().ContainKey("Cookie");
var cookie = response.Resource.Headers["Cookie"].ToString(); var cookie = response.Resource.Headers["Cookie"].ToString();
cookie.Should().Contain("__cfduid=d29e686a9d65800021c66faca0a29b4261436890790"); cookie.Should().Contain("__cfduid=d29e686a9d65800021c66faca0a29b4261436890790");
ExceptionVerification.IgnoreErrors(); ExceptionVerification.IgnoreErrors();
}
finally
{
Thread.CurrentThread.CurrentCulture = origCulture;
Thread.CurrentThread.CurrentUICulture = origCulture;
}
} }
} }

@ -1,4 +1,5 @@
using System; using System;
using System.Globalization;
using System.IO; using System.IO;
using System.IO.Compression; using System.IO.Compression;
using System.Linq; using System.Linq;
@ -175,9 +176,15 @@ namespace NzbDrone.Common.Http.Dispatchers
// fix up the date if it was malformed // fix up the date if it was malformed
var setCookieClean = ExpiryDate.Replace(setCookie, delegate(Match match) var setCookieClean = ExpiryDate.Replace(setCookie, delegate(Match match)
{ {
string format = "ddd, dd-MMM-yyyy HH:mm:ss"; string shortFormat = "ddd, dd-MMM-yy HH:mm:ss";
DateTime dt = Convert.ToDateTime(match.Groups[2].Value); string longFormat = "ddd, dd-MMM-yyyy HH:mm:ss";
return match.Groups[1].Value + dt.ToUniversalTime().ToString(format) + " GMT"; DateTime dt;
if (DateTime.TryParseExact(match.Groups[2].Value, longFormat, CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal, out dt) ||
DateTime.TryParseExact(match.Groups[2].Value, shortFormat, CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal, out dt) ||
DateTime.TryParse(match.Groups[2].Value, CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal, out dt))
return match.Groups[1].Value + dt.ToUniversalTime().ToString(longFormat, CultureInfo.InvariantCulture) + " GMT";
else
return match.Value;
}); });
return setCookieClean; return setCookieClean;
} }

Loading…
Cancel
Save