2014-09-11 23:49:41 +00:00
|
|
|
|
using System;
|
|
|
|
|
using System.Collections.Generic;
|
2015-10-25 21:57:37 +00:00
|
|
|
|
using System.Globalization;
|
2015-01-02 18:57:51 +00:00
|
|
|
|
using System.IO;
|
2014-09-11 23:49:41 +00:00
|
|
|
|
using System.Net;
|
2015-10-25 21:57:37 +00:00
|
|
|
|
using System.Threading;
|
2014-09-11 23:49:41 +00:00
|
|
|
|
using FluentAssertions;
|
2015-10-25 21:57:37 +00:00
|
|
|
|
using Moq;
|
|
|
|
|
using NLog;
|
2014-09-11 23:49:41 +00:00
|
|
|
|
using NUnit.Framework;
|
2015-04-02 18:58:10 +00:00
|
|
|
|
using NzbDrone.Common.Cache;
|
2017-01-04 02:36:47 +00:00
|
|
|
|
using NzbDrone.Common.EnvironmentInfo;
|
2014-09-11 23:49:41 +00:00
|
|
|
|
using NzbDrone.Common.Http;
|
2015-10-25 21:57:37 +00:00
|
|
|
|
using NzbDrone.Common.Http.Dispatchers;
|
2016-04-25 19:53:26 +00:00
|
|
|
|
using NzbDrone.Common.Http.Proxy;
|
2015-10-25 21:57:37 +00:00
|
|
|
|
using NzbDrone.Common.TPL;
|
2014-09-11 23:49:41 +00:00
|
|
|
|
using NzbDrone.Test.Common;
|
|
|
|
|
using NzbDrone.Test.Common.Categories;
|
|
|
|
|
|
|
|
|
|
namespace NzbDrone.Common.Test.Http
|
|
|
|
|
{
|
|
|
|
|
[IntegrationTest]
|
2015-10-10 20:20:17 +00:00
|
|
|
|
[TestFixture(typeof(ManagedHttpDispatcher))]
|
|
|
|
|
[TestFixture(typeof(CurlHttpDispatcher))]
|
|
|
|
|
public class HttpClientFixture<TDispatcher> : TestBase<HttpClient> where TDispatcher : IHttpDispatcher
|
2016-05-21 21:02:02 +00:00
|
|
|
|
{
|
|
|
|
|
private static string[] _httpBinHosts = new[] { "eu.httpbin.org", "httpbin.org" };
|
|
|
|
|
private static int _httpBinRandom;
|
|
|
|
|
private string _httpBinHost;
|
|
|
|
|
|
2015-04-02 18:58:10 +00:00
|
|
|
|
[SetUp]
|
|
|
|
|
public void SetUp()
|
|
|
|
|
{
|
2017-01-04 02:36:47 +00:00
|
|
|
|
Mocker.GetMock<IPlatformInfo>().Setup(c => c.Version).Returns(new Version("1.0.0"));
|
|
|
|
|
Mocker.GetMock<IOsInfo>().Setup(c => c.Name).Returns("TestOS");
|
|
|
|
|
Mocker.GetMock<IOsInfo>().Setup(c => c.Version).Returns("9.0.0");
|
|
|
|
|
|
|
|
|
|
Mocker.SetConstant<IUserAgentBuilder>(Mocker.Resolve<UserAgentBuilder>());
|
|
|
|
|
|
2015-04-02 18:58:10 +00:00
|
|
|
|
Mocker.SetConstant<ICacheManager>(Mocker.Resolve<CacheManager>());
|
2016-04-25 19:53:26 +00:00
|
|
|
|
Mocker.SetConstant<ICreateManagedWebProxy>(Mocker.Resolve<ManagedWebProxyFactory>());
|
2015-05-27 20:25:53 +00:00
|
|
|
|
Mocker.SetConstant<IRateLimitService>(Mocker.Resolve<RateLimitService>());
|
2015-09-21 19:59:35 +00:00
|
|
|
|
Mocker.SetConstant<IEnumerable<IHttpRequestInterceptor>>(new IHttpRequestInterceptor[0]);
|
2015-10-10 20:20:17 +00:00
|
|
|
|
Mocker.SetConstant<IHttpDispatcher>(Mocker.Resolve<TDispatcher>());
|
2016-04-25 19:53:26 +00:00
|
|
|
|
|
2016-05-21 21:02:02 +00:00
|
|
|
|
// Used for manual testing of socks proxies.
|
2016-04-25 19:53:26 +00:00
|
|
|
|
//Mocker.GetMock<IHttpProxySettingsProvider>()
|
|
|
|
|
// .Setup(v => v.GetProxySettings(It.IsAny<HttpRequest>()))
|
|
|
|
|
// .Returns(new HttpProxySettings(ProxyType.Socks5, "127.0.0.1", 5476, "", false));
|
2016-05-21 21:02:02 +00:00
|
|
|
|
|
|
|
|
|
// Roundrobin over the two servers, to reduce the chance of hitting the ratelimiter.
|
|
|
|
|
_httpBinHost = _httpBinHosts[_httpBinRandom++ % _httpBinHosts.Length];
|
2015-04-02 18:58:10 +00:00
|
|
|
|
}
|
|
|
|
|
|
2014-09-11 23:49:41 +00:00
|
|
|
|
[Test]
|
|
|
|
|
public void should_execute_simple_get()
|
|
|
|
|
{
|
2017-01-04 02:36:47 +00:00
|
|
|
|
var request = new HttpRequest($"http://{_httpBinHost}/get");
|
2014-09-11 23:49:41 +00:00
|
|
|
|
|
|
|
|
|
var response = Subject.Execute(request);
|
|
|
|
|
|
|
|
|
|
response.Content.Should().NotBeNullOrWhiteSpace();
|
|
|
|
|
}
|
2015-08-01 12:54:20 +00:00
|
|
|
|
|
|
|
|
|
[Test]
|
|
|
|
|
public void should_execute_https_get()
|
|
|
|
|
{
|
2017-01-04 02:36:47 +00:00
|
|
|
|
var request = new HttpRequest($"https://{_httpBinHost}/get");
|
2015-08-01 12:54:20 +00:00
|
|
|
|
|
|
|
|
|
var response = Subject.Execute(request);
|
|
|
|
|
|
|
|
|
|
response.Content.Should().NotBeNullOrWhiteSpace();
|
|
|
|
|
}
|
2014-09-11 23:49:41 +00:00
|
|
|
|
|
|
|
|
|
[Test]
|
|
|
|
|
public void should_execute_typed_get()
|
|
|
|
|
{
|
2017-01-04 02:36:47 +00:00
|
|
|
|
var request = new HttpRequest($"http://{_httpBinHost}/get");
|
2014-09-11 23:49:41 +00:00
|
|
|
|
|
|
|
|
|
var response = Subject.Get<HttpBinResource>(request);
|
|
|
|
|
|
2016-02-29 23:33:28 +00:00
|
|
|
|
response.Resource.Url.Should().Be(request.Url.FullUri);
|
2014-09-11 23:49:41 +00:00
|
|
|
|
}
|
|
|
|
|
|
2015-06-18 07:08:29 +00:00
|
|
|
|
[Test]
|
|
|
|
|
public void should_execute_simple_post()
|
|
|
|
|
{
|
2016-02-28 15:41:22 +00:00
|
|
|
|
var message = "{ my: 1 }";
|
|
|
|
|
|
2017-01-04 02:36:47 +00:00
|
|
|
|
var request = new HttpRequest($"http://{_httpBinHost}/post");
|
2016-02-28 15:41:22 +00:00
|
|
|
|
request.SetContent(message);
|
2015-06-18 07:08:29 +00:00
|
|
|
|
|
|
|
|
|
var response = Subject.Post<HttpBinResource>(request);
|
|
|
|
|
|
2016-02-28 15:41:22 +00:00
|
|
|
|
response.Resource.Data.Should().Be(message);
|
2015-06-18 07:08:29 +00:00
|
|
|
|
}
|
|
|
|
|
|
2014-09-11 23:49:41 +00:00
|
|
|
|
[TestCase("gzip")]
|
|
|
|
|
public void should_execute_get_using_gzip(string compression)
|
|
|
|
|
{
|
2017-01-04 02:36:47 +00:00
|
|
|
|
var request = new HttpRequest($"http://{_httpBinHost}/{compression}");
|
2014-09-11 23:49:41 +00:00
|
|
|
|
|
|
|
|
|
var response = Subject.Get<HttpBinResource>(request);
|
|
|
|
|
|
|
|
|
|
response.Resource.Headers["Accept-Encoding"].ToString().Should().Be(compression);
|
|
|
|
|
response.Headers.ContentLength.Should().BeLessOrEqualTo(response.Content.Length);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
[TestCase(HttpStatusCode.Unauthorized)]
|
|
|
|
|
[TestCase(HttpStatusCode.Forbidden)]
|
|
|
|
|
[TestCase(HttpStatusCode.NotFound)]
|
|
|
|
|
[TestCase(HttpStatusCode.InternalServerError)]
|
|
|
|
|
[TestCase(HttpStatusCode.ServiceUnavailable)]
|
|
|
|
|
[TestCase(HttpStatusCode.BadGateway)]
|
2014-10-03 17:50:43 +00:00
|
|
|
|
public void should_throw_on_unsuccessful_status_codes(int statusCode)
|
2014-09-11 23:49:41 +00:00
|
|
|
|
{
|
2017-01-04 02:36:47 +00:00
|
|
|
|
var request = new HttpRequest($"http://{_httpBinHost}/status/{statusCode}");
|
2014-09-11 23:49:41 +00:00
|
|
|
|
|
|
|
|
|
var exception = Assert.Throws<HttpException>(() => Subject.Get<HttpBinResource>(request));
|
|
|
|
|
|
2014-10-03 17:50:43 +00:00
|
|
|
|
((int)exception.Response.StatusCode).Should().Be(statusCode);
|
2014-09-14 09:47:46 +00:00
|
|
|
|
|
|
|
|
|
ExceptionVerification.IgnoreWarns();
|
2014-09-11 23:49:41 +00:00
|
|
|
|
}
|
|
|
|
|
|
2015-08-12 18:45:44 +00:00
|
|
|
|
[Test]
|
|
|
|
|
public void should_not_follow_redirects_when_not_in_production()
|
2014-09-11 23:49:41 +00:00
|
|
|
|
{
|
2017-01-04 02:36:47 +00:00
|
|
|
|
var request = new HttpRequest($"http://{_httpBinHost}/redirect/1");
|
2014-09-11 23:49:41 +00:00
|
|
|
|
|
2015-08-12 18:45:44 +00:00
|
|
|
|
Subject.Get(request);
|
2015-03-15 01:00:44 +00:00
|
|
|
|
|
|
|
|
|
ExceptionVerification.ExpectedErrors(1);
|
2014-09-11 23:49:41 +00:00
|
|
|
|
}
|
|
|
|
|
|
2015-08-12 18:45:44 +00:00
|
|
|
|
[Test]
|
|
|
|
|
public void should_follow_redirects()
|
|
|
|
|
{
|
2017-01-04 02:36:47 +00:00
|
|
|
|
var request = new HttpRequest($"http://{_httpBinHost}/redirect/1");
|
2015-08-12 18:45:44 +00:00
|
|
|
|
request.AllowAutoRedirect = true;
|
|
|
|
|
|
|
|
|
|
Subject.Get(request);
|
|
|
|
|
|
|
|
|
|
ExceptionVerification.ExpectedErrors(0);
|
|
|
|
|
}
|
|
|
|
|
|
2014-09-14 09:47:46 +00:00
|
|
|
|
[Test]
|
|
|
|
|
public void should_send_user_agent()
|
|
|
|
|
{
|
2017-01-04 02:36:47 +00:00
|
|
|
|
var request = new HttpRequest($"http://{_httpBinHost}/get");
|
2014-09-14 09:47:46 +00:00
|
|
|
|
|
|
|
|
|
var response = Subject.Get<HttpBinResource>(request);
|
|
|
|
|
|
|
|
|
|
response.Resource.Headers.Should().ContainKey("User-Agent");
|
|
|
|
|
|
|
|
|
|
var userAgent = response.Resource.Headers["User-Agent"].ToString();
|
|
|
|
|
|
2017-03-30 03:49:38 +00:00
|
|
|
|
userAgent.Should().Contain("Lidarr");
|
2014-09-14 09:47:46 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
[TestCase("Accept", "text/xml, text/rss+xml, application/rss+xml")]
|
2015-10-03 17:45:26 +00:00
|
|
|
|
public void should_send_headers(string header, string value)
|
2014-09-14 09:47:46 +00:00
|
|
|
|
{
|
2017-01-04 02:36:47 +00:00
|
|
|
|
var request = new HttpRequest($"http://{_httpBinHost}/get");
|
2014-09-14 09:47:46 +00:00
|
|
|
|
request.Headers.Add(header, value);
|
|
|
|
|
|
|
|
|
|
var response = Subject.Get<HttpBinResource>(request);
|
|
|
|
|
|
|
|
|
|
response.Resource.Headers[header].ToString().Should().Be(value);
|
|
|
|
|
}
|
2015-01-02 18:57:51 +00:00
|
|
|
|
|
|
|
|
|
[Test]
|
|
|
|
|
public void should_not_download_file_with_error()
|
|
|
|
|
{
|
|
|
|
|
var file = GetTempFilePath();
|
|
|
|
|
|
2017-04-28 14:55:18 +00:00
|
|
|
|
Assert.Throws<WebException>(() => Subject.DownloadFile("http://download.lidarr.audio/wrongpath", file));
|
2015-01-02 18:57:51 +00:00
|
|
|
|
|
|
|
|
|
File.Exists(file).Should().BeFalse();
|
|
|
|
|
|
|
|
|
|
ExceptionVerification.ExpectedWarns(1);
|
2015-04-02 18:58:10 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
[Test]
|
|
|
|
|
public void should_send_cookie()
|
|
|
|
|
{
|
2017-01-04 02:36:47 +00:00
|
|
|
|
var request = new HttpRequest($"http://{_httpBinHost}/get");
|
2016-02-28 15:41:22 +00:00
|
|
|
|
request.Cookies["my"] = "cookie";
|
2015-04-02 18:58:10 +00:00
|
|
|
|
|
|
|
|
|
var response = Subject.Get<HttpBinResource>(request);
|
|
|
|
|
|
|
|
|
|
response.Resource.Headers.Should().ContainKey("Cookie");
|
|
|
|
|
|
|
|
|
|
var cookie = response.Resource.Headers["Cookie"].ToString();
|
|
|
|
|
|
|
|
|
|
cookie.Should().Contain("my=cookie");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public void GivenOldCookie()
|
|
|
|
|
{
|
|
|
|
|
var oldRequest = new HttpRequest("http://eu.httpbin.org/get");
|
2016-02-28 15:41:22 +00:00
|
|
|
|
oldRequest.Cookies["my"] = "cookie";
|
2015-04-02 18:58:10 +00:00
|
|
|
|
|
2017-01-04 02:36:47 +00:00
|
|
|
|
var oldClient = new HttpClient(new IHttpRequestInterceptor[0], Mocker.Resolve<ICacheManager>(), Mocker.Resolve<IRateLimitService>(), Mocker.Resolve<IHttpDispatcher>(), Mocker.GetMock<IUserAgentBuilder>().Object, Mocker.Resolve<Logger>());
|
2015-04-02 18:58:10 +00:00
|
|
|
|
|
|
|
|
|
oldClient.Should().NotBeSameAs(Subject);
|
|
|
|
|
|
|
|
|
|
var oldResponse = oldClient.Get<HttpBinResource>(oldRequest);
|
|
|
|
|
|
|
|
|
|
oldResponse.Resource.Headers.Should().ContainKey("Cookie");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
[Test]
|
|
|
|
|
public void should_preserve_cookie_during_session()
|
|
|
|
|
{
|
|
|
|
|
GivenOldCookie();
|
|
|
|
|
|
|
|
|
|
var request = new HttpRequest("http://eu.httpbin.org/get");
|
|
|
|
|
|
|
|
|
|
var response = Subject.Get<HttpBinResource>(request);
|
|
|
|
|
|
|
|
|
|
response.Resource.Headers.Should().ContainKey("Cookie");
|
|
|
|
|
|
|
|
|
|
var cookie = response.Resource.Headers["Cookie"].ToString();
|
|
|
|
|
|
|
|
|
|
cookie.Should().Contain("my=cookie");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
[Test]
|
|
|
|
|
public void should_not_send_cookie_to_other_host()
|
|
|
|
|
{
|
|
|
|
|
GivenOldCookie();
|
|
|
|
|
|
|
|
|
|
var request = new HttpRequest("http://httpbin.org/get");
|
|
|
|
|
|
|
|
|
|
var response = Subject.Get<HttpBinResource>(request);
|
2015-01-02 18:57:51 +00:00
|
|
|
|
|
2015-04-02 18:58:10 +00:00
|
|
|
|
response.Resource.Headers.Should().NotContainKey("Cookie");
|
2015-01-02 18:57:51 +00:00
|
|
|
|
}
|
2015-04-13 21:25:14 +00:00
|
|
|
|
|
|
|
|
|
[Test]
|
|
|
|
|
public void should_not_store_response_cookie()
|
|
|
|
|
{
|
2017-01-04 02:36:47 +00:00
|
|
|
|
var requestSet = new HttpRequest($"http://{_httpBinHost}/cookies/set?my=cookie");
|
2015-04-13 21:25:14 +00:00
|
|
|
|
requestSet.AllowAutoRedirect = false;
|
|
|
|
|
|
|
|
|
|
var responseSet = Subject.Get(requestSet);
|
|
|
|
|
|
2017-01-04 02:36:47 +00:00
|
|
|
|
var request = new HttpRequest($"http://{_httpBinHost}/get");
|
2015-04-13 21:25:14 +00:00
|
|
|
|
|
|
|
|
|
var response = Subject.Get<HttpBinResource>(request);
|
|
|
|
|
|
|
|
|
|
response.Resource.Headers.Should().NotContainKey("Cookie");
|
|
|
|
|
|
|
|
|
|
ExceptionVerification.IgnoreErrors();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
[Test]
|
|
|
|
|
public void should_store_response_cookie()
|
|
|
|
|
{
|
2017-01-04 02:36:47 +00:00
|
|
|
|
var requestSet = new HttpRequest($"http://{_httpBinHost}/cookies/set?my=cookie");
|
2015-04-13 21:25:14 +00:00
|
|
|
|
requestSet.AllowAutoRedirect = false;
|
|
|
|
|
requestSet.StoreResponseCookie = true;
|
|
|
|
|
|
|
|
|
|
var responseSet = Subject.Get(requestSet);
|
|
|
|
|
|
2017-01-04 02:36:47 +00:00
|
|
|
|
var request = new HttpRequest($"http://{_httpBinHost}/get");
|
2015-04-13 21:25:14 +00:00
|
|
|
|
|
|
|
|
|
var response = Subject.Get<HttpBinResource>(request);
|
|
|
|
|
|
|
|
|
|
response.Resource.Headers.Should().ContainKey("Cookie");
|
|
|
|
|
|
|
|
|
|
var cookie = response.Resource.Headers["Cookie"].ToString();
|
|
|
|
|
|
|
|
|
|
cookie.Should().Contain("my=cookie");
|
|
|
|
|
|
|
|
|
|
ExceptionVerification.IgnoreErrors();
|
|
|
|
|
}
|
2015-07-08 18:05:03 +00:00
|
|
|
|
|
|
|
|
|
[Test]
|
|
|
|
|
public void should_overwrite_response_cookie()
|
|
|
|
|
{
|
2017-01-04 02:36:47 +00:00
|
|
|
|
var requestSet = new HttpRequest($"http://{_httpBinHost}/cookies/set?my=cookie");
|
2015-07-08 18:05:03 +00:00
|
|
|
|
requestSet.AllowAutoRedirect = false;
|
|
|
|
|
requestSet.StoreResponseCookie = true;
|
2016-02-28 15:41:22 +00:00
|
|
|
|
requestSet.Cookies["my"] = "oldcookie";
|
2015-07-08 18:05:03 +00:00
|
|
|
|
|
|
|
|
|
var responseSet = Subject.Get(requestSet);
|
|
|
|
|
|
2017-01-04 02:36:47 +00:00
|
|
|
|
var request = new HttpRequest($"http://{_httpBinHost}/get");
|
2015-07-08 18:05:03 +00:00
|
|
|
|
|
|
|
|
|
var response = Subject.Get<HttpBinResource>(request);
|
|
|
|
|
|
|
|
|
|
response.Resource.Headers.Should().ContainKey("Cookie");
|
|
|
|
|
|
|
|
|
|
var cookie = response.Resource.Headers["Cookie"].ToString();
|
|
|
|
|
|
|
|
|
|
cookie.Should().Contain("my=cookie");
|
|
|
|
|
|
|
|
|
|
ExceptionVerification.IgnoreErrors();
|
|
|
|
|
}
|
2015-06-27 09:43:17 +00:00
|
|
|
|
|
|
|
|
|
[Test]
|
|
|
|
|
public void should_throw_on_http429_too_many_requests()
|
|
|
|
|
{
|
2017-01-04 02:36:47 +00:00
|
|
|
|
var request = new HttpRequest($"http://{_httpBinHost}/status/429");
|
2015-06-27 09:43:17 +00:00
|
|
|
|
|
|
|
|
|
Assert.Throws<TooManyRequestsException>(() => Subject.Get(request));
|
|
|
|
|
|
|
|
|
|
ExceptionVerification.IgnoreWarns();
|
|
|
|
|
}
|
2015-09-21 19:59:35 +00:00
|
|
|
|
|
|
|
|
|
[Test]
|
|
|
|
|
public void should_call_interceptor()
|
|
|
|
|
{
|
|
|
|
|
Mocker.SetConstant<IEnumerable<IHttpRequestInterceptor>>(new [] { Mocker.GetMock<IHttpRequestInterceptor>().Object });
|
|
|
|
|
|
|
|
|
|
Mocker.GetMock<IHttpRequestInterceptor>()
|
|
|
|
|
.Setup(v => v.PreRequest(It.IsAny<HttpRequest>()))
|
|
|
|
|
.Returns<HttpRequest>(r => r);
|
|
|
|
|
|
|
|
|
|
Mocker.GetMock<IHttpRequestInterceptor>()
|
|
|
|
|
.Setup(v => v.PostResponse(It.IsAny<HttpResponse>()))
|
|
|
|
|
.Returns<HttpResponse>(r => r);
|
|
|
|
|
|
2017-01-04 02:36:47 +00:00
|
|
|
|
var request = new HttpRequest($"http://{_httpBinHost}/get");
|
2015-09-21 19:59:35 +00:00
|
|
|
|
|
|
|
|
|
Subject.Get(request);
|
|
|
|
|
|
|
|
|
|
Mocker.GetMock<IHttpRequestInterceptor>()
|
|
|
|
|
.Verify(v => v.PreRequest(It.IsAny<HttpRequest>()), Times.Once());
|
|
|
|
|
|
|
|
|
|
Mocker.GetMock<IHttpRequestInterceptor>()
|
|
|
|
|
.Verify(v => v.PostResponse(It.IsAny<HttpResponse>()), Times.Once());
|
|
|
|
|
}
|
2015-08-01 12:54:20 +00:00
|
|
|
|
|
2015-10-25 21:57:37 +00:00
|
|
|
|
[TestCase("en-US")]
|
|
|
|
|
[TestCase("es-ES")]
|
|
|
|
|
public void should_parse_malformed_cloudflare_cookie(string culture)
|
2015-08-01 12:54:20 +00:00
|
|
|
|
{
|
2015-10-25 21:57:37 +00:00
|
|
|
|
var origCulture = Thread.CurrentThread.CurrentCulture;
|
|
|
|
|
Thread.CurrentThread.CurrentCulture = CultureInfo.GetCultureInfo(culture);
|
|
|
|
|
Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo(culture);
|
|
|
|
|
try
|
|
|
|
|
{
|
2016-07-21 22:34:18 +00:00
|
|
|
|
// the date is bad in the below - should be 13-Jul-2026
|
|
|
|
|
string malformedCookie = @"__cfduid=d29e686a9d65800021c66faca0a29b4261436890790; expires=Mon, 13-Jul-26 16:19:50 GMT; path=/; HttpOnly";
|
2017-01-04 02:36:47 +00:00
|
|
|
|
var requestSet = new HttpRequestBuilder($"http://{_httpBinHost}/response-headers")
|
2016-02-28 15:41:22 +00:00
|
|
|
|
.AddQueryParam("Set-Cookie", malformedCookie)
|
|
|
|
|
.Build();
|
2015-08-01 12:54:20 +00:00
|
|
|
|
|
2015-10-25 21:57:37 +00:00
|
|
|
|
requestSet.AllowAutoRedirect = false;
|
|
|
|
|
requestSet.StoreResponseCookie = true;
|
2015-08-01 12:54:20 +00:00
|
|
|
|
|
2015-10-25 21:57:37 +00:00
|
|
|
|
var responseSet = Subject.Get(requestSet);
|
2015-08-01 12:54:20 +00:00
|
|
|
|
|
2017-01-04 02:36:47 +00:00
|
|
|
|
var request = new HttpRequest($"http://{_httpBinHost}/get");
|
2015-08-01 12:54:20 +00:00
|
|
|
|
|
2015-10-25 21:57:37 +00:00
|
|
|
|
var response = Subject.Get<HttpBinResource>(request);
|
2015-08-01 12:54:20 +00:00
|
|
|
|
|
2015-10-25 21:57:37 +00:00
|
|
|
|
response.Resource.Headers.Should().ContainKey("Cookie");
|
2015-08-01 12:54:20 +00:00
|
|
|
|
|
2015-10-25 21:57:37 +00:00
|
|
|
|
var cookie = response.Resource.Headers["Cookie"].ToString();
|
2015-08-01 12:54:20 +00:00
|
|
|
|
|
2015-10-25 21:57:37 +00:00
|
|
|
|
cookie.Should().Contain("__cfduid=d29e686a9d65800021c66faca0a29b4261436890790");
|
2015-08-01 12:54:20 +00:00
|
|
|
|
|
2015-10-25 21:57:37 +00:00
|
|
|
|
ExceptionVerification.IgnoreErrors();
|
|
|
|
|
}
|
|
|
|
|
finally
|
|
|
|
|
{
|
|
|
|
|
Thread.CurrentThread.CurrentCulture = origCulture;
|
|
|
|
|
Thread.CurrentThread.CurrentUICulture = origCulture;
|
|
|
|
|
}
|
2015-08-01 12:54:20 +00:00
|
|
|
|
}
|
2015-12-24 18:30:16 +00:00
|
|
|
|
|
2016-07-21 22:34:18 +00:00
|
|
|
|
[TestCase("lang_code=en; expires=Wed, 23-Dec-2026 18:09:14 GMT; Max-Age=31536000; path=/; domain=.abc.com")]
|
2015-12-24 18:30:16 +00:00
|
|
|
|
public void should_reject_malformed_domain_cookie(string malformedCookie)
|
|
|
|
|
{
|
|
|
|
|
try
|
|
|
|
|
{
|
2017-01-04 02:36:47 +00:00
|
|
|
|
string url = $"http://{_httpBinHost}/response-headers?Set-Cookie={Uri.EscapeUriString(malformedCookie)}";
|
2015-12-24 18:30:16 +00:00
|
|
|
|
|
|
|
|
|
var requestSet = new HttpRequest(url);
|
|
|
|
|
requestSet.AllowAutoRedirect = false;
|
|
|
|
|
requestSet.StoreResponseCookie = true;
|
|
|
|
|
|
|
|
|
|
var responseSet = Subject.Get(requestSet);
|
|
|
|
|
|
2017-01-04 02:36:47 +00:00
|
|
|
|
var request = new HttpRequest($"http://{_httpBinHost}/get");
|
2015-12-24 18:30:16 +00:00
|
|
|
|
|
|
|
|
|
var response = Subject.Get<HttpBinResource>(request);
|
|
|
|
|
|
|
|
|
|
response.Resource.Headers.Should().NotContainKey("Cookie");
|
|
|
|
|
|
|
|
|
|
ExceptionVerification.IgnoreErrors();
|
|
|
|
|
}
|
|
|
|
|
finally
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
}
|
2014-09-14 09:47:46 +00:00
|
|
|
|
}
|
2014-09-11 23:49:41 +00:00
|
|
|
|
|
|
|
|
|
public class HttpBinResource
|
|
|
|
|
{
|
|
|
|
|
public Dictionary<string, object> Headers { get; set; }
|
|
|
|
|
public string Origin { get; set; }
|
|
|
|
|
public string Url { get; set; }
|
2015-06-18 07:08:29 +00:00
|
|
|
|
public string Data { get; set; }
|
2014-09-11 23:49:41 +00:00
|
|
|
|
}
|
|
|
|
|
}
|