mirror of
https://github.com/jellyfin/jellyfin.git
synced 2024-09-07 03:48:06 +02:00
161 lines
3.8 KiB
C#
161 lines
3.8 KiB
C#
|
using System;
|
|||
|
using System.Collections.Specialized;
|
|||
|
using System.IO;
|
|||
|
using System.Net;
|
|||
|
using System.Text;
|
|||
|
using HttpStatusCode = SocketHttpListener.Net.HttpStatusCode;
|
|||
|
using HttpVersion = SocketHttpListener.Net.HttpVersion;
|
|||
|
using System.Linq;
|
|||
|
using MediaBrowser.Model.Services;
|
|||
|
|
|||
|
namespace SocketHttpListener
|
|||
|
{
|
|||
|
internal class HttpResponse : HttpBase
|
|||
|
{
|
|||
|
#region Private Fields
|
|||
|
|
|||
|
private string _code;
|
|||
|
private string _reason;
|
|||
|
|
|||
|
#endregion
|
|||
|
|
|||
|
#region Private Constructors
|
|||
|
|
|||
|
private HttpResponse(string code, string reason, Version version, QueryParamCollection headers)
|
|||
|
: base(version, headers)
|
|||
|
{
|
|||
|
_code = code;
|
|||
|
_reason = reason;
|
|||
|
}
|
|||
|
|
|||
|
#endregion
|
|||
|
|
|||
|
#region Internal Constructors
|
|||
|
|
|||
|
internal HttpResponse(HttpStatusCode code)
|
|||
|
: this(code, code.GetDescription())
|
|||
|
{
|
|||
|
}
|
|||
|
|
|||
|
internal HttpResponse(HttpStatusCode code, string reason)
|
|||
|
: this(((int)code).ToString(), reason, HttpVersion.Version11, new QueryParamCollection())
|
|||
|
{
|
|||
|
Headers["Server"] = "websocket-sharp/1.0";
|
|||
|
}
|
|||
|
|
|||
|
#endregion
|
|||
|
|
|||
|
#region Public Properties
|
|||
|
|
|||
|
public CookieCollection Cookies
|
|||
|
{
|
|||
|
get
|
|||
|
{
|
|||
|
return Headers.GetCookies(true);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
public bool IsProxyAuthenticationRequired
|
|||
|
{
|
|||
|
get
|
|||
|
{
|
|||
|
return _code == "407";
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
public bool IsUnauthorized
|
|||
|
{
|
|||
|
get
|
|||
|
{
|
|||
|
return _code == "401";
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
public bool IsWebSocketResponse
|
|||
|
{
|
|||
|
get
|
|||
|
{
|
|||
|
var headers = Headers;
|
|||
|
return ProtocolVersion > HttpVersion.Version10 &&
|
|||
|
_code == "101" &&
|
|||
|
headers.Contains("Upgrade", "websocket") &&
|
|||
|
headers.Contains("Connection", "Upgrade");
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
public string Reason
|
|||
|
{
|
|||
|
get
|
|||
|
{
|
|||
|
return _reason;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
public string StatusCode
|
|||
|
{
|
|||
|
get
|
|||
|
{
|
|||
|
return _code;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
#endregion
|
|||
|
|
|||
|
#region Internal Methods
|
|||
|
|
|||
|
internal static HttpResponse CreateCloseResponse(HttpStatusCode code)
|
|||
|
{
|
|||
|
var res = new HttpResponse(code);
|
|||
|
res.Headers["Connection"] = "close";
|
|||
|
|
|||
|
return res;
|
|||
|
}
|
|||
|
|
|||
|
internal static HttpResponse CreateWebSocketResponse()
|
|||
|
{
|
|||
|
var res = new HttpResponse(HttpStatusCode.SwitchingProtocols);
|
|||
|
|
|||
|
var headers = res.Headers;
|
|||
|
headers["Upgrade"] = "websocket";
|
|||
|
headers["Connection"] = "Upgrade";
|
|||
|
|
|||
|
return res;
|
|||
|
}
|
|||
|
|
|||
|
#endregion
|
|||
|
|
|||
|
#region Public Methods
|
|||
|
|
|||
|
public void SetCookies(CookieCollection cookies)
|
|||
|
{
|
|||
|
if (cookies == null || cookies.Count == 0)
|
|||
|
return;
|
|||
|
|
|||
|
var headers = Headers;
|
|||
|
var sorted = cookies.OfType<Cookie>().OrderBy(i => i.Name).ToList();
|
|||
|
|
|||
|
foreach (var cookie in sorted)
|
|||
|
headers.Add("Set-Cookie", cookie.ToString());
|
|||
|
}
|
|||
|
|
|||
|
public override string ToString()
|
|||
|
{
|
|||
|
var output = new StringBuilder(64);
|
|||
|
output.AppendFormat("HTTP/{0} {1} {2}{3}", ProtocolVersion, _code, _reason, CrLf);
|
|||
|
|
|||
|
var headers = Headers;
|
|||
|
foreach (var key in headers.Keys)
|
|||
|
output.AppendFormat("{0}: {1}{2}", key, headers[key], CrLf);
|
|||
|
|
|||
|
output.Append(CrLf);
|
|||
|
|
|||
|
var entity = EntityBody;
|
|||
|
if (entity.Length > 0)
|
|||
|
output.Append(entity);
|
|||
|
|
|||
|
return output.ToString();
|
|||
|
}
|
|||
|
|
|||
|
#endregion
|
|||
|
}
|
|||
|
}
|