Skip to content

Commit

Permalink
ensure RequestDataContent can handle null postdata again
Browse files Browse the repository at this point in the history
  • Loading branch information
Mpdreamz committed Oct 30, 2024
1 parent 68d74f1 commit 4a311c6
Show file tree
Hide file tree
Showing 6 changed files with 28 additions and 14 deletions.
4 changes: 2 additions & 2 deletions src/Elastic.Transport/Components/Pipeline/RequestData.cs
Original file line number Diff line number Diff line change
Expand Up @@ -160,7 +160,7 @@ MemoryStreamFactory memoryStreamFactory
public ITransportConfiguration ConnectionSettings { get; }
public CustomResponseBuilder? CustomResponseBuilder { get; }
public HeadersList? ResponseHeadersToParse { get; }
public NameValueCollection Headers { get; }
public NameValueCollection? Headers { get; }
public bool DisableDirectStreaming { get; }
public bool ParseAllHeaders { get; }
public bool DisableAutomaticProxyDetection { get; }
Expand All @@ -186,7 +186,7 @@ MemoryStreamFactory memoryStreamFactory

public TimeSpan DnsRefreshTimeout { get; }

public MetaHeaderProvider MetaHeaderProvider { get; }
public MetaHeaderProvider? MetaHeaderProvider { get; }

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

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,12 +29,12 @@ namespace Elastic.Transport;
internal sealed class RequestDataContent : HttpContent
{
private readonly RequestData _requestData;
private readonly PostData _postData;
private readonly PostData? _postData;

private readonly Func<RequestData, PostData, CompleteTaskOnCloseStream, RequestDataContent, TransportContext, CancellationToken, Task>
private readonly Func<RequestData, PostData?, CompleteTaskOnCloseStream, RequestDataContent, TransportContext, CancellationToken, Task>
_onStreamAvailableAsync;

private readonly Action<RequestData, PostData, CompleteTaskOnCloseStream, RequestDataContent, TransportContext> _onStreamAvailable;
private readonly Action<RequestData, PostData?, CompleteTaskOnCloseStream, RequestDataContent, TransportContext> _onStreamAvailable;
private readonly CancellationToken _token;

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

private static void OnStreamAvailable(RequestData data, PostData postData, Stream stream, HttpContent content, TransportContext context)
private static void OnStreamAvailable(RequestData data, PostData? postData, Stream stream, HttpContent content, TransportContext context)
{
if (postData == null)
{
stream.Dispose();
return;
}
if (data.HttpCompression) stream = new GZipStream(stream, CompressionMode.Compress, false);

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

private static async Task OnStreamAvailableAsync(RequestData data, PostData postData, Stream stream, HttpContent content, TransportContext context, CancellationToken ctx = default)
private static async Task OnStreamAvailableAsync(RequestData data, PostData? postData, Stream stream, HttpContent content, TransportContext context, CancellationToken ctx = default)
{
if (postData == null)
{
#if NET6_0_OR_GREATER
await stream.DisposeAsync().ConfigureAwait(false);
#else
stream.Dispose();
#endif
return;
}
if (data.HttpCompression) stream = new GZipStream(stream, CompressionMode.Compress, false);

#if NET6_0_OR_GREATER
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -193,7 +193,7 @@ private async ValueTask<TResponse> RequestCoreAsync<TResponse>(bool isAsync, End
{
// if there's an exception, ensure we always release the stream and response so that the connection is freed.
responseStream.Dispose();
receivedResponse.Dispose();
receivedResponse.Dispose();
throw;
}
}
Expand Down Expand Up @@ -343,7 +343,7 @@ internal HttpRequestMessage CreateHttpRequestMessage(Endpoint endpoint, RequestD
internal void SetAuthenticationIfNeeded(Endpoint endpoint, RequestData requestData, HttpRequestMessage requestMessage)
{
//If user manually specifies an Authorization Header give it preference
if (requestData.Headers.HasKeys() && requestData.Headers.AllKeys.Contains("Authorization"))
if (requestData.Headers != null && requestData.Headers.HasKeys() && requestData.Headers.AllKeys.Contains("Authorization"))
{
var header = AuthenticationHeaderValue.Parse(requestData.Headers["Authorization"]);
requestMessage.Headers.Authorization = header;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -195,7 +195,7 @@ public interface ITransportConfiguration : IRequestConfiguration, IDisposable
/// <summary>
/// Produces the client meta header for a request.
/// </summary>
MetaHeaderProvider MetaHeaderProvider { get; }
MetaHeaderProvider? MetaHeaderProvider { get; }

/// <summary>
/// Disables the meta header which is included on all requests by default. This header contains lightweight information
Expand Down
4 changes: 3 additions & 1 deletion src/Elastic.Transport/DistributedTransport.cs
Original file line number Diff line number Diff line change
Expand Up @@ -307,7 +307,9 @@ private static void ThrowUnexpectedTransportException<TResponse>(Exception kille
) where TResponse : TransportResponse, new() =>
throw new UnexpectedTransportException(killerException, seenExceptions)
{
Endpoint = endpoint, ApiCallDetails = response?.ApiCallDetails, AuditTrail = pipeline.AuditTrail
Endpoint = endpoint,
ApiCallDetails = response?.ApiCallDetails,
AuditTrail = pipeline.AuditTrail
};

private static void HandlePipelineException<TResponse>(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -106,11 +106,9 @@ public async Task WhenNoContent_MemoryStreamShouldBeDisposed()

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

[Fact]
Expand Down

0 comments on commit 4a311c6

Please sign in to comment.