summaryrefslogtreecommitdiff
path: root/lib/csharp/src/Transport/THttpTaskAsyncHandler.cs
diff options
context:
space:
mode:
authorJens Geyer <jensg@apache.org>2020-02-28 19:22:34 +0100
committerJens Geyer <jensg@apache.org>2021-02-10 20:27:08 +0100
commitb89316d54bb0253493b48446cb510755fb3196d2 (patch)
tree1f52ff971d44c2c8bb0aad0b9ba627a953e0c899 /lib/csharp/src/Transport/THttpTaskAsyncHandler.cs
parent897652e5f08147efad9db66b86c3036b3d3826db (diff)
downloadthrift-b89316d54bb0253493b48446cb510755fb3196d2.tar.gz
Revert "THRIFT-4982 Remove deprecated C# bindings from the code base"
Only compiler, test, lib and tutorial code.
Diffstat (limited to 'lib/csharp/src/Transport/THttpTaskAsyncHandler.cs')
-rw-r--r--lib/csharp/src/Transport/THttpTaskAsyncHandler.cs97
1 files changed, 97 insertions, 0 deletions
diff --git a/lib/csharp/src/Transport/THttpTaskAsyncHandler.cs b/lib/csharp/src/Transport/THttpTaskAsyncHandler.cs
new file mode 100644
index 000000000..e491f32cb
--- /dev/null
+++ b/lib/csharp/src/Transport/THttpTaskAsyncHandler.cs
@@ -0,0 +1,97 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ * Contains some contributions under the Thrift Software License.
+ * Please see doc/old-thrift-license.txt in the Thrift distribution for
+ * details.
+ */
+
+using System.Threading.Tasks;
+using System.Web;
+using Thrift.Protocol;
+
+namespace Thrift.Transport
+{
+ /// <summary>
+ /// An async task based HTTP handler for processing thrift services.
+ /// </summary>
+ public class THttpTaskAsyncHandler : HttpTaskAsyncHandler
+ {
+ private readonly TAsyncProcessor _processor;
+ private readonly TProtocolFactory _inputProtocolFactory;
+ private readonly TProtocolFactory _outputProtocolFactory;
+
+ /// <summary>
+ /// Initializes a new instance of the <see cref="THttpTaskAsyncHandler"/> class
+ /// using the <see cref="TBinaryProtocol.Factory"/> for both input and output streams.
+ /// </summary>
+ /// <param name="processor">The async processor implementation.</param>
+ public THttpTaskAsyncHandler(TAsyncProcessor processor)
+ : this(processor, new TBinaryProtocol.Factory())
+ {
+ }
+
+ /// <summary>
+ /// Initializes a new instance of the <see cref="THttpTaskAsyncHandler"/> class
+ /// using <paramref name="protocolFactory"/> for both input and output streams.
+ /// </summary>
+ /// <param name="processor">The async processor implementation.</param>
+ /// <param name="protocolFactory">The protocol factory.</param>
+ public THttpTaskAsyncHandler(TAsyncProcessor processor, TProtocolFactory protocolFactory)
+ : this(processor, protocolFactory, protocolFactory)
+ {
+ }
+
+ /// <summary>
+ /// Initializes a new instance of the <see cref="THttpTaskAsyncHandler"/> class.
+ /// </summary>
+ /// <param name="processor">The async processor implementation.</param>
+ /// <param name="inputProtocolFactory">The input protocol factory.</param>
+ /// <param name="outputProtocolFactory">The output protocol factory.</param>
+ public THttpTaskAsyncHandler(TAsyncProcessor processor, TProtocolFactory inputProtocolFactory,
+ TProtocolFactory outputProtocolFactory)
+ {
+ _processor = processor;
+ _inputProtocolFactory = inputProtocolFactory;
+ _outputProtocolFactory = outputProtocolFactory;
+ }
+
+ public override async Task ProcessRequestAsync(HttpContext context)
+ {
+ var transport = new TStreamTransport(context.Request.InputStream, context.Response.OutputStream);
+
+ try
+ {
+ var input = _inputProtocolFactory.GetProtocol(transport);
+ var output = _outputProtocolFactory.GetProtocol(transport);
+
+ while (await _processor.ProcessAsync(input, output))
+ {
+ }
+ }
+ catch (TTransportException)
+ {
+ // Client died, just move on
+ }
+ finally
+ {
+ transport.Close();
+ }
+ }
+ }
+}