mirror of
https://github.com/jellyfin/jellyfin.git
synced 2025-06-23 15:30:56 -04:00
commit
0ef30db4e8
@ -140,7 +140,17 @@ namespace MediaBrowser.Common.Implementations.HttpClientManager
|
|||||||
|
|
||||||
private WebRequest GetRequest(HttpRequestOptions options, string method)
|
private WebRequest GetRequest(HttpRequestOptions options, string method)
|
||||||
{
|
{
|
||||||
var request = CreateWebRequest(options.Url);
|
var url = options.Url;
|
||||||
|
|
||||||
|
var uriAddress = new Uri(url);
|
||||||
|
var userInfo = uriAddress.UserInfo;
|
||||||
|
if (!string.IsNullOrWhiteSpace(userInfo))
|
||||||
|
{
|
||||||
|
_logger.Info("Found userInfo in url: {0} ... url: {1}", userInfo, url);
|
||||||
|
url = url.Replace(userInfo + "@", string.Empty);
|
||||||
|
}
|
||||||
|
|
||||||
|
var request = CreateWebRequest(url);
|
||||||
var httpWebRequest = request as HttpWebRequest;
|
var httpWebRequest = request as HttpWebRequest;
|
||||||
|
|
||||||
if (httpWebRequest != null)
|
if (httpWebRequest != null)
|
||||||
@ -183,9 +193,27 @@ namespace MediaBrowser.Common.Implementations.HttpClientManager
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!string.IsNullOrWhiteSpace(userInfo))
|
||||||
|
{
|
||||||
|
var parts = userInfo.Split(':');
|
||||||
|
if (parts.Length == 2)
|
||||||
|
{
|
||||||
|
request.Credentials = GetCredential(url, parts[0], parts[1]);
|
||||||
|
request.PreAuthenticate = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return request;
|
return request;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private CredentialCache GetCredential(string url, string username, string password)
|
||||||
|
{
|
||||||
|
//ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3;
|
||||||
|
CredentialCache credentialCache = new CredentialCache();
|
||||||
|
credentialCache.Add(new Uri(url), "Basic", new NetworkCredential(username, password));
|
||||||
|
return credentialCache;
|
||||||
|
}
|
||||||
|
|
||||||
private void AddRequestHeaders(HttpWebRequest request, HttpRequestOptions options)
|
private void AddRequestHeaders(HttpWebRequest request, HttpRequestOptions options)
|
||||||
{
|
{
|
||||||
foreach (var header in options.RequestHeaders.ToList())
|
foreach (var header in options.RequestHeaders.ToList())
|
||||||
|
@ -72,7 +72,10 @@ namespace MediaBrowser.Providers.MediaInfo
|
|||||||
// Try to translate to three character code
|
// Try to translate to three character code
|
||||||
// Be flexible and check against both the full and three character versions
|
// Be flexible and check against both the full and three character versions
|
||||||
var culture = _localization.GetCultures()
|
var culture = _localization.GetCultures()
|
||||||
.FirstOrDefault(i => string.Equals(i.DisplayName, language, StringComparison.OrdinalIgnoreCase) || string.Equals(i.Name, language, StringComparison.OrdinalIgnoreCase) || string.Equals(i.ThreeLetterISOLanguageName, language, StringComparison.OrdinalIgnoreCase) || string.Equals(i.TwoLetterISOLanguageName, language, StringComparison.OrdinalIgnoreCase));
|
.FirstOrDefault(i => string.Equals(i.DisplayName, language, StringComparison.OrdinalIgnoreCase) ||
|
||||||
|
string.Equals(i.Name, language, StringComparison.OrdinalIgnoreCase) ||
|
||||||
|
string.Equals(i.ThreeLetterISOLanguageName, language, StringComparison.OrdinalIgnoreCase) ||
|
||||||
|
string.Equals(i.TwoLetterISOLanguageName, language, StringComparison.OrdinalIgnoreCase));
|
||||||
|
|
||||||
if (culture != null)
|
if (culture != null)
|
||||||
{
|
{
|
||||||
@ -99,10 +102,12 @@ namespace MediaBrowser.Providers.MediaInfo
|
|||||||
private string NormalizeFilenameForSubtitleComparison(string filename)
|
private string NormalizeFilenameForSubtitleComparison(string filename)
|
||||||
{
|
{
|
||||||
// Try to account for sloppy file naming
|
// Try to account for sloppy file naming
|
||||||
filename = filename.Replace("-", string.Empty);
|
|
||||||
filename = filename.Replace("_", string.Empty);
|
filename = filename.Replace("_", string.Empty);
|
||||||
filename = filename.Replace(" ", string.Empty);
|
filename = filename.Replace(" ", string.Empty);
|
||||||
|
|
||||||
|
// can't normalize this due to languages such as pt-br
|
||||||
|
//filename = filename.Replace("-", string.Empty);
|
||||||
|
|
||||||
//filename = filename.Replace(".", string.Empty);
|
//filename = filename.Replace(".", string.Empty);
|
||||||
|
|
||||||
return filename;
|
return filename;
|
||||||
|
@ -3,6 +3,7 @@ using System.Collections.Specialized;
|
|||||||
using System.Globalization;
|
using System.Globalization;
|
||||||
using System.IO;
|
using System.IO;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
using System.Web;
|
using System.Web;
|
||||||
using ServiceStack;
|
using ServiceStack;
|
||||||
using ServiceStack.Web;
|
using ServiceStack.Web;
|
||||||
@ -32,53 +33,54 @@ namespace MediaBrowser.Server.Implementations.HttpServer.SocketSharp
|
|||||||
return header.Substring(ap + 1, end - ap - 1);
|
return header.Substring(ap + 1, end - ap - 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
void LoadMultiPart()
|
async Task LoadMultiPart()
|
||||||
{
|
{
|
||||||
string boundary = GetParameter(ContentType, "; boundary=");
|
string boundary = GetParameter(ContentType, "; boundary=");
|
||||||
if (boundary == null)
|
if (boundary == null)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
var input = GetSubStream(InputStream);
|
using (var requestStream = GetSubStream(InputStream))
|
||||||
|
|
||||||
//DB: 30/01/11 - Hack to get around non-seekable stream and received HTTP request
|
|
||||||
//Not ending with \r\n?
|
|
||||||
var ms = new MemoryStream(32 * 1024);
|
|
||||||
input.CopyTo(ms);
|
|
||||||
input = ms;
|
|
||||||
ms.WriteByte((byte)'\r');
|
|
||||||
ms.WriteByte((byte)'\n');
|
|
||||||
|
|
||||||
input.Position = 0;
|
|
||||||
|
|
||||||
//Uncomment to debug
|
|
||||||
//var content = new StreamReader(ms).ReadToEnd();
|
|
||||||
//Console.WriteLine(boundary + "::" + content);
|
|
||||||
//input.Position = 0;
|
|
||||||
|
|
||||||
var multi_part = new HttpMultipart(input, boundary, ContentEncoding);
|
|
||||||
|
|
||||||
HttpMultipart.Element e;
|
|
||||||
while ((e = multi_part.ReadNextElement()) != null)
|
|
||||||
{
|
{
|
||||||
if (e.Filename == null)
|
//DB: 30/01/11 - Hack to get around non-seekable stream and received HTTP request
|
||||||
{
|
//Not ending with \r\n?
|
||||||
byte[] copy = new byte[e.Length];
|
var ms = new MemoryStream(32 * 1024);
|
||||||
|
await requestStream.CopyToAsync(ms).ConfigureAwait(false);
|
||||||
|
|
||||||
input.Position = e.Start;
|
var input = ms;
|
||||||
input.Read(copy, 0, (int)e.Length);
|
ms.WriteByte((byte)'\r');
|
||||||
|
ms.WriteByte((byte)'\n');
|
||||||
|
|
||||||
form.Add(e.Name, (e.Encoding ?? ContentEncoding).GetString(copy));
|
input.Position = 0;
|
||||||
}
|
|
||||||
else
|
//Uncomment to debug
|
||||||
|
//var content = new StreamReader(ms).ReadToEnd();
|
||||||
|
//Console.WriteLine(boundary + "::" + content);
|
||||||
|
//input.Position = 0;
|
||||||
|
|
||||||
|
var multi_part = new HttpMultipart(input, boundary, ContentEncoding);
|
||||||
|
|
||||||
|
HttpMultipart.Element e;
|
||||||
|
while ((e = multi_part.ReadNextElement()) != null)
|
||||||
{
|
{
|
||||||
//
|
if (e.Filename == null)
|
||||||
// We use a substream, as in 2.x we will support large uploads streamed to disk,
|
{
|
||||||
//
|
byte[] copy = new byte[e.Length];
|
||||||
HttpPostedFile sub = new HttpPostedFile(e.Filename, e.ContentType, input, e.Start, e.Length);
|
|
||||||
files.AddFile(e.Name, sub);
|
input.Position = e.Start;
|
||||||
|
input.Read(copy, 0, (int)e.Length);
|
||||||
|
|
||||||
|
form.Add(e.Name, (e.Encoding ?? ContentEncoding).GetString(copy));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
//
|
||||||
|
// We use a substream, as in 2.x we will support large uploads streamed to disk,
|
||||||
|
//
|
||||||
|
HttpPostedFile sub = new HttpPostedFile(e.Filename, e.ContentType, input, e.Start, e.Length);
|
||||||
|
files.AddFile(e.Name, sub);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
EndSubStream(input);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public NameValueCollection Form
|
public NameValueCollection Form
|
||||||
@ -91,10 +93,15 @@ namespace MediaBrowser.Server.Implementations.HttpServer.SocketSharp
|
|||||||
files = new HttpFileCollection();
|
files = new HttpFileCollection();
|
||||||
|
|
||||||
if (IsContentType("multipart/form-data", true))
|
if (IsContentType("multipart/form-data", true))
|
||||||
LoadMultiPart();
|
{
|
||||||
else if (
|
var task = LoadMultiPart();
|
||||||
IsContentType("application/x-www-form-urlencoded", true))
|
Task.WaitAll(task);
|
||||||
LoadWwwForm();
|
}
|
||||||
|
else if (IsContentType("application/x-www-form-urlencoded", true))
|
||||||
|
{
|
||||||
|
var task = LoadWwwForm();
|
||||||
|
Task.WaitAll(task);
|
||||||
|
}
|
||||||
|
|
||||||
form.Protect();
|
form.Protect();
|
||||||
}
|
}
|
||||||
@ -220,50 +227,50 @@ namespace MediaBrowser.Server.Implementations.HttpServer.SocketSharp
|
|||||||
return String.Compare(ContentType, ct, true, Helpers.InvariantCulture) == 0;
|
return String.Compare(ContentType, ct, true, Helpers.InvariantCulture) == 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async Task LoadWwwForm()
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void LoadWwwForm()
|
|
||||||
{
|
{
|
||||||
using (Stream input = GetSubStream(InputStream))
|
using (Stream input = GetSubStream(InputStream))
|
||||||
{
|
{
|
||||||
using (StreamReader s = new StreamReader(input, ContentEncoding))
|
using (var ms = new MemoryStream())
|
||||||
{
|
{
|
||||||
StringBuilder key = new StringBuilder();
|
await input.CopyToAsync(ms).ConfigureAwait(false);
|
||||||
StringBuilder value = new StringBuilder();
|
ms.Position = 0;
|
||||||
int c;
|
|
||||||
|
|
||||||
while ((c = s.Read()) != -1)
|
using (StreamReader s = new StreamReader(ms, ContentEncoding))
|
||||||
{
|
{
|
||||||
if (c == '=')
|
StringBuilder key = new StringBuilder();
|
||||||
|
StringBuilder value = new StringBuilder();
|
||||||
|
int c;
|
||||||
|
|
||||||
|
while ((c = s.Read()) != -1)
|
||||||
{
|
{
|
||||||
value.Length = 0;
|
if (c == '=')
|
||||||
while ((c = s.Read()) != -1)
|
|
||||||
{
|
{
|
||||||
if (c == '&')
|
value.Length = 0;
|
||||||
|
while ((c = s.Read()) != -1)
|
||||||
|
{
|
||||||
|
if (c == '&')
|
||||||
|
{
|
||||||
|
AddRawKeyValue(key, value);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
value.Append((char)c);
|
||||||
|
}
|
||||||
|
if (c == -1)
|
||||||
{
|
{
|
||||||
AddRawKeyValue(key, value);
|
AddRawKeyValue(key, value);
|
||||||
break;
|
return;
|
||||||
}
|
}
|
||||||
else
|
|
||||||
value.Append((char)c);
|
|
||||||
}
|
}
|
||||||
if (c == -1)
|
else if (c == '&')
|
||||||
{
|
|
||||||
AddRawKeyValue(key, value);
|
AddRawKeyValue(key, value);
|
||||||
return;
|
else
|
||||||
}
|
key.Append((char)c);
|
||||||
}
|
}
|
||||||
else if (c == '&')
|
if (c == -1)
|
||||||
AddRawKeyValue(key, value);
|
AddRawKeyValue(key, value);
|
||||||
else
|
|
||||||
key.Append((char)c);
|
|
||||||
}
|
}
|
||||||
if (c == -1)
|
|
||||||
AddRawKeyValue(key, value);
|
|
||||||
|
|
||||||
EndSubStream(input);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -465,10 +465,6 @@ namespace MediaBrowser.Server.Implementations.HttpServer.SocketSharp
|
|||||||
return stream;
|
return stream;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void EndSubStream(Stream stream)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
public static string GetHandlerPathIfAny(string listenerUrl)
|
public static string GetHandlerPathIfAny(string listenerUrl)
|
||||||
{
|
{
|
||||||
if (listenerUrl == null) return null;
|
if (listenerUrl == null) return null;
|
||||||
|
@ -73,8 +73,8 @@
|
|||||||
<HintPath>..\packages\SimpleInjector.3.2.0\lib\net45\SimpleInjector.dll</HintPath>
|
<HintPath>..\packages\SimpleInjector.3.2.0\lib\net45\SimpleInjector.dll</HintPath>
|
||||||
<Private>True</Private>
|
<Private>True</Private>
|
||||||
</Reference>
|
</Reference>
|
||||||
<Reference Include="SocketHttpListener, Version=1.0.6039.31236, Culture=neutral, processorArchitecture=MSIL">
|
<Reference Include="SocketHttpListener, Version=1.0.6046.26351, Culture=neutral, processorArchitecture=MSIL">
|
||||||
<HintPath>..\packages\SocketHttpListener.1.0.0.33\lib\net45\SocketHttpListener.dll</HintPath>
|
<HintPath>..\packages\SocketHttpListener.1.0.0.35\lib\net45\SocketHttpListener.dll</HintPath>
|
||||||
<Private>True</Private>
|
<Private>True</Private>
|
||||||
</Reference>
|
</Reference>
|
||||||
<Reference Include="System" />
|
<Reference Include="System" />
|
||||||
|
@ -9,5 +9,5 @@
|
|||||||
<package id="morelinq" version="1.4.0" targetFramework="net45" />
|
<package id="morelinq" version="1.4.0" targetFramework="net45" />
|
||||||
<package id="Patterns.Logging" version="1.0.0.2" targetFramework="net45" />
|
<package id="Patterns.Logging" version="1.0.0.2" targetFramework="net45" />
|
||||||
<package id="SimpleInjector" version="3.2.0" targetFramework="net45" />
|
<package id="SimpleInjector" version="3.2.0" targetFramework="net45" />
|
||||||
<package id="SocketHttpListener" version="1.0.0.33" targetFramework="net45" />
|
<package id="SocketHttpListener" version="1.0.0.35" targetFramework="net45" />
|
||||||
</packages>
|
</packages>
|
Loading…
x
Reference in New Issue
Block a user