You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
124 lines
3.3 KiB
124 lines
3.3 KiB
using System;
|
|
using System.Linq;
|
|
using System.Net;
|
|
using System.Text;
|
|
using MediaBrowser.Model.Services;
|
|
using SocketHttpListener.Net;
|
|
using HttpStatusCode = SocketHttpListener.Net.HttpStatusCode;
|
|
using HttpVersion = SocketHttpListener.Net.HttpVersion;
|
|
|
|
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 => GetCookies(Headers, true);
|
|
|
|
private static CookieCollection GetCookies(QueryParamCollection headers, bool response)
|
|
{
|
|
var name = response ? "Set-Cookie" : "Cookie";
|
|
return headers == null || !headers.Contains(name)
|
|
? new CookieCollection()
|
|
: CookieHelper.Parse(headers[name], response);
|
|
}
|
|
|
|
public bool IsProxyAuthenticationRequired => _code == "407";
|
|
|
|
public bool IsUnauthorized => _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 => _reason;
|
|
|
|
public string StatusCode => _code;
|
|
|
|
#endregion
|
|
|
|
#region Internal Methods
|
|
|
|
internal static HttpResponse CreateCloseResponse(HttpStatusCode code)
|
|
{
|
|
var res = new HttpResponse(code);
|
|
res.Headers["Connection"] = "close";
|
|
|
|
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);
|
|
|
|
return output.ToString();
|
|
}
|
|
|
|
#endregion
|
|
}
|
|
}
|