Skip to content

Commit cfb2c28

Browse files
authored
fix: Refactor to eliminate usage of .GetAwaiter().GetResult() in Framework builds. (#2534) (#2535)
1 parent 227003a commit cfb2c28

15 files changed

+68
-77
lines changed

src/Agent/NewRelic/Agent/Core/DataTransport/Client/HttpClientBase.cs

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
// Copyright 2020 New Relic, Inc. All rights reserved.
1+
// Copyright 2020 New Relic, Inc. All rights reserved.
22
// SPDX-License-Identifier: Apache-2.0
33

44
using System;
@@ -23,7 +23,7 @@ protected HttpClientBase(IWebProxy proxy)
2323
_proxy = proxy;
2424
}
2525

26-
public abstract Task<IHttpResponse> SendAsync(IHttpRequest request);
26+
public abstract IHttpResponse Send(IHttpRequest request);
2727

2828
public virtual void Dispose()
2929
{

src/Agent/NewRelic/Agent/Core/DataTransport/Client/HttpContentWrapper.cs

+3-4
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,9 @@
1-
// Copyright 2020 New Relic, Inc. All rights reserved.
1+
// Copyright 2020 New Relic, Inc. All rights reserved.
22
// SPDX-License-Identifier: Apache-2.0
33

44
#if !NETFRAMEWORK
55
using System.IO;
66
using System.Net.Http;
7-
using System.Threading.Tasks;
87
using NewRelic.Agent.Core.DataTransport.Client.Interfaces;
98

109
namespace NewRelic.Agent.Core.DataTransport.Client
@@ -21,9 +20,9 @@ public HttpContentWrapper(HttpContent httpContent)
2120
_httpContent = httpContent;
2221
}
2322

24-
public Task<Stream> ReadAsStreamAsync()
23+
public Stream ReadAsStream()
2524
{
26-
return _httpContent.ReadAsStreamAsync();
25+
return _httpContent.ReadAsStreamAsync().GetAwaiter().GetResult();
2726
}
2827

2928
public IHttpContentHeadersWrapper Headers => new HttpContentHeadersWrapper(_httpContent.Headers);

src/Agent/NewRelic/Agent/Core/DataTransport/Client/HttpResponse.cs

+4-4
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
// Copyright 2020 New Relic, Inc. All rights reserved.
1+
// Copyright 2020 New Relic, Inc. All rights reserved.
22
// SPDX-License-Identifier: Apache-2.0
33

44
#if !NETFRAMEWORK
@@ -28,7 +28,7 @@ public HttpResponse(Guid requestGuid, IHttpResponseMessageWrapper httpResponseMe
2828
_httpResponseMessageWrapper = httpResponseMessageWrapper;
2929
}
3030

