aboutsummaryrefslogtreecommitdiff
path: root/SocketHttpListener/HttpResponse.cs
diff options
context:
space:
mode:
Diffstat (limited to 'SocketHttpListener/HttpResponse.cs')
-rw-r--r--SocketHttpListener/HttpResponse.cs161
1 files changed, 161 insertions, 0 deletions
diff --git a/SocketHttpListener/HttpResponse.cs b/SocketHttpListener/HttpResponse.cs
new file mode 100644
index 000000000..5aca28c7c
--- /dev/null
+++ b/SocketHttpListener/HttpResponse.cs
@@ -0,0 +1,161 @@
+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
+ }
+} \ No newline at end of file