Author: bryanduxbury
Date: Thu Jun 24 20:34:34 2010
New Revision: 957708
URL: http://svn.apache.org/viewvc?rev=957708&view=rev
Log:
THRIFT-160. csharp: Created THttpTransport for the C# library based on
WebHttpRequest
This patch adds a new THttpTransport to the C# library and adds some related
changes to the Makefile and csproj.
Patch: Michael Greene and Todd Gardner
Added:
incubator/thrift/trunk/lib/csharp/src/Transport/THttpClient.cs
Modified:
incubator/thrift/trunk/lib/csharp/Makefile.am
incubator/thrift/trunk/lib/csharp/src/Thrift.csproj
incubator/thrift/trunk/test/csharp/ThriftTest/TestClient.cs
Modified: incubator/thrift/trunk/lib/csharp/Makefile.am
URL:
http://svn.apache.org/viewvc/incubator/thrift/trunk/lib/csharp/Makefile.am?rev=957708&r1=957707&r2=957708&view=diff
==============================================================================
--- incubator/thrift/trunk/lib/csharp/Makefile.am (original)
+++ incubator/thrift/trunk/lib/csharp/Makefile.am Thu Jun 24 20:34:34 2010
@@ -46,6 +46,7 @@ THRIFTCODE= \
src/Transport/TServerTransport.cs \
src/Transport/TServerSocket.cs \
src/Transport/TTransportFactory.cs \
+ src/Transport/THttpClient.cs \
src/TProcessor.cs \
src/TApplicationException.cs
Modified: incubator/thrift/trunk/lib/csharp/src/Thrift.csproj
URL:
http://svn.apache.org/viewvc/incubator/thrift/trunk/lib/csharp/src/Thrift.csproj?rev=957708&r1=957707&r2=957708&view=diff
==============================================================================
--- incubator/thrift/trunk/lib/csharp/src/Thrift.csproj (original)
+++ incubator/thrift/trunk/lib/csharp/src/Thrift.csproj Thu Jun 24 20:34:34 2010
@@ -59,6 +59,7 @@
<Compile Include="TProcessor.cs" />
<Compile Include="Transport\TBufferedTransport.cs" />
<Compile Include="Transport\TFramedTransport.cs" />
+ <Compile Include="Transport\THttpClient.cs" />
<Compile Include="Transport\TServerSocket.cs" />
<Compile Include="Transport\TServerTransport.cs" />
<Compile Include="Transport\TSocket.cs" />
Added: incubator/thrift/trunk/lib/csharp/src/Transport/THttpClient.cs
URL:
http://svn.apache.org/viewvc/incubator/thrift/trunk/lib/csharp/src/Transport/THttpClient.cs?rev=957708&view=auto
==============================================================================
--- incubator/thrift/trunk/lib/csharp/src/Transport/THttpClient.cs (added)
+++ incubator/thrift/trunk/lib/csharp/src/Transport/THttpClient.cs Thu Jun 24
20:34:34 2010
@@ -0,0 +1,182 @@
+/**
+ * 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.
+ *
+ *
+ */
+
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Net;
+
+namespace Thrift.Transport
+{
+ public class THttpClient : TTransport
+ {
+ private readonly Uri uri;
+ private Stream inputStream;
+ private MemoryStream outputStream = new MemoryStream();
+ private int connectTimeout = 0;
+ private int readTimeout = 0;
+ private IDictionary<String, String> customHeaders = new
Dictionary<string, string>();
+
+ public THttpClient(Uri u)
+ {
+ uri = u;
+ }
+
+ public int ConnectTimeout
+ {
+ set
+ {
+ connectTimeout = value;
+ }
+ }
+
+ public int ReadTimeout
+ {
+ set
+ {
+ readTimeout = value;
+ }
+ }
+
+ public IDictionary<String, String> CustomHeaders
+ {
+ get
+ {
+ return customHeaders;
+ }
+ }
+
+ public override bool IsOpen
+ {
+ get
+ {
+ return true;
+ }
+ }
+
+ public override void Open()
+ {
+ }
+
+ public override void Close()
+ {
+ if (inputStream != null)
+ {
+ inputStream.Close();
+ inputStream = null;
+ }
+ if (outputStream != null)
+ {
+ outputStream.Close();
+ outputStream = null;
+ }
+ }
+
+ public override int Read(byte[] buf, int off, int len)
+ {
+ if (inputStream == null)
+ {
+ throw new
TTransportException(TTransportException.ExceptionType.NotOpen, "No request has
been sent");
+ }
+
+ try
+ {
+ int ret = inputStream.Read(buf, off, len);
+
+ if (ret == -1)
+ {
+ throw new
TTransportException(TTransportException.ExceptionType.EndOfFile, "No more data
available");
+ }
+
+ return ret;
+ }
+ catch (IOException iox)
+ {
+ throw new
TTransportException(TTransportException.ExceptionType.Unknown, iox.ToString());
+ }
+ }
+
+ public override void Write(byte[] buf, int off, int len)
+ {
+ outputStream.Write(buf, off, len);
+ }
+
+ public override void Flush()
+ {
+ SendRequest();
+ outputStream = new MemoryStream();
+ }
+
+ private void SendRequest()
+ {
+ try
+ {
+ HttpWebRequest connection = CreateRequest();
+
+ byte[] data = outputStream.ToArray();
+ connection.ContentLength = data.Length;
+
+ Stream requestStream =
connection.GetRequestStream();
+ requestStream.Write(data, 0, data.Length);
+ inputStream =
connection.GetResponse().GetResponseStream();
+ }
+ catch (IOException iox)
+ {
+ throw new
TTransportException(TTransportException.ExceptionType.Unknown, iox.ToString());
+ }
+ catch (WebException wx)
+ {
+ throw new
TTransportException(TTransportException.ExceptionType.Unknown, "Couldn't
connect to server: " + wx);
+ }
+ }
+
+ private HttpWebRequest CreateRequest()
+ {
+ HttpWebRequest connection =
(HttpWebRequest)WebRequest.Create(uri);
+
+ if (connectTimeout > 0)
+ {
+ connection.Timeout = connectTimeout;
+ }
+ if (readTimeout > 0)
+ {
+ connection.ReadWriteTimeout = readTimeout;
+ }
+
+ // Make the request
+ connection.ContentType = "application/x-thrift";
+ connection.Accept = "application/x-thrift";
+ connection.UserAgent = "C#/THttpClient";
+ connection.Method = "POST";
+ connection.ProtocolVersion = HttpVersion.Version10;
+
+ //add custom headers here
+ foreach (KeyValuePair<string, string> item in
customHeaders)
+ {
+ connection.Headers.Add(item.Key, item.Value);
+ }
+
+ connection.Proxy = null;
+
+ return connection;
+ }
+ }
+}
Modified: incubator/thrift/trunk/test/csharp/ThriftTest/TestClient.cs
URL:
http://svn.apache.org/viewvc/incubator/thrift/trunk/test/csharp/ThriftTest/TestClient.cs?rev=957708&r1=957707&r2=957708&view=diff
==============================================================================
--- incubator/thrift/trunk/test/csharp/ThriftTest/TestClient.cs (original)
+++ incubator/thrift/trunk/test/csharp/ThriftTest/TestClient.cs Thu Jun 24
20:34:34 2010
@@ -87,15 +87,23 @@ namespace Test
{
Thread t = new Thread(new
ParameterizedThreadStart(ClientThread));
threads[test] = t;
- TSocket socket = new TSocket(host,
port);
- if (buffered)
+ if (url == null)
{
- TBufferedTransport buffer = new
TBufferedTransport(socket);
- t.Start(buffer);
+ TSocket socket = new
TSocket(host, port);
+ if (buffered)
+ {
+ TBufferedTransport
buffer = new TBufferedTransport(socket);
+ t.Start(buffer);
+ }
+ else
+ {
+ t.Start(socket);
+ }
}
else
{
- t.Start(socket);
+ THttpClient http = new
THttpClient(new Uri(url));
+ t.Start(http);
}
}