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);
                                        }
                                }
 


Reply via email to