31-
public async Task<string> GetContentAsync()
31+
public string GetContent()
3232
{
3333
try
3434
{
@@ -37,7 +37,7 @@ public async Task<string> GetContentAsync()
3737
return Constants.EmptyResponseBody;
3838
}
3939

40-
var responseStream = await _httpResponseMessageWrapper.Content.ReadAsStreamAsync();
40+
var responseStream = _httpResponseMessageWrapper.Content.ReadAsStream();
4141

4242
var contentTypeEncoding = _httpResponseMessageWrapper.Content.Headers.ContentEncoding;
4343
if (contentTypeEncoding.Contains("gzip"))
@@ -48,7 +48,7 @@ public async Task<string> GetContentAsync()
4848
using (responseStream)
4949
using (var reader = new StreamReader(responseStream, Encoding.UTF8))
5050
{
51-
var responseBody = await reader.ReadLineAsync();
51+
var responseBody = reader.ReadLineAsync().GetAwaiter().GetResult();
5252

5353
if (responseBody != null)
5454
{
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
// Copyright 2020 New Relic, Inc. All rights reserved.
1+
// Copyright 2020 New Relic, Inc. All rights reserved.
22
// SPDX-License-Identifier: Apache-2.0
33

44
using System;
@@ -8,6 +8,6 @@ namespace NewRelic.Agent.Core.DataTransport.Client.Interfaces
88
{
99
public interface IHttpClient : IDisposable
1010
{
11-
Task<IHttpResponse> SendAsync(IHttpRequest request);
11+
IHttpResponse Send(IHttpRequest request);
1212
}
1313
}
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,7 @@
1-
// Copyright 2020 New Relic, Inc. All rights reserved.
1+
// Copyright 2020 New Relic, Inc. All rights reserved.
22
// SPDX-License-Identifier: Apache-2.0
33

44
using System.IO;
5-
using System.Threading.Tasks;
65

76
namespace NewRelic.Agent.Core.DataTransport.Client.Interfaces
87
{
@@ -12,7 +11,7 @@ namespace NewRelic.Agent.Core.DataTransport.Client.Interfaces
1211
/// </summary>
1312
public interface IHttpContentWrapper
1413
{
15-
Task<Stream> ReadAsStreamAsync();
14+
Stream ReadAsStream();
1615
IHttpContentHeadersWrapper Headers { get; }
1716
}
1817
}

src/Agent/NewRelic/Agent/Core/DataTransport/Client/Interfaces/IHttpResponse.cs

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
// Copyright 2020 New Relic, Inc. All rights reserved.
1+
// Copyright 2020 New Relic, Inc. All rights reserved.
22
// SPDX-License-Identifier: Apache-2.0
33

44
using System;
@@ -11,6 +11,6 @@ public interface IHttpResponse : IDisposable
1111
{
1212
bool IsSuccessStatusCode { get; }
1313
HttpStatusCode StatusCode { get; }
14-
Task<string> GetContentAsync();
14+
string GetContent();
1515
}
1616
}

src/Agent/NewRelic/Agent/Core/DataTransport/Client/NRHttpClient.cs

+3-3
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
// Copyright 2020 New Relic, Inc. All rights reserved.
1+
// Copyright 2020 New Relic, Inc. All rights reserved.
22
// SPDX-License-Identifier: Apache-2.0
33

44
#if !NETFRAMEWORK
@@ -32,7 +32,7 @@ public NRHttpClient(IWebProxy proxy, IConfiguration configuration) : base(proxy)
3232
_httpClientWrapper = new HttpClientWrapper(httpClient, (int)configuration.CollectorTimeout);
3333
}
3434

35-
public override async Task<IHttpResponse> SendAsync(IHttpRequest request)
35+
public override IHttpResponse Send(IHttpRequest request)
3636
{
3737
try
3838
{
@@ -65,7 +65,7 @@ public override async Task<IHttpResponse> SendAsync(IHttpRequest request)
6565
req.Content.Headers.Add(contentHeader.Key, contentHeader.Value);
6666
}
6767

68-
var response = await _httpClientWrapper.SendAsync(req);
68+
var response = _httpClientWrapper.SendAsync(req).GetAwaiter().GetResult();
6969

7070
var httpResponse = new HttpResponse(request.RequestGuid, response);
7171
return httpResponse;

src/Agent/NewRelic/Agent/Core/DataTransport/Client/NRWebRequestClient.cs

+4-6
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
// Copyright 2020 New Relic, Inc. All rights reserved.
1+
// Copyright 2020 New Relic, Inc. All rights reserved.
22
// SPDX-License-Identifier: Apache-2.0
33

44
#if NETFRAMEWORK
@@ -25,7 +25,7 @@ public NRWebRequestClient(IWebProxy proxy, IConfiguration configuration) : base(
2525
_configuration = configuration;
2626
}
2727

28-
public override async Task<IHttpResponse> SendAsync(IHttpRequest request)
28+
public override IHttpResponse Send(IHttpRequest request)
2929
{
3030
try
3131
{
@@ -61,12 +61,10 @@ public override async Task<IHttpResponse> SendAsync(IHttpRequest request)
6161
throw new NullReferenceException("outputStream");
6262
}
6363

64-
// .ConfigureAwait(false) is required here for some reason
65-
await outputStream.WriteAsync(request.Content.PayloadBytes, 0, (int)_httpWebRequest.ContentLength).ConfigureAwait(false);
64+
outputStream.Write(request.Content.PayloadBytes, 0, (int)_httpWebRequest.ContentLength);
6665
}
6766

68-
// .ConfigureAwait(false) is required here for some reason
69-
var resp = (HttpWebResponse)await _httpWebRequest.GetResponseAsync().ConfigureAwait(false);
67+
var resp = (HttpWebResponse)_httpWebRequest.GetResponse();
7068

7169
return new WebRequestClientResponse(request.RequestGuid, resp);
7270
}

src/Agent/NewRelic/Agent/Core/DataTransport/Client/WebRequestClientResponse.cs

+4-4
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
// Copyright 2020 New Relic, Inc. All rights reserved.
1+
// Copyright 2020 New Relic, Inc. All rights reserved.
22
// SPDX-License-Identifier: Apache-2.0
33
#if NETFRAMEWORK
44
using System;
@@ -26,7 +26,7 @@ public WebRequestClientResponse(Guid requestGuid, HttpWebResponse response)
2626
_response = response;
2727
}
2828

