Skip to content

Commit f802ba4

Browse files
committed
* Flesh out AmqpString and ExchangeName
* Ensure tests pass
1 parent cfccf3a commit f802ba4

File tree

3 files changed

+72
-7
lines changed

3 files changed

+72
-7
lines changed

projects/RabbitMQ.Client/PublicAPI.Unshipped.txt

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,6 @@ override RabbitMQ.Client.PublicationAddress.ToString() -> string
7575
override RabbitMQ.Client.ShutdownEventArgs.ToString() -> string
7676
override RabbitMQ.Client.ShutdownReportEntry.ToString() -> string
7777
RabbitMQ.Client.AmqpString
78-
RabbitMQ.Client.AmqpString.AmqpString() -> void
7978
RabbitMQ.Client.AmqpTcpEndpoint
8079
RabbitMQ.Client.AmqpTcpEndpoint.AddressFamily.get -> System.Net.Sockets.AddressFamily
8180
RabbitMQ.Client.AmqpTcpEndpoint.AddressFamily.set -> void
@@ -881,8 +880,10 @@ virtual RabbitMQ.Client.TcpClientAdapter.ReceiveTimeout.get -> System.TimeSpan
881880
virtual RabbitMQ.Client.TcpClientAdapter.ReceiveTimeout.set -> void
882881
~const RabbitMQ.Client.RabbitMQActivitySource.PublisherSourceName = "RabbitMQ.Client.Publisher" -> string
883882
~const RabbitMQ.Client.RabbitMQActivitySource.SubscriberSourceName = "RabbitMQ.Client.Subscriber" -> string
883+
~override RabbitMQ.Client.AmqpString.ToString() -> string
884884
~override RabbitMQ.Client.Events.AsyncEventingBasicConsumer.HandleBasicDeliver(string consumerTag, ulong deliveryTag, bool redelivered, System.ReadOnlyMemory<byte> exchange, System.ReadOnlyMemory<byte> routingKey, in RabbitMQ.Client.ReadOnlyBasicProperties properties, System.ReadOnlyMemory<byte> body) -> System.Threading.Tasks.Task
885885
~override RabbitMQ.Client.Events.EventingBasicConsumer.HandleBasicDeliverAsync(string consumerTag, ulong deliveryTag, bool redelivered, System.ReadOnlyMemory<byte> exchange, System.ReadOnlyMemory<byte> routingKey, RabbitMQ.Client.ReadOnlyBasicProperties properties, System.ReadOnlyMemory<byte> body) -> System.Threading.Tasks.Task
886+
~RabbitMQ.Client.AmqpString.AmqpString(string value, ushort maxLen, System.Text.Encoding validEncoding, string validatorRegex) -> void
886887
~RabbitMQ.Client.AmqpTcpEndpoint.AmqpTcpEndpoint(string hostName, int portOrMinusOne, RabbitMQ.Client.SslOption ssl, uint maxInboundMessageBodySize) -> void
887888
~RabbitMQ.Client.ConnectionFactory.CreateConnectionAsync(RabbitMQ.Client.IEndpointResolver endpointResolver, string clientProvidedName, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<RabbitMQ.Client.IConnection>
888889
~RabbitMQ.Client.ConnectionFactory.CreateConnectionAsync(string clientProvidedName, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<RabbitMQ.Client.IConnection>
@@ -940,6 +941,9 @@ virtual RabbitMQ.Client.TcpClientAdapter.ReceiveTimeout.set -> void
940941
~RabbitMQ.Client.TopologyRecoveryExceptionHandler.ExchangeRecoveryExceptionHandlerAsync.set -> void
941942
~RabbitMQ.Client.TopologyRecoveryExceptionHandler.QueueRecoveryExceptionHandlerAsync.get -> System.Func<RabbitMQ.Client.IRecordedQueue, System.Exception, RabbitMQ.Client.IConnection, System.Threading.Tasks.Task>
942943
~RabbitMQ.Client.TopologyRecoveryExceptionHandler.QueueRecoveryExceptionHandlerAsync.set -> void
944+
~static RabbitMQ.Client.AmqpString.implicit operator string(RabbitMQ.Client.AmqpString amqpString) -> string
945+
~static RabbitMQ.Client.AmqpString.implicit operator System.ReadOnlyMemory<byte>(RabbitMQ.Client.AmqpString amqpString) -> System.ReadOnlyMemory<byte>
946+
~static RabbitMQ.Client.ExchangeName.explicit operator RabbitMQ.Client.ExchangeName(string value) -> RabbitMQ.Client.ExchangeName
943947
~static RabbitMQ.Client.IChannelExtensions.AbortAsync(this RabbitMQ.Client.IChannel channel, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task
944948
~static RabbitMQ.Client.IChannelExtensions.BasicConsumeAsync(this RabbitMQ.Client.IChannel channel, RabbitMQ.Client.IBasicConsumer consumer, string queue, bool autoAck = false, string consumerTag = "", bool noLocal = false, bool exclusive = false, System.Collections.Generic.IDictionary<string, object> arguments = null) -> System.Threading.Tasks.Task<string>
945949
~static RabbitMQ.Client.IChannelExtensions.BasicConsumeAsync(this RabbitMQ.Client.IChannel channel, string queue, bool autoAck, RabbitMQ.Client.IBasicConsumer consumer) -> System.Threading.Tasks.Task<string>

projects/RabbitMQ.Client/client/api/AmqpString.cs

Lines changed: 51 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,19 +29,68 @@
2929
// Copyright (c) 2011-2020 VMware, Inc. or its affiliates. All rights reserved.
3030
//---------------------------------------------------------------------------
3131

32+
using System;
33+
using System.Text;
34+
using System.Text.RegularExpressions;
35+
3236
namespace RabbitMQ.Client
3337
{
3438
public abstract class AmqpString
3539
{
36-
public AmqpString()
40+
private readonly string _value;
41+
private readonly ReadOnlyMemory<byte> _stringBytes;
42+
43+
public AmqpString(string value, ushort maxLen, Encoding validEncoding, string validatorRegex)
44+
{
45+
if (value.Length > maxLen)
46+
{
47+
throw new ArgumentOutOfRangeException(nameof(value));
48+
}
49+
50+
var re = new Regex(validatorRegex);
51+
if (false == re.IsMatch(value))
52+
{
53+
throw new ArgumentOutOfRangeException(nameof(value));
54+
}
55+
56+
_value = value;
57+
_stringBytes = new ReadOnlyMemory<byte>(validEncoding.GetBytes(value));
58+
}
59+
60+
public override string ToString()
61+
{
62+
return _value;
63+
}
64+
65+
public static implicit operator string(AmqpString amqpString)
66+
{
67+
return amqpString._value;
68+
}
69+
70+
public static implicit operator ReadOnlyMemory<byte>(AmqpString amqpString)
3771
{
72+
return amqpString._stringBytes;
3873
}
3974
}
4075

76+
/*
77+
* From the spec:
78+
* <domain name="exchange-name" type="shortstr" label="exchange name">
79+
* <doc> The exchange name is a client-selected string that identifies the exchange for publish methods. </doc>
80+
* <assert check="length" value="127"/>
81+
* <assert check="regexp" value="^[a-zA-Z0-9-_.:]*$"/>
82+
* </domain>
83+
*/
4184
public class ExchangeName : AmqpString
4285
{
43-
public ExchangeName(string exchangeName) : base()
86+
public ExchangeName(string exchangeName)
87+
: base(exchangeName, 127, Encoding.ASCII, "^[a-zA-Z0-9-_.:]*$")
88+
{
89+
}
90+
91+
public static explicit operator ExchangeName(string value)
4492
{
93+
return new ExchangeName(value);
4594
}
4695
}
4796
}

projects/Test/Unit/TestAmqpString.cs

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -37,11 +37,23 @@ namespace Test.Unit
3737
{
3838
public class TestAmqpString
3939
{
40-
[Fact]
41-
public void TestInvalidExchangeNameThrows()
40+
[Theory]
41+
[InlineData("exchange-ABC:123.abc_456")]
42+
[InlineData("6PiY80XbjBKnY39R947i2s03cAg261412IS1FzS4uEoJJ6cWZ50P0SJ3S4yqvzx0n4TN4NsROlWyEwaUG4I5Glrj1mI2N28QGbkf5t8Kyo7EavaqME5TrvhPxtJGY1p")]
43+
[InlineData("foo_bar_baz")]
44+
public void TestValidExchangeNames(string arg)
4245
{
43-
string e = "exchange-Евгений";
44-
Assert.Throws<ArgumentOutOfRangeException>(() => new ExchangeName(e));
46+
var e = new ExchangeName(arg);
47+
Assert.Equal(e, arg);
48+
}
49+
50+
[Theory]
51+
[InlineData("exchange-Евгений")]
52+
[InlineData("6PiY80XbjBK9nY39R947i2s03cAg261412IS1FzS4uEoJJ6cWZ50P0SJ3S4yqvzx0n4TN4NsROlWyEwaUG4I5Glrj1mI2N28QGbkf5t8Kyo7EavaqME5TrvhPxtJGY1p")]
53+
[InlineData("foo/bar%baz")]
54+
public void TestInvalidExchangeNameThrows(string arg)
55+
{
56+
Assert.Throws<ArgumentOutOfRangeException>(() => new ExchangeName(arg));
4557
}
4658
}
4759
}

0 commit comments

Comments
 (0)