summaryrefslogtreecommitdiff
path: root/tutorial
diff options
context:
space:
mode:
authorKyle Smith <ksmith.developer@gmail.com>2019-03-23 17:26:56 +0100
committerJens Geyer <jensg@apache.org>2019-03-27 00:17:55 +0100
commit7b94dd422117ffb6c646d1217c643efb80a8cf45 (patch)
tree6f59120dda391259e9e67a456ef6ae73964c1b81 /tutorial
parentddec431b4a402258c3b56b873908c98a15f22de4 (diff)
downloadthrift-7b94dd422117ffb6c646d1217c643efb80a8cf45.tar.gz
THRIFT-4839: Remove embedded buffering/framed options from TCP transports
Client: netstd Patch: Kyle Smith + minor changes by Jens Geyer This closes #1770
Diffstat (limited to 'tutorial')
-rw-r--r--tutorial/netstd/Client/Client.csproj4
-rw-r--r--tutorial/netstd/Client/Program.cs72
-rw-r--r--tutorial/netstd/Server/Program.cs81
3 files changed, 122 insertions, 35 deletions
diff --git a/tutorial/netstd/Client/Client.csproj b/tutorial/netstd/Client/Client.csproj
index 70eae1584..a1470a9d3 100644
--- a/tutorial/netstd/Client/Client.csproj
+++ b/tutorial/netstd/Client/Client.csproj
@@ -30,6 +30,10 @@
</PropertyGroup>
<ItemGroup>
+ <PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="2.2.0" />
+ </ItemGroup>
+
+ <ItemGroup>
<ProjectReference Include="..\Interfaces\Interfaces.csproj" />
<ProjectReference Include="..\..\..\lib\netstd\Thrift\Thrift.csproj" />
</ItemGroup>
diff --git a/tutorial/netstd/Client/Program.cs b/tutorial/netstd/Client/Program.cs
index 4b68cee4a..f9509fa2d 100644
--- a/tutorial/netstd/Client/Program.cs
+++ b/tutorial/netstd/Client/Program.cs
@@ -32,6 +32,7 @@ using Thrift.Transport.Client;
using tutorial;
using shared;
using Microsoft.Extensions.DependencyInjection;
+using System.Diagnostics;
namespace Client
{
@@ -47,17 +48,20 @@ Usage:
Client.exe -help
will diplay help information
- Client.exe -tr:<transport> -pr:<protocol> -mc:<numClients>
+ Client.exe -tr:<transport> -bf:<buffering> -pr:<protocol> -mc:<numClients>
will run client with specified arguments (tcp transport and binary protocol by default) and with 1 client
Options:
-tr (transport):
tcp - (default) tcp transport will be used (host - ""localhost"", port - 9090)
- tcpbuffered - buffered transport over tcp will be used (host - ""localhost"", port - 9090)
namedpipe - namedpipe transport will be used (pipe address - "".test"")
http - http transport will be used (address - ""http://localhost:9090"")
tcptls - tcp tls transport will be used (host - ""localhost"", port - 9090)
- framed - tcp framed transport will be used (host - ""localhost"", port - 9090)
+
+ -bf (buffering):
+ none - (default) no buffering will be used
+ buffered - buffered transport will be used
+ framed - framed transport will be used
-pr (protocol):
binary - (default) binary protocol will be used
@@ -139,29 +143,57 @@ Sample:
private static TTransport GetTransport(string[] args)
{
- var transport = args.FirstOrDefault(x => x.StartsWith("-tr"))?.Split(':')?[1];
+ TTransport transport = new TSocketTransport(IPAddress.Loopback, 9090);
- Transport selectedTransport;
- if (Enum.TryParse(transport, true, out selectedTransport))
+ // construct endpoint transport
+ var transportArg = args.FirstOrDefault(x => x.StartsWith("-tr"))?.Split(':')?[1];
+ if (Enum.TryParse(transportArg, true, out Transport selectedTransport))
{
switch (selectedTransport)
{
case Transport.Tcp:
- return new TSocketTransport(IPAddress.Loopback, 9090);
+ transport = new TSocketTransport(IPAddress.Loopback, 9090);
+ break;
+
case Transport.NamedPipe:
- return new TNamedPipeTransport(".test");
+ transport = new TNamedPipeTransport(".test");
+ break;
+
case Transport.Http:
- return new THttpTransport(new Uri("http://localhost:9090"), null);
- case Transport.TcpBuffered:
- return new TBufferedTransport(new TSocketTransport(IPAddress.Loopback, 9090));
+ transport = new THttpTransport(new Uri("http://localhost:9090"), null);
+ break;
+
case Transport.TcpTls:
- return new TTlsSocketTransport(IPAddress.Loopback, 9090, GetCertificate(), CertValidator, LocalCertificateSelectionCallback);
- case Transport.Framed:
- return new TFramedTransport(new TSocketTransport(IPAddress.Loopback, 9090));
+ transport = new TTlsSocketTransport(IPAddress.Loopback, 9090, GetCertificate(), CertValidator, LocalCertificateSelectionCallback);
+ break;
+
+ default:
+ Debug.Assert(false, "unhandled case");
+ break;
}
}
- return new TSocketTransport(IPAddress.Loopback, 9090);
+ // optionally add layered transport(s)
+ var bufferingArg = args.FirstOrDefault(x => x.StartsWith("-bf"))?.Split(':')?[1];
+ if (Enum.TryParse<Buffering>(bufferingArg, out var selectedBuffering))
+ {
+ switch (selectedBuffering)
+ {
+ case Buffering.Buffered:
+ transport = new TBufferedTransport(transport);
+ break;
+
+ case Buffering.Framed:
+ transport = new TFramedTransport(transport);
+ break;
+
+ default: // layered transport(s) are optional
+ Debug.Assert(selectedBuffering == Buffering.None, "unhandled case");
+ break;
+ }
+ }
+
+ return transport;
}
private static int GetNumberOfClients(string[] args)
@@ -231,6 +263,9 @@ Sample:
case Protocol.Multiplexed:
// it returns BinaryProtocol to avoid making wrapped protocol as public in TProtocolDecorator (in RunClientAsync it will be wrapped into Multiplexed protocol)
return new Tuple<Protocol, TProtocol>(selectedProtocol, new TBinaryProtocol(transport));
+ default:
+ Debug.Assert(false, "unhandled case");
+ break;
}
}
@@ -363,5 +398,12 @@ Sample:
Json,
Multiplexed
}
+
+ private enum Buffering
+ {
+ None,
+ Buffered,
+ Framed
+ }
}
}
diff --git a/tutorial/netstd/Server/Program.cs b/tutorial/netstd/Server/Program.cs
index c5e26d12d..25e7daeed 100644
--- a/tutorial/netstd/Server/Program.cs
+++ b/tutorial/netstd/Server/Program.cs
@@ -36,6 +36,7 @@ using Thrift.Transport.Server;
using tutorial;
using shared;
using Thrift.Processor;
+using System.Diagnostics;
namespace Server
{
@@ -85,17 +86,20 @@ Usage:
Server.exe -help
will diplay help information
- Server.exe -tr:<transport> -pr:<protocol>
- will run server with specified arguments (tcp transport and binary protocol by default)
+ Server.exe -tr:<transport> -bf:<buffering> -pr:<protocol>
+ will run server with specified arguments (tcp transport, no buffering, and binary protocol by default)
Options:
-tr (transport):
tcp - (default) tcp transport will be used (host - ""localhost"", port - 9090)
- tcpbuffered - tcp buffered transport will be used (host - ""localhost"", port - 9090)
namedpipe - namedpipe transport will be used (pipe address - "".test"")
http - http transport will be used (http address - ""localhost:9090"")
tcptls - tcp transport with tls will be used (host - ""localhost"", port - 9090)
- framed - tcp framed transport will be used (host - ""localhost"", port - 9090)
+
+ -bf (buffering):
+ none - (default) no buffering will be used
+ buffered - buffered transport will be used
+ framed - framed transport will be used
-pr (protocol):
binary - (default) binary protocol will be used
@@ -111,6 +115,7 @@ Sample:
private static async Task RunAsync(string[] args, CancellationToken cancellationToken)
{
var selectedTransport = GetTransport(args);
+ var selectedBuffering = GetBuffering(args);
var selectedProtocol = GetProtocol(args);
if (selectedTransport == Transport.Http)
@@ -119,7 +124,7 @@ Sample:
}
else
{
- await RunSelectedConfigurationAsync(selectedTransport, selectedProtocol, cancellationToken);
+ await RunSelectedConfigurationAsync(selectedTransport, selectedBuffering, selectedProtocol, cancellationToken);
}
}
@@ -132,6 +137,15 @@ Sample:
return selectedProtocol;
}
+ private static Buffering GetBuffering(string[] args)
+ {
+ var buffering = args.FirstOrDefault(x => x.StartsWith("-bf"))?.Split(":")?[1];
+
+ Enum.TryParse<Buffering>(buffering, out var selectedBuffering);
+
+ return selectedBuffering;
+ }
+
private static Transport GetTransport(string[] args)
{
var transport = args.FirstOrDefault(x => x.StartsWith("-tr"))?.Split(':')?[1];
@@ -141,10 +155,9 @@ Sample:
return selectedTransport;
}
- private static async Task RunSelectedConfigurationAsync(Transport transport, Protocol protocol, CancellationToken cancellationToken)
+ private static async Task RunSelectedConfigurationAsync(Transport transport, Buffering buffering, Protocol protocol, CancellationToken cancellationToken)
{
var handler = new CalculatorAsyncHandler();
- ITAsyncProcessor processor = null;
TServerTransport serverTransport = null;
switch (transport)
@@ -152,23 +165,36 @@ Sample:
case Transport.Tcp:
serverTransport = new TServerSocketTransport(9090);
break;
- case Transport.TcpBuffered:
- serverTransport = new TServerSocketTransport(port: 9090, clientTimeout: 10000, buffering: Buffering.BufferedTransport);
- break;
case Transport.NamedPipe:
serverTransport = new TNamedPipeServerTransport(".test");
break;
case Transport.TcpTls:
- serverTransport = new TTlsServerSocketTransport(9090, GetCertificate(), Buffering.None, ClientCertValidator, LocalCertificateSelectionCallback);
- break;
- case Transport.Framed:
- serverTransport = new TServerFramedTransport(9090);
+ serverTransport = new TTlsServerSocketTransport(9090, GetCertificate(), ClientCertValidator, LocalCertificateSelectionCallback);
break;
}
- TProtocolFactory inputProtocolFactory;
- TProtocolFactory outputProtocolFactory;
+ TTransportFactory inputTransportFactory = null;
+ TTransportFactory outputTransportFactory = null;
+ switch (buffering)
+ {
+ case Buffering.Buffered:
+ inputTransportFactory = new TBufferedTransport.Factory();
+ outputTransportFactory = new TBufferedTransport.Factory();
+ break;
+ case Buffering.Framed:
+ inputTransportFactory = new TFramedTransport.Factory();
+ outputTransportFactory = new TFramedTransport.Factory();
+ break;
+
+ default: // layered transport(s) are optional
+ Debug.Assert(buffering == Buffering.None, "unhandled case");
+ break;
+ }
+
+ TProtocolFactory inputProtocolFactory = null;
+ TProtocolFactory outputProtocolFactory = null;
+ ITAsyncProcessor processor = null;
switch (protocol)
{
case Protocol.Binary:
@@ -210,15 +236,25 @@ Sample:
throw new ArgumentOutOfRangeException(nameof(protocol), protocol, null);
}
+
try
{
Logger.LogInformation(
$"Selected TAsyncServer with {serverTransport} transport, {processor} processor and {inputProtocolFactory} protocol factories");
- var fabric = ServiceCollection.BuildServiceProvider().GetService<ILoggerFactory>();
- var server = new TSimpleAsyncServer(processor, serverTransport, inputProtocolFactory, outputProtocolFactory, fabric);
+ var loggerFactory = ServiceCollection.BuildServiceProvider().GetService<ILoggerFactory>();
+
+ var server = new TSimpleAsyncServer(
+ itProcessorFactory: new TSingletonProcessorFactory(processor),
+ serverTransport: serverTransport,
+ inputTransportFactory: inputTransportFactory,
+ outputTransportFactory: outputTransportFactory,
+ inputProtocolFactory: inputProtocolFactory,
+ outputProtocolFactory: outputProtocolFactory,
+ logger: loggerFactory.CreateLogger<TSimpleAsyncServer>());
Logger.LogInformation("Starting the server...");
+
await server.ServeAsync(cancellationToken);
}
catch (Exception x)
@@ -266,11 +302,16 @@ Sample:
private enum Transport
{
Tcp,
- TcpBuffered,
NamedPipe,
Http,
TcpTls,
- Framed
+ }
+
+ private enum Buffering
+ {
+ None,
+ Buffered,
+ Framed,
}
private enum Protocol