29-
public Task<string> GetContentAsync()
29+
public string GetContent()
3030
{
3131
try
3232
{
@@ -51,14 +51,14 @@ public Task<string> GetContentAsync()
5151
using (var reader = new StreamReader(responseStream, Encoding.UTF8))
5252
{
5353
var responseBody = reader.ReadLine();
54-
return Task.FromResult(responseBody ?? Constants.EmptyResponseBody);
54+
return responseBody ?? Constants.EmptyResponseBody;
5555
}
5656
}
5757
catch (Exception ex)
5858
{
5959
Log.Error(ex, "Request({0}): Unable to parse response body.", _requestGuid);
6060

61-
return Task.FromResult(Constants.EmptyResponseBody);
61+
return Constants.EmptyResponseBody;
6262
}
6363
}
6464

src/Agent/NewRelic/Agent/Core/DataTransport/HttpCollectorWire.cs

+2-2
Original file line numberDiff line numberDiff line change
@@ -62,9 +62,9 @@ public string SendData(string method, ConnectionInfo connectionInfo, string seri
6262
foreach (var header in _requestHeadersMap)
6363
request.Headers.Add(header.Key, header.Value);
6464

65-
using var response = httpClient.SendAsync(request).GetAwaiter().GetResult();
65+
using var response = httpClient.Send(request);
6666

67-
var responseContent = response.GetContentAsync().GetAwaiter().GetResult();
67+
var responseContent = response.GetContent();
6868

6969
if (!response.IsSuccessStatusCode)
7070
{

tests/Agent/UnitTests/Core.UnitTest/DataTransport/Client/HttpResponseTests.cs

+8-10
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,12 @@
44
#if !NETFRAMEWORK
55
using System;
66
using System.Collections.Generic;
7-
using System.Net.Http;
87
using System.IO;
98
using System.IO.Compression;
109
using Telerik.JustMock;
1110
using NUnit.Framework;
1211
using System.Net;
1312
using System.Text;
14-
using System.Threading.Tasks;
1513
using NewRelic.Agent.Core.DataTransport.Client.Interfaces;
1614
using Telerik.JustMock.Helpers;
1715

@@ -40,30 +38,30 @@ public void TearDown()
4038
}
4139

4240
[Test]
43-
public async Task GetContentAsync_ReturnsEmptyResponseBody_WhenContentIsNull()
41+
public void GetContent_ReturnsEmptyResponseBody_WhenContentIsNull()
4442
{
4543
_mockHttpResponseMessage.Arrange(message => message.Content).Returns((IHttpContentWrapper)null);
4644

47-
var result = await _httpResponse.GetContentAsync();
45+
var result = _httpResponse.GetContent();
4846

4947
Assert.That(result, Is.EqualTo(Constants.EmptyResponseBody));
5048
}
5149

5250
[Test]
53-
public async Task GetContentAsync_ReturnsContent_WhenContentIsNotNull()
51+
public void GetContent_ReturnsContent_WhenContentIsNotNull()
5452
{
5553
var mockContent = Mock.Create<IHttpContentWrapper>();
5654
var stream = new MemoryStream(Encoding.UTF8.GetBytes(TestResponseBody));
5755
_mockHttpResponseMessage.Arrange(message => message.Content).Returns(mockContent);
58-
mockContent.Arrange(content => content.ReadAsStreamAsync()).ReturnsAsync((Stream)stream);
56+
mockContent.Arrange(content => content.ReadAsStream()).Returns(stream);
5957

60-
var result = await _httpResponse.GetContentAsync();
58+
var result = _httpResponse.GetContent();
6159

6260
Assert.That(result, Is.EqualTo(TestResponseBody));
6361
}
6462

6563
[Test]
66-
public async Task GetContentAsync_HandlesGzipDecompression_WhenContentEncodingIsGzip()
64+
public void GetContent_HandlesGzipDecompression_WhenContentEncodingIsGzip()
6765
{
6866
var compressedStream = new MemoryStream();
6967
using (var gzipStream = new GZipStream(compressedStream, CompressionMode.Compress, true))
@@ -79,9 +77,9 @@ public async Task GetContentAsync_HandlesGzipDecompression_WhenContentEncodingIs
7977
var mockHeaders = Mock.Create<IHttpContentHeadersWrapper>();
8078
mockContent.Arrange(content => content.Headers).Returns(mockHeaders);
8179
mockHeaders.Arrange(headers => headers.ContentEncoding).Returns(new List<string> { "gzip" });
82-
mockContent.Arrange(content => content.ReadAsStreamAsync()).ReturnsAsync((Stream)compressedStream);
80+
mockContent.Arrange(content => content.ReadAsStream()).Returns(compressedStream);
8381

84-
var result = await _httpResponse.GetContentAsync();
82+
var result = _httpResponse.GetContent();
8583

8684
Assert.That(result, Is.EqualTo(TestResponseBody));
8785
}

tests/Agent/UnitTests/Core.UnitTest/DataTransport/Client/NRHttpClientTests.cs

+3-3
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ public void TearDown()
5151
_mockHttpClientWrapper.Dispose();
5252
}
5353
[Test]
54-
public async Task SendAsync_ReturnsResponse_WhenSendAsyncSucceeds()
54+
public void Send_ReturnsResponse_WhenSendAsyncSucceeds()
5555
{
5656
// Arrange
5757
var request = CreateHttpRequest();
@@ -64,7 +64,7 @@ public async Task SendAsync_ReturnsResponse_WhenSendAsyncSucceeds()
6464
.ReturnsAsync(mockHttpResponseMessage);
6565

6666
// Act
67-
var response = await _client.SendAsync(request);
67+
var response = _client.Send(request);
6868

6969
// Assert
7070
Assert.That(response, Is.Not.Null);
@@ -80,7 +80,7 @@ public void SendAsync_ThrowsHttpRequestException_WhenSendAsyncThrows()
8080
.Throws<HttpRequestException>();
8181

8282
// Act & Assert
83-
Assert.ThrowsAsync<HttpRequestException>(() => _client.SendAsync(request));
83+
Assert.Throws<HttpRequestException>(() => _client.Send(request));
8484
}
8585

