123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123 |
- 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
- }
- }
|