| Jens Geyer | aa0c8b3 | 2019-01-28 23:27:45 +0100 | [diff] [blame] | 1 | // Licensed to the Apache Software Foundation(ASF) under one | 
 | 2 | // or more contributor license agreements.See the NOTICE file | 
 | 3 | // distributed with this work for additional information | 
 | 4 | // regarding copyright ownership.The ASF licenses this file | 
 | 5 | // to you under the Apache License, Version 2.0 (the | 
 | 6 | // "License"); you may not use this file except in compliance | 
 | 7 | // with the License. You may obtain a copy of the License at | 
 | 8 | // | 
 | 9 | //     http://www.apache.org/licenses/LICENSE-2.0 | 
 | 10 | // | 
 | 11 | // Unless required by applicable law or agreed to in writing, | 
 | 12 | // software distributed under the License is distributed on an | 
 | 13 | // "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY | 
 | 14 | // KIND, either express or implied. See the License for the | 
 | 15 | // specific language governing permissions and limitations | 
 | 16 | // under the License. | 
 | 17 |  | 
 | 18 | using System; | 
 | 19 | using System.Collections.Generic; | 
| Jens Geyer | adde44b | 2019-02-05 01:00:02 +0100 | [diff] [blame] | 20 | using System.Diagnostics; | 
| Jens Geyer | aa0c8b3 | 2019-01-28 23:27:45 +0100 | [diff] [blame] | 21 | using System.IO; | 
 | 22 | using System.Linq; | 
 | 23 | using System.Security.Authentication; | 
 | 24 | using System.Security.Cryptography.X509Certificates; | 
 | 25 | using System.Text; | 
 | 26 | using System.Threading; | 
 | 27 | using System.Threading.Tasks; | 
 | 28 | using Microsoft.Extensions.Logging; | 
 | 29 | using Thrift; | 
 | 30 | using Thrift.Collections; | 
 | 31 | using Thrift.Processor; | 
 | 32 | using Thrift.Protocol; | 
 | 33 | using Thrift.Server; | 
 | 34 | using Thrift.Transport; | 
 | 35 | using Thrift.Transport.Server; | 
 | 36 |  | 