8686
private IHttpRequest CreateHttpRequest()

tests/Agent/UnitTests/Core.UnitTest/DataTransport/Client/NRWebRequestClientTests.cs

+9-12
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,10 @@
55
using System;
66
using System.IO;
77
using System.Net;
8-
using System.Threading.Tasks;
98
using NewRelic.Agent.Configuration;
109
using NewRelic.Agent.Core.DataTransport.Client.Interfaces;
1110
using NUnit.Framework;
1211
using Telerik.JustMock;
13-
using Telerik.JustMock.AutoMock.Ninject.Activation;
14-
using Telerik.JustMock.Helpers;
1512

1613
namespace NewRelic.Agent.Core.DataTransport.Client
1714
{
@@ -52,20 +49,20 @@ public void TearDown()
5249
}
5350

5451
[Test]
55-
public async Task SendAsync_ShouldReturnValidResponse_WhenWebRequestIsSuccessful()
52+
public void Send_ShouldReturnValidResponse_WhenWebRequestIsSuccessful()
5653
{
5754
// Arrange
5855
var fakeResponse = Mock.Create<HttpWebResponse>();
5956
_client.SetHttpWebRequestFunc(uri =>
6057
{
6158
var mockWebRequest = Mock.Create<HttpWebRequest>();
6259
Mock.Arrange(() => mockWebRequest.GetRequestStream()).Returns(new MemoryStream());
63-
Mock.Arrange(() => mockWebRequest.GetResponseAsync()).ReturnsAsync((WebResponse)fakeResponse);
60+
Mock.Arrange(() => mockWebRequest.GetResponse()).Returns((WebResponse)fakeResponse);
6461
return mockWebRequest;
6562
});
6663

6764
// Act
68-
var response = await _client.SendAsync(_request);
65+
var response = _client.Send(_request);
6966

7067
// Assert
7168
Assert.That(response, Is.Not.Null);
@@ -83,7 +80,7 @@ public void SendAsync_ShouldThrow_WhenNullOutputStream()
8380
});
8481

