4
4
using Pipelines . Sockets . Unofficial ;
5
5
using System . Text ;
6
6
using TelnetNegotiationCore . Models ;
7
- using System . Collections . Immutable ;
8
7
using Microsoft . Extensions . Logging ;
9
8
10
- namespace TelnetNegotiationCore . TestClient
9
+ namespace TelnetNegotiationCore . TestClient ;
10
+
11
+ public class MockPipelineClient ( ILogger < MockPipelineClient > logger )
11
12
{
12
- public class MockPipelineClient ( ILogger < MockPipelineClient > logger )
13
+ private async ValueTask WriteToOutputStreamAsync ( byte [ ] arg , PipeWriter writer )
13
14
{
14
-
15
- private async Task WriteToOutputStreamAsync ( byte [ ] arg , PipeWriter writer )
15
+ try
16
16
{
17
- try
18
- {
19
- await writer . WriteAsync ( new ReadOnlyMemory < byte > ( arg ) , CancellationToken . None ) ;
20
- }
21
- catch ( ObjectDisposedException ode )
22
- {
23
- logger . LogError ( ode , "Stream has been closed" ) ;
24
- }
17
+ await writer . WriteAsync ( new ReadOnlyMemory < byte > ( arg ) , CancellationToken . None ) ;
25
18
}
26
-
27
- public static Task WriteBackAsync ( byte [ ] writeback , Encoding encoding , TelnetInterpreter t ) =>
28
- Task . Run ( ( ) => Console . WriteLine ( encoding . GetString ( writeback . AsSpan ( ) ) ) ) ;
29
-
30
- public Task SignalGMCPAsync ( ( string module , string writeback ) val )
19
+ catch ( ObjectDisposedException ode )
31
20
{
32
- logger . LogDebug ( "GMCP Signal: {Module}: {WriteBack}" , val . module , val . writeback ) ;
33
- return Task . CompletedTask ;
21
+ logger . LogError ( ode , "Stream has been closed" ) ;
34
22
}
23
+ }
35
24
36
- public Task SignalMSSPAsync ( MSSPConfig val )
37
- {
38
- logger . LogDebug ( "New MSSP: {@MSSPConfig}" , val ) ;
39
- return Task . CompletedTask ;
40
- }
25
+ public static async ValueTask WriteBackAsync ( byte [ ] writeback , Encoding encoding , TelnetInterpreter t ) =>
26
+ await Task . Run ( ( ) => Console . WriteLine ( encoding . GetString ( writeback . AsSpan ( ) ) ) ) ;
27
+
28
+ public ValueTask SignalGMCPAsync ( ( string module , string writeback ) val )
29
+ {
30
+ logger . LogDebug ( "GMCP Signal: {Module}: {WriteBack}" , val . module , val . writeback ) ;
31
+ return ValueTask . CompletedTask ;
32
+ }
41
33
42
- public Task SignalPromptAsync ( ) =>
43
- Task . Run ( ( ) => logger . LogDebug ( "Prompt" ) ) ;
34
+ public ValueTask SignalMSSPAsync ( MSSPConfig val )
35
+ {
36
+ logger . LogDebug ( "New MSSP: {@MSSPConfig}" , val ) ;
37
+ return ValueTask . CompletedTask ;
38
+ }
44
39
45
- public async Task StartAsync ( string address , int port )
40
+ public async ValueTask SignalPromptAsync ( ) =>
41
+ await Task . Run ( ( ) => logger . LogDebug ( "Prompt" ) ) ;
42
+
43
+ public async Task StartAsync ( string address , int port )
44
+ {
45
+ var client = new TcpClient ( address , port ) ;
46
+ var stream = client . GetStream ( ) ;
47
+ var pipe = StreamConnection . GetDuplex ( stream , new PipeOptions ( ) ) ;
48
+
49
+ var telnet = await new TelnetInterpreter ( TelnetInterpreter . TelnetMode . Client , logger )
46
50
{
47
- var client = new TcpClient ( address , port ) ;
48
- var stream = client . GetStream ( ) ;
49
- var pipe = StreamConnection . GetDuplex ( stream , new PipeOptions ( ) ) ;
51
+ CallbackOnSubmitAsync = WriteBackAsync ,
52
+ CallbackNegotiationAsync = ( x ) => WriteToOutputStreamAsync ( x , pipe . Output ) ,
53
+ SignalOnGMCPAsync = SignalGMCPAsync ,
54
+ SignalOnMSSPAsync = SignalMSSPAsync ,
55
+ SignalOnPromptingAsync = SignalPromptAsync ,
56
+ CharsetOrder = [ Encoding . GetEncoding ( "utf-8" ) , Encoding . GetEncoding ( "iso-8859-1" ) ]
57
+ } . BuildAsync ( ) ;
50
58
51
- var telnet = await new TelnetInterpreter ( TelnetInterpreter . TelnetMode . Client , logger )
52
- {
53
- CallbackOnSubmitAsync = WriteBackAsync ,
54
- CallbackNegotiationAsync = ( x ) => WriteToOutputStreamAsync ( x , pipe . Output ) ,
55
- SignalOnGMCPAsync = SignalGMCPAsync ,
56
- SignalOnMSSPAsync = SignalMSSPAsync ,
57
- SignalOnPromptingAsync = SignalPromptAsync ,
58
- CharsetOrder = new [ ] { Encoding . GetEncoding ( "utf-8" ) , Encoding . GetEncoding ( "iso-8859-1" ) }
59
- } . BuildAsync ( ) ;
59
+ var backgroundTask = Task . Run ( ( ) => ReadFromPipeline ( telnet , pipe . Input ) ) ;
60
60
61
- var backgroundTask = Task . Run ( ( ) => ReadFromPipeline ( telnet , pipe . Input ) ) ;
61
+ while ( true )
62
+ {
63
+ string read = Console . ReadLine ( ) ?? string . Empty ;
62
64
63
- while ( true )
65
+ if ( telnet != null )
64
66
{
65
- string read = Console . ReadLine ( ) ?? string . Empty ;
66
-
67
- if ( telnet != null )
68
- {
69
- await telnet . SendPromptAsync ( telnet ? . CurrentEncoding . GetBytes ( read ) ) ;
70
- }
67
+ await telnet . SendPromptAsync ( telnet ? . CurrentEncoding . GetBytes ( read ) ) ;
71
68
}
72
69
}
70
+ }
73
71
74
- /// <summary>
75
- /// Read data coming from the server and interpret it.
76
- /// </summary>
77
- /// <param name="reader">The Pipeline Reader</param>
78
- /// <returns>A ValueTask</returns>
79
- static async ValueTask ReadFromPipeline ( TelnetInterpreter telnet , PipeReader reader )
72
+ /// <summary>
73
+ /// Read data coming from the server and interpret it.
74
+ /// </summary>
75
+ /// <param name="telnet">Interpreter</param>
76
+ /// <param name="reader">The Pipeline Reader</param>
77
+ /// <returns>A ValueTask</returns>
78
+ static async ValueTask ReadFromPipeline ( TelnetInterpreter telnet , PipeReader reader )
79
+ {
80
+ while ( true )
80
81
{
81
- while ( true )
82
- {
83
- // await some data being available
84
- ReadResult read = await reader . ReadAtLeastAsync ( 1 ) ;
82
+ // await some data being available
83
+ var read = await reader . ReadAtLeastAsync ( 1 ) ;
85
84
86
- foreach ( var segment in read . Buffer )
87
- {
88
- await telnet . InterpretByteArrayAsync ( segment . Span . ToImmutableArray ( ) ) ;
89
- }
90
-
91
- // tell the pipe that we used everything
92
- reader . AdvanceTo ( read . Buffer . End ) ;
85
+ foreach ( var segment in read . Buffer )
86
+ {
87
+ await telnet . InterpretByteArrayAsync ( [ ..segment . Span ] ) ;
93
88
}
89
+
90
+ // tell the pipe that we used everything
91
+ reader . AdvanceTo ( read . Buffer . End ) ;
94
92
}
95
93
}
96
- }
94
+ }
0 commit comments