|
|
|
@ -86,9 +86,7 @@ namespace Jellyfin.SocketSharp
|
|
|
|
|
|
|
|
|
|
private static readonly char[] HttpTrimCharacters = new char[] { (char)0x09, (char)0xA, (char)0xB, (char)0xC, (char)0xD, (char)0x20 };
|
|
|
|
|
|
|
|
|
|
//
|
|
|
|
|
// CheckBadChars - throws on invalid chars to be not found in header name/value
|
|
|
|
|
//
|
|
|
|
|
internal static string CheckBadChars(string name)
|
|
|
|
|
{
|
|
|
|
|
if (name == null || name.Length == 0)
|
|
|
|
@ -97,11 +95,11 @@ namespace Jellyfin.SocketSharp
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// VALUE check
|
|
|
|
|
//Trim spaces from both ends
|
|
|
|
|
// Trim spaces from both ends
|
|
|
|
|
name = name.Trim(HttpTrimCharacters);
|
|
|
|
|
|
|
|
|
|
//First, check for correctly formed multi-line value
|
|
|
|
|
//Second, check for absenece of CTL characters
|
|
|
|
|
// First, check for correctly formed multi-line value
|
|
|
|
|
// Second, check for absenece of CTL characters
|
|
|
|
|
int crlf = 0;
|
|
|
|
|
for (int i = 0; i < name.Length; ++i)
|
|
|
|
|
{
|
|
|
|
@ -198,7 +196,10 @@ namespace Jellyfin.SocketSharp
|
|
|
|
|
public static string GetResponseContentType(IRequest httpReq)
|
|
|
|
|
{
|
|
|
|
|
var specifiedContentType = GetQueryStringContentType(httpReq);
|
|
|
|
|
if (!string.IsNullOrEmpty(specifiedContentType)) return specifiedContentType;
|
|
|
|
|
if (!string.IsNullOrEmpty(specifiedContentType))
|
|
|
|
|
{
|
|
|
|
|
return specifiedContentType;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
var serverDefaultContentType = "application/json";
|
|
|
|
|
|
|
|
|
@ -237,7 +238,7 @@ namespace Jellyfin.SocketSharp
|
|
|
|
|
return Soap11;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//We could also send a '406 Not Acceptable', but this is allowed also
|
|
|
|
|
// We could also send a '406 Not Acceptable', but this is allowed also
|
|
|
|
|
return serverDefaultContentType;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -252,7 +253,10 @@ namespace Jellyfin.SocketSharp
|
|
|
|
|
|
|
|
|
|
foreach (var contentType in contentTypes)
|
|
|
|
|
{
|
|
|
|
|
if (IsContentType(request, contentType)) return true;
|
|
|
|
|
if (IsContentType(request, contentType))
|
|
|
|
|
{
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return false;
|
|
|
|
@ -274,10 +278,12 @@ namespace Jellyfin.SocketSharp
|
|
|
|
|
{
|
|
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (pi[0] == '/')
|
|
|
|
|
{
|
|
|
|
|
pi = pi.Substring(1);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
format = LeftPart(pi, '/');
|
|
|
|
|
if (format.Length > formatMaxLength)
|
|
|
|
|
{
|
|
|
|
@ -285,7 +291,7 @@ namespace Jellyfin.SocketSharp
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
format = LeftPart(format, '.').ToLowerInvariant();
|
|
|
|
|
format = LeftPart(format, '.');
|
|
|
|
|
if (format.Contains("json", StringComparison.OrdinalIgnoreCase))
|
|
|
|
|
{
|
|
|
|
|
return "application/json";
|
|
|
|
@ -349,7 +355,7 @@ namespace Jellyfin.SocketSharp
|
|
|
|
|
return pathInfo;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//Wildcard mode relies on this to work out the handlerPath
|
|
|
|
|
// Wildcard mode relies on this to work out the handlerPath
|
|
|
|
|
pathInfo = ResolvePathInfoFromMappedPath(fullPath, appPath);
|
|
|
|
|
if (!string.IsNullOrEmpty(pathInfo))
|
|
|
|
|
{
|
|
|
|
|