Skip to content

Commit baef833

Browse files
authored
[Service Bus] Preserve custom port for AdminClient (Azure#49514)
* [Service Bus] Preserve custom port for AdminClient The focus of these changes is to preserve a custom port associated with the local development emulator when creating the admin client. Previously, this was incorrectly reset to the default. * Fixing non-URI case
1 parent 56a5ab3 commit baef833

File tree

4 files changed

+67
-8
lines changed

4 files changed

+67
-8
lines changed

sdk/servicebus/Azure.Messaging.ServiceBus/CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@
88

99
### Bugs Fixed
1010

11+
- Fixed a bug where the custom port associated with a local emulator endpoint was reset by the `ServiceBusAdministrationClient`.
12+
1113
### Other Changes
1214

1315
## 7.19.0 (2025-04-08)

sdk/servicebus/Azure.Messaging.ServiceBus/src/Administration/HttpRequestAndResponse.cs

Lines changed: 17 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,16 @@
11
// Copyright (c) Microsoft Corporation. All rights reserved.
22
// Licensed under the MIT License.
33

4-
using Azure.Core;
54
using System;
5+
using System.Collections.Generic;
6+
using System.Globalization;
67
using System.Net;
78
using System.Text;
89
using System.Threading;
910
using System.Threading.Tasks;
10-
using Azure.Messaging.ServiceBus.Authorization;
11+
using Azure.Core;
1112
using Azure.Core.Pipeline;
12-
using System.Collections.Generic;
13-
using System.Globalization;
13+
using Azure.Messaging.ServiceBus.Authorization;
1414

1515
namespace Azure.Messaging.ServiceBus.Administration
1616
{
@@ -33,14 +33,15 @@ public HttpRequestAndResponse(
3333
TokenCredential tokenCredential,
3434
string fullyQualifiedNamespace,
3535
ServiceBusAdministrationClientOptions.ServiceVersion version,
36+
int port,
3637
bool useTls)
3738
{
3839
_pipeline = pipeline;
3940
_diagnostics = diagnostics;
4041
_versionQuery = $"api-version={version.ToVersionString()}";
4142
_tokenCredential = tokenCredential;
4243
_fullyQualifiedNamespace = fullyQualifiedNamespace;
43-
_port = GetPort(_fullyQualifiedNamespace);
44+
_port = GetPort(_fullyQualifiedNamespace, port);
4445
_scheme = useTls ? Uri.UriSchemeHttps : Uri.UriSchemeHttp;
4546
}
4647

@@ -264,6 +265,15 @@ public async Task<Response> DeleteEntityAsync(
264265
return response;
265266
}
266267

268+
internal Uri BuildDefaultUri(string entityPath) =>
269+
new UriBuilder(_fullyQualifiedNamespace)
270+
{
271+
Path = entityPath,
272+
Port = _port,
273+
Scheme = _scheme,
274+
Query = _versionQuery
275+
}.Uri;
276+
267277
private async Task<Response> SendHttpRequestAsync(
268278
Request request,
269279
CancellationToken cancellationToken)
@@ -281,15 +291,15 @@ private async Task<Response> SendHttpRequestAsync(
281291
return response;
282292
}
283293

284-
private static int GetPort(string endpoint)
294+
private static int GetPort(string endpoint, int port)
285295
{
286296
// used for internal testing
287297
if (endpoint.EndsWith("onebox.windows-int.net", StringComparison.InvariantCultureIgnoreCase))
288298
{
289299
return 4446;
290300
}
291301

292-
return -1;
302+
return (port > 0) ? port : -1;
293303
}
294304
}
295305
}

sdk/servicebus/Azure.Messaging.ServiceBus/src/Administration/ServiceBusAdministrationClient.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,7 @@ public ServiceBusAdministrationClient(
114114
tokenCredential,
115115
_fullyQualifiedNamespace,
116116
options.Version,
117+
connectionStringProperties.Endpoint.Port,
117118
useTls);
118119
}
119120

