diff --git a/.circleci/config.yml b/.circleci/config.yml index 66bdad982..cd509415e 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -159,7 +159,7 @@ jobs: - restore_cache: name: Restoring reSharper Cache keys: - - &cache-key reSharper-cache-2021_3_3 + - &cache-key reSharper-cache-2022_1_0 - run: name: Check code formatting command: | diff --git a/CHANGELOG.md b/CHANGELOG.md index 335677d00..c09f99e24 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,8 @@ ### Bug Fixes 1. [#313](https://github.com/influxdata/influxdb-client-csharp/pull/313): Using default `org` and `bucket` in `WriteApiAsync` +1. [#317](https://github.com/influxdata/influxdb-client-csharp/pull/317): Decompress Gzipped data +1. [#317](https://github.com/influxdata/influxdb-client-csharp/pull/317): Logging HTTP headers from streaming request ### Documentation 1. [#315](https://github.com/influxdata/influxdb-client-csharp/pull/315): Clarify `timeout` option diff --git a/Client.Core/Internal/AbstractQueryClient.cs b/Client.Core/Internal/AbstractQueryClient.cs index 239a6e059..c1ed7b201 100644 --- a/Client.Core/Internal/AbstractQueryClient.cs +++ b/Client.Core/Internal/AbstractQueryClient.cs @@ -2,6 +2,8 @@ using System.Collections.Generic; using System.Diagnostics; using System.IO; +using System.IO.Compression; +using System.Linq; using System.Net.Http; using System.Runtime.CompilerServices; using System.Threading; @@ -112,7 +114,8 @@ private async Task Query(Func, RestReque var query = queryFn.Invoke(response => { var result = GetStreamFromResponse(response, cancellationToken); - result = AfterIntercept((int)response.StatusCode, () => response.Headers.ToHeaderParameters(), + result = AfterIntercept((int)response.StatusCode, + () => response.Headers.ToHeaderParameters(response.Content.Headers), result); RaiseForInfluxError(response, result); @@ -155,7 +158,8 @@ private void QuerySync(Func, RestRequest var query = queryFn.Invoke(response => { var result = GetStreamFromResponse(response, cancellationToken); - result = AfterIntercept((int)response.StatusCode, () => response.Headers.ToHeaderParameters(), + result = AfterIntercept((int)response.StatusCode, + () => response.Headers.ToHeaderParameters(response.Content.Headers), result); RaiseForInfluxError(response, result); @@ -194,7 +198,8 @@ protected async IAsyncEnumerable QueryEnumerable( var query = queryFn.Invoke(response => { stream = GetStreamFromResponse(response, cancellationToken); - stream = AfterIntercept((int)response.StatusCode, () => response.Headers.ToHeaderParameters(), stream); + stream = AfterIntercept((int)response.StatusCode, + () => response.Headers.ToHeaderParameters(response.Content.Headers), stream); RaiseForInfluxError(response, stream); @@ -394,7 +399,13 @@ private Stream GetStreamFromResponse(HttpResponseMessage response, CancellationT # else var readAsStreamAsync = response.Content.ReadAsStreamAsync(); #endif - return readAsStreamAsync.ConfigureAwait(false).GetAwaiter().GetResult(); + var streamFromResponse = readAsStreamAsync.ConfigureAwait(false).GetAwaiter().GetResult(); + if (response.Content.Headers.ContentEncoding.Any(x => "gzip".Equals(x, StringComparison.OrdinalIgnoreCase))) + { + streamFromResponse = new GZipStream(streamFromResponse, CompressionMode.Decompress); + } + + return streamFromResponse; } } } \ No newline at end of file diff --git a/Client.Core/Internal/RestSharpExtensions.cs b/Client.Core/Internal/RestSharpExtensions.cs index 454218e18..ca14950aa 100644 --- a/Client.Core/Internal/RestSharpExtensions.cs +++ b/Client.Core/Internal/RestSharpExtensions.cs @@ -10,9 +10,17 @@ namespace InfluxDB.Client.Core.Internal { internal static class RestSharpExtensions { - internal static IEnumerable ToHeaderParameters(this HttpHeaders httpHeaders) + /// + /// Transform `HttpHeaders` to `HeaderParameter` type. + /// + /// + /// Additionally content Headers + /// IEnumerable<HeaderParameter> + internal static IEnumerable ToHeaderParameters(this HttpHeaders httpHeaders, + HttpContentHeaders httpContentHeaders = null) { return httpHeaders + .Concat(httpContentHeaders ?? Enumerable.Empty>>()) .SelectMany(x => x.Value.Select(y => (x.Key, y))) .Select(x => new HeaderParameter(x.Key, x.y)); } diff --git a/Client.Test/ItWriteQueryApiTest.cs b/Client.Test/ItWriteQueryApiTest.cs index 56e158ae5..ebb10d1dd 100644 --- a/Client.Test/ItWriteQueryApiTest.cs +++ b/Client.Test/ItWriteQueryApiTest.cs @@ -920,5 +920,21 @@ public async Task WriteTooManyData() foreach (var successEvent in successEvents) Assert.AreEqual(50_000, successEvent.LineProtocol.Split("\n").Length); } + + [Test] + public async Task GzipWithLargeAmountOfData() + { + Client.EnableGzip(); + + var records = new List(); + for (var i = 0; i < 1000; i++) records.Add($"mem{i},tag=a value={i}i {i}"); + await Client.GetWriteApiAsync().WriteRecordsAsync(records); + + var tables = await _queryApi.QueryAsync( + $"from(bucket:\"{_bucket.Name}\") |> range(start: 0)"); + + Assert.AreEqual(1000, tables.Count); + Assert.AreEqual(1, tables[0].Records.Count); + } } } \ No newline at end of file diff --git a/Client.Test/QueryApiTest.cs b/Client.Test/QueryApiTest.cs index 8bb5858b6..91ad4f74d 100644 --- a/Client.Test/QueryApiTest.cs +++ b/Client.Test/QueryApiTest.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Diagnostics; +using System.IO; using System.Linq; using System.Threading.Tasks; using InfluxDB.Client.Api.Domain; @@ -127,6 +128,23 @@ public void RequiredOrgQueryAsync() ae.Message); } + [Test] + public async Task LoggedContentType() + { + var writer = new StringWriter(); + Trace.Listeners.Add(new TextWriterTraceListener(writer)); + + _influxDbClient.SetLogLevel(LogLevel.Headers); + + MockServer + .Given(Request.Create().WithPath("/api/v2/query").UsingPost()) + .RespondWith(CreateResponse(Data)); + + await _queryApi.QueryAsync("from(..."); + + StringAssert.Contains("Content-Type=text/csv; charset=utf-8", writer.ToString()); + } + private class SyncPoco { [Column(IsMeasurement = true)] public string Measurement { get; set; } diff --git a/Scripts/reformat-code.sh b/Scripts/reformat-code.sh index cdce1136c..c7a20c7f6 100755 --- a/Scripts/reformat-code.sh +++ b/Scripts/reformat-code.sh @@ -8,7 +8,7 @@ cd "$SCRIPT_PATH"/.. # # Install ReSharper command line tools # -dotnet tool install --tool-path="./reSharperCLI" JetBrains.ReSharper.GlobalTools --version 2021.3.3 || true +dotnet tool install --tool-path="./reSharperCLI" JetBrains.ReSharper.GlobalTools --version 2022.1.0 || true # # Reformat code