THRIFT-4217 HttpClient should support gzip and deflate
Client: C#
Patch: Jens Geyer
This closes #1282
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.Threading;
using System.Linq;
using System.Security.Cryptography.X509Certificates;
+using System.IO.Compression;
namespace Thrift.Transport
{
@@ -166,6 +167,7 @@
try
{
HttpWebRequest connection = CreateRequest();
+ connection.Headers.Add("Accept-Encoding", "gzip, deflate");
byte[] data = outputStream.ToArray();
connection.ContentLength = data.Length;
@@ -184,14 +186,29 @@
// 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 @@
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()
{