You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@thrift.apache.org by je...@apache.org on 2017/05/31 07:08:37 UTC

thrift git commit: THRIFT-4217 HttpClient should support gzip and deflate Client: C# Patch: Jens Geyer

Repository: thrift
Updated Branches:
  refs/heads/master 72ca60deb -> 695115952


THRIFT-4217 HttpClient should support gzip and deflate
Client: C#
Patch: Jens Geyer

This closes #1282


Project: http://git-wip-us.apache.org/repos/asf/thrift/repo
Commit: http://git-wip-us.apache.org/repos/asf/thrift/commit/69511595
Tree: http://git-wip-us.apache.org/repos/asf/thrift/tree/69511595
Diff: http://git-wip-us.apache.org/repos/asf/thrift/diff/69511595

Branch: refs/heads/master
Commit: 695115952de6ef5603a30081e2a6762bd2a57ba6
Parents: 72ca60d
Author: Jens Geyer <je...@apache.org>
Authored: Tue May 30 22:32:01 2017 +0200
Committer: Jens Geyer <je...@apache.org>
Committed: Wed May 31 09:07:26 2017 +0200

----------------------------------------------------------------------
 lib/csharp/src/Transport/THttpClient.cs | 45 ++++++++++++++++++++++++++--
 1 file changed, 43 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/thrift/blob/69511595/lib/csharp/src/Transport/THttpClient.cs
----------------------------------------------------------------------
diff --git a/lib/csharp/src/Transport/THttpClient.cs b/lib/csharp/src/Transport/THttpClient.cs
index a56a3e8..e68d33d 100644
--- a/lib/csharp/src/Transport/THttpClient.cs
+++ b/lib/csharp/src/Transport/THttpClient.cs
@@ -26,6 +26,7 @@ using System.Net;
 using System.Threading;
 using System.Linq;
 using System.Security.Cryptography.X509Certificates;
+using System.IO.Compression;
 
 namespace Thrift.Transport
 {
@@ -166,6 +167,7 @@ namespace Thrift.Transport
             try
             {
                 HttpWebRequest connection = CreateRequest();
+                connection.Headers.Add("Accept-Encoding", "gzip, deflate");
 
                 byte[] data = outputStream.ToArray();
                 connection.ContentLength = data.Length;
@@ -184,14 +186,29 @@ namespace Thrift.Transport
                             // Copy the response to a memory stream so that we can
                             // cleanly close the response and response stream.
                             inputStream = new MemoryStream();
-                            byte[] buffer = new byte[8096];
+                            byte[] buffer = new byte[8192];  // multiple of 4096
                             int bytesRead;
                             while ((bytesRead = responseStream.Read(buffer, 0, buffer.Length)) > 0)
                             {
-                                inputStream.Write (buffer, 0, bytesRead);
+                                inputStream.Write(buffer, 0, bytesRead);
                             }
                             inputStream.Seek(0, 0);
                         }
+
+                        foreach( var encoding in response.Headers.GetValues("Content-Encoding"))
+                        {
+                            switch(encoding)
+                            {
+                                case "gzip":
+                                    DecompressGZipped(ref inputStream);
+                                    break;
+                                case "deflate":
+                                    DecompressDeflated(ref inputStream);
+                                    break;
+                                default:
+                                    break;
+                            }
+                        }
                     }
                 }
             }
@@ -204,6 +221,30 @@ namespace Thrift.Transport
                 throw new TTransportException(TTransportException.ExceptionType.Unknown, "Couldn't connect to server: " + wx);
             }
         }
+
+        private void DecompressDeflated(ref Stream inputStream)
+        {
+            var tmp = new MemoryStream();
+            using (var decomp = new DeflateStream(inputStream, CompressionMode.Decompress))
+            {
+                decomp.CopyTo(tmp);
+            }
+            inputStream.Dispose();
+            inputStream = tmp;
+            inputStream.Seek(0, 0);
+        }
+
+        private void DecompressGZipped(ref Stream inputStream)
+        {
+            var tmp = new MemoryStream();
+            using (var decomp = new GZipStream(inputStream, CompressionMode.Decompress))
+            {
+                decomp.CopyTo(tmp);
+            }
+            inputStream.Dispose();
+            inputStream = tmp;
+            inputStream.Seek(0, 0);
+        }
 #endif
         private HttpWebRequest CreateRequest()
         {