mirror of
https://github.com/jellyfin/jellyfin.git
synced 2025-12-23 09:14:45 +03:00
add loopback handler
This commit is contained in:
@@ -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
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user