diff --git a/tracer/missing-nullability-files.csv b/tracer/missing-nullability-files.csv index 5aa540291a4f..74759b858cbe 100644 --- a/tracer/missing-nullability-files.csv +++ b/tracer/missing-nullability-files.csv @@ -242,8 +242,6 @@ src/Datadog.Trace/Agent/TraceSamplers/ErrorSampler.cs src/Datadog.Trace/Agent/TraceSamplers/ITraceChunkSampler.cs src/Datadog.Trace/Agent/TraceSamplers/PrioritySampler.cs src/Datadog.Trace/Agent/TraceSamplers/RareSampler.cs -src/Datadog.Trace/Agent/Transports/ApiWebRequest.cs -src/Datadog.Trace/Agent/Transports/ApiWebRequestFactory.cs src/Datadog.Trace/Agent/Transports/HttpClientRequest.cs src/Datadog.Trace/Agent/Transports/HttpClientRequestFactory.cs src/Datadog.Trace/Agent/Transports/HttpStreamRequest.cs diff --git a/tracer/src/Datadog.Trace.Trimming/build/Datadog.Trace.Trimming.xml b/tracer/src/Datadog.Trace.Trimming/build/Datadog.Trace.Trimming.xml index b2c71c22161e..e40b5114dbad 100644 --- a/tracer/src/Datadog.Trace.Trimming/build/Datadog.Trace.Trimming.xml +++ b/tracer/src/Datadog.Trace.Trimming/build/Datadog.Trace.Trimming.xml @@ -438,7 +438,6 @@ - diff --git a/tracer/src/Datadog.Trace/Agent/AgentTransportStrategy.cs b/tracer/src/Datadog.Trace/Agent/AgentTransportStrategy.cs index f512fc08dda1..1341ccd32d52 100644 --- a/tracer/src/Datadog.Trace/Agent/AgentTransportStrategy.cs +++ b/tracer/src/Datadog.Trace/Agent/AgentTransportStrategy.cs @@ -72,13 +72,8 @@ public static IApiRequestFactory Get( #endif case TracesTransportType.Default: default: -#if NETCOREAPP Log.Information("Using " + nameof(HttpClientRequestFactory) + " for {ProductName} transport.", productName); return new HttpClientRequestFactory(getBaseEndpoint(settings.AgentUri), defaultAgentHeaders, timeout: tcpTimeout); -#else - Log.Information("Using " + nameof(ApiWebRequestFactory) + " for {ProductName} transport.", productName); - return new ApiWebRequestFactory(getBaseEndpoint(settings.AgentUri), defaultAgentHeaders, timeout: tcpTimeout); -#endif } } } diff --git a/tracer/src/Datadog.Trace/Agent/Transports/ApiWebRequest.cs b/tracer/src/Datadog.Trace/Agent/Transports/ApiWebRequest.cs deleted file mode 100644 index 8142af44ccb6..000000000000 --- a/tracer/src/Datadog.Trace/Agent/Transports/ApiWebRequest.cs +++ /dev/null @@ -1,191 +0,0 @@ -// -// Unless explicitly stated otherwise all files in this repository are licensed under the Apache 2 License. -// This product includes software developed at Datadog (https://www.datadoghq.com/). Copyright 2017 Datadog, Inc. -// - -using System; -using System.IO; -using System.IO.Compression; -using System.Net; -using System.Text; -using System.Threading.Tasks; -using Datadog.Trace.Logging; -using Datadog.Trace.Util; -using static Datadog.Trace.HttpOverStreams.DatadogHttpValues; - -namespace Datadog.Trace.Agent.Transports -{ - internal class ApiWebRequest : IApiRequest - { - private const string BoundarySeparator = $"{CrLf}--{Boundary}{CrLf}"; - private const string BoundaryTrailer = $"{CrLf}--{Boundary}--{CrLf}"; - - private static readonly IDatadogLogger Log = DatadogLogging.GetLoggerFor(); - private readonly HttpWebRequest _request; - - private byte[] _boundarySeparatorInBytes; - private byte[] _boundaryTrailerInBytes; - - public ApiWebRequest(HttpWebRequest request) - { - _request = request; - } - - public void AddHeader(string name, string value) - { - _request.Headers.Add(name, value); - } - - public Task GetAsync() - { - ResetRequest(method: "GET", contentType: null, contentEncoding: null); - - return FinishAndGetResponse(); - } - - public Task PostAsync(ArraySegment bytes, string contentType) - => PostAsync(bytes, contentType, null); - - public async Task PostAsync(ArraySegment bytes, string contentType, string contentEncoding) - { - ResetRequest(method: "POST", contentType, contentEncoding); - - using (var requestStream = await _request.GetRequestStreamAsync().ConfigureAwait(false)) - { - await requestStream.WriteAsync(bytes.Array, bytes.Offset, bytes.Count).ConfigureAwait(false); - } - - return await FinishAndGetResponse().ConfigureAwait(false); - } - - public async Task PostAsync(Func writeToRequestStream, string contentType, string contentEncoding, string multipartBoundary) - { - ResetRequest(method: "POST", ContentTypeHelper.GetContentType(contentType, multipartBoundary), contentEncoding); - - using (var requestStream = await _request.GetRequestStreamAsync().ConfigureAwait(false)) - { - await writeToRequestStream(requestStream).ConfigureAwait(false); - } - - return await FinishAndGetResponse().ConfigureAwait(false); - } - - /// - /// Send a Post request using multipart form data. - /// WARNING: Name and FileName of each MultipartFormItem instance must be ASCII encoding compatible. - /// - /// Multipart form data items - /// Multipart compression - /// Task with the response - public async Task PostAsync(MultipartFormItem[] items, MultipartCompression multipartCompression = MultipartCompression.None) - { - if (items is null) - { - ThrowHelper.ThrowArgumentNullException(nameof(items)); - } - - Log.Debug("Sending multipart form request with {Count} items.", items.Length); - - ResetRequest(method: "POST", contentType: "multipart/form-data; boundary=" + Boundary, contentEncoding: multipartCompression == MultipartCompression.GZip ? "gzip" : null); - using (var reqStream = await _request.GetRequestStreamAsync().ConfigureAwait(false)) - { - if (multipartCompression == MultipartCompression.GZip) - { - Log.Debug("Using MultipartCompression.GZip"); - using var gzip = new GZipStream(reqStream, CompressionMode.Compress, leaveOpen: true); - await WriteToStreamAsync(items, gzip).ConfigureAwait(false); - await gzip.FlushAsync().ConfigureAwait(false); - Log.Debug("Compressing multipart payload..."); - } - else - { - await WriteToStreamAsync(items, reqStream).ConfigureAwait(false); - } - } - - return await FinishAndGetResponse().ConfigureAwait(false); - - async Task WriteToStreamAsync(MultipartFormItem[] multipartItems, Stream requestStream) - { - // Write form request using the boundary - var boundaryBytes = _boundarySeparatorInBytes ??= Encoding.ASCII.GetBytes(BoundarySeparator); - var trailerBytes = _boundaryTrailerInBytes ??= Encoding.ASCII.GetBytes(BoundaryTrailer); - - // Write each MultipartFormItem - var itemsWritten = 0; - foreach (var item in multipartItems) - { - if (!item.IsValid(Log)) - { - continue; - } - - var headerBytes = Encoding.ASCII.GetBytes( - item.FileName is not null - ? $"Content-Type: {item.ContentType}\r\nContent-Disposition: form-data; name=\"{item.Name}\"; filename=\"{item.FileName}\"\r\n\r\n" - : $"Content-Type: {item.ContentType}\r\nContent-Disposition: form-data; name=\"{item.Name}\"\r\n\r\n"); - - if (itemsWritten == 0) - { - // If we are writing the first item, we skip the initial `\r\n` in the array - await requestStream.WriteAsync(boundaryBytes, 2, boundaryBytes.Length - 2).ConfigureAwait(false); - } - else - { - await requestStream.WriteAsync(boundaryBytes, 0, boundaryBytes.Length).ConfigureAwait(false); - } - - await requestStream.WriteAsync(headerBytes, 0, headerBytes.Length).ConfigureAwait(false); - if (item.ContentInBytes is { } arraySegment) - { - Log.Debug("Adding to Multipart Byte Array | Name: {Name} | FileName: {FileName} | ContentType: {ContentType}", item.Name, item.FileName, item.ContentType); - await requestStream.WriteAsync(arraySegment.Array, arraySegment.Offset, arraySegment.Count).ConfigureAwait(false); - } - else if (item.ContentInStream is { } stream) - { - Log.Debug("Adding to Multipart Stream | Name: {Name} | FileName: {FileName} | ContentType: {ContentType}", item.Name, item.FileName, item.ContentType); - await stream.CopyToAsync(requestStream).ConfigureAwait(false); - } - - itemsWritten++; - } - - if (itemsWritten == 0) - { - await requestStream.WriteAsync(boundaryBytes, 2, boundaryBytes.Length - 2).ConfigureAwait(false); - } - - await requestStream.WriteAsync(trailerBytes, 0, trailerBytes.Length).ConfigureAwait(false); - } - } - - private void ResetRequest(string method, string contentType, string contentEncoding) - { - _request.Method = method; - _request.ContentType = string.IsNullOrEmpty(contentType) ? null : contentType; - if (string.IsNullOrEmpty(contentEncoding)) - { - _request.Headers.Remove(HttpRequestHeader.ContentEncoding); - } - else - { - _request.Headers.Set(HttpRequestHeader.ContentEncoding, contentEncoding); - } - } - - private async Task FinishAndGetResponse() - { - try - { - var httpWebResponse = (HttpWebResponse)await _request.GetResponseAsync().ConfigureAwait(false); - return new ApiWebResponse(httpWebResponse); - } - catch (WebException exception) - when (exception.Status == WebExceptionStatus.ProtocolError && exception.Response != null) - { - // If the exception is caused by an error status code, ignore it and let the caller handle the result - return new ApiWebResponse((HttpWebResponse)exception.Response); - } - } - } -} diff --git a/tracer/src/Datadog.Trace/Agent/Transports/ApiWebRequestFactory.cs b/tracer/src/Datadog.Trace/Agent/Transports/ApiWebRequestFactory.cs deleted file mode 100644 index 55cfb933d0f0..000000000000 --- a/tracer/src/Datadog.Trace/Agent/Transports/ApiWebRequestFactory.cs +++ /dev/null @@ -1,69 +0,0 @@ -// -// Unless explicitly stated otherwise all files in this repository are licensed under the Apache 2 License. -// This product includes software developed at Datadog (https://www.datadoghq.com/). Copyright 2017 Datadog, Inc. -// - -using System; -using System.Collections.Generic; -using System.Net; -using Datadog.Trace.Util; - -#pragma warning disable CS0618 // WebRequest, HttpWebRequest, ServicePoint, and WebClient are obsolete. Use HttpClient instead. - -namespace Datadog.Trace.Agent.Transports -{ - internal class ApiWebRequestFactory : IApiRequestFactory - { - private readonly KeyValuePair[] _defaultHeaders; - private readonly Uri _baseEndpoint; - private WebProxy _proxy; - private NetworkCredential _credential; - private TimeSpan? _timeout; - - public ApiWebRequestFactory(Uri baseEndpoint, KeyValuePair[] defaultHeaders, TimeSpan? timeout = null) - { - _baseEndpoint = baseEndpoint; - _defaultHeaders = defaultHeaders; - _timeout = timeout; - } - - public string Info(Uri endpoint) - { - return endpoint.ToString(); - } - - public Uri GetEndpoint(string relativePath) => UriHelpers.Combine(_baseEndpoint, relativePath); - - public IApiRequest Create(Uri endpoint) - { - var request = WebRequest.CreateHttp(endpoint); - if (_proxy is not null) - { - request.Proxy = _proxy; - } - - if (_credential is not null) - { - request.Credentials = _credential; - } - - if (_timeout.HasValue) - { - request.Timeout = (int)_timeout.Value.TotalMilliseconds; - } - - foreach (var pair in _defaultHeaders) - { - request.Headers.Add(pair.Key, pair.Value); - } - - return new ApiWebRequest(request); - } - - public void SetProxy(WebProxy proxy, NetworkCredential credential) - { - _proxy = proxy; - _credential = credential; - } - } -} diff --git a/tracer/src/Datadog.Trace/Agent/Transports/ApiWebResponse.cs b/tracer/src/Datadog.Trace/Agent/Transports/ApiWebResponse.cs deleted file mode 100644 index ced78e83c14e..000000000000 --- a/tracer/src/Datadog.Trace/Agent/Transports/ApiWebResponse.cs +++ /dev/null @@ -1,49 +0,0 @@ -// -// Unless explicitly stated otherwise all files in this repository are licensed under the Apache 2 License. -// This product includes software developed at Datadog (https://www.datadoghq.com/). Copyright 2017 Datadog, Inc. -// - -#nullable enable - -using System; -using System.IO; -using System.Net; -using System.Text; -using System.Threading.Tasks; - -namespace Datadog.Trace.Agent.Transports -{ - internal class ApiWebResponse : IApiResponse, IDisposable - { - private readonly HttpWebResponse _response; - - public ApiWebResponse(HttpWebResponse response) - { - _response = response; - } - - public int StatusCode => (int)_response.StatusCode; - - public long ContentLength => _response.ContentLength; - - public string? ContentTypeHeader => _response.ContentType; - - public string? ContentEncodingHeader => _response.ContentEncoding; - - public string? GetHeader(string headerName) => _response.Headers[headerName]; - - public Encoding GetCharsetEncoding() => ApiResponseExtensions.GetCharsetEncoding(ContentTypeHeader); - - public ContentEncodingType GetContentEncodingType() => ApiResponseExtensions.GetContentEncodingType(ContentEncodingHeader); - - public Task GetStreamAsync() - { - return Task.FromResult(_response.GetResponseStream()); - } - - public void Dispose() - { - _response?.Dispose(); - } - } -} diff --git a/tracer/src/Datadog.Trace/Agent/Transports/GzipCompressedContent.cs b/tracer/src/Datadog.Trace/Agent/Transports/GzipCompressedContent.cs index bb6d237de486..2d6b264ca832 100644 --- a/tracer/src/Datadog.Trace/Agent/Transports/GzipCompressedContent.cs +++ b/tracer/src/Datadog.Trace/Agent/Transports/GzipCompressedContent.cs @@ -5,7 +5,6 @@ #nullable enable -#if NETCOREAPP using System.IO; using System.IO.Compression; using System.Net; @@ -47,5 +46,3 @@ protected override bool TryComputeLength(out long length) return false; } } - -#endif diff --git a/tracer/src/Datadog.Trace/Agent/Transports/HttpClientRequest.cs b/tracer/src/Datadog.Trace/Agent/Transports/HttpClientRequest.cs index e5f5d5ecb6a4..0780da61a7ab 100644 --- a/tracer/src/Datadog.Trace/Agent/Transports/HttpClientRequest.cs +++ b/tracer/src/Datadog.Trace/Agent/Transports/HttpClientRequest.cs @@ -3,13 +3,11 @@ // This product includes software developed at Datadog (https://www.datadoghq.com/). Copyright 2017 Datadog, Inc. // -#if NETCOREAPP using System; using System.IO; using System.Net.Http; using System.Net.Http.Headers; using System.Threading.Tasks; -using Datadog.Trace.AppSec; using Datadog.Trace.HttpOverStreams; using Datadog.Trace.Logging; @@ -152,4 +150,3 @@ public async Task PostAsync(MultipartFormItem[] items, MultipartCo } } } -#endif diff --git a/tracer/src/Datadog.Trace/Agent/Transports/HttpClientRequestFactory.cs b/tracer/src/Datadog.Trace/Agent/Transports/HttpClientRequestFactory.cs index ec4f55694fe2..c96edf47f5f2 100644 --- a/tracer/src/Datadog.Trace/Agent/Transports/HttpClientRequestFactory.cs +++ b/tracer/src/Datadog.Trace/Agent/Transports/HttpClientRequestFactory.cs @@ -3,7 +3,6 @@ // This product includes software developed at Datadog (https://www.datadoghq.com/). Copyright 2017 Datadog, Inc. // -#if NETCOREAPP using System; using System.Collections.Generic; using System.Net; @@ -62,4 +61,3 @@ public void SetProxy(WebProxy proxy, NetworkCredential credential) } } } -#endif diff --git a/tracer/src/Datadog.Trace/Agent/Transports/HttpClientResponse.cs b/tracer/src/Datadog.Trace/Agent/Transports/HttpClientResponse.cs index b47f4655c340..d6c09ba36b6e 100644 --- a/tracer/src/Datadog.Trace/Agent/Transports/HttpClientResponse.cs +++ b/tracer/src/Datadog.Trace/Agent/Transports/HttpClientResponse.cs @@ -5,7 +5,7 @@ #nullable enable -#if NETCOREAPP +using System; using System.IO; using System.Linq; using System.Net.Http; @@ -28,7 +28,11 @@ public HttpClientResponse(HttpResponseMessage response) public long ContentLength => _response.Content.Headers.ContentLength ?? -1; +#if NETCOREAPP public string? ContentEncodingHeader => string.Join(',', _response.Content.Headers.ContentEncoding); +#else + public string? ContentEncodingHeader => string.Join(",", _response.Content.Headers.ContentEncoding); +#endif public string? ContentTypeHeader => _response.Content.Headers.ContentType?.ToString(); @@ -43,12 +47,12 @@ public ContentEncodingType GetContentEncodingType() => public Encoding GetCharsetEncoding() { var charset = _response.Content.Headers.ContentType?.CharSet; - if (string.IsNullOrEmpty(charset)) + if (StringUtil.IsNullOrEmpty(charset)) { return EncodingHelpers.Utf8NoBom; } - if (EncodingHelpers.TryGetWellKnownCharset(charset, out var wellKnown)) + if (EncodingHelpers.TryGetWellKnownCharset(charset.AsSpan(), out var wellKnown)) { return wellKnown; } @@ -89,4 +93,3 @@ public Task GetStreamAsync() } } } -#endif diff --git a/tracer/src/Datadog.Trace/Agent/Transports/PushStreamContent.cs b/tracer/src/Datadog.Trace/Agent/Transports/PushStreamContent.cs index deef98c05867..762a94528779 100644 --- a/tracer/src/Datadog.Trace/Agent/Transports/PushStreamContent.cs +++ b/tracer/src/Datadog.Trace/Agent/Transports/PushStreamContent.cs @@ -11,8 +11,6 @@ #nullable enable -#if NETCOREAPP - using System; using System.Diagnostics.CodeAnalysis; using System.IO; @@ -72,4 +70,3 @@ protected override bool TryComputeLength(out long length) return false; } } -#endif diff --git a/tracer/src/Datadog.Trace/Ci/TestOptimizationTracerManagement.cs b/tracer/src/Datadog.Trace/Ci/TestOptimizationTracerManagement.cs index 3a509250d10b..2d711d5a46ba 100644 --- a/tracer/src/Datadog.Trace/Ci/TestOptimizationTracerManagement.cs +++ b/tracer/src/Datadog.Trace/Ci/TestOptimizationTracerManagement.cs @@ -172,17 +172,13 @@ public IApiRequestFactory GetRequestFactory(TracerSettings tracerSettings, TimeS } else { -#if NETCOREAPP Log.Information("TestOptimizationTracerManagement: Using {FactoryType} for trace transport.", nameof(HttpClientRequestFactory)); factory = new HttpClientRequestFactory( exporterSettings.AgentUri, AgentHttpHeaderNames.DefaultHeaders, handler: new System.Net.Http.HttpClientHandler { AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate, }, timeout: timeout); -#else - Log.Information("TestOptimizationTracerManagement: Using {FactoryType} for trace transport.", nameof(ApiWebRequestFactory)); - factory = new ApiWebRequestFactory(tracerSettings.Exporter.AgentUri, AgentHttpHeaderNames.DefaultHeaders, timeout: timeout); -#endif + if (!string.IsNullOrWhiteSpace(_settings.ProxyHttps)) { var proxyHttpsUriBuilder = new UriBuilder(_settings.ProxyHttps!); diff --git a/tracer/src/Datadog.Trace/Datadog.Trace.csproj b/tracer/src/Datadog.Trace/Datadog.Trace.csproj index f7c0749e6db7..496d5bb13a22 100644 --- a/tracer/src/Datadog.Trace/Datadog.Trace.csproj +++ b/tracer/src/Datadog.Trace/Datadog.Trace.csproj @@ -49,6 +49,7 @@ + diff --git a/tracer/src/Datadog.Trace/Debugger/DebuggerTransportStrategy.cs b/tracer/src/Datadog.Trace/Debugger/DebuggerTransportStrategy.cs index 866506de2413..233a5f6a86db 100644 --- a/tracer/src/Datadog.Trace/Debugger/DebuggerTransportStrategy.cs +++ b/tracer/src/Datadog.Trace/Debugger/DebuggerTransportStrategy.cs @@ -17,13 +17,8 @@ internal static class DebuggerTransportStrategy public static IApiRequestFactory Get(Uri baseEndpoint) { -#if NETCOREAPP Log.Information("Using {FactoryType} for debugger transport.", nameof(HttpClientRequestFactory)); return new HttpClientRequestFactory(baseEndpoint, AgentHttpHeaderNames.DefaultHeaders); -#else - Log.Information("Using {FactoryType} for debugger transport.", nameof(ApiWebRequestFactory)); - return new ApiWebRequestFactory(baseEndpoint, AgentHttpHeaderNames.DefaultHeaders); -#endif } } } diff --git a/tracer/src/Datadog.Trace/Logging/DirectSubmission/LogsTransportStrategy.cs b/tracer/src/Datadog.Trace/Logging/DirectSubmission/LogsTransportStrategy.cs index dece2330a165..a390257ce061 100644 --- a/tracer/src/Datadog.Trace/Logging/DirectSubmission/LogsTransportStrategy.cs +++ b/tracer/src/Datadog.Trace/Logging/DirectSubmission/LogsTransportStrategy.cs @@ -20,13 +20,8 @@ public static IApiRequestFactory Get(DirectLogSubmissionSettings settings) // Still quite a long time, but we could be sending a lot of data var timeout = TimeSpan.FromSeconds(15); -#if NETCOREAPP Log.Information("Using {FactoryType} for log submission transport.", nameof(HttpClientRequestFactory)); return new HttpClientRequestFactory(settings.IntakeUrl, LogsApiHeaderNames.DefaultHeaders, timeout: timeout); -#else - Log.Information("Using {FactoryType} for log submission transport.", nameof(ApiWebRequestFactory)); - return new ApiWebRequestFactory(settings.IntakeUrl, LogsApiHeaderNames.DefaultHeaders, timeout: timeout); -#endif } } } diff --git a/tracer/src/Datadog.Trace/Telemetry/Transports/TelemetryTransportStrategy.cs b/tracer/src/Datadog.Trace/Telemetry/Transports/TelemetryTransportStrategy.cs index 252922ba24c4..50eaec4904ae 100644 --- a/tracer/src/Datadog.Trace/Telemetry/Transports/TelemetryTransportStrategy.cs +++ b/tracer/src/Datadog.Trace/Telemetry/Transports/TelemetryTransportStrategy.cs @@ -20,13 +20,8 @@ internal static class TelemetryTransportStrategy public static IApiRequestFactory GetDirectIntakeFactory(TelemetrySettings.AgentlessSettings settings) { -#if NETCOREAPP Log.Information("Using {FactoryType} for telemetry transport direct to intake.", nameof(HttpClientRequestFactory)); return new HttpClientRequestFactory(settings.AgentlessUri, TelemetryHttpHeaderNames.GetDefaultIntakeHeaders(settings), timeout: Timeout); -#else - Log.Information("Using {FactoryType} for telemetry transport direct to intake.", nameof(ApiWebRequestFactory)); - return new ApiWebRequestFactory(settings.AgentlessUri, TelemetryHttpHeaderNames.GetDefaultIntakeHeaders(settings), timeout: Timeout); -#endif } public static IApiRequestFactory GetAgentIntakeFactory(ExporterSettings settings) diff --git a/tracer/test/Datadog.Trace.Tests/Agent/Transports/ApiWebRequestFactoryTests.cs b/tracer/test/Datadog.Trace.Tests/Agent/Transports/ApiWebRequestFactoryTests.cs deleted file mode 100644 index 3a24b758fc73..000000000000 --- a/tracer/test/Datadog.Trace.Tests/Agent/Transports/ApiWebRequestFactoryTests.cs +++ /dev/null @@ -1,63 +0,0 @@ -// -// Unless explicitly stated otherwise all files in this repository are licensed under the Apache 2 License. -// This product includes software developed at Datadog (https://www.datadoghq.com/). Copyright 2017 Datadog, Inc. -// - -using System; -using System.Net; -using System.Reflection; -using Datadog.Trace.Agent.Transports; -using Xunit; - -namespace Datadog.Trace.Tests.Agent.Transports -{ - [Collection(nameof(WebRequestCollection))] - public class ApiWebRequestFactoryTests - { - /// - /// This test ensures that the ApiWebRequestFactory behaves correctly when - /// a different type of WebRequest is assigned to the http:// prefix - /// - [Fact] - public void OverrideHttpPrefix() - { - // Couldn't find a way to "officially" unregister a prefix but that shouldn't stop us - var prefixListProperty = typeof(WebRequest).GetProperty("PrefixList", BindingFlags.Static | BindingFlags.NonPublic); - var oldPrefixList = prefixListProperty.GetValue(null); - - WebRequest.RegisterPrefix("http://", new CustomWebRequestCreator()); - - // Make sure we properly hooked the WebRequest factory - Assert.IsType(WebRequest.Create("http://localhost/")); - - try - { - var factory = new ApiWebRequestFactory(new Uri("http://localhost"), AgentHttpHeaderNames.DefaultHeaders); - - var request = factory.Create(factory.GetEndpoint(string.Empty)); - - Assert.NotNull(request); - } - finally - { - // Unregister the prefix - prefixListProperty.SetValue(null, oldPrefixList); - } - - // Make sure we properly restored the old WebRequest factory - Assert.IsType(WebRequest.Create("http://localhost/")); - } - - private class CustomWebRequestCreator : IWebRequestCreate - { - public WebRequest Create(Uri uri) - { - return new FakeWebRequest(); - } - } - - private class FakeWebRequest : WebRequest - { - } - } -} diff --git a/tracer/test/Datadog.Trace.Tests/MultipartFormTests.cs b/tracer/test/Datadog.Trace.Tests/MultipartFormTests.cs index 4155eacda59a..c377011a0666 100644 --- a/tracer/test/Datadog.Trace.Tests/MultipartFormTests.cs +++ b/tracer/test/Datadog.Trace.Tests/MultipartFormTests.cs @@ -24,6 +24,8 @@ namespace Datadog.Trace.Tests [UsesVerify] public class MultipartFormTests { + private const string AwrMultipartTest = "ApiWebRequest_MultipartTest"; + private const string AwrValidationTest = "ApiWebRequest_ValidationTest"; private static readonly Uri Localhost = new Uri("http://localhost"); private readonly ITestOutputHelper _output; @@ -38,28 +40,6 @@ public static IEnumerable GetTestData() => from useGzip in new[] { true, false } select new object[] { useStream, useGzip }; - [Theory] - [MemberData(nameof(GetTestData))] - public async Task ApiWebRequest_MultipartTest(bool useStream, bool useGzip) - { - using var agent = MockTracerAgent.Create(_output); - var url = new Uri($"http://localhost:{agent.Port}/"); - var factory = new ApiWebRequestFactory(url, AgentHttpHeaderNames.DefaultHeaders); - await RunTest(agent, () => factory.Create(url), useStream, useGzip, nameof(ApiWebRequest_MultipartTest)); - } - - [Theory] - [MemberData(nameof(GetTestData))] - public async Task ApiWebRequest_ValidationTest(bool useStream, bool useGzip) - { - using var agent = MockTracerAgent.Create(_output); - var url = new Uri($"http://localhost:{agent.Port}/"); - var factory = new ApiWebRequestFactory(url, AgentHttpHeaderNames.DefaultHeaders); - await RunValidationTest(agent, () => factory.Create(url), useStream, useGzip, nameof(ApiWebRequest_ValidationTest)); - } - -#if NETCOREAPP3_1_OR_GREATER - [Theory] [MemberData(nameof(GetTestData))] public async Task HttpClientRequest_MultipartTest(bool useStream, bool useGzip) @@ -104,7 +84,7 @@ public async Task HttpClientRequest_UDS_ValidationTest(bool useStream, bool useG Localhost); await RunValidationTest(agent, () => factory.Create(Localhost), useStream, useGzip, nameof(HttpClientRequest_ValidationTest)); } -#else +#elif NETCOREAPP3_1_OR_GREATER [Theory] [MemberData(nameof(GetTestData))] public async Task HttpStreamRequest_UDS_MultipartTest(bool useStream, bool useGzip) @@ -114,7 +94,7 @@ public async Task HttpStreamRequest_UDS_MultipartTest(bool useStream, bool useGz new UnixDomainSocketStreamFactory(agent.TracesUdsPath), new DatadogHttpClient(new TraceAgentHttpHeaderHelper()), Localhost); - await RunTest(agent, () => factory.Create(Localhost), useStream, useGzip, nameof(ApiWebRequest_MultipartTest)); + await RunTest(agent, () => factory.Create(Localhost), useStream, useGzip, AwrMultipartTest); } [Theory] @@ -126,9 +106,8 @@ public async Task HttpStreamRequest_UDS_ValidationTest(bool useStream, bool useG new UnixDomainSocketStreamFactory(agent.TracesUdsPath), new DatadogHttpClient(new TraceAgentHttpHeaderHelper()), Localhost); - await RunValidationTest(agent, () => factory.Create(Localhost), useStream, useGzip, nameof(ApiWebRequest_ValidationTest)); + await RunValidationTest(agent, () => factory.Create(Localhost), useStream, useGzip, AwrValidationTest); } -#endif #endif [Theory] @@ -164,7 +143,7 @@ async Task RunNamedPipesTest() new NamedPipeClientStreamFactory(agent.TracesWindowsPipeName, timeoutMs: 100), new DatadogHttpClient(new TraceAgentHttpHeaderHelper()), Localhost); - await RunTest(agent, () => factory.Create(Localhost), useStream, useGzip, nameof(ApiWebRequest_MultipartTest)); + await RunTest(agent, () => factory.Create(Localhost), useStream, useGzip, AwrMultipartTest); } } @@ -201,7 +180,7 @@ async Task RunNamedPipesTest() new NamedPipeClientStreamFactory(agent.TracesWindowsPipeName, timeoutMs: 100), new DatadogHttpClient(new TraceAgentHttpHeaderHelper()), Localhost); - await RunValidationTest(agent, () => factory.Create(Localhost), useStream, useGzip, nameof(ApiWebRequest_ValidationTest)); + await RunValidationTest(agent, () => factory.Create(Localhost), useStream, useGzip, AwrValidationTest); } } diff --git a/tracer/test/Datadog.Trace.Tests/Snapshots/PublicApiTests.Datadog.Trace.AssemblyReferencesHaveNotChanged.net461.verified.txt b/tracer/test/Datadog.Trace.Tests/Snapshots/PublicApiTests.Datadog.Trace.AssemblyReferencesHaveNotChanged.net461.verified.txt index bf667f06e8e7..ed74c83c89ad 100644 --- a/tracer/test/Datadog.Trace.Tests/Snapshots/PublicApiTests.Datadog.Trace.AssemblyReferencesHaveNotChanged.net461.verified.txt +++ b/tracer/test/Datadog.Trace.Tests/Snapshots/PublicApiTests.Datadog.Trace.AssemblyReferencesHaveNotChanged.net461.verified.txt @@ -3,6 +3,7 @@ System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Configuration, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a System.Core, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Data, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 +System.Net.Http, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a System.Numerics, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Runtime.Serialization, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a diff --git a/tracer/test/benchmarks/Benchmarks.Trace/AgentWriterBenchmark.cs b/tracer/test/benchmarks/Benchmarks.Trace/AgentWriterBenchmark.cs index 158b56489c51..349d0d2dec2f 100644 --- a/tracer/test/benchmarks/Benchmarks.Trace/AgentWriterBenchmark.cs +++ b/tracer/test/benchmarks/Benchmarks.Trace/AgentWriterBenchmark.cs @@ -63,7 +63,7 @@ public Task WriteAndFlushEnrichedTraces() } /// - /// Try to mimick as much as possible the overhead of the ApiWebRequestFactory, + /// Try to mimick as much as possible the overhead of the HttpClientRequestFactory, /// without actually sending the requests /// private class FakeApiRequestFactory : IApiRequestFactory @@ -74,7 +74,7 @@ private class FakeApiRequestFactory : IApiRequestFactory public FakeApiRequestFactory(Uri baseEndpointUri) { _baseEndpointUri = baseEndpointUri; - _realFactory = new ApiWebRequestFactory(baseEndpointUri, AgentHttpHeaderNames.DefaultHeaders); + _realFactory = new HttpClientRequestFactory(baseEndpointUri, AgentHttpHeaderNames.DefaultHeaders); } public string Info(Uri endpoint)