Skip to content

Commit 699ef0f

Browse files
committed
UnknownPackageHandler
1 parent 5d74143 commit 699ef0f

File tree

3 files changed

+83
-0
lines changed

3 files changed

+83
-0
lines changed

src/SuperSocket.Command/CommandMiddleware.cs

+21
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,8 @@ public class CommandMiddleware<TKey, TNetPackageInfo, TPackageInfo> : Middleware
4545
{
4646
private Dictionary<TKey, ICommandSet> _commands;
4747

48+
private Func<IAppSession, TPackageInfo, CancellationToken, ValueTask> _unknownPackageHandler;
49+
4850
private ILogger _logger;
4951

5052
protected IPackageMapper<TNetPackageInfo, TPackageInfo> PackageMapper { get; private set; }
@@ -136,6 +138,18 @@ public CommandMiddleware(IServiceProvider serviceProvider, IOptions<CommandOptio
136138
_commands = commandDict;
137139

138140
PackageMapper = packageMapper != null ? packageMapper : CreatePackageMapper(serviceProvider);
141+
142+
var unknownPackageHandler = commandOptions.Value.UnknownPackageHandler;
143+
144+
if (unknownPackageHandler != null)
145+
{
146+
_unknownPackageHandler = unknownPackageHandler as Func<IAppSession, TPackageInfo, CancellationToken, ValueTask>;
147+
148+
if (_unknownPackageHandler == null)
149+
{
150+
_logger.LogError($"{nameof(commandOptions.Value.UnknownPackageHandler)} was registered with incorrectly. The expected typew is {typeof(Func<IAppSession, TPackageInfo, ValueTask>).Name}.");
151+
}
152+
}
139153
}
140154

141155
private void RegisterCommandInterfaces(List<CommandTypeInfo> commandInterfaces, List<ICommandSetFactory> commandSetFactories, IServiceProvider serviceProvider, Type sessionType, Type packageType, bool wrapRequired = false)
@@ -200,6 +214,13 @@ protected virtual async ValueTask HandlePackage(IAppSession session, TPackageInf
200214
{
201215
if (!_commands.TryGetValue(package.Key, out ICommandSet commandSet))
202216
{
217+
var unknownPackageHandler = _unknownPackageHandler;
218+
219+
if (unknownPackageHandler != null)
220+
{
221+
await unknownPackageHandler.Invoke(session, package, cancellationToken);
222+
}
223+
203224
return;
204225
}
205226

src/SuperSocket.Command/CommandOptions.cs

+11
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,10 @@
22
using System.Linq;
33
using System.Collections.Generic;
44
using System.Reflection;
5+
using System.Threading.Tasks;
6+
using SuperSocket.ProtoBase;
7+
using SuperSocket.Server.Abstractions.Session;
8+
using System.Threading;
59

610
namespace SuperSocket.Command
711
{
@@ -13,6 +17,13 @@ public CommandOptions()
1317
_globalCommandFilterTypes = new List<Type>();
1418
}
1519

20+
internal object UnknownPackageHandler { get; private set; }
21+
22+
public void RegisterUnknownPackageHandler<TPackageInfo>(Func<IAppSession, TPackageInfo, CancellationToken, ValueTask> unknownPackageHandler)
23+
{
24+
UnknownPackageHandler = unknownPackageHandler;
25+
}
26+
1627
public CommandAssemblyConfig[] Assemblies { get; set; }
1728

1829
public List<ICommandSource> CommandSources { get; set; }

test/SuperSocket.Tests/CommandTest.cs

+51
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,57 @@ public async Task TestCommands(Type hostConfiguratorType)
8989
}
9090
}
9191

92+
[Theory]
93+
[InlineData(typeof(RegularHostConfigurator))]
94+
[InlineData(typeof(SecureHostConfigurator))]
95+
public async Task TestUnknownCommands(Type hostConfiguratorType)
96+
{
97+
var hostConfigurator = CreateObject<IHostConfigurator>(hostConfiguratorType);
98+
using (var server = CreateSocketServerBuilder<StringPackageInfo, CommandLinePipelineFilter>(hostConfigurator)
99+
.UseCommand(commandOptions =>
100+
{
101+
// register commands one by one
102+
commandOptions.AddCommand<ADD>();
103+
commandOptions.RegisterUnknownPackageHandler<StringPackageInfo>(async (session, package, cancellationToken) =>
104+
{
105+
await session.SendAsync(Encoding.UTF8.GetBytes("X\r\n"));
106+
});
107+
108+
// register all commands in one assembly
109+
//commandOptions.AddCommandAssembly(typeof(SUB).GetTypeInfo().Assembly);
110+
})
111+
.BuildAsServer())
112+
{
113+
114+
Assert.Equal("TestServer", server.Name);
115+
116+
Assert.True(await server.StartAsync());
117+
OutputHelper.WriteLine("Server started.");
118+
119+
120+
var client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
121+
await client.ConnectAsync(hostConfigurator.GetServerEndPoint());
122+
OutputHelper.WriteLine("Connected.");
123+
124+
using (var stream = await hostConfigurator.GetClientStream(client))
125+
using (var streamReader = new StreamReader(stream, Utf8Encoding, true))
126+
using (var streamWriter = new StreamWriter(stream, Utf8Encoding, 1024 * 1024 * 4))
127+
{
128+
await streamWriter.WriteAsync("ADD 1 2 3\r\n");
129+
await streamWriter.FlushAsync();
130+
var line = await streamReader.ReadLineAsync();
131+
Assert.Equal("6", line);
132+
133+
await streamWriter.WriteAsync("MULT 2 5\r\n");
134+
await streamWriter.FlushAsync();
135+
line = await streamReader.ReadLineAsync();
136+
Assert.Equal("X", line);
137+
}
138+
139+
await server.StopAsync();
140+
}
141+
}
142+
92143
[Theory]
93144
[InlineData(typeof(RegularHostConfigurator))]
94145
[InlineData(typeof(SecureHostConfigurator))]

0 commit comments

Comments
 (0)