aboutsummaryrefslogtreecommitdiff
path: root/MediaBrowser.Dlna/Ssdp/SsdpHandler.cs
diff options
context:
space:
mode:
Diffstat (limited to 'MediaBrowser.Dlna/Ssdp/SsdpHandler.cs')
-rw-r--r--MediaBrowser.Dlna/Ssdp/SsdpHandler.cs108
1 files changed, 82 insertions, 26 deletions
diff --git a/MediaBrowser.Dlna/Ssdp/SsdpHandler.cs b/MediaBrowser.Dlna/Ssdp/SsdpHandler.cs
index 5b3746aeb4..28ea5ad6c9 100644
--- a/MediaBrowser.Dlna/Ssdp/SsdpHandler.cs
+++ b/MediaBrowser.Dlna/Ssdp/SsdpHandler.cs
@@ -67,7 +67,7 @@ namespace MediaBrowser.Dlna.Ssdp
}
return String.Format(
- "{0}{1}/{2}.{3} UPnP/1.0 DLNADOC/1.5 MediaBrowser/{4}",
+ "{0}{1}/{2}.{3} UPnP/1.0 DLNADOC/1.5 Emby/{4}",
pstring,
IntPtr.Size * 8,
os.Version.Major,
@@ -88,24 +88,21 @@ namespace MediaBrowser.Dlna.Ssdp
private async void OnMessageReceived(SsdpMessageEventArgs args)
{
- if (string.Equals(args.Method, "M-SEARCH", StringComparison.OrdinalIgnoreCase))
- {
- var headers = args.Headers;
+ var headers = args.Headers;
+ string st;
+ if (string.Equals(args.Method, "M-SEARCH", StringComparison.OrdinalIgnoreCase) && headers.TryGetValue("st", out st))
+ {
TimeSpan delay = GetSearchDelay(headers);
-
+
if (_config.GetDlnaConfiguration().EnableDebugLogging)
{
_logger.Debug("Delaying search response by {0} seconds", delay.TotalSeconds);
}
-
+
await Task.Delay(delay).ConfigureAwait(false);
- string st;
- if (headers.TryGetValue("st", out st))
- {
- RespondToSearch(args.EndPoint, st);
- }
+ RespondToSearch(args.EndPoint, st);
}
EventHelper.FireEventIfNotNull(MessageReceived, this, args, _logger);
@@ -166,9 +163,11 @@ namespace MediaBrowser.Dlna.Ssdp
var msg = new SsdpMessageBuilder().BuildMessage(header, values);
var queued = false;
+ var enableDebugLogging = _config.GetDlnaConfiguration().EnableDebugLogging;
+
for (var i = 0; i < sendCount; i++)
{
- var dgram = new Datagram(endpoint, localAddress, _logger, msg, ignoreBindFailure);
+ var dgram = new Datagram(endpoint, localAddress, _logger, msg, ignoreBindFailure, enableDebugLogging);
if (_messageQueue.Count == 0)
{
@@ -212,10 +211,9 @@ namespace MediaBrowser.Dlna.Ssdp
private void RespondToSearch(EndPoint endpoint, string deviceType)
{
- if (_config.GetDlnaConfiguration().EnableDebugLogging)
- {
- _logger.Debug("RespondToSearch");
- }
+ var enableDebugLogging = _config.GetDlnaConfiguration().EnableDebugLogging;
+
+ var isLogged = false;
const string header = "HTTP/1.1 200 OK";
@@ -224,6 +222,15 @@ namespace MediaBrowser.Dlna.Ssdp
if (string.Equals(deviceType, "ssdp:all", StringComparison.OrdinalIgnoreCase) ||
string.Equals(deviceType, d.Type, StringComparison.OrdinalIgnoreCase))
{
+ if (!isLogged)
+ {
+ if (enableDebugLogging)
+ {
+ _logger.Debug("Responding to search from {0} for {1}", endpoint, deviceType);
+ }
+ isLogged = true;
+ }
+
var values = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase);
values["CACHE-CONTROL"] = "max-age = 600";
@@ -238,7 +245,7 @@ namespace MediaBrowser.Dlna.Ssdp
SendDatagram(header, values, endpoint, new IPEndPoint(d.Address, 0), true, 1);
//SendDatagram(header, values, endpoint, null, true);
- if (_config.GetDlnaConfiguration().EnableDebugLogging)
+ if (enableDebugLogging)
{
_logger.Debug("{1} - Responded to a {0} request to {2}", d.Type, endpoint, d.Address.ToString());
}
@@ -316,7 +323,9 @@ namespace MediaBrowser.Dlna.Ssdp
var received = (byte[])result.AsyncState;
- if (_config.GetDlnaConfiguration().EnableDebugLogging)
+ var enableDebugLogging = _config.GetDlnaConfiguration().EnableDebugLogging;
+
+ if (enableDebugLogging)
{
_logger.Debug(Encoding.ASCII.GetString(received));
}
@@ -324,7 +333,12 @@ namespace MediaBrowser.Dlna.Ssdp
var args = SsdpHelper.ParseSsdpResponse(received);
args.EndPoint = endpoint;
- if (_config.GetDlnaConfiguration().EnableDebugLogging)
+ if (IsSelfNotification(args))
+ {
+ return;
+ }
+
+ if (enableDebugLogging)
{
var headerTexts = args.Headers.Select(i => string.Format("{0}={1}", i.Key, i.Value));
var headerText = string.Join(",", headerTexts.ToArray());
@@ -345,6 +359,44 @@ namespace MediaBrowser.Dlna.Ssdp
}
}
+ internal bool IsSelfNotification(SsdpMessageEventArgs args)
+ {
+ // Avoid responding to self search messages
+ //string serverId;
+ //if (args.Headers.TryGetValue("X-EMBYSERVERID", out serverId) &&
+ // string.Equals(serverId, _appHost.SystemId, StringComparison.OrdinalIgnoreCase))
+ //{
+ // return true;
+ //}
+
+ string server;
+ args.Headers.TryGetValue("SERVER", out server);
+
+ if (string.Equals(server, _serverSignature, StringComparison.OrdinalIgnoreCase))
+ {
+ return true;
+ }
+ return false;
+ //string usn;
+ //args.Headers.TryGetValue("USN", out usn);
+
+ //if (string.IsNullOrWhiteSpace(usn))
+ //{
+ // return false;
+ //}
+
+ //_logger.Debug("IsSelfNotification test: " + usn);
+
+ //return RegisteredDevices.Any(i =>
+ //{
+ // var isSameDevice = string.Equals(usn, i.USN, StringComparison.OrdinalIgnoreCase) ||
+ // i.USN.IndexOf(usn, StringComparison.OrdinalIgnoreCase) != 1 ||
+ // usn.IndexOf(i.USN, StringComparison.OrdinalIgnoreCase) != 1;
+
+ // return isSameDevice;
+ //});
+ }
+
public void Dispose()
{
_config.NamedConfigurationUpdated -= _config_ConfigurationUpdated;
@@ -399,17 +451,19 @@ namespace MediaBrowser.Dlna.Ssdp
private void NotifyAll()
{
- if (_config.GetDlnaConfiguration().EnableDebugLogging)
+ var enableDebugLogging = _config.GetDlnaConfiguration().EnableDebugLogging;
+
+ if (enableDebugLogging)
{
_logger.Debug("Sending alive notifications");
}
foreach (var d in RegisteredDevices)
{
- NotifyDevice(d, "alive", 1);
+ NotifyDevice(d, "alive", 1, enableDebugLogging);
}
}
- private void NotifyDevice(UpnpDevice dev, string type, int sendCount)
+ private void NotifyDevice(UpnpDevice dev, string type, int sendCount, bool logMessage)
{
const string header = "NOTIFY * HTTP/1.1";
@@ -424,7 +478,7 @@ namespace MediaBrowser.Dlna.Ssdp
values["NT"] = dev.Type;
values["USN"] = dev.USN;
- if (_config.GetDlnaConfiguration().EnableDebugLogging)
+ if (logMessage)
{
_logger.Debug("{0} said {1}", dev.USN, type);
}
@@ -457,7 +511,7 @@ namespace MediaBrowser.Dlna.Ssdp
foreach (var d in dl.ToList())
{
- NotifyDevice(d, "byebye", 2);
+ NotifyDevice(d, "byebye", 2, true);
}
_logger.Debug("Unregistered mount {0}", uuid);
@@ -468,13 +522,15 @@ namespace MediaBrowser.Dlna.Ssdp
private int _aliveNotifierIntervalMs;
private void ReloadAliveNotifier()
{
- if (!_config.GetDlnaConfiguration().BlastAliveMessages)
+ var config = _config.GetDlnaConfiguration();
+
+ if (!config.BlastAliveMessages)
{
DisposeNotificationTimer();
return;
}
- var intervalMs = _config.GetDlnaConfiguration().BlastAliveMessageIntervalSeconds * 1000;
+ var intervalMs = config.BlastAliveMessageIntervalSeconds * 1000;
if (_notificationTimer == null || _aliveNotifierIntervalMs != intervalMs)
{