| Jens Geyer | 828ffa8 | 2020-11-21 15:15:32 +0100 | [diff] [blame] | 37 | #pragma warning disable IDE0063  // using can be simplified, we don't | 
| Jens Geyer | 2b2ea62 | 2021-04-09 22:55:11 +0200 | [diff] [blame] | 38 | #pragma warning disable IDE0057  // substr can be simplified, we don't | 
| Jens Geyer | 98a2325 | 2022-01-09 16:50:52 +0100 | [diff] [blame] | 39 | #pragma warning disable CS1998   // await missing | 
| Jens Geyer | 828ffa8 | 2020-11-21 15:15:32 +0100 | [diff] [blame] | 40 |  | 
| Jens Geyer | aa0c8b3 | 2019-01-28 23:27:45 +0100 | [diff] [blame] | 41 | namespace ThriftTest | 
 | 42 | { | 
| Jens Geyer | adde44b | 2019-02-05 01:00:02 +0100 | [diff] [blame] | 43 |     internal enum ProtocolChoice | 
 | 44 |     { | 
 | 45 |         Binary, | 
 | 46 |         Compact, | 
 | 47 |         Json | 
 | 48 |     } | 
 | 49 |  | 
| Jens Geyer | adde44b | 2019-02-05 01:00:02 +0100 | [diff] [blame] | 50 |     internal enum TransportChoice | 
 | 51 |     { | 
 | 52 |         Socket, | 
 | 53 |         TlsSocket, | 
 | 54 |         NamedPipe | 
 | 55 |     } | 
 | 56 |  | 
| Kyle Smith | 7b94dd4 | 2019-03-23 17:26:56 +0100 | [diff] [blame] | 57 |     internal enum BufferChoice | 
 | 58 |     { | 
 | 59 |         None, | 
 | 60 |         Buffered, | 
 | 61 |         Framed | 
 | 62 |     } | 
 | 63 |  | 
| Jens Geyer | 63d114d | 2021-05-25 23:42:35 +0200 | [diff] [blame] | 64 |     internal enum ServerChoice | 
 | 65 |     { | 
 | 66 |         Simple, | 
 | 67 |         ThreadPool | 
 | 68 |     } | 
 | 69 |  | 
 | 70 |  | 
| Jens Geyer | aa0c8b3 | 2019-01-28 23:27:45 +0100 | [diff] [blame] | 71 |     internal class ServerParam | 
 | 72 |     { | 
| Kyle Smith | 7b94dd4 | 2019-03-23 17:26:56 +0100 | [diff] [blame] | 73 |         internal BufferChoice buffering = BufferChoice.None; | 
| Jens Geyer | adde44b | 2019-02-05 01:00:02 +0100 | [diff] [blame] | 74 |         internal ProtocolChoice protocol = ProtocolChoice.Binary; | 
 | 75 |         internal TransportChoice transport = TransportChoice.Socket; | 
| Jens Geyer | 63d114d | 2021-05-25 23:42:35 +0200 | [diff] [blame] | 76 |         internal ServerChoice server = ServerChoice.Simple; | 
| Jens Geyer | aa0c8b3 | 2019-01-28 23:27:45 +0100 | [diff] [blame] | 77 |         internal int port = 9090; | 
| Jens Geyer | 98a2325 | 2022-01-09 16:50:52 +0100 | [diff] [blame] | 78 |         internal string pipe = string.Empty; | 
| Jens Geyer | aa0c8b3 | 2019-01-28 23:27:45 +0100 | [diff] [blame] | 79 |  | 
 | 80 |         internal void Parse(List<string> args) | 
 | 81 |         { | 
 | 82 |             for (var i = 0; i < args.Count; i++) | 
 | 83 |             { | 
 | 84 |                 if (args[i].StartsWith("--pipe=")) | 
 | 85 |                 { | 
 | 86 |                     pipe = args[i].Substring(args[i].IndexOf("=") + 1); | 
| Jens Geyer | adde44b | 2019-02-05 01:00:02 +0100 | [diff] [blame] | 87 |                     transport = TransportChoice.NamedPipe; | 
| Jens Geyer | aa0c8b3 | 2019-01-28 23:27:45 +0100 | [diff] [blame] | 88 |                 } | 
 | 89 |                 else if (args[i].StartsWith("--port=")) | 
 | 90 |                 { | 
 | 91 |                     port = int.Parse(args[i].Substring(args[i].IndexOf("=") + 1)); | 
| Jens Geyer | adde44b | 2019-02-05 01:00:02 +0100 | [diff] [blame] | 92 |                     if(transport != TransportChoice.TlsSocket) | 
 | 93 |                         transport = TransportChoice.Socket; | 
| Jens Geyer | aa0c8b3 | 2019-01-28 23:27:45 +0100 | [diff] [blame] | 94 |                 } | 
 | 95 |                 else if (args[i] == "-b" || args[i] == "--buffered" || args[i] == "--transport=buffered") | 
 | 96 |                 { | 
| Kyle Smith | 7b94dd4 | 2019-03-23 17:26:56 +0100 | [diff] [blame] | 97 |                     buffering = BufferChoice.Buffered; | 
| Jens Geyer | aa0c8b3 | 2019-01-28 23:27:45 +0100 | [diff] [blame] | 98 |                 } | 
 | 99 |                 else if (args[i] == "-f" || args[i] == "--framed" || args[i] == "--transport=framed") | 
 | 100 |                 { | 
| Kyle Smith | 7b94dd4 | 2019-03-23 17:26:56 +0100 | [diff] [blame] | 101 |                     buffering = BufferChoice.Framed; | 
| Jens Geyer | aa0c8b3 | 2019-01-28 23:27:45 +0100 | [diff] [blame] | 102 |                 } | 
 | 103 |                 else if (args[i] == "--binary" || args[i] == "--protocol=binary") | 
 | 104 |                 { | 
| Jens Geyer | adde44b | 2019-02-05 01:00:02 +0100 | [diff] [blame] | 105 |                     protocol = ProtocolChoice.Binary; | 
| Jens Geyer | aa0c8b3 | 2019-01-28 23:27:45 +0100 | [diff] [blame] | 106 |                 } | 
 | 107 |                 else if (args[i] == "--compact" || args[i] == "--protocol=compact") | 
 | 108 |                 { | 
| Jens Geyer | adde44b | 2019-02-05 01:00:02 +0100 | [diff] [blame] | 109 |                     protocol = ProtocolChoice.Compact; | 
| Jens Geyer | aa0c8b3 | 2019-01-28 23:27:45 +0100 | [diff] [blame] | 110 |                 } | 
 | 111 |                 else if (args[i] == "--json" || args[i] == "--protocol=json") | 
 | 112 |                 { | 
| Jens Geyer | adde44b | 2019-02-05 01:00:02 +0100 | [diff] [blame] | 113 |                     protocol = ProtocolChoice.Json; | 
| Jens Geyer | aa0c8b3 | 2019-01-28 23:27:45 +0100 | [diff] [blame] | 114 |                 } | 
| Jens Geyer | 63d114d | 2021-05-25 23:42:35 +0200 | [diff] [blame] | 115 |                 else if (args[i] == "--server-type=simple") | 
 | 116 |                 { | 
 | 117 |                     server = ServerChoice.Simple; | 
 | 118 |                 } | 
| Jens Geyer | aa0c8b3 | 2019-01-28 23:27:45 +0100 | [diff] [blame] | 119 |                 else if (args[i] == "--threaded" || args[i] == "--server-type=threaded") | 
 | 120 |                 { | 
 | 121 |                     throw new NotImplementedException(args[i]); | 
 | 122 |                 } | 
 | 123 |                 else if (args[i] == "--threadpool" || args[i] == "--server-type=threadpool") | 
 | 124 |                 { | 
| Jens Geyer | 63d114d | 2021-05-25 23:42:35 +0200 | [diff] [blame] | 125 |                     server = ServerChoice.ThreadPool; | 
| Jens Geyer | aa0c8b3 | 2019-01-28 23:27:45 +0100 | [diff] [blame] | 126 |                 } | 
 | 127 |                 else if (args[i] == "--prototype" || args[i] == "--processor=prototype") | 
 | 128 |                 { | 
 | 129 |                     throw new NotImplementedException(args[i]); | 
 | 130 |                 } | 
 | 131 |                 else if (args[i] == "--ssl") | 
 | 132 |                 { | 
| Jens Geyer | adde44b | 2019-02-05 01:00:02 +0100 | [diff] [blame] | 133 |                     transport = TransportChoice.TlsSocket; | 
 | 134 |                 } | 
 | 135 |                 else if (args[i] == "--help") | 
 | 136 |                 { | 
 | 137 |                     PrintOptionsHelp(); | 
 | 138 |                     return; | 
| Jens Geyer | aa0c8b3 | 2019-01-28 23:27:45 +0100 | [diff] [blame] | 139 |                 } | 
 | 140 |                 else | 
 | 141 |                 { | 
| Jens Geyer | adde44b | 2019-02-05 01:00:02 +0100 | [diff] [blame] | 142 |                     Console.WriteLine("Invalid argument: {0}", args[i]); | 
 | 143 |                     PrintOptionsHelp(); | 
 | 144 |                     return; | 
| Jens Geyer | aa0c8b3 | 2019-01-28 23:27:45 +0100 | [diff] [blame] | 145 |                 } | 
 | 146 |             } | 
 | 147 |  | 
 | 148 |         } | 
| Jens Geyer | adde44b | 2019-02-05 01:00:02 +0100 | [diff] [blame] | 149 |  | 
 | 150 |         internal static void PrintOptionsHelp() | 
 | 151 |         { | 
 | 152 |             Console.WriteLine("Server options:"); | 
 | 153 |             Console.WriteLine("  --pipe=<pipe name>"); | 
 | 154 |             Console.WriteLine("  --port=<port number>"); | 
 | 155 |             Console.WriteLine("  --transport=<transport name>    one of buffered,framed  (defaults to none)"); | 
 | 156 |             Console.WriteLine("  --protocol=<protocol name>      one of compact,json  (defaults to binary)"); | 
 | 157 |             Console.WriteLine("  --server-type=<type>            one of threaded,threadpool  (defaults to simple)"); | 
 | 158 |             Console.WriteLine("  --processor=<prototype>"); | 
 | 159 |             Console.WriteLine("  --ssl"); | 
 | 160 |             Console.WriteLine(); | 
 | 161 |         } | 
| Jens Geyer | aa0c8b3 | 2019-01-28 23:27:45 +0100 | [diff] [blame] | 162 |     } | 
 | 163 |  | 
 | 164 |     public class TestServer | 
 | 165 |     { | 
| Jens Geyer | ef0cb01 | 2021-04-02 12:18:15 +0200 | [diff] [blame] | 166 |         #pragma warning disable CA2211 | 
 | 167 |         public static int _clientID = -1;  // use with Interlocked only! | 
 | 168 |         #pragma warning restore CA2211 | 
 | 169 |  | 
| Jens Geyer | 98a2325 | 2022-01-09 16:50:52 +0100 | [diff] [blame] | 170 |         private static readonly TConfiguration Configuration = new();  | 
| Jens Geyer | eacd1d4 | 2019-11-20 19:03:14 +0100 | [diff] [blame] | 171 |  | 
| Jens Geyer | aa0c8b3 | 2019-01-28 23:27:45 +0100 | [diff] [blame] | 172 |         public delegate void TestLogDelegate(string msg, params object[] values); | 
 | 173 |  | 
 | 174 |         public class MyServerEventHandler : TServerEventHandler | 
 | 175 |         { | 
 | 176 |             public int callCount = 0; | 
 | 177 |  | 
 | 178 |             public Task PreServeAsync(CancellationToken cancellationToken) | 
 | 179 |             { | 
 | 180 |                 callCount++; | 
 | 181 |                 return Task.CompletedTask; | 
 | 182 |             } | 
 | 183 |  | 
| Jens Geyer | 98a2325 | 2022-01-09 16:50:52 +0100 | [diff] [blame] | 184 |             public async Task<object?> CreateContextAsync(TProtocol input, TProtocol output, CancellationToken cancellationToken) | 
| Jens Geyer | aa0c8b3 | 2019-01-28 23:27:45 +0100 | [diff] [blame] | 185 |             { | 
 | 186 |                 callCount++; | 
| Jens Geyer | 98a2325 | 2022-01-09 16:50:52 +0100 | [diff] [blame] | 187 |                 return null; | 
| Jens Geyer | aa0c8b3 | 2019-01-28 23:27:45 +0100 | [diff] [blame] | 188 |             } | 
 | 189 |  | 
 | 190 |             public Task DeleteContextAsync(object serverContext, TProtocol input, TProtocol output, CancellationToken cancellationToken) | 
 | 191 |             { | 
 | 192 |                 callCount++; | 
 | 193 |                 return Task.CompletedTask; | 
 | 194 |             } | 
 | 195 |  | 
 | 196 |             public Task ProcessContextAsync(object serverContext, TTransport transport, CancellationToken cancellationToken) | 
 | 197 |             { | 
 | 198 |                 callCount++; | 
 | 199 |                 return Task.CompletedTask; | 
 | 200 |             } | 
 | 201 |         } | 
 | 202 |  | 
 | 203 |         public class TestHandlerAsync : ThriftTest.IAsync | 
 | 204 |         { | 
| Jens Geyer | 98a2325 | 2022-01-09 16:50:52 +0100 | [diff] [blame] | 205 |             //public TServer Server { get; set; } | 
| Jens Geyer | 261cad3 | 2019-11-20 19:03:14 +0100 | [diff] [blame] | 206 |             private readonly int handlerID; | 
| Jens Geyer | 2b2ea62 | 2021-04-09 22:55:11 +0200 | [diff] [blame] | 207 |             private readonly StringBuilder sb = new(); | 
| Jens Geyer | 261cad3 | 2019-11-20 19:03:14 +0100 | [diff] [blame] | 208 |             private readonly TestLogDelegate logger; | 
| Jens Geyer | aa0c8b3 | 2019-01-28 23:27:45 +0100 | [diff] [blame] | 209 |  | 
 | 210 |             public TestHandlerAsync() | 
 | 211 |             { | 
 | 212 |                 handlerID = Interlocked.Increment(ref _clientID); | 
| Jens Geyer | 261cad3 | 2019-11-20 19:03:14 +0100 | [diff] [blame] | 213 |                 logger += TestConsoleLogger; | 
| Jens Geyer | aa0c8b3 | 2019-01-28 23:27:45 +0100 | [diff] [blame] | 214 |                 logger.Invoke("New TestHandler instance created"); | 
 | 215 |             } | 
 | 216 |  | 
| Jens Geyer | 261cad3 | 2019-11-20 19:03:14 +0100 | [diff] [blame] | 217 |             public void TestConsoleLogger(string msg, params object[] values) | 
| Jens Geyer | aa0c8b3 | 2019-01-28 23:27:45 +0100 | [diff] [blame] | 218 |             { | 
 | 219 |                 sb.Clear(); | 
 | 220 |                 sb.AppendFormat("handler{0:D3}:", handlerID); | 
 | 221 |                 sb.AppendFormat(msg, values); | 
 | 222 |                 sb.AppendLine(); | 
 | 223 |                 Console.Write(sb.ToString()); | 
 | 224 |             } | 
 | 225 |  | 
| Jens Geyer | 2b2ea62 | 2021-04-09 22:55:11 +0200 | [diff] [blame] | 226 |             public Task testVoid(CancellationToken cancellationToken) | 
| Jens Geyer | aa0c8b3 | 2019-01-28 23:27:45 +0100 | [diff] [blame] | 227 |             { | 
 | 228 |                 logger.Invoke("testVoid()"); | 
 | 229 |                 return Task.CompletedTask; | 
 | 230 |             } | 
 | 231 |  | 
| Jens Geyer | 3cac320 | 2022-01-31 18:04:35 +0100 | [diff] [blame] | 232 |             public Task<string> testString(string? thing, CancellationToken cancellationToken) | 
| Jens Geyer | aa0c8b3 | 2019-01-28 23:27:45 +0100 | [diff] [blame] | 233 |             { | 
| Jens Geyer | 3cac320 | 2022-01-31 18:04:35 +0100 | [diff] [blame] | 234 |                 logger.Invoke("testString({0})", thing ?? "<null>"); | 
 | 235 |                 return Task.FromResult(thing ?? string.Empty); | 
| Jens Geyer | aa0c8b3 | 2019-01-28 23:27:45 +0100 | [diff] [blame] | 236 |             } | 
 | 237 |  | 
| Jens Geyer | 2b2ea62 | 2021-04-09 22:55:11 +0200 | [diff] [blame] | 238 |             public Task<bool> testBool(bool thing, CancellationToken cancellationToken) | 
| Jens Geyer | aa0c8b3 | 2019-01-28 23:27:45 +0100 | [diff] [blame] | 239 |             { | 
 | 240 |                 logger.Invoke("testBool({0})", thing); | 
 | 241 |                 return Task.FromResult(thing); | 
 | 242 |             } | 
 | 243 |  | 
| Jens Geyer | 2b2ea62 | 2021-04-09 22:55:11 +0200 | [diff] [blame] | 244 |             public Task<sbyte> testByte(sbyte thing, CancellationToken cancellationToken) | 
| Jens Geyer | aa0c8b3 | 2019-01-28 23:27:45 +0100 | [diff] [blame] | 245 |             { | 
 | 246 |                 logger.Invoke("testByte({0})", thing); | 
 | 247 |                 return Task.FromResult(thing); | 
 | 248 |             } | 
 | 249 |  | 
| Jens Geyer | 2b2ea62 | 2021-04-09 22:55:11 +0200 | [diff] [blame] | 250 |             public Task<int> testI32(int thing, CancellationToken cancellationToken) | 
| Jens Geyer | aa0c8b3 | 2019-01-28 23:27:45 +0100 | [diff] [blame] | 251 |             { | 
 | 252 |                 logger.Invoke("testI32({0})", thing); | 
 | 253 |                 return Task.FromResult(thing); | 
 | 254 |             } | 
 | 255 |  | 
| Jens Geyer | 2b2ea62 | 2021-04-09 22:55:11 +0200 | [diff] [blame] | 256 |             public Task<long> testI64(long thing, CancellationToken cancellationToken) | 
| Jens Geyer | aa0c8b3 | 2019-01-28 23:27:45 +0100 | [diff] [blame] | 257 |             { | 
 | 258 |                 logger.Invoke("testI64({0})", thing); | 
 | 259 |                 return Task.FromResult(thing); | 
 | 260 |             } | 
 | 261 |  | 
| Jens Geyer | 2b2ea62 | 2021-04-09 22:55:11 +0200 | [diff] [blame] | 262 |             public Task<double> testDouble(double thing, CancellationToken cancellationToken) | 
| Jens Geyer | aa0c8b3 | 2019-01-28 23:27:45 +0100 | [diff] [blame] | 263 |             { | 
 | 264 |                 logger.Invoke("testDouble({0})", thing); | 
 | 265 |                 return Task.FromResult(thing); | 
 | 266 |             } | 
 | 267 |  | 
| Jens Geyer | 3cac320 | 2022-01-31 18:04:35 +0100 | [diff] [blame] | 268 |             public Task<byte[]> testBinary(byte[]? thing, CancellationToken cancellationToken) | 
| Jens Geyer | aa0c8b3 | 2019-01-28 23:27:45 +0100 | [diff] [blame] | 269 |             { | 
| Jens Geyer | 3cac320 | 2022-01-31 18:04:35 +0100 | [diff] [blame] | 270 |                 logger.Invoke("testBinary({0} bytes)", thing?.Length ?? 0); | 
 | 271 |                 return Task.FromResult(thing ?? Array.Empty<byte>()); | 
| Jens Geyer | aa0c8b3 | 2019-01-28 23:27:45 +0100 | [diff] [blame] | 272 |             } | 
 | 273 |  | 
| Jens Geyer | 3cac320 | 2022-01-31 18:04:35 +0100 | [diff] [blame] | 274 |             public Task<Xtruct> testStruct(Xtruct? thing, CancellationToken cancellationToken) | 
| Jens Geyer | aa0c8b3 | 2019-01-28 23:27:45 +0100 | [diff] [blame] | 275 |             { | 
| Jens Geyer | 3cac320 | 2022-01-31 18:04:35 +0100 | [diff] [blame] | 276 |                 logger.Invoke("testStruct({{\"{0}\", {1}, {2}, {3}}})", thing?.String_thing ?? "<null>", thing?.Byte_thing ?? 0, thing?.I32_thing ?? 0, thing?.I64_thing ?? 0); | 
 | 277 |                 return Task.FromResult(thing ?? new Xtruct());   // null returns are not allowed in Thrift | 
| Jens Geyer | aa0c8b3 | 2019-01-28 23:27:45 +0100 | [diff] [blame] | 278 |             } | 
 | 279 |  | 
| Jens Geyer | 3cac320 | 2022-01-31 18:04:35 +0100 | [diff] [blame] | 280 |             public Task<Xtruct2> testNest(Xtruct2? nest, CancellationToken cancellationToken) | 
| Jens Geyer | aa0c8b3 | 2019-01-28 23:27:45 +0100 | [diff] [blame] | 281 |             { | 
| Jens Geyer | 3cac320 | 2022-01-31 18:04:35 +0100 | [diff] [blame] | 282 |                 var thing = nest?.Struct_thing; | 
| Jens Geyer | aa0c8b3 | 2019-01-28 23:27:45 +0100 | [diff] [blame] | 283 |                 logger.Invoke("testNest({{{0}, {{\"{1}\", {2}, {3}, {4}, {5}}}}})", | 
| Jens Geyer | 3cac320 | 2022-01-31 18:04:35 +0100 | [diff] [blame] | 284 |                     nest?.Byte_thing ?? 0, | 
 | 285 |                     thing?.String_thing ?? "<null>", | 
 | 286 |                     thing?.Byte_thing ?? 0, | 
 | 287 |                     thing?.I32_thing ?? 0, | 
 | 288 |                     thing?.I64_thing ?? 0, | 
 | 289 |                     nest?.I32_thing ?? 0); | 
 | 290 |                 return Task.FromResult(nest ?? new Xtruct2());   // null returns are not allowed in Thrift | 
| Jens Geyer | aa0c8b3 | 2019-01-28 23:27:45 +0100 | [diff] [blame] | 291 |             } | 
 | 292 |  | 
| Jens Geyer | 3cac320 | 2022-01-31 18:04:35 +0100 | [diff] [blame] | 293 |             public Task<Dictionary<int, int>> testMap(Dictionary<int, int>? thing, CancellationToken cancellationToken) | 
| Jens Geyer | aa0c8b3 | 2019-01-28 23:27:45 +0100 | [diff] [blame] | 294 |             { | 
 | 295 |                 sb.Clear(); | 
 | 296 |                 sb.Append("testMap({{"); | 
| Jens Geyer | 3cac320 | 2022-01-31 18:04:35 +0100 | [diff] [blame] | 297 |                 if (thing != null) | 
| Jens Geyer | aa0c8b3 | 2019-01-28 23:27:45 +0100 | [diff] [blame] | 298 |                 { | 
| Jens Geyer | 3cac320 | 2022-01-31 18:04:35 +0100 | [diff] [blame] | 299 |                     var first = true; | 
 | 300 |                     foreach (var key in thing.Keys) | 
| Jens Geyer | aa0c8b3 | 2019-01-28 23:27:45 +0100 | [diff] [blame] | 301 |                     { | 
| Jens Geyer | 3cac320 | 2022-01-31 18:04:35 +0100 | [diff] [blame] | 302 |                         if (first) | 
 | 303 |                         { | 
 | 304 |                             first = false; | 
 | 305 |                         } | 
 | 306 |                         else | 
 | 307 |                         { | 
 | 308 |                             sb.Append(", "); | 
 | 309 |                         } | 
 | 310 |                         sb.AppendFormat("{0} => {1}", key, thing[key]); | 
| Jens Geyer | aa0c8b3 | 2019-01-28 23:27:45 +0100 | [diff] [blame] | 311 |                     } | 
| Jens Geyer | aa0c8b3 | 2019-01-28 23:27:45 +0100 | [diff] [blame] | 312 |                 } | 
 | 313 |                 sb.Append("}})"); | 
 | 314 |                 logger.Invoke(sb.ToString()); | 
| Jens Geyer | 3cac320 | 2022-01-31 18:04:35 +0100 | [diff] [blame] | 315 |                 return Task.FromResult(thing ?? new Dictionary<int, int>());   // null returns are not allowed in Thrift | 
| Jens Geyer | aa0c8b3 | 2019-01-28 23:27:45 +0100 | [diff] [blame] | 316 |             } | 
 | 317 |  | 
| Jens Geyer | 3cac320 | 2022-01-31 18:04:35 +0100 | [diff] [blame] | 318 |             public Task<Dictionary<string, string>> testStringMap(Dictionary<string, string>? thing, CancellationToken cancellationToken) | 
| Jens Geyer | aa0c8b3 | 2019-01-28 23:27:45 +0100 | [diff] [blame] | 319 |             { | 
 | 320 |                 sb.Clear(); | 
 | 321 |                 sb.Append("testStringMap({{"); | 
| Jens Geyer | 3cac320 | 2022-01-31 18:04:35 +0100 | [diff] [blame] | 322 |                 if (thing != null) | 
| Jens Geyer | aa0c8b3 | 2019-01-28 23:27:45 +0100 | [diff] [blame] | 323 |                 { | 
| Jens Geyer | 3cac320 | 2022-01-31 18:04:35 +0100 | [diff] [blame] | 324 |                     var first = true; | 
 | 325 |                     foreach (var key in thing.Keys) | 
| Jens Geyer | aa0c8b3 | 2019-01-28 23:27:45 +0100 | [diff] [blame] | 326 |                     { | 
| Jens Geyer | 3cac320 | 2022-01-31 18:04:35 +0100 | [diff] [blame] | 327 |                         if (first) | 
 | 328 |                         { | 
 | 329 |                             first = false; | 
 | 330 |                         } | 
 | 331 |                         else | 
 | 332 |                         { | 
 | 333 |                             sb.Append(", "); | 
 | 334 |                         } | 
 | 335 |                         sb.AppendFormat("{0} => {1}", key, thing[key]); | 
| Jens Geyer | aa0c8b3 | 2019-01-28 23:27:45 +0100 | [diff] [blame] | 336 |                     } | 
| Jens Geyer | aa0c8b3 | 2019-01-28 23:27:45 +0100 | [diff] [blame] | 337 |                 } | 
 | 338 |                 sb.Append("}})"); | 
 | 339 |                 logger.Invoke(sb.ToString()); | 
| Jens Geyer | 3cac320 | 2022-01-31 18:04:35 +0100 | [diff] [blame] | 340 |                 return Task.FromResult(thing ?? new Dictionary<string, string>());   // null returns are not allowed in Thrift | 
| Jens Geyer | aa0c8b3 | 2019-01-28 23:27:45 +0100 | [diff] [blame] | 341 |             } | 
 | 342 |  | 
| Jens Geyer | 3cac320 | 2022-01-31 18:04:35 +0100 | [diff] [blame] | 343 |             public Task<HashSet<int>> testSet(HashSet<int>? thing, CancellationToken cancellationToken) | 
| Jens Geyer | aa0c8b3 | 2019-01-28 23:27:45 +0100 | [diff] [blame] | 344 |             { | 
 | 345 |                 sb.Clear(); | 
 | 346 |                 sb.Append("testSet({{"); | 
| Jens Geyer | 3cac320 | 2022-01-31 18:04:35 +0100 | [diff] [blame] | 347 |                 if (thing != null) | 
| Jens Geyer | aa0c8b3 | 2019-01-28 23:27:45 +0100 | [diff] [blame] | 348 |                 { | 
| Jens Geyer | 3cac320 | 2022-01-31 18:04:35 +0100 | [diff] [blame] | 349 |                     var first = true; | 
 | 350 |                     foreach (int elem in thing) | 
| Jens Geyer | aa0c8b3 | 2019-01-28 23:27:45 +0100 | [diff] [blame] | 351 |                     { | 
| Jens Geyer | 3cac320 | 2022-01-31 18:04:35 +0100 | [diff] [blame] | 352 |                         if (first) | 
 | 353 |                         { | 
 | 354 |                             first = false; | 
 | 355 |                         } | 
 | 356 |                         else | 
 | 357 |                         { | 
 | 358 |                             sb.Append(", "); | 
 | 359 |                         } | 
 | 360 |                         sb.AppendFormat("{0}", elem); | 
| Jens Geyer | aa0c8b3 | 2019-01-28 23:27:45 +0100 | [diff] [blame] | 361 |                     } | 
| Jens Geyer | aa0c8b3 | 2019-01-28 23:27:45 +0100 | [diff] [blame] | 362 |                 } | 
 | 363 |                 sb.Append("}})"); | 
 | 364 |                 logger.Invoke(sb.ToString()); | 
| Jens Geyer | 3cac320 | 2022-01-31 18:04:35 +0100 | [diff] [blame] | 365 |                 return Task.FromResult(thing ?? new HashSet<int>());   // null returns are not allowed in Thrift | 
| Jens Geyer | aa0c8b3 | 2019-01-28 23:27:45 +0100 | [diff] [blame] | 366 |             } | 
 | 367 |  | 
| Jens Geyer | 3cac320 | 2022-01-31 18:04:35 +0100 | [diff] [blame] | 368 |             public Task<List<int>> testList(List<int>? thing, CancellationToken cancellationToken) | 
| Jens Geyer | aa0c8b3 | 2019-01-28 23:27:45 +0100 | [diff] [blame] | 369 |             { | 
 | 370 |                 sb.Clear(); | 
 | 371 |                 sb.Append("testList({{"); | 
| Jens Geyer | 3cac320 | 2022-01-31 18:04:35 +0100 | [diff] [blame] | 372 |                 if (thing != null) | 
| Jens Geyer | aa0c8b3 | 2019-01-28 23:27:45 +0100 | [diff] [blame] | 373 |                 { | 
| Jens Geyer | 3cac320 | 2022-01-31 18:04:35 +0100 | [diff] [blame] | 374 |                     var first = true; | 
 | 375 |                     foreach (var elem in thing) | 
| Jens Geyer | aa0c8b3 | 2019-01-28 23:27:45 +0100 | [diff] [blame] | 376 |                     { | 
| Jens Geyer | 3cac320 | 2022-01-31 18:04:35 +0100 | [diff] [blame] | 377 |                         if (first) | 
 | 378 |                         { | 
 | 379 |                             first = false; | 
 | 380 |                         } | 
 | 381 |                         else | 
 | 382 |                         { | 
 | 383 |                             sb.Append(", "); | 
 | 384 |                         } | 
 | 385 |                         sb.AppendFormat("{0}", elem); | 
| Jens Geyer | aa0c8b3 | 2019-01-28 23:27:45 +0100 | [diff] [blame] | 386 |                     } | 
| Jens Geyer | aa0c8b3 | 2019-01-28 23:27:45 +0100 | [diff] [blame] | 387 |                 } | 
 | 388 |                 sb.Append("}})"); | 
 | 389 |                 logger.Invoke(sb.ToString()); | 
| Jens Geyer | 3cac320 | 2022-01-31 18:04:35 +0100 | [diff] [blame] | 390 |                 return Task.FromResult(thing ?? new List<int>());   // null returns are not allowed in Thrift | 
| Jens Geyer | aa0c8b3 | 2019-01-28 23:27:45 +0100 | [diff] [blame] | 391 |             } | 
 | 392 |  | 
| Jens Geyer | 2b2ea62 | 2021-04-09 22:55:11 +0200 | [diff] [blame] | 393 |             public Task<Numberz> testEnum(Numberz thing, CancellationToken cancellationToken) | 
| Jens Geyer | aa0c8b3 | 2019-01-28 23:27:45 +0100 | [diff] [blame] | 394 |             { | 
 | 395 |                 logger.Invoke("testEnum({0})", thing); | 
 | 396 |                 return Task.FromResult(thing); | 
 | 397 |             } | 
 | 398 |  | 
| Jens Geyer | 2b2ea62 | 2021-04-09 22:55:11 +0200 | [diff] [blame] | 399 |             public Task<long> testTypedef(long thing, CancellationToken cancellationToken) | 
| Jens Geyer | aa0c8b3 | 2019-01-28 23:27:45 +0100 | [diff] [blame] | 400 |             { | 
 | 401 |                 logger.Invoke("testTypedef({0})", thing); | 
 | 402 |                 return Task.FromResult(thing); | 
 | 403 |             } | 
 | 404 |  | 
| Jens Geyer | 2b2ea62 | 2021-04-09 22:55:11 +0200 | [diff] [blame] | 405 |             public Task<Dictionary<int, Dictionary<int, int>>> testMapMap(int hello, CancellationToken cancellationToken) | 
| Jens Geyer | aa0c8b3 | 2019-01-28 23:27:45 +0100 | [diff] [blame] | 406 |             { | 
 | 407 |                 logger.Invoke("testMapMap({0})", hello); | 
 | 408 |                 var mapmap = new Dictionary<int, Dictionary<int, int>>(); | 
 | 409 |  | 
 | 410 |                 var pos = new Dictionary<int, int>(); | 
 | 411 |                 var neg = new Dictionary<int, int>(); | 
 | 412 |                 for (var i = 1; i < 5; i++) | 
 | 413 |                 { | 
 | 414 |                     pos[i] = i; | 
 | 415 |                     neg[-i] = -i; | 
 | 416 |                 } | 
 | 417 |  | 
 | 418 |                 mapmap[4] = pos; | 
 | 419 |                 mapmap[-4] = neg; | 
 | 420 |  | 
 | 421 |                 return Task.FromResult(mapmap); | 
 | 422 |             } | 
 | 423 |  | 
| Jens Geyer | 3cac320 | 2022-01-31 18:04:35 +0100 | [diff] [blame] | 424 |             public Task<Dictionary<long, Dictionary<Numberz, Insanity>>> testInsanity(Insanity? argument, CancellationToken cancellationToken) | 
| Jens Geyer | aa0c8b3 | 2019-01-28 23:27:45 +0100 | [diff] [blame] | 425 |             { | 
 | 426 |                 logger.Invoke("testInsanity()"); | 
 | 427 |  | 
 | 428 |                 /** from ThriftTest.thrift: | 
 | 429 |                  * So you think you've got this all worked, out eh? | 
 | 430 |                  * | 
 | 431 |                  * Creates a the returned map with these values and prints it out: | 
 | 432 |                  *   { 1 => { 2 => argument, | 
 | 433 |                  *            3 => argument, | 
 | 434 |                  *          }, | 
 | 435 |                  *     2 => { 6 => <empty Insanity struct>, }, | 
 | 436 |                  *   } | 
 | 437 |                  * @return map<UserId, map<Numberz,Insanity>> - a map with the above values | 
 | 438 |                  */ | 
 | 439 |  | 
 | 440 |                 var first_map = new Dictionary<Numberz, Insanity>(); | 
 | 441 |                 var second_map = new Dictionary<Numberz, Insanity>(); ; | 
 | 442 |  | 
| Jens Geyer | 3cac320 | 2022-01-31 18:04:35 +0100 | [diff] [blame] | 443 |                 // null dict keys/values are not allowed in Thrift | 
 | 444 |                 first_map[Numberz.TWO] = argument ?? new Insanity(); | 
 | 445 |                 first_map[Numberz.THREE] = argument ?? new Insanity(); | 
| Jens Geyer | aa0c8b3 | 2019-01-28 23:27:45 +0100 | [diff] [blame] | 446 |  | 
 | 447 |                 second_map[Numberz.SIX] = new Insanity(); | 
 | 448 |  | 
 | 449 |                 var insane = new Dictionary<long, Dictionary<Numberz, Insanity>> | 
 | 450 |                 { | 
 | 451 |                     [1] = first_map, | 
 | 452 |                     [2] = second_map | 
 | 453 |                 }; | 
 | 454 |  | 
 | 455 |                 return Task.FromResult(insane); | 
 | 456 |             } | 
 | 457 |  | 
| Jens Geyer | 3cac320 | 2022-01-31 18:04:35 +0100 | [diff] [blame] | 458 |             public Task<Xtruct> testMulti(sbyte arg0, int arg1, long arg2, Dictionary<short, string>? arg3, Numberz arg4, long arg5, | 
| Jens Geyer | aa0c8b3 | 2019-01-28 23:27:45 +0100 | [diff] [blame] | 459 |                 CancellationToken cancellationToken) | 
 | 460 |             { | 
 | 461 |                 logger.Invoke("testMulti()"); | 
 | 462 |  | 
 | 463 |                 var hello = new Xtruct(); ; | 
| Jens Geyer | ffb97e1 | 2019-12-06 23:43:08 +0100 | [diff] [blame] | 464 |                 hello.String_thing = "Hello2"; | 
 | 465 |                 hello.Byte_thing = arg0; | 
 | 466 |                 hello.I32_thing = arg1; | 
 | 467 |                 hello.I64_thing = arg2; | 
| Jens Geyer | aa0c8b3 | 2019-01-28 23:27:45 +0100 | [diff] [blame] | 468 |                 return Task.FromResult(hello); | 
 | 469 |             } | 
 | 470 |  | 
| Jens Geyer | 3cac320 | 2022-01-31 18:04:35 +0100 | [diff] [blame] | 471 |             public Task testException(string? arg, CancellationToken cancellationToken) | 
| Jens Geyer | aa0c8b3 | 2019-01-28 23:27:45 +0100 | [diff] [blame] | 472 |             { | 
| Jens Geyer | 3cac320 | 2022-01-31 18:04:35 +0100 | [diff] [blame] | 473 |                 logger.Invoke("testException({0})", arg ?? "<null>"); | 
| Jens Geyer | aa0c8b3 | 2019-01-28 23:27:45 +0100 | [diff] [blame] | 474 |                 if (arg == "Xception") | 
 | 475 |                 { | 
 | 476 |                     var x = new Xception | 
 | 477 |                     { | 
 | 478 |                         ErrorCode = 1001, | 
 | 479 |                         Message = arg | 
 | 480 |                     }; | 
 | 481 |                     throw x; | 
 | 482 |                 } | 
 | 483 |                 if (arg == "TException") | 
 | 484 |                 { | 
 | 485 |                     throw new TException(); | 
 | 486 |                 } | 
 | 487 |                 return Task.CompletedTask; | 
 | 488 |             } | 
 | 489 |  | 
| Jens Geyer | 3cac320 | 2022-01-31 18:04:35 +0100 | [diff] [blame] | 490 |             public Task<Xtruct> testMultiException(string? arg0, string? arg1, CancellationToken cancellationToken) | 
| Jens Geyer | aa0c8b3 | 2019-01-28 23:27:45 +0100 | [diff] [blame] | 491 |             { | 
| Jens Geyer | 3cac320 | 2022-01-31 18:04:35 +0100 | [diff] [blame] | 492 |                 logger.Invoke("testMultiException({0}, {1})", arg0 ?? "<null>", arg1 ?? "<null>"); | 
| Jens Geyer | aa0c8b3 | 2019-01-28 23:27:45 +0100 | [diff] [blame] | 493 |                 if (arg0 == "Xception") | 
 | 494 |                 { | 
 | 495 |                     var x = new Xception | 
 | 496 |                     { | 
 | 497 |                         ErrorCode = 1001, | 
 | 498 |                         Message = "This is an Xception" | 
 | 499 |                     }; | 
 | 500 |                     throw x; | 
 | 501 |                 } | 
 | 502 |  | 
 | 503 |                 if (arg0 == "Xception2") | 
 | 504 |                 { | 
 | 505 |                     var x = new Xception2 | 
 | 506 |                     { | 
 | 507 |                         ErrorCode = 2002, | 
| Jens Geyer | ffb97e1 | 2019-12-06 23:43:08 +0100 | [diff] [blame] | 508 |                         Struct_thing = new Xtruct { String_thing = "This is an Xception2" } | 
| Jens Geyer | aa0c8b3 | 2019-01-28 23:27:45 +0100 | [diff] [blame] | 509 |                     }; | 
 | 510 |                     throw x; | 
 | 511 |                 } | 
 | 512 |  | 
| Jens Geyer | ffb97e1 | 2019-12-06 23:43:08 +0100 | [diff] [blame] | 513 |                 var result = new Xtruct { String_thing = arg1 }; | 
| Jens Geyer | aa0c8b3 | 2019-01-28 23:27:45 +0100 | [diff] [blame] | 514 |                 return Task.FromResult(result); | 
 | 515 |             } | 
 | 516 |  | 
| Jens Geyer | 7156940 | 2021-11-13 23:51:16 +0100 | [diff] [blame] | 517 |             public async Task testOneway(int secondsToSleep, CancellationToken cancellationToken) | 
| Jens Geyer | aa0c8b3 | 2019-01-28 23:27:45 +0100 | [diff] [blame] | 518 |             { | 
 | 519 |                 logger.Invoke("testOneway({0}), sleeping...", secondsToSleep); | 
| Jens Geyer | 7156940 | 2021-11-13 23:51:16 +0100 | [diff] [blame] | 520 |                 await Task.Delay(secondsToSleep * 1000, cancellationToken); | 
| Jens Geyer | aa0c8b3 | 2019-01-28 23:27:45 +0100 | [diff] [blame] | 521 |                 logger.Invoke("testOneway finished"); | 
| Jens Geyer | aa0c8b3 | 2019-01-28 23:27:45 +0100 | [diff] [blame] | 522 |             } | 
 | 523 |         } | 
 | 524 |  | 
| Jens Geyer | aa0c8b3 | 2019-01-28 23:27:45 +0100 | [diff] [blame] | 525 |  | 
 | 526 |         private static X509Certificate2 GetServerCert() | 
 | 527 |         { | 
 | 528 |             var serverCertName = "server.p12"; | 
 | 529 |             var possiblePaths = new List<string> | 
 | 530 |             { | 
 | 531 |                 "../../../keys/", | 
 | 532 |                 "../../keys/", | 
 | 533 |                 "../keys/", | 
 | 534 |                 "keys/", | 
 | 535 |             }; | 
 | 536 |                          | 
| Jens Geyer | 98a2325 | 2022-01-09 16:50:52 +0100 | [diff] [blame] | 537 |             var existingPath = string.Empty; | 
| Jens Geyer | aa0c8b3 | 2019-01-28 23:27:45 +0100 | [diff] [blame] | 538 |             foreach (var possiblePath in possiblePaths) | 
 | 539 |             { | 
 | 540 |                 var path = Path.GetFullPath(possiblePath + serverCertName); | 
 | 541 |                 if (File.Exists(path)) | 
 | 542 |                 { | 
 | 543 |                     existingPath = path; | 
 | 544 |                     break; | 
 | 545 |                 } | 
 | 546 |             } | 
 | 547 |                          | 
 | 548 |             if (string.IsNullOrEmpty(existingPath)) | 
 | 549 |             { | 
 | 550 |                 throw new FileNotFoundException($"Cannot find file: {serverCertName}"); | 
 | 551 |             } | 
 | 552 |                                      | 
 | 553 |             var cert = new X509Certificate2(existingPath, "thrift"); | 
 | 554 |                          | 
 | 555 |             return cert; | 
 | 556 |         } | 
 | 557 |  | 
| Jens Geyer | 7156940 | 2021-11-13 23:51:16 +0100 | [diff] [blame] | 558 |         public static async Task<int> Execute(List<string> args) | 
| Jens Geyer | aa0c8b3 | 2019-01-28 23:27:45 +0100 | [diff] [blame] | 559 |         { | 
| Jens Geyer | 261cad3 | 2019-11-20 19:03:14 +0100 | [diff] [blame] | 560 |             using (var loggerFactory = new LoggerFactory()) //.AddConsole().AddDebug(); | 
| Jens Geyer | aa0c8b3 | 2019-01-28 23:27:45 +0100 | [diff] [blame] | 561 |             { | 
| Jens Geyer | 261cad3 | 2019-11-20 19:03:14 +0100 | [diff] [blame] | 562 |                 var logger = loggerFactory.CreateLogger("Test"); | 
| Jens Geyer | aa0c8b3 | 2019-01-28 23:27:45 +0100 | [diff] [blame] | 563 |  | 
 | 564 |                 try | 
 | 565 |                 { | 
| Jens Geyer | 261cad3 | 2019-11-20 19:03:14 +0100 | [diff] [blame] | 566 |                     var param = new ServerParam(); | 
 | 567 |  | 
 | 568 |                     try | 
 | 569 |                     { | 
 | 570 |                         param.Parse(args); | 
 | 571 |                     } | 
 | 572 |                     catch (Exception ex) | 
 | 573 |                     { | 
 | 574 |                         Console.WriteLine("*** FAILED ***"); | 
 | 575 |                         Console.WriteLine("Error while  parsing arguments"); | 
 | 576 |                         Console.WriteLine(ex.Message + " ST: " + ex.StackTrace); | 
 | 577 |                         return 1; | 
 | 578 |                     } | 
 | 579 |  | 
 | 580 |  | 
 | 581 |                     // Endpoint transport (mandatory) | 
 | 582 |                     TServerTransport trans; | 
 | 583 |                     switch (param.transport) | 
 | 584 |                     { | 
 | 585 |                         case TransportChoice.NamedPipe: | 
 | 586 |                             Debug.Assert(param.pipe != null); | 
| Jens Geyer | ef0cb01 | 2021-04-02 12:18:15 +0200 | [diff] [blame] | 587 |                             trans = new TNamedPipeServerTransport(param.pipe, Configuration, NamedPipeClientFlags.OnlyLocalClients); | 
| Jens Geyer | 261cad3 | 2019-11-20 19:03:14 +0100 | [diff] [blame] | 588 |                             break; | 
 | 589 |  | 
 | 590 |  | 
 | 591 |                         case TransportChoice.TlsSocket: | 
 | 592 |                             var cert = GetServerCert(); | 
 | 593 |                             if (cert == null || !cert.HasPrivateKey) | 
 | 594 |                             { | 
 | 595 |                                 cert?.Dispose(); | 
 | 596 |                                 throw new InvalidOperationException("Certificate doesn't contain private key"); | 
 | 597 |                             } | 
 | 598 |  | 
| Jens Geyer | eacd1d4 | 2019-11-20 19:03:14 +0100 | [diff] [blame] | 599 |                             trans = new TTlsServerSocketTransport(param.port, Configuration, | 
 | 600 |                                 cert, | 
| Jens Geyer | 261cad3 | 2019-11-20 19:03:14 +0100 | [diff] [blame] | 601 |                                 (sender, certificate, chain, errors) => true, | 
 | 602 |                                 null, SslProtocols.Tls | SslProtocols.Tls11 | SslProtocols.Tls12); | 
 | 603 |                             break; | 
 | 604 |  | 
 | 605 |                         case TransportChoice.Socket: | 
 | 606 |                         default: | 
| Jens Geyer | eacd1d4 | 2019-11-20 19:03:14 +0100 | [diff] [blame] | 607 |                             trans = new TServerSocketTransport(param.port, Configuration); | 
| Jens Geyer | 261cad3 | 2019-11-20 19:03:14 +0100 | [diff] [blame] | 608 |                             break; | 
 | 609 |                     } | 
 | 610 |  | 
 | 611 |                     // Layered transport (mandatory) | 
| Jens Geyer | 98a2325 | 2022-01-09 16:50:52 +0100 | [diff] [blame] | 612 |                     TTransportFactory? transFactory; | 
| Jens Geyer | 261cad3 | 2019-11-20 19:03:14 +0100 | [diff] [blame] | 613 |                     switch (param.buffering) | 
 | 614 |                     { | 
 | 615 |                         case BufferChoice.Framed: | 
 | 616 |                             transFactory = new TFramedTransport.Factory(); | 
 | 617 |                             break; | 
 | 618 |                         case BufferChoice.Buffered: | 
 | 619 |                             transFactory = new TBufferedTransport.Factory(); | 
 | 620 |                             break; | 
 | 621 |                         default: | 
 | 622 |                             Debug.Assert(param.buffering == BufferChoice.None, "unhandled case"); | 
 | 623 |                             transFactory = null;  // no layered transprt | 
 | 624 |                             break; | 
 | 625 |                     } | 
 | 626 |  | 
| Jens Geyer | 828ffa8 | 2020-11-21 15:15:32 +0100 | [diff] [blame] | 627 |                     TProtocolFactory proto = param.protocol switch | 
| Jens Geyer | 261cad3 | 2019-11-20 19:03:14 +0100 | [diff] [blame] | 628 |                     { | 
| Jens Geyer | 828ffa8 | 2020-11-21 15:15:32 +0100 | [diff] [blame] | 629 |                         ProtocolChoice.Compact => new TCompactProtocol.Factory(), | 
 | 630 |                         ProtocolChoice.Json => new TJsonProtocol.Factory(), | 
 | 631 |                         ProtocolChoice.Binary => new TBinaryProtocol.Factory(), | 
 | 632 |                         _ => new TBinaryProtocol.Factory(), | 
 | 633 |                     }; | 
| Jens Geyer | 261cad3 | 2019-11-20 19:03:14 +0100 | [diff] [blame] | 634 |  | 
 | 635 |                     // Processor | 
 | 636 |                     var testHandler = new TestHandlerAsync(); | 
 | 637 |                     var testProcessor = new ThriftTest.AsyncProcessor(testHandler); | 
 | 638 |                     var processorFactory = new TSingletonProcessorFactory(testProcessor); | 
 | 639 |  | 
| Jens Geyer | 63d114d | 2021-05-25 23:42:35 +0200 | [diff] [blame] | 640 |                     var poolconfig = new TThreadPoolAsyncServer.Configuration();  // use platform defaults | 
 | 641 |                     TServer serverEngine = param.server switch | 
 | 642 |                     { | 
 | 643 |                         ServerChoice.Simple => new TSimpleAsyncServer(processorFactory, trans, transFactory, transFactory, proto, proto, logger), | 
 | 644 |                         ServerChoice.ThreadPool => new TThreadPoolAsyncServer(processorFactory, trans, transFactory, transFactory, proto, proto, poolconfig, logger), | 
 | 645 |                         _ => new TSimpleAsyncServer(processorFactory, trans, transFactory, transFactory, proto, proto, logger) | 
 | 646 |                     }; | 
| Jens Geyer | 261cad3 | 2019-11-20 19:03:14 +0100 | [diff] [blame] | 647 |  | 
 | 648 |                     //Server event handler | 
 | 649 |                     var serverEvents = new MyServerEventHandler(); | 
 | 650 |                     serverEngine.SetEventHandler(serverEvents); | 
 | 651 |  | 
 | 652 |                     // Run it | 
| Jens Geyer | 63d114d | 2021-05-25 23:42:35 +0200 | [diff] [blame] | 653 |                     var where = (!string.IsNullOrEmpty(param.pipe)) ? "pipe " + param.pipe : "port " + param.port; | 
 | 654 |                     Console.WriteLine("Running "+ serverEngine.GetType().Name + | 
 | 655 |                                       " at "+ where + | 
 | 656 |                                       " using "+ processorFactory.GetType().Name + " processor prototype factory " + | 
| Jens Geyer | 261cad3 | 2019-11-20 19:03:14 +0100 | [diff] [blame] | 657 |                                       (param.buffering == BufferChoice.Buffered ? " with buffered transport" : "") + | 
 | 658 |                                       (param.buffering == BufferChoice.Framed ? " with framed transport" : "") + | 
 | 659 |                                       (param.transport == TransportChoice.TlsSocket ? " with encryption" : "") + | 
 | 660 |                                       (param.protocol == ProtocolChoice.Compact ? " with compact protocol" : "") + | 
 | 661 |                                       (param.protocol == ProtocolChoice.Json ? " with json protocol" : "") + | 
 | 662 |                                       "..."); | 
| Jens Geyer | 7156940 | 2021-11-13 23:51:16 +0100 | [diff] [blame] | 663 |                     await serverEngine.ServeAsync(CancellationToken.None); | 
| Jens Geyer | 261cad3 | 2019-11-20 19:03:14 +0100 | [diff] [blame] | 664 |                     Console.ReadLine(); | 
| Jens Geyer | aa0c8b3 | 2019-01-28 23:27:45 +0100 | [diff] [blame] | 665 |                 } | 
| Jens Geyer | 261cad3 | 2019-11-20 19:03:14 +0100 | [diff] [blame] | 666 |                 catch (Exception x) | 
| Jens Geyer | aa0c8b3 | 2019-01-28 23:27:45 +0100 | [diff] [blame] | 667 |                 { | 
| Jens Geyer | 261cad3 | 2019-11-20 19:03:14 +0100 | [diff] [blame] | 668 |                     Console.Error.Write(x); | 
| Jens Geyer | aa0c8b3 | 2019-01-28 23:27:45 +0100 | [diff] [blame] | 669 |                     return 1; | 
 | 670 |                 } | 
 | 671 |  | 
| Jens Geyer | 261cad3 | 2019-11-20 19:03:14 +0100 | [diff] [blame] | 672 |                 Console.WriteLine("done."); | 
 | 673 |                 return 0; | 
| Jens Geyer | aa0c8b3 | 2019-01-28 23:27:45 +0100 | [diff] [blame] | 674 |             } | 
| Jens Geyer | aa0c8b3 | 2019-01-28 23:27:45 +0100 | [diff] [blame] | 675 |         } | 
 | 676 |     } | 
 | 677 |  | 
 | 678 | } |