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()
{