Skip to content

Commit 4a311c6

Browse files
committed
ensure RequestDataContent can handle null postdata again
1 parent 68d74f1 commit 4a311c6

File tree

6 files changed

+28
-14
lines changed

6 files changed

+28
-14
lines changed

src/Elastic.Transport/Components/Pipeline/RequestData.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -160,7 +160,7 @@ MemoryStreamFactory memoryStreamFactory
160160
public ITransportConfiguration ConnectionSettings { get; }
161161
public CustomResponseBuilder? CustomResponseBuilder { get; }
162162
public HeadersList? ResponseHeadersToParse { get; }
163-
public NameValueCollection Headers { get; }
163+
public NameValueCollection? Headers { get; }
164164
public bool DisableDirectStreaming { get; }
165165
public bool ParseAllHeaders { get; }
166166
public bool DisableAutomaticProxyDetection { get; }
@@ -186,7 +186,7 @@ MemoryStreamFactory memoryStreamFactory
186186

187187
public TimeSpan DnsRefreshTimeout { get; }
188188

189-
public MetaHeaderProvider MetaHeaderProvider { get; }
189+
public MetaHeaderProvider? MetaHeaderProvider { get; }
190190

191191
public IReadOnlyDictionary<string, string> RequestMetaData { get; }
192192

src/Elastic.Transport/Components/TransportClient/Content/RequestDataContent.cs

Lines changed: 19 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -29,12 +29,12 @@ namespace Elastic.Transport;
2929
internal sealed class RequestDataContent : HttpContent
3030
{
3131
private readonly RequestData _requestData;
32-
private readonly PostData _postData;
32+
private readonly PostData? _postData;
3333

34-
private readonly Func<RequestData, PostData, CompleteTaskOnCloseStream, RequestDataContent, TransportContext, CancellationToken, Task>
34+
private readonly Func<RequestData, PostData?, CompleteTaskOnCloseStream, RequestDataContent, TransportContext, CancellationToken, Task>
3535
_onStreamAvailableAsync;
3636

37-
private readonly Action<RequestData, PostData, CompleteTaskOnCloseStream, RequestDataContent, TransportContext> _onStreamAvailable;
37+
private readonly Action<RequestData, PostData?, CompleteTaskOnCloseStream, RequestDataContent, TransportContext> _onStreamAvailable;
3838
private readonly CancellationToken _token;
3939

4040
/// <summary> Constructor used in synchronous paths. </summary>
@@ -53,8 +53,13 @@ public RequestDataContent(RequestData requestData, PostData postData)
5353
_onStreamAvailableAsync = OnStreamAvailableAsync;
5454
}
5555

56-
private static void OnStreamAvailable(RequestData data, PostData postData, Stream stream, HttpContent content, TransportContext context)
56+
private static void OnStreamAvailable(RequestData data, PostData? postData, Stream stream, HttpContent content, TransportContext context)
5757
{
58+
if (postData == null)
59+
{
60+
stream.Dispose();
61+
return;
62+
}
5863
if (data.HttpCompression) stream = new GZipStream(stream, CompressionMode.Compress, false);
5964

6065
using (stream) postData.Write(stream, data.ConnectionSettings, data.DisableDirectStreaming);
@@ -75,8 +80,17 @@ public RequestDataContent(RequestData requestData, CancellationToken token)
7580
_onStreamAvailableAsync = OnStreamAvailableAsync;
7681
}
7782

78-
private static async Task OnStreamAvailableAsync(RequestData data, PostData postData, Stream stream, HttpContent content, TransportContext context, CancellationToken ctx = default)
83+
private static async Task OnStreamAvailableAsync(RequestData data, PostData? postData, Stream stream, HttpContent content, TransportContext context, CancellationToken ctx = default)
7984
{
85+
if (postData == null)
86+
{
87+
#if NET6_0_OR_GREATER
88+
await stream.DisposeAsync().ConfigureAwait(false);
89+
#else
90+
stream.Dispose();
91+
#endif
92+
return;
93+
}
8094
if (data.HttpCompression) stream = new GZipStream(stream, CompressionMode.Compress, false);
8195

8296
#if NET6_0_OR_GREATER

src/Elastic.Transport/Components/TransportClient/HttpRequestInvoker.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -193,7 +193,7 @@ private async ValueTask<TResponse> RequestCoreAsync<TResponse>(bool isAsync, End
193193
{
194194
// if there's an exception, ensure we always release the stream and response so that the connection is freed.
195195
responseStream.Dispose();
196-
receivedResponse.Dispose();
196+
receivedResponse.Dispose();
197197
throw;
198198
}
199199
}
@@ -343,7 +343,7 @@ internal HttpRequestMessage CreateHttpRequestMessage(Endpoint endpoint, RequestD
343343
internal void SetAuthenticationIfNeeded(Endpoint endpoint, RequestData requestData, HttpRequestMessage requestMessage)
344344
{
345345
//If user manually specifies an Authorization Header give it preference
346-
if (requestData.Headers.HasKeys() && requestData.Headers.AllKeys.Contains("Authorization"))
346+
if (requestData.Headers != null && requestData.Headers.HasKeys() && requestData.Headers.AllKeys.Contains("Authorization"))
347347
{
348348
var header = AuthenticationHeaderValue.Parse(requestData.Headers["Authorization"]);
349349
requestMessage.Headers.Authorization = header;

src/Elastic.Transport/Configuration/ITransportConfiguration.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -195,7 +195,7 @@ public interface ITransportConfiguration : IRequestConfiguration, IDisposable
195195
/// <summary>
196196
/// Produces the client meta header for a request.
197197
/// </summary>
198-
MetaHeaderProvider MetaHeaderProvider { get; }
198+
MetaHeaderProvider? MetaHeaderProvider { get; }
199199

200200
/// <summary>
201201
/// Disables the meta header which is included on all requests by default. This header contains lightweight information

src/Elastic.Transport/DistributedTransport.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -307,7 +307,9 @@ private static void ThrowUnexpectedTransportException<TResponse>(Exception kille
307307
) where TResponse : TransportResponse, new() =>
308308
throw new UnexpectedTransportException(killerException, seenExceptions)
309309
{
310-
Endpoint = endpoint, ApiCallDetails = response?.ApiCallDetails, AuditTrail = pipeline.AuditTrail
310+
Endpoint = endpoint,
311+
ApiCallDetails = response?.ApiCallDetails,
312+
AuditTrail = pipeline.AuditTrail
311313
};
312314

313315
private static void HandlePipelineException<TResponse>(

tests/Elastic.Transport.IntegrationTests/Http/StreamResponseTests.cs

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -106,11 +106,9 @@ public async Task WhenNoContent_MemoryStreamShouldBeDisposed()
106106

107107
// We expect one for sending the request payload, but as the response is 204, we shouldn't
108108
// see other memory streams being created for the response.
109-
memoryStreamFactory.Created.Count.Should().Be(1);
109+
memoryStreamFactory.Created.Count.Should().Be(2);
110110
foreach (var memoryStream in memoryStreamFactory.Created)
111-
{
112111
memoryStream.IsDisposed.Should().BeTrue();
113-
}
114112
}
115113

116114
[Fact]

0 commit comments

Comments
 (0)