@@ -190,9 +191,12 @@ private ServiceBusAdministrationClient(
190191
Argument.AssertNotNull(credential, nameof(credential));
191192
Argument.AssertNotNullOrEmpty(fullyQualifiedNamespace, nameof(fullyQualifiedNamespace));
192193

194+
var port = -1;
195+
193196
if (Uri.TryCreate(fullyQualifiedNamespace, UriKind.Absolute, out var uri))
194197
{
195198
fullyQualifiedNamespace = uri.Host;
199+
port = uri.Port;
196200
}
197201

198202
Argument.AssertWellFormedServiceBusNamespace(fullyQualifiedNamespace, nameof(fullyQualifiedNamespace));
@@ -216,6 +220,7 @@ private ServiceBusAdministrationClient(
216220
credential,
217221
_fullyQualifiedNamespace,
218222
options.Version,
223+
port,
219224
true);
220225
}
221226

sdk/servicebus/Azure.Messaging.ServiceBus/tests/Administration/RequestResponseTests.cs

Lines changed: 43 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,14 +13,15 @@
1313

1414
namespace Azure.Messaging.ServiceBus.Tests.Management
1515
{
16+
[TestFixture]
1617
public class RequestResponseTests
1718
{
1819
private readonly HttpRequestAndResponse _requestResponse;
1920
public RequestResponseTests()
2021
{
2122
var options = new ServiceBusAdministrationClientOptions();
2223
var pipeline = HttpPipelineBuilder.Build(options);
23-
_requestResponse = new HttpRequestAndResponse(pipeline, new ClientDiagnostics(options), null, "fakeNamespace", ServiceBusAdministrationClientOptions.ServiceVersion.V2017_04, true);
24+
_requestResponse = new HttpRequestAndResponse(pipeline, new ClientDiagnostics(options), null, "fakeNamespace", ServiceBusAdministrationClientOptions.ServiceVersion.V2017_04, -1, true);
2425
}
2526

2627
[Test]
@@ -217,5 +218,46 @@ public void ThrowsGeneralFailureOnOtherError()
217218
}
218219
Assert.Fail("No exception!");
219220
}
221+
222+
[Test]
223+
[TestCase(1)]
224+
[TestCase(80)]
225+
[TestCase(8989)]
226+
[TestCase(6335)]
227+
public void CustomPortIsPreserved(int port)
228+
{
229+
var options = new ServiceBusAdministrationClientOptions();
230+
var pipeline = HttpPipelineBuilder.Build(options);
231+
var requestResponse = new HttpRequestAndResponse(pipeline, new ClientDiagnostics(options), null, "fakeNamespace", ServiceBusAdministrationClientOptions.ServiceVersion.V2017_04, port, true);
232+
233+
Assert.AreEqual(port, requestResponse.BuildDefaultUri("dummy").Port);
234+
}
235+
236+
[Test]
237+
[TestCase(0)]
238+
[TestCase(-1)]
239+
[TestCase(-200)]
240+
public void DefaultPortIsPreserved(int port)
241+
{
242+
var options = new ServiceBusAdministrationClientOptions();
243+
var pipeline = HttpPipelineBuilder.Build(options);
244+
var requestResponse = new HttpRequestAndResponse(pipeline, new ClientDiagnostics(options), null, "fakeNamespace", ServiceBusAdministrationClientOptions.ServiceVersion.V2017_04, port, true);
245+
246+
var defaultPort = new UriBuilder("https://www.examplke.com").Uri.Port;
247+
Assert.AreEqual(defaultPort, requestResponse.BuildDefaultUri("dummy").Port);
248+
}
249+
250+
[Test]
251+
[TestCase(true)]
252+
[TestCase(false)]
253+
public void UseTlsIsHonored(bool useTls)
254+
{
255+
var options = new ServiceBusAdministrationClientOptions();
256+
var pipeline = HttpPipelineBuilder.Build(options);
257+
var requestResponse = new HttpRequestAndResponse(pipeline, new ClientDiagnostics(options), null, "fakeNamespace", ServiceBusAdministrationClientOptions.ServiceVersion.V2017_04, -1, useTls);
258+
259+
var expectedScheme = useTls ? "https" : "http";
260+
Assert.AreEqual(expectedScheme, requestResponse.BuildDefaultUri("dummy").Scheme);
261+
}
220262
}
221263
}

0 commit comments

Comments
 (0)