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.
jellyfin/RSSDP/SsdpHelper.cs

89 lines
2.5 KiB

using System;
using System.Collections.Generic;
using System.IO;
using System.Text;
using MediaBrowser.Model.Net;
using MediaBrowser.Model.Text;
namespace RSSDP
{
public class SsdpHelper
{
private readonly ITextEncoding _encoding;
public SsdpHelper(ITextEncoding encoding)
{
_encoding = encoding;
}
public SsdpMessageInfo ParseSsdpResponse(byte[] data)
{
using (var ms = new MemoryStream(data))
{
using (var reader = new StreamReader(ms, _encoding.GetASCIIEncoding()))
{
var proto = (reader.ReadLine() ?? string.Empty).Trim();
var method = proto.Split(new[] { ' ' }, 2)[0];
var headers = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase);
for (var line = reader.ReadLine(); line != null; line = reader.ReadLine())
{
line = line.Trim();
if (string.IsNullOrEmpty(line))
{
break;
}
var parts = line.Split(new[] { ':' }, 2);
if (parts.Length >= 2)
{
headers[parts[0]] = parts[1].Trim();
}
}
return new SsdpMessageInfo
{
Method = method,
Headers = headers,
Message = data
};
}
}
}
public static string BuildMessage(string header, Dictionary<string, string> values)
{
var builder = new StringBuilder();
const string argFormat = "{0}: {1}\r\n";
builder.AppendFormat("{0}\r\n", header);
foreach (var pair in values)
{
builder.AppendFormat(argFormat, pair.Key, pair.Value);
}
builder.Append("\r\n");
return builder.ToString();
}
}
public class SsdpMessageInfo
{
public string Method { get; set; }
public IpEndPointInfo EndPoint { get; set; }
public Dictionary<string, string> Headers { get; set; }
public IpEndPointInfo LocalEndPoint { get; set; }
public byte[] Message { get; set; }
public SsdpMessageInfo()
{
Headers = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase);
}
}
}