@ -4,6 +4,7 @@ using System.Globalization;
using System.IO ;
using System.Linq ;
using System.Net ;
using System.Net.Http ;
using System.Threading ;
using FluentAssertions ;
using Moq ;
@ -15,12 +16,14 @@ using NzbDrone.Common.Http;
using NzbDrone.Common.Http.Dispatchers ;
using NzbDrone.Common.Http.Proxy ;
using NzbDrone.Common.TPL ;
using NzbDrone.Core.Configuration ;
using NzbDrone.Core.Security ;
using NzbDrone.Test.Common ;
using NzbDrone.Test.Common.Categories ;
using HttpClient = NzbDrone . Common . Http . HttpClient ;
namespace NzbDrone.Common.Test.Http
{
[Ignore("httpbin is bugged")]
[IntegrationTest]
[TestFixture(typeof(ManagedHttpDispatcher))]
public class HttpClientFixture < TDispatcher > : TestBase < HttpClient >
@ -32,39 +35,38 @@ namespace NzbDrone.Common.Test.Http
private string _httpBinHost ;
private string _httpBinHost2 ;
private System . Net . Http . HttpClient _httpClient = new ( ) ;
[OneTimeSetUp]
public void FixtureSetUp ( )
{
var candidates = new [ ] { "eu.httpbin.org" , /*"httpbin.org",*/ "www.httpbin.org" } ;
// Always use our server for main tests
var mainHost = "httpbin.servarr.com" ;
// Use mirrors for tests that use two hosts
var candidates = new [ ] { "httpbin1.servarr.com" } ;
// httpbin.org is broken right now, occassionally redirecting to https if it's unavailable.
_httpBinHost = mainHost ;
_httpBinHosts = candidates . Where ( IsTestSiteAvailable ) . ToArray ( ) ;
TestLogger . Info ( $"{candidates.Length} TestSites available." ) ;
_httpBinSleep = _httpBinHosts . Count ( ) < 2 ? 100 : 10 ;
_httpBinSleep = 10 ;
}
private bool IsTestSiteAvailable ( string site )
{
try
{
var re q = WebRequest . Create ( $"http://{site}/get" ) as HttpWebRequest ;
var res = req . GetResponse ( ) as HttpWebResponse ;
var re s = _httpClient . GetAsync ( $"https://{site}/get" ) . GetAwaiter ( ) . GetResult ( ) ;
if ( res . StatusCode ! = HttpStatusCode . OK )
{
return false ;
}
try
{
req = WebRequest . Create ( $"http://{site}/status/429" ) as HttpWebRequest ;
res = req . GetResponse ( ) as HttpWebResponse ;
}
catch ( WebException ex )
{
res = ex . Response as HttpWebResponse ;
}
res = _httpClient . GetAsync ( $"https://{site}/status/429" ) . GetAwaiter ( ) . GetResult ( ) ;
if ( res = = null | | res . StatusCode ! = ( HttpStatusCode ) 429 )
{
@ -91,10 +93,14 @@ namespace NzbDrone.Common.Test.Http
Mocker . GetMock < IOsInfo > ( ) . Setup ( c = > c . Name ) . Returns ( "TestOS" ) ;
Mocker . GetMock < IOsInfo > ( ) . Setup ( c = > c . Version ) . Returns ( "9.0.0" ) ;
Mocker . GetMock < IConfigService > ( ) . SetupGet ( x = > x . CertificateValidation ) . Returns ( CertificateValidationType . Enabled ) ;
Mocker . SetConstant < IUserAgentBuilder > ( Mocker . Resolve < UserAgentBuilder > ( ) ) ;
Mocker . SetConstant < ICacheManager > ( Mocker . Resolve < CacheManager > ( ) ) ;
Mocker . SetConstant < ICreateManagedWebProxy > ( Mocker . Resolve < ManagedWebProxyFactory > ( ) ) ;
Mocker . SetConstant < ICertificateValidationService > ( new X509CertificateValidationService ( Mocker . GetMock < IConfigService > ( ) . Object , TestLogger ) ) ;
Mocker . SetConstant < IRateLimitService > ( Mocker . Resolve < RateLimitService > ( ) ) ;
Mocker . SetConstant < IEnumerable < IHttpRequestInterceptor > > ( new IHttpRequestInterceptor [ 0 ] ) ;
Mocker . SetConstant < IHttpDispatcher > ( Mocker . Resolve < TDispatcher > ( ) ) ;
@ -105,8 +111,7 @@ namespace NzbDrone.Common.Test.Http
// .Returns(new HttpProxySettings(ProxyType.Socks5, "127.0.0.1", 5476, "", false));
// Roundrobin over the two servers, to reduce the chance of hitting the ratelimiter.
_httpBinHost = _httpBinHosts [ _httpBinRandom + + % _httpBinHosts . Length ] ;
_httpBinHost2 = _httpBinHosts [ _httpBinRandom % _httpBinHosts . Length ] ;
_httpBinHost2 = _httpBinHosts [ _httpBinRandom + + % _httpBinHosts . Length ] ;
}
[TearDown]
@ -118,7 +123,7 @@ namespace NzbDrone.Common.Test.Http
[Test]
public void should_execute_simple_get ( )
{
var request = new HttpRequest ( $"http ://{_httpBinHost}/get") ;
var request = new HttpRequest ( $"http s ://{_httpBinHost}/get") ;
var response = Subject . Execute ( request ) ;
@ -135,10 +140,32 @@ namespace NzbDrone.Common.Test.Http
response . Content . Should ( ) . NotBeNullOrWhiteSpace ( ) ;
}
[TestCase(CertificateValidationType.Enabled)]
[TestCase(CertificateValidationType.DisabledForLocalAddresses)]
public void bad_ssl_should_fail_when_remote_validation_enabled ( CertificateValidationType validationType )
{
Mocker . GetMock < IConfigService > ( ) . SetupGet ( x = > x . CertificateValidation ) . Returns ( validationType ) ;
var request = new HttpRequest ( $"https://expired.badssl.com" ) ;
Assert . Throws < HttpRequestException > ( ( ) = > Subject . Execute ( request ) ) ;
ExceptionVerification . ExpectedErrors ( 2 ) ;
}
[Test]
public void bad_ssl_should_pass_if_remote_validation_disabled ( )
{
Mocker . GetMock < IConfigService > ( ) . SetupGet ( x = > x . CertificateValidation ) . Returns ( CertificateValidationType . Disabled ) ;
var request = new HttpRequest ( $"https://expired.badssl.com" ) ;
Subject . Execute ( request ) ;
ExceptionVerification . ExpectedErrors ( 0 ) ;
}
[Test]
public void should_execute_typed_get ( )
{
var request = new HttpRequest ( $"http://{_httpBinHost}/get?test=1" ) ;
var request = new HttpRequest ( $"http s ://{_httpBinHost}/get?test=1") ;
var response = Subject . Get < HttpBinResource > ( request ) ;
@ -151,7 +178,7 @@ namespace NzbDrone.Common.Test.Http
{
var message = "{ my: 1 }" ;
var request = new HttpRequest ( $"http ://{_httpBinHost}/post") ;
var request = new HttpRequest ( $"http s ://{_httpBinHost}/post") ;
request . SetContent ( message ) ;
var response = Subject . Post < HttpBinResource > ( request ) ;
@ -159,15 +186,42 @@ namespace NzbDrone.Common.Test.Http
response . Resource . Data . Should ( ) . Be ( message ) ;
}
[Test Case("gzip") ]
public void should_execute_ get_using_gzip( string compression )
[Test ]
public void should_execute_ post_with_content_type( )
{
var request = new HttpRequest ( $"http://{_httpBinHost}/{compression}" ) ;
var message = "{ my: 1 }" ;
var request = new HttpRequest ( $"https://{_httpBinHost}/post" ) ;
request . SetContent ( message ) ;
request . Headers . ContentType = "application/json" ;
var response = Subject . Post < HttpBinResource > ( request ) ;
response . Resource . Data . Should ( ) . Be ( message ) ;
}
[Test]
public void should_execute_get_using_gzip ( )
{
var request = new HttpRequest ( $"https://{_httpBinHost}/gzip" ) ;
var response = Subject . Get < HttpBinResource > ( request ) ;
response . Resource . Headers [ "Accept-Encoding" ] . ToString ( ) . Should ( ) . Contain ( "gzip" ) ;
response . Resource . Gzipped . Should ( ) . BeTrue ( ) ;
response . Resource . Brotli . Should ( ) . BeFalse ( ) ;
}
[Test]
public void should_execute_get_using_brotli ( )
{
var request = new HttpRequest ( $"https://{_httpBinHost}/brotli" ) ;
var response = Subject . Get < HttpBinResource > ( request ) ;
response . Resource . Headers [ "Accept-Encoding" ] . ToString ( ) . Should ( ) . Be ( compression ) ;
response . Headers . ContentLength . Should ( ) . BeLessOrEqualTo ( response . Content . Length ) ;
response . Resource . Headers [ "Accept-Encoding" ] . ToString ( ) . Should ( ) . Contain ( "br" ) ;
response . Resource . Gzipped . Should ( ) . BeFalse ( ) ;
response . Resource . Brotli . Should ( ) . BeTrue ( ) ;
}
[TestCase(HttpStatusCode.Unauthorized)]
@ -178,7 +232,7 @@ namespace NzbDrone.Common.Test.Http
[TestCase(HttpStatusCode.BadGateway)]
public void should_throw_on_unsuccessful_status_codes ( int statusCode )
{
var request = new HttpRequest ( $"http ://{_httpBinHost}/status/{statusCode}") ;
var request = new HttpRequest ( $"http s ://{_httpBinHost}/status/{statusCode}") ;
var exception = Assert . Throws < HttpException > ( ( ) = > Subject . Get < HttpBinResource > ( request ) ) ;
@ -190,10 +244,10 @@ namespace NzbDrone.Common.Test.Http
[Test]
public void should_not_throw_on_suppressed_status_codes ( )
{
var request = new HttpRequest ( $"http ://{_httpBinHost}/status/{HttpStatusCode.NotFound}") ;
var request = new HttpRequest ( $"http s ://{_httpBinHost}/status/{HttpStatusCode.NotFound}") ;
request . SuppressHttpErrorStatusCodes = new [ ] { HttpStatusCode . NotFound } ;
var exception = Assert . Throws < HttpException > ( ( ) = > Subject . Get < HttpBinResource > ( request ) ) ;
Assert . Throws < HttpException > ( ( ) = > Subject . Get < HttpBinResource > ( request ) ) ;
ExceptionVerification . IgnoreWarns ( ) ;
}
@ -201,7 +255,7 @@ namespace NzbDrone.Common.Test.Http
[Test]
public void should_log_unsuccessful_status_codes ( )
{
var request = new HttpRequest ( $"http ://{_httpBinHost}/status/{HttpStatusCode.NotFound}") ;
var request = new HttpRequest ( $"http s ://{_httpBinHost}/status/{HttpStatusCode.NotFound}") ;
var exception = Assert . Throws < HttpException > ( ( ) = > Subject . Get < HttpBinResource > ( request ) ) ;
@ -211,10 +265,10 @@ namespace NzbDrone.Common.Test.Http
[Test]
public void should_not_log_unsuccessful_status_codes ( )
{
var request = new HttpRequest ( $"http ://{_httpBinHost}/status/{HttpStatusCode.NotFound}") ;
var request = new HttpRequest ( $"http s ://{_httpBinHost}/status/{HttpStatusCode.NotFound}") ;
request . LogHttpError = false ;
var exception = Assert . Throws < HttpException > ( ( ) = > Subject . Get < HttpBinResource > ( request ) ) ;
Assert . Throws < HttpException > ( ( ) = > Subject . Get < HttpBinResource > ( request ) ) ;
ExceptionVerification . ExpectedWarns ( 0 ) ;
}
@ -222,7 +276,7 @@ namespace NzbDrone.Common.Test.Http
[Test]
public void should_not_follow_redirects_when_not_in_production ( )
{
var request = new HttpRequest ( $"http ://{_httpBinHost}/redirect/1") ;
var request = new HttpRequest ( $"http s ://{_httpBinHost}/redirect/1") ;
Subject . Get ( request ) ;
@ -232,7 +286,7 @@ namespace NzbDrone.Common.Test.Http
[Test]
public void should_follow_redirects ( )
{
var request = new HttpRequest ( $"http ://{_httpBinHost}/redirect/1") ;
var request = new HttpRequest ( $"http s ://{_httpBinHost}/redirect/1") ;
request . AllowAutoRedirect = true ;
var response = Subject . Get ( request ) ;
@ -245,7 +299,7 @@ namespace NzbDrone.Common.Test.Http
[Test]
public void should_not_follow_redirects ( )
{
var request = new HttpRequest ( $"http ://{_httpBinHost}/redirect/1") ;
var request = new HttpRequest ( $"http s ://{_httpBinHost}/redirect/1") ;
request . AllowAutoRedirect = false ;
var response = Subject . Get ( request ) ;
@ -258,7 +312,7 @@ namespace NzbDrone.Common.Test.Http
[Test]
public void should_follow_redirects_to_https ( )
{
var request = new HttpRequestBuilder ( $"http ://{_httpBinHost}/redirect-to")
var request = new HttpRequestBuilder ( $"http s ://{_httpBinHost}/redirect-to")
. AddQueryParam ( "url" , $"https://sonarr.tv/" )
. Build ( ) ;
request . AllowAutoRedirect = true ;
@ -274,7 +328,7 @@ namespace NzbDrone.Common.Test.Http
[Test]
public void should_throw_on_too_many_redirects ( )
{
var request = new HttpRequest ( $"http ://{_httpBinHost}/redirect/6") ;
var request = new HttpRequest ( $"http s ://{_httpBinHost}/redirect/6") ;
request . AllowAutoRedirect = true ;
Assert . Throws < WebException > ( ( ) = > Subject . Get ( request ) ) ;
@ -285,7 +339,7 @@ namespace NzbDrone.Common.Test.Http
[Test]
public void should_send_user_agent ( )
{
var request = new HttpRequest ( $"http ://{_httpBinHost}/get") ;
var request = new HttpRequest ( $"http s ://{_httpBinHost}/get") ;
var response = Subject . Get < HttpBinResource > ( request ) ;
@ -299,7 +353,7 @@ namespace NzbDrone.Common.Test.Http
[TestCase("Accept", "text/xml, text/rss+xml, application/rss+xml")]
public void should_send_headers ( string header , string value )
{
var request = new HttpRequest ( $"http ://{_httpBinHost}/get") ;
var request = new HttpRequest ( $"http s ://{_httpBinHost}/get") ;
request . Headers . Add ( header , value ) ;
var response = Subject . Get < HttpBinResource > ( request ) ;
@ -324,12 +378,30 @@ namespace NzbDrone.Common.Test.Http
fileInfo . Length . Should ( ) . Be ( 307054 ) ;
}
[Test]
public void should_download_file_with_redirect ( )
{
var file = GetTempFilePath ( ) ;
var request = new HttpRequestBuilder ( $"https://{_httpBinHost}/redirect-to" )
. AddQueryParam ( "url" , $"https://sonarr.tv/img/slider/seriesdetails.png" )
. Build ( ) ;
Subject . DownloadFile ( request . Url . FullUri , file ) ;
ExceptionVerification . ExpectedErrors ( 0 ) ;
var fileInfo = new FileInfo ( file ) ;
fileInfo . Exists . Should ( ) . BeTrue ( ) ;
fileInfo . Length . Should ( ) . Be ( 307054 ) ;
}
[Test]
public void should_not_download_file_with_error ( )
{
var file = GetTempFilePath ( ) ;
Assert . Throws < HttpException > ( ( ) = > Subject . DownloadFile ( "http://download.sonarr.tv/wrongpath" , file ) ) ;
Assert . Throws < HttpException > ( ( ) = > Subject . DownloadFile ( "http s ://download.sonarr.tv/wrongpath", file ) ) ;
File . Exists ( file ) . Should ( ) . BeFalse ( ) ;
File . Exists ( file + ".part" ) . Should ( ) . BeFalse ( ) ;
@ -344,7 +416,7 @@ namespace NzbDrone.Common.Test.Http
using ( var fileStream = new FileStream ( file , FileMode . Create ) )
{
var request = new HttpRequest ( $"http ://{_httpBinHost}/redirect/1") ;
var request = new HttpRequest ( $"http s ://{_httpBinHost}/redirect/1") ;
request . AllowAutoRedirect = false ;
request . ResponseStream = fileStream ;
@ -365,7 +437,7 @@ namespace NzbDrone.Common.Test.Http
[Test]
public void should_send_cookie ( )
{
var request = new HttpRequest ( $"http ://{_httpBinHost}/get") ;
var request = new HttpRequest ( $"http s ://{_httpBinHost}/get") ;
request . Cookies [ "my" ] = "cookie" ;
var response = Subject . Get < HttpBinResource > ( request ) ;
@ -384,7 +456,7 @@ namespace NzbDrone.Common.Test.Http
Assert . Inconclusive ( "Need both httpbin.org and eu.httpbin.org to run this test." ) ;
}
var oldRequest = new HttpRequest ( $"http ://{_httpBinHost2}/get") ;
var oldRequest = new HttpRequest ( $"http s ://{_httpBinHost2}/get") ;
oldRequest . Cookies [ "my" ] = "cookie" ;
var oldClient = new HttpClient ( new IHttpRequestInterceptor [ 0 ] , Mocker . Resolve < ICacheManager > ( ) , Mocker . Resolve < IRateLimitService > ( ) , Mocker . Resolve < IHttpDispatcher > ( ) , Mocker . GetMock < IUserAgentBuilder > ( ) . Object , Mocker . Resolve < Logger > ( ) ) ;
@ -401,7 +473,7 @@ namespace NzbDrone.Common.Test.Http
{
GivenOldCookie ( ) ;
var request = new HttpRequest ( $"http ://{_httpBinHost2}/get") ;
var request = new HttpRequest ( $"http s ://{_httpBinHost2}/get") ;
var response = Subject . Get < HttpBinResource > ( request ) ;
@ -417,7 +489,7 @@ namespace NzbDrone.Common.Test.Http
{
GivenOldCookie ( ) ;
var request = new HttpRequest ( $"http ://{_httpBinHost}/get") ;
var request = new HttpRequest ( $"http s ://{_httpBinHost}/get") ;
var response = Subject . Get < HttpBinResource > ( request ) ;
@ -427,14 +499,14 @@ namespace NzbDrone.Common.Test.Http
[Test]
public void should_not_store_request_cookie ( )
{
var requestGet = new HttpRequest ( $"http ://{_httpBinHost}/get") ;
var requestGet = new HttpRequest ( $"http s ://{_httpBinHost}/get") ;
requestGet . Cookies . Add ( "my" , "cookie" ) ;
requestGet . AllowAutoRedirect = false ;
requestGet . StoreRequestCookie = false ;
requestGet . StoreResponseCookie = false ;
var responseGet = Subject . Get < HttpBinResource > ( requestGet ) ;
var requestCookies = new HttpRequest ( $"http ://{_httpBinHost}/cookies") ;
var requestCookies = new HttpRequest ( $"http s ://{_httpBinHost}/cookies") ;
requestCookies . AllowAutoRedirect = false ;
var responseCookies = Subject . Get < HttpCookieResource > ( requestCookies ) ;
@ -446,14 +518,14 @@ namespace NzbDrone.Common.Test.Http
[Test]
public void should_store_request_cookie ( )
{
var requestGet = new HttpRequest ( $"http ://{_httpBinHost}/get") ;
var requestGet = new HttpRequest ( $"http s ://{_httpBinHost}/get") ;
requestGet . Cookies . Add ( "my" , "cookie" ) ;
requestGet . AllowAutoRedirect = false ;
requestGet . StoreRequestCookie . Should ( ) . BeTrue ( ) ;
requestGet . StoreResponseCookie = false ;
var responseGet = Subject . Get < HttpBinResource > ( requestGet ) ;
var requestCookies = new HttpRequest ( $"http ://{_httpBinHost}/cookies") ;
var requestCookies = new HttpRequest ( $"http s ://{_httpBinHost}/cookies") ;
requestCookies . AllowAutoRedirect = false ;
var responseCookies = Subject . Get < HttpCookieResource > ( requestCookies ) ;
@ -465,7 +537,7 @@ namespace NzbDrone.Common.Test.Http
[Test]
public void should_delete_request_cookie ( )
{
var requestDelete = new HttpRequest ( $"http ://{_httpBinHost}/cookies/delete?my") ;
var requestDelete = new HttpRequest ( $"http s ://{_httpBinHost}/cookies/delete?my") ;
requestDelete . Cookies . Add ( "my" , "cookie" ) ;
requestDelete . AllowAutoRedirect = true ;
requestDelete . StoreRequestCookie = false ;
@ -480,7 +552,7 @@ namespace NzbDrone.Common.Test.Http
[Test]
public void should_clear_request_cookie ( )
{
var requestSet = new HttpRequest ( $"http ://{_httpBinHost}/cookies") ;
var requestSet = new HttpRequest ( $"http s ://{_httpBinHost}/cookies") ;
requestSet . Cookies . Add ( "my" , "cookie" ) ;
requestSet . AllowAutoRedirect = false ;
requestSet . StoreRequestCookie = true ;
@ -488,7 +560,7 @@ namespace NzbDrone.Common.Test.Http
var responseSet = Subject . Get < HttpCookieResource > ( requestSet ) ;
var requestClear = new HttpRequest ( $"http ://{_httpBinHost}/cookies") ;
var requestClear = new HttpRequest ( $"http s ://{_httpBinHost}/cookies") ;
requestClear . Cookies . Add ( "my" , null ) ;
requestClear . AllowAutoRedirect = false ;
requestClear . StoreRequestCookie = true ;
@ -502,14 +574,14 @@ namespace NzbDrone.Common.Test.Http
[Test]
public void should_not_store_response_cookie ( )
{
var requestSet = new HttpRequest ( $"http ://{_httpBinHost}/cookies/set?my=cookie") ;
var requestSet = new HttpRequest ( $"http s ://{_httpBinHost}/cookies/set?my=cookie") ;
requestSet . AllowAutoRedirect = false ;
requestSet . StoreRequestCookie = false ;
requestSet . StoreResponseCookie . Should ( ) . BeFalse ( ) ;
var responseSet = Subject . Get ( requestSet ) ;
var requestCookies = new HttpRequest ( $"http ://{_httpBinHost}/cookies") ;
var requestCookies = new HttpRequest ( $"http s ://{_httpBinHost}/cookies") ;
var responseCookies = Subject . Get < HttpCookieResource > ( requestCookies ) ;
@ -521,14 +593,14 @@ namespace NzbDrone.Common.Test.Http
[Test]
public void should_store_response_cookie ( )
{
var requestSet = new HttpRequest ( $"http ://{_httpBinHost}/cookies/set?my=cookie") ;
var requestSet = new HttpRequest ( $"http s ://{_httpBinHost}/cookies/set?my=cookie") ;
requestSet . AllowAutoRedirect = false ;
requestSet . StoreRequestCookie = false ;
requestSet . StoreResponseCookie = true ;
var responseSet = Subject . Get ( requestSet ) ;
var requestCookies = new HttpRequest ( $"http ://{_httpBinHost}/cookies") ;
var requestCookies = new HttpRequest ( $"http s ://{_httpBinHost}/cookies") ;
var responseCookies = Subject . Get < HttpCookieResource > ( requestCookies ) ;
@ -540,7 +612,7 @@ namespace NzbDrone.Common.Test.Http
[Test]
public void should_temp_store_response_cookie ( )
{
var requestSet = new HttpRequest ( $"http ://{_httpBinHost}/cookies/set?my=cookie") ;
var requestSet = new HttpRequest ( $"http s ://{_httpBinHost}/cookies/set?my=cookie") ;
requestSet . AllowAutoRedirect = true ;
requestSet . StoreRequestCookie = false ;
requestSet . StoreResponseCookie . Should ( ) . BeFalse ( ) ;
@ -555,7 +627,7 @@ namespace NzbDrone.Common.Test.Http
[Test]
public void should_overwrite_response_cookie ( )
{
var requestSet = new HttpRequest ( $"http ://{_httpBinHost}/cookies/set?my=cookie") ;
var requestSet = new HttpRequest ( $"http s ://{_httpBinHost}/cookies/set?my=cookie") ;
requestSet . Cookies . Add ( "my" , "oldcookie" ) ;
requestSet . AllowAutoRedirect = false ;
requestSet . StoreRequestCookie = false ;
@ -563,7 +635,7 @@ namespace NzbDrone.Common.Test.Http
var responseSet = Subject . Get ( requestSet ) ;
var requestCookies = new HttpRequest ( $"http ://{_httpBinHost}/cookies") ;
var requestCookies = new HttpRequest ( $"http s ://{_httpBinHost}/cookies") ;
var responseCookies = Subject . Get < HttpCookieResource > ( requestCookies ) ;
@ -575,7 +647,7 @@ namespace NzbDrone.Common.Test.Http
[Test]
public void should_overwrite_temp_response_cookie ( )
{
var requestSet = new HttpRequest ( $"http ://{_httpBinHost}/cookies/set?my=cookie") ;
var requestSet = new HttpRequest ( $"http s ://{_httpBinHost}/cookies/set?my=cookie") ;
requestSet . Cookies . Add ( "my" , "oldcookie" ) ;
requestSet . AllowAutoRedirect = true ;
requestSet . StoreRequestCookie = true ;
@ -585,7 +657,7 @@ namespace NzbDrone.Common.Test.Http
responseSet . Resource . Cookies . Should ( ) . HaveCount ( 1 ) . And . Contain ( "my" , "cookie" ) ;
var requestCookies = new HttpRequest ( $"http ://{_httpBinHost}/cookies") ;
var requestCookies = new HttpRequest ( $"http s ://{_httpBinHost}/cookies") ;
var responseCookies = Subject . Get < HttpCookieResource > ( requestCookies ) ;
@ -597,7 +669,7 @@ namespace NzbDrone.Common.Test.Http
[Test]
public void should_not_delete_response_cookie ( )
{
var requestCookies = new HttpRequest ( $"http ://{_httpBinHost}/cookies") ;
var requestCookies = new HttpRequest ( $"http s ://{_httpBinHost}/cookies") ;
requestCookies . Cookies . Add ( "my" , "cookie" ) ;
requestCookies . AllowAutoRedirect = false ;
requestCookies . StoreRequestCookie = true ;
@ -606,14 +678,14 @@ namespace NzbDrone.Common.Test.Http
responseCookies . Resource . Cookies . Should ( ) . HaveCount ( 1 ) . And . Contain ( "my" , "cookie" ) ;
var requestDelete = new HttpRequest ( $"http ://{_httpBinHost}/cookies/delete?my") ;
var requestDelete = new HttpRequest ( $"http s ://{_httpBinHost}/cookies/delete?my") ;
requestDelete . AllowAutoRedirect = false ;
requestDelete . StoreRequestCookie = false ;
requestDelete . StoreResponseCookie = false ;
var responseDelete = Subject . Get ( requestDelete ) ;
requestCookies = new HttpRequest ( $"http ://{_httpBinHost}/cookies") ;
requestCookies = new HttpRequest ( $"http s ://{_httpBinHost}/cookies") ;
requestCookies . StoreRequestCookie = false ;
requestCookies . StoreResponseCookie = false ;
@ -627,7 +699,7 @@ namespace NzbDrone.Common.Test.Http
[Test]
public void should_delete_response_cookie ( )
{
var requestCookies = new HttpRequest ( $"http ://{_httpBinHost}/cookies") ;
var requestCookies = new HttpRequest ( $"http s ://{_httpBinHost}/cookies") ;
requestCookies . Cookies . Add ( "my" , "cookie" ) ;
requestCookies . AllowAutoRedirect = false ;
requestCookies . StoreRequestCookie = true ;
@ -636,14 +708,14 @@ namespace NzbDrone.Common.Test.Http
responseCookies . Resource . Cookies . Should ( ) . HaveCount ( 1 ) . And . Contain ( "my" , "cookie" ) ;
var requestDelete = new HttpRequest ( $"http ://{_httpBinHost}/cookies/delete?my") ;
var requestDelete = new HttpRequest ( $"http s ://{_httpBinHost}/cookies/delete?my") ;
requestDelete . AllowAutoRedirect = false ;
requestDelete . StoreRequestCookie = false ;
requestDelete . StoreResponseCookie = true ;
var responseDelete = Subject . Get ( requestDelete ) ;
requestCookies = new HttpRequest ( $"http ://{_httpBinHost}/cookies") ;
requestCookies = new HttpRequest ( $"http s ://{_httpBinHost}/cookies") ;
requestCookies . StoreRequestCookie = false ;
requestCookies . StoreResponseCookie = false ;
@ -657,7 +729,7 @@ namespace NzbDrone.Common.Test.Http
[Test]
public void should_delete_temp_response_cookie ( )
{
var requestCookies = new HttpRequest ( $"http ://{_httpBinHost}/cookies") ;
var requestCookies = new HttpRequest ( $"http s ://{_httpBinHost}/cookies") ;
requestCookies . Cookies . Add ( "my" , "cookie" ) ;
requestCookies . AllowAutoRedirect = false ;
requestCookies . StoreRequestCookie = true ;
@ -666,7 +738,7 @@ namespace NzbDrone.Common.Test.Http
responseCookies . Resource . Cookies . Should ( ) . HaveCount ( 1 ) . And . Contain ( "my" , "cookie" ) ;
var requestDelete = new HttpRequest ( $"http ://{_httpBinHost}/cookies/delete?my") ;
var requestDelete = new HttpRequest ( $"http s ://{_httpBinHost}/cookies/delete?my") ;
requestDelete . AllowAutoRedirect = true ;
requestDelete . StoreRequestCookie = false ;
requestDelete . StoreResponseCookie = false ;
@ -674,7 +746,7 @@ namespace NzbDrone.Common.Test.Http
responseDelete . Resource . Cookies . Should ( ) . BeEmpty ( ) ;
requestCookies = new HttpRequest ( $"http ://{_httpBinHost}/cookies") ;
requestCookies = new HttpRequest ( $"http s ://{_httpBinHost}/cookies") ;
requestCookies . StoreRequestCookie = false ;
requestCookies . StoreResponseCookie = false ;
@ -686,7 +758,7 @@ namespace NzbDrone.Common.Test.Http
[Test]
public void should_throw_on_http429_too_many_requests ( )
{
var request = new HttpRequest ( $"http ://{_httpBinHost}/status/429") ;
var request = new HttpRequest ( $"http s ://{_httpBinHost}/status/429") ;
Assert . Throws < TooManyRequestsException > ( ( ) = > Subject . Get ( request ) ) ;
@ -706,7 +778,7 @@ namespace NzbDrone.Common.Test.Http
. Setup ( v = > v . PostResponse ( It . IsAny < HttpResponse > ( ) ) )
. Returns < HttpResponse > ( r = > r ) ;
var request = new HttpRequest ( $"http ://{_httpBinHost}/get") ;
var request = new HttpRequest ( $"http s ://{_httpBinHost}/get") ;
Subject . Get ( request ) ;
@ -728,7 +800,7 @@ namespace NzbDrone.Common.Test.Http
{
// 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" ;
var requestSet = new HttpRequestBuilder ( $"http ://{_httpBinHost}/response-headers")
var requestSet = new HttpRequestBuilder ( $"http s ://{_httpBinHost}/response-headers")
. AddQueryParam ( "Set-Cookie" , malformedCookie )
. Build ( ) ;
@ -737,7 +809,7 @@ namespace NzbDrone.Common.Test.Http
var responseSet = Subject . Get ( requestSet ) ;
var request = new HttpRequest ( $"http ://{_httpBinHost}/get") ;
var request = new HttpRequest ( $"http s ://{_httpBinHost}/get") ;
var response = Subject . Get < HttpBinResource > ( request ) ;
@ -761,7 +833,7 @@ namespace NzbDrone.Common.Test.Http
{
try
{
string url = $"http ://{_httpBinHost}/response-headers?Set-Cookie={Uri.EscapeDataString(malformedCookie)}";
string url = $"http s ://{_httpBinHost}/response-headers?Set-Cookie={Uri.EscapeDataString(malformedCookie)}";
var requestSet = new HttpRequest ( url ) ;
requestSet . AllowAutoRedirect = false ;
@ -769,7 +841,7 @@ namespace NzbDrone.Common.Test.Http
var responseSet = Subject . Get ( requestSet ) ;
var request = new HttpRequest ( $"http ://{_httpBinHost}/get") ;
var request = new HttpRequest ( $"http s ://{_httpBinHost}/get") ;
var response = Subject . Get < HttpBinResource > ( request ) ;
@ -781,6 +853,17 @@ namespace NzbDrone.Common.Test.Http
{
}
}
[Test]
public void should_correctly_use_basic_auth ( )
{
var request = new HttpRequest ( $"https://{_httpBinHost}/basic-auth/username/password" ) ;
request . Credentials = new BasicNetworkCredential ( "username" , "password" ) ;
var response = Subject . Execute ( request ) ;
response . StatusCode . Should ( ) . Be ( HttpStatusCode . OK ) ;
}
}
public class HttpBinResource
@ -790,6 +873,8 @@ namespace NzbDrone.Common.Test.Http
public string Origin { get ; set ; }
public string Url { get ; set ; }
public string Data { get ; set ; }
public bool Gzipped { get ; set ; }
public bool Brotli { get ; set ; }
}
public class HttpCookieResource