mirror of
https://github.com/Prowlarr/Prowlarr.git
synced 2026-04-18 21:55:12 -04:00
Fixed: Form data encoding for non-UTF8 indexers
This commit is contained in:
@@ -1,4 +1,5 @@
|
|||||||
using System;
|
using System;
|
||||||
|
using System.Text;
|
||||||
using FluentAssertions;
|
using FluentAssertions;
|
||||||
using NUnit.Framework;
|
using NUnit.Framework;
|
||||||
using NzbDrone.Common.Http;
|
using NzbDrone.Common.Http;
|
||||||
@@ -9,6 +10,12 @@ namespace NzbDrone.Common.Test.Http
|
|||||||
[TestFixture]
|
[TestFixture]
|
||||||
public class HttpRequestBuilderFixture : TestBase
|
public class HttpRequestBuilderFixture : TestBase
|
||||||
{
|
{
|
||||||
|
[OneTimeSetUp]
|
||||||
|
public void RegisterEncodingProvider()
|
||||||
|
{
|
||||||
|
Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
|
||||||
|
}
|
||||||
|
|
||||||
[TestCase("http://host/{seg}/some", "http://host/dir/some")]
|
[TestCase("http://host/{seg}/some", "http://host/dir/some")]
|
||||||
[TestCase("http://host/some/{seg}", "http://host/some/dir")]
|
[TestCase("http://host/some/{seg}", "http://host/some/dir")]
|
||||||
public void should_add_single_segment_url_segments(string url, string result)
|
public void should_add_single_segment_url_segments(string url, string result)
|
||||||
@@ -36,5 +43,70 @@ namespace NzbDrone.Common.Test.Http
|
|||||||
|
|
||||||
request.Url.FullUri.Should().Be("http://domain/v1/");
|
request.Url.FullUri.Should().Be("http://domain/v1/");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void should_encode_form_parameters_with_utf8_by_default()
|
||||||
|
{
|
||||||
|
var builder = new HttpRequestBuilder("http://domain/login")
|
||||||
|
.Post()
|
||||||
|
.AddFormParameter("username", "Привет");
|
||||||
|
|
||||||
|
var request = builder.Build();
|
||||||
|
var body = Encoding.UTF8.GetString(request.ContentData);
|
||||||
|
|
||||||
|
// UTF-8 encoding: Привет = %D0%9F%D1%80%D0%B8%D0%B2%D0%B5%D1%82
|
||||||
|
body.Should().Contain("username=%D0%9F%D1%80%D0%B8%D0%B2%D0%B5%D1%82");
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void should_encode_form_parameters_with_windows_1251_for_cyrillic()
|
||||||
|
{
|
||||||
|
var windows1251 = Encoding.GetEncoding("windows-1251");
|
||||||
|
|
||||||
|
var builder = new HttpRequestBuilder("http://domain/login")
|
||||||
|
.Post()
|
||||||
|
.SetEncoding(windows1251)
|
||||||
|
.AddFormParameter("username", "Привет");
|
||||||
|
|
||||||
|
var request = builder.Build();
|
||||||
|
var body = windows1251.GetString(request.ContentData);
|
||||||
|
|
||||||
|
// Windows-1251 encoding: Привет = %CF%F0%E8%E2%E5%F2
|
||||||
|
body.Should().Contain("username=%CF%F0%E8%E2%E5%F2");
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void should_encode_form_parameters_with_iso_8859_1_for_extended_latin()
|
||||||
|
{
|
||||||
|
var iso88591 = Encoding.GetEncoding("iso-8859-1");
|
||||||
|
|
||||||
|
var builder = new HttpRequestBuilder("http://domain/login")
|
||||||
|
.Post()
|
||||||
|
.SetEncoding(iso88591)
|
||||||
|
.AddFormParameter("username", "café");
|
||||||
|
|
||||||
|
var request = builder.Build();
|
||||||
|
var body = iso88591.GetString(request.ContentData);
|
||||||
|
|
||||||
|
// ISO-8859-1 encoding: é = %E9
|
||||||
|
body.Should().Contain("username=caf%E9");
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void should_encode_form_parameters_ascii_same_regardless_of_encoding()
|
||||||
|
{
|
||||||
|
var windows1251 = Encoding.GetEncoding("windows-1251");
|
||||||
|
|
||||||
|
var builder = new HttpRequestBuilder("http://domain/login")
|
||||||
|
.Post()
|
||||||
|
.SetEncoding(windows1251)
|
||||||
|
.AddFormParameter("username", "testuser")
|
||||||
|
.AddFormParameter("password", "pass123");
|
||||||
|
|
||||||
|
var request = builder.Build();
|
||||||
|
var body = windows1251.GetString(request.ContentData);
|
||||||
|
|
||||||
|
body.Should().Be("username=testuser&password=pass123");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -231,7 +231,7 @@ namespace NzbDrone.Common.Http
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
var parameters = FormData.Select(v => string.Format("{0}={1}", v.Name, Uri.EscapeDataString(Encoding.GetString(v.ContentData))));
|
var parameters = FormData.Select(v => string.Format("{0}={1}", v.Name, Encoding.GetString(v.ContentData).UrlEncode(Encoding)));
|
||||||
var urlencoded = string.Join("&", parameters);
|
var urlencoded = string.Join("&", parameters);
|
||||||
var body = Encoding.GetBytes(urlencoded);
|
var body = Encoding.GetBytes(urlencoded);
|
||||||
|
|
||||||
|
|||||||
@@ -58,6 +58,7 @@ public class FunFile : TorrentIndexerBase<UserPassTorrentBaseSettings>
|
|||||||
};
|
};
|
||||||
|
|
||||||
var authLoginRequest = requestBuilder
|
var authLoginRequest = requestBuilder
|
||||||
|
.SetEncoding(Encoding)
|
||||||
.AddFormParameter("username", Settings.Username)
|
.AddFormParameter("username", Settings.Username)
|
||||||
.AddFormParameter("password", Settings.Password)
|
.AddFormParameter("password", Settings.Password)
|
||||||
.AddFormParameter("returnto", "")
|
.AddFormParameter("returnto", "")
|
||||||
|
|||||||
@@ -57,6 +57,7 @@ namespace NzbDrone.Core.Indexers.Definitions
|
|||||||
};
|
};
|
||||||
|
|
||||||
var authLoginRequest = requestBuilder
|
var authLoginRequest = requestBuilder
|
||||||
|
.SetEncoding(Encoding)
|
||||||
.AddFormParameter("login_username", Settings.Username)
|
.AddFormParameter("login_username", Settings.Username)
|
||||||
.AddFormParameter("login_password", Settings.Password)
|
.AddFormParameter("login_password", Settings.Password)
|
||||||
.AddFormParameter("login", "Login")
|
.AddFormParameter("login", "Login")
|
||||||
|
|||||||
@@ -66,6 +66,7 @@ public class PreToMe : TorrentIndexerBase<PreToMeSettings>
|
|||||||
};
|
};
|
||||||
|
|
||||||
var authLoginRequest = requestBuilder
|
var authLoginRequest = requestBuilder
|
||||||
|
.SetEncoding(Encoding)
|
||||||
.SetCookies(loginPage.GetCookies())
|
.SetCookies(loginPage.GetCookies())
|
||||||
.AddFormParameter("username", Settings.Username)
|
.AddFormParameter("username", Settings.Username)
|
||||||
.AddFormParameter("password", Settings.Password)
|
.AddFormParameter("password", Settings.Password)
|
||||||
|
|||||||
@@ -91,6 +91,7 @@ namespace NzbDrone.Core.Indexers.Definitions
|
|||||||
Cookies = null;
|
Cookies = null;
|
||||||
|
|
||||||
var authLoginRequest = requestBuilder.Post()
|
var authLoginRequest = requestBuilder.Post()
|
||||||
|
.SetEncoding(Encoding)
|
||||||
.AddFormParameter("login_username", Settings.Username)
|
.AddFormParameter("login_username", Settings.Username)
|
||||||
.AddFormParameter("login_password", Settings.Password)
|
.AddFormParameter("login_password", Settings.Password)
|
||||||
.AddFormParameter("login", "Login")
|
.AddFormParameter("login", "Login")
|
||||||
|
|||||||
@@ -58,6 +58,7 @@ namespace NzbDrone.Core.Indexers.Definitions
|
|||||||
Cookies = null;
|
Cookies = null;
|
||||||
|
|
||||||
var authLoginRequest = requestBuilder
|
var authLoginRequest = requestBuilder
|
||||||
|
.SetEncoding(Encoding)
|
||||||
.AddFormParameter("username", Settings.Username)
|
.AddFormParameter("username", Settings.Username)
|
||||||
.AddFormParameter("password", Settings.Password)
|
.AddFormParameter("password", Settings.Password)
|
||||||
.AddFormParameter("returnto", "/")
|
.AddFormParameter("returnto", "/")
|
||||||
|
|||||||
Reference in New Issue
Block a user