8582
// Act & Assert
86-
Assert.ThrowsAsync<NullReferenceException>(() => _client.SendAsync(_request));
83+
Assert.Throws<NullReferenceException>(() => _client.Send(_request));
8784
}
8885

8986
[Test]
@@ -95,15 +92,15 @@ public void SendAsync_ThrowsWebException_WhenWebExceptionResponseIsNull()
9592
var mockWebRequest = Mock.Create<HttpWebRequest>();
9693
Mock.Arrange(() => mockWebRequest.Address).Returns(new Uri("https://sometesthost.com"));
9794
var webException = new WebException("testing");
98-
Mock.Arrange(() => mockWebRequest.GetResponseAsync()).Throws(webException);
95+
Mock.Arrange(() => mockWebRequest.GetResponse()).Throws(webException);
9996
return mockWebRequest;
10097
});
10198

10299
// Act & Assert
103-
Assert.ThrowsAsync<WebException>(() => _client.SendAsync(_request));
100+
Assert.Throws<WebException>(() => _client.Send(_request));
104101
}
105102
[Test]
106-
public async Task SendAsync_ReturnsResponse_WhenWebExceptionResponseIsNotNull()
103+
public void Send_ReturnsResponse_WhenWebExceptionResponseIsNotNull()
107104
{
108105
// Arrange
109106
_client.SetHttpWebRequestFunc(uri =>
@@ -115,12 +112,12 @@ public async Task SendAsync_ReturnsResponse_WhenWebExceptionResponseIsNotNull()
115112
Mock.Arrange(() => mockHttpWebResponse.StatusCode).Returns(HttpStatusCode.BadRequest);
116113
Mock.Arrange(() => mockHttpWebResponse.StatusDescription).Returns("Bad Request");
117114
var webException = new WebException("testing", null, WebExceptionStatus.SendFailure,mockHttpWebResponse);
118-
Mock.Arrange(() => mockWebRequest.GetResponseAsync()).Throws(webException);
115+
Mock.Arrange(() => mockWebRequest.GetResponse()).Throws(webException);
119116
return mockWebRequest;
120117
});
121118

122119
// Act
123-
var response = await _client.SendAsync(_request);
120+
var response = _client.Send(_request);
124121

125122
// Assert
126123
Assert.That(response, Is.Not.Null);

0 commit comments

Comments
 (0)