add loopback handler

This commit is contained in:
Luke Pulverenti
2016-09-03 13:16:36 -04:00
parent adeb944c61
commit 2d7c82d0dd
18 changed files with 79 additions and 144 deletions

View File

@@ -30,7 +30,7 @@ namespace MediaBrowser.Server.Implementations.Udp
private bool _isDisposed;
private readonly List<Tuple<string, byte[], Action<string, Encoding>>> _responders = new List<Tuple<string, byte[], Action<string, Encoding>>>();
private readonly List<Tuple<string, bool, Func<string, string, Encoding, Task>>> _responders = new List<Tuple<string, bool, Func<string, string, Encoding, Task>>>();
private readonly IServerApplicationHost _appHost;
private readonly IJsonSerializer _json;
@@ -49,42 +49,35 @@ namespace MediaBrowser.Server.Implementations.Udp
_appHost = appHost;
_json = json;
AddMessageResponder("who is EmbyServer?", RespondToV2Message);
AddMessageResponder("who is MediaBrowserServer_v2?", RespondToV2Message);
AddMessageResponder("who is EmbyServer?", true, RespondToV2Message);
AddMessageResponder("who is MediaBrowserServer_v2?", false, RespondToV2Message);
}
private void AddMessageResponder(string message, Action<string, Encoding> responder)
private void AddMessageResponder(string message, bool isSubstring, Func<string, string, Encoding, Task> responder)
{
var expectedMessageBytes = Encoding.UTF8.GetBytes(message);
_responders.Add(new Tuple<string, byte[], Action<string, Encoding>>(message, expectedMessageBytes, responder));
_responders.Add(new Tuple<string, bool, Func<string, string, Encoding, Task>>(message, isSubstring, responder));
}
/// <summary>
/// Raises the <see cref="E:MessageReceived" /> event.
/// </summary>
/// <param name="e">The <see cref="UdpMessageReceivedEventArgs"/> instance containing the event data.</param>
private void OnMessageReceived(UdpMessageReceivedEventArgs e)
private async void OnMessageReceived(UdpMessageReceivedEventArgs e)
{
var responder = _responders.FirstOrDefault(i => i.Item2.SequenceEqual(e.Bytes));
var encoding = Encoding.UTF8;
var responder = GetResponder(e.Bytes, encoding);
if (responder == null)
{
var text = Encoding.Unicode.GetString(e.Bytes);
responder = _responders.FirstOrDefault(i => string.Equals(i.Item1, text, StringComparison.OrdinalIgnoreCase));
if (responder != null)
{
encoding = Encoding.Unicode;
}
encoding = Encoding.Unicode;
responder = GetResponder(e.Bytes, encoding);
}
if (responder != null)
{
try
{
responder.Item3(e.RemoteEndPoint, encoding);
await responder.Item2.Item3(responder.Item1, e.RemoteEndPoint, encoding).ConfigureAwait(false);
}
catch (Exception ex)
{
@@ -93,8 +86,34 @@ namespace MediaBrowser.Server.Implementations.Udp
}
}
private async void RespondToV2Message(string endpoint, Encoding encoding)
private Tuple<string, Tuple<string, bool, Func<string, string, Encoding, Task>>> GetResponder(byte[] bytes, Encoding encoding)
{
var text = encoding.GetString(bytes);
var responder = _responders.FirstOrDefault(i =>
{
if (i.Item2)
{
return text.IndexOf(i.Item1, StringComparison.OrdinalIgnoreCase) != -1;
}
return string.Equals(i.Item1, text, StringComparison.OrdinalIgnoreCase);
});
if (responder == null)
{
return null;
}
return new Tuple<string, Tuple<string, bool, Func<string, string, Encoding, Task>>>(text, responder);
}
private async Task RespondToV2Message(string messageText, string endpoint, Encoding encoding)
{
var parts = messageText.Split('|');
if (parts.Length > 1)
{
_appHost.EnableLoopback(parts[1]);
}
var localUrl = await _appHost.GetLocalApiUrl().ConfigureAwait(false);
if (!string.IsNullOrEmpty(localUrl))
@@ -106,7 +125,7 @@ namespace MediaBrowser.Server.Implementations.Udp
Name = _appHost.FriendlyName
};
await SendAsync(encoding.GetBytes(_json.SerializeToString(response)), endpoint);
await SendAsync(encoding.GetBytes(_json.SerializeToString(response)), endpoint).ConfigureAwait(false);
}
else
{