Merge pull request #1960 from MediaBrowser/dev

Dev
This commit is contained in:
Luke 2016-07-21 14:44:29 -04:00 committed by GitHub
commit 0ef30db4e8
6 changed files with 114 additions and 78 deletions

View File

@ -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())

View File

@ -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;

View File

@ -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);
} }
} }
} }

View File

@ -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;

View File

@ -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" />

View File

@ -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>