SsdpHelper.cs 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. using System;
  2. using System.Collections.Generic;
  3. using System.IO;
  4. using System.Text;
  5. using MediaBrowser.Model.Net;
  6. using MediaBrowser.Model.Text;
  7. namespace RSSDP
  8. {
  9. public class SsdpHelper
  10. {
  11. private readonly ITextEncoding _encoding;
  12. public SsdpHelper(ITextEncoding encoding)
  13. {
  14. _encoding = encoding;
  15. }
  16. public SsdpMessageInfo ParseSsdpResponse(byte[] data)
  17. {
  18. using (var ms = new MemoryStream(data))
  19. {
  20. using (var reader = new StreamReader(ms, _encoding.GetASCIIEncoding()))
  21. {
  22. var proto = (reader.ReadLine() ?? string.Empty).Trim();
  23. var method = proto.Split(new[] { ' ' }, 2)[0];
  24. var headers = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase);
  25. for (var line = reader.ReadLine(); line != null; line = reader.ReadLine())
  26. {
  27. line = line.Trim();
  28. if (string.IsNullOrEmpty(line))
  29. {
  30. break;
  31. }
  32. var parts = line.Split(new[] { ':' }, 2);
  33. if (parts.Length >= 2)
  34. {
  35. headers[parts[0]] = parts[1].Trim();
  36. }
  37. }
  38. return new SsdpMessageInfo
  39. {
  40. Method = method,
  41. Headers = headers,
  42. Message = data
  43. };
  44. }
  45. }
  46. }
  47. public static string BuildMessage(string header, Dictionary<string, string> values)
  48. {
  49. var builder = new StringBuilder();
  50. const string argFormat = "{0}: {1}\r\n";
  51. builder.AppendFormat("{0}\r\n", header);
  52. foreach (var pair in values)
  53. {
  54. builder.AppendFormat(argFormat, pair.Key, pair.Value);
  55. }
  56. builder.Append("\r\n");
  57. return builder.ToString();
  58. }
  59. }
  60. public class SsdpMessageInfo
  61. {
  62. public string Method { get; set; }
  63. public IpEndPointInfo EndPoint { get; set; }
  64. public Dictionary<string, string> Headers { get; set; }
  65. public IpEndPointInfo LocalEndPoint { get; set; }
  66. public byte[] Message { get; set; }
  67. public SsdpMessageInfo()
  68. {
  69. Headers = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase);
  70. }
  71. }
  72. }