Skip to content

Commit 7657c0b

Browse files
committed
Encode non-unreserved characters in binding path segment
This is a special case for a path segment, because the names of source and destination and the routing key are expected to be fully percent-encoded, so that the broker can extract them from the path segment.
1 parent 05c101c commit 7657c0b

File tree

4 files changed

+26
-9
lines changed

4 files changed

+26
-9
lines changed

src/main/java/com/rabbitmq/client/amqp/impl/AmqpManagement.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -374,13 +374,13 @@ void unbind(
374374
String target =
375375
"/bindings/"
376376
+ "src="
377-
+ UriUtils.encodePathSegment(source)
377+
+ UriUtils.encodeNonUnreserved(source)
378378
+ ";"
379379
+ destinationField
380380
+ "="
381-
+ UriUtils.encodePathSegment(destination)
381+
+ UriUtils.encodeNonUnreserved(destination)
382382
+ ";key="
383-
+ UriUtils.encodePathSegment(key)
383+
+ UriUtils.encodeNonUnreserved(key)
384384
+ ";args=";
385385
delete(target, CODE_204);
386386
} else {

src/main/java/com/rabbitmq/client/amqp/impl/UriUtils.java

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,10 @@ private UriUtils() {}
7373
QUERY_PARAM.clear('&');
7474
}
7575

76+
static String encodeNonUnreserved(String value) {
77+
return encode(value, UNRESERVED);
78+
}
79+
7680
static String encodePathSegment(String segment) {
7781
return encode(segment, PCHAR);
7882
}
@@ -81,12 +85,12 @@ static String encodeParameter(String value) {
8185
return encode(value, QUERY_PARAM);
8286
}
8387

84-
private static String encode(String segment, BitSet safeCharacters) {
85-
if (segment == null) {
88+
private static String encode(String value, BitSet safeCharacters) {
89+
if (value == null) {
8690
return null;
8791
}
8892
StringBuilder buf = new StringBuilder();
89-
final CharBuffer cb = CharBuffer.wrap(segment);
93+
final CharBuffer cb = CharBuffer.wrap(value);
9094
final ByteBuffer bb = StandardCharsets.UTF_8.encode(cb);
9195
while (bb.hasRemaining()) {
9296
final int b = bb.get() & 0xff;

src/test/java/com/rabbitmq/client/amqp/impl/AmqpTest.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -138,14 +138,16 @@ void queueDeclareDeletePublishConsume(String subject) {
138138
"foo,true",
139139
"фообар,true",
140140
"фообар,false",
141+
"фоо!бар,false",
142+
"фоо!бар,true",
141143
})
142144
void binding(String prefix, boolean addBindingArguments, TestInfo info) {
143145
String e1 = prefix + "-" + TestUtils.name(info);
144146
String e2 = prefix + "-" + TestUtils.name(info);
145147
String q = prefix + "-" + TestUtils.name(info);
146148
String rk = prefix + "-" + "foo";
147149
Map<String, Object> bindingArguments =
148-
addBindingArguments ? singletonMap("foo", "bar") : emptyMap();
150+
addBindingArguments ? singletonMap("foo", prefix + "-bar") : emptyMap();
149151
Management management = connection.management();
150152
try {
151153
management.exchange().name(e1).type(DIRECT).declare();

src/test/java/com/rabbitmq/client/amqp/impl/UriUtilsTest.java

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,7 @@
1717
1818
package com.rabbitmq.client.amqp.impl;
1919

20-
import static com.rabbitmq.client.amqp.impl.UriUtils.encodeParameter;
21-
import static com.rabbitmq.client.amqp.impl.UriUtils.encodePathSegment;
20+
import static com.rabbitmq.client.amqp.impl.UriUtils.*;
2221
import static org.assertj.core.api.Assertions.assertThat;
2322

2423
import org.junit.jupiter.params.ParameterizedTest;
@@ -44,4 +43,16 @@ void encodePathSegmentTest(String segment, String expected) {
4443
void encodeParamTest(String param, String expected) {
4544
assertThat(encodeParameter(param)).isEqualTo(expected);
4645
}
46+
47+
@ParameterizedTest
48+
@CsvSource({
49+
"test,test",
50+
"foobar,foobar",
51+
"foo bar,foo%20bar",
52+
"foo&bar,foo%26bar",
53+
"foo*bar,foo%2Abar"
54+
})
55+
void encodeNonUnreservedTest(String param, String expected) {
56+
assertThat(encodeNonUnreserved(param)).isEqualTo(expected);
57+
}
4758
}

0 commit comments

Comments
 (0)