jellyfin/MediaBrowser.Server.Implementations/HttpServer/SocketSharp/WebSocketSharpResponse.cs

152 lines
4 KiB
C#
Raw Normal View History

2014-07-19 03:28:40 +02:00
using System;
2016-06-19 18:53:43 +02:00
using System.Collections.Generic;
2014-07-19 03:28:40 +02:00
using System.IO;
using System.Net;
using MediaBrowser.Model.Logging;
using ServiceStack;
using ServiceStack.Host;
using ServiceStack.Web;
2015-01-03 20:38:22 +01:00
using HttpListenerResponse = SocketHttpListener.Net.HttpListenerResponse;
2014-07-19 03:28:40 +02:00
namespace MediaBrowser.Server.Implementations.HttpServer.SocketSharp
{
public class WebSocketSharpResponse : IHttpResponse
{
private readonly ILogger _logger;
private readonly HttpListenerResponse response;
2016-06-19 18:53:43 +02:00
public WebSocketSharpResponse(ILogger logger, HttpListenerResponse response, IRequest request)
2014-07-19 03:28:40 +02:00
{
_logger = logger;
this.response = response;
2016-06-19 18:53:43 +02:00
Items = new Dictionary<string, object>();
Request = request;
2014-07-19 03:28:40 +02:00
}
2016-06-19 18:53:43 +02:00
public IRequest Request { get; private set; }
2014-07-19 03:28:40 +02:00
public bool UseBufferedStream { get; set; }
2016-06-19 18:53:43 +02:00
public Dictionary<string, object> Items { get; private set; }
2014-07-19 03:28:40 +02:00
public object OriginalResponse
{
get { return response; }
}
public int StatusCode
{
get { return this.response.StatusCode; }
set { this.response.StatusCode = value; }
}
public string StatusDescription
{
get { return this.response.StatusDescription; }
set { this.response.StatusDescription = value; }
}
public string ContentType
{
get { return response.ContentType; }
set { response.ContentType = value; }
}
public ICookies Cookies { get; set; }
public void AddHeader(string name, string value)
{
if (string.Equals(name, "Content-Type", StringComparison.OrdinalIgnoreCase))
{
ContentType = value;
return;
}
response.AddHeader(name, value);
}
2016-06-19 18:53:43 +02:00
public string GetHeader(string name)
{
return response.Headers[name];
}
2014-07-19 03:28:40 +02:00
public void Redirect(string url)
{
response.Redirect(url);
}
public Stream OutputStream
{
get { return response.OutputStream; }
}
public object Dto { get; set; }
public void Write(string text)
{
2016-10-07 17:08:13 +02:00
var bOutput = System.Text.Encoding.UTF8.GetBytes(text);
response.ContentLength64 = bOutput.Length;
2014-07-19 03:28:40 +02:00
2016-10-07 17:08:13 +02:00
var outputStream = response.OutputStream;
outputStream.Write(bOutput, 0, bOutput.Length);
Close();
2014-07-19 03:28:40 +02:00
}
public void Close()
{
if (!this.IsClosed)
{
this.IsClosed = true;
try
{
this.response.CloseOutputStream(_logger);
}
catch (Exception ex)
{
_logger.ErrorException("Error closing HttpListener output stream", ex);
}
}
}
public void End()
{
Close();
}
public void Flush()
{
response.OutputStream.Flush();
}
public bool IsClosed
{
get;
private set;
}
public void SetContentLength(long contentLength)
{
//you can happily set the Content-Length header in Asp.Net
//but HttpListener will complain if you do - you have to set ContentLength64 on the response.
//workaround: HttpListener throws "The parameter is incorrect" exceptions when we try to set the Content-Length header
response.ContentLength64 = contentLength;
}
public void SetCookie(Cookie cookie)
{
var cookieStr = cookie.AsHeaderValue();
response.Headers.Add(HttpHeaders.SetCookie, cookieStr);
}
public bool SendChunked
{
get { return response.SendChunked; }
set { response.SendChunked = value; }
}
2014-11-15 16:51:49 +01:00
public bool KeepAlive { get; set; }
2016-06-19 18:53:43 +02:00
public void ClearCookies()
{
}
2014-07-19 03:28:40 +02:00
}
}