You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@qpid.apache.org by kw...@apache.org on 2015/06/16 10:19:27 UTC
svn commit: r1685729 - in /qpid/java/trunk:
client/src/test/java/org/apache/qpid/test/unit/client/destinationurl/BindingURLTest.java
common/src/main/java/org/apache/qpid/url/BindingURLParser.java
Author: kwall
Date: Tue Jun 16 08:19:26 2015
New Revision: 1685729
URL: http://svn.apache.org/r1685729
Log:
[QPID-6593] : [Java Client] Disallow bare BURL addresses such as /a/b/c/d and IBMPerfQueue1?durable=true
Modified:
qpid/java/trunk/client/src/test/java/org/apache/qpid/test/unit/client/destinationurl/BindingURLTest.java
qpid/java/trunk/common/src/main/java/org/apache/qpid/url/BindingURLParser.java
Modified: qpid/java/trunk/client/src/test/java/org/apache/qpid/test/unit/client/destinationurl/BindingURLTest.java
URL: http://svn.apache.org/viewvc/qpid/java/trunk/client/src/test/java/org/apache/qpid/test/unit/client/destinationurl/BindingURLTest.java?rev=1685729&r1=1685728&r2=1685729&view=diff
==============================================================================
--- qpid/java/trunk/client/src/test/java/org/apache/qpid/test/unit/client/destinationurl/BindingURLTest.java (original)
+++ qpid/java/trunk/client/src/test/java/org/apache/qpid/test/unit/client/destinationurl/BindingURLTest.java Tue Jun 16 08:19:26 2015
@@ -241,34 +241,31 @@ public class BindingURLTest extends Qpid
}
}
- public void testBareNameTreatedAsQueue() throws Exception
+ public void testMissingExchangeClass() throws Exception
{
- String url = "IBMPerfQueue1?durable='true'";
- BindingURL burl = new AMQBindingURL(url);
-
- assertEquals("direct:////IBMPerfQueue1?durable='true'", burl.toString());
-
- assertEquals("direct", burl.getExchangeClass());
- assertEquals("", burl.getExchangeName());
- assertEquals("", burl.getDestinationName());
- assertEquals("IBMPerfQueue1", burl.getQueueName());
- assertEquals("IBMPerfQueue1", burl.getRoutingKey());
- assertEquals("IBMPerfQueue1", burl.getBindingKeys()[0]);
+ String url = "://exchangeName/Destination/Queue";
+ try
+ {
+ new AMQBindingURL(url);
+ fail("Exception not thrown");
+ }
+ catch(URISyntaxException e)
+ {
+ // PASS
+ }
}
- public void testBareNameContainingSlashesTreatedAsQueueWithOddName() throws Exception
+ public void testMissingSlashWithinHierarchyPrefix() throws Exception
{
- String url = "/a/b/c/d";
- BindingURL burl = new AMQBindingURL(url);
-
- assertEquals("direct://///a/b/c/d", burl.toString());
-
- assertEquals("direct", burl.getExchangeClass());
- assertEquals("", burl.getExchangeName());
- assertEquals("", burl.getDestinationName());
- assertEquals("/a/b/c/d", burl.getQueueName());
- assertEquals("/a/b/c/d", burl.getRoutingKey());
- assertEquals("/a/b/c/d", burl.getBindingKeys()[0]);
+ String url = "direct:/exchangeName/Destination/Queue";
+ try
+ {
+ new AMQBindingURL(url);
+ fail("Exception not thrown");
+ }
+ catch(URISyntaxException e)
+ {
+ // PASS
+ }
}
-
}
Modified: qpid/java/trunk/common/src/main/java/org/apache/qpid/url/BindingURLParser.java
URL: http://svn.apache.org/viewvc/qpid/java/trunk/common/src/main/java/org/apache/qpid/url/BindingURLParser.java?rev=1685729&r1=1685728&r2=1685729&view=diff
==============================================================================
--- qpid/java/trunk/common/src/main/java/org/apache/qpid/url/BindingURLParser.java (original)
+++ qpid/java/trunk/common/src/main/java/org/apache/qpid/url/BindingURLParser.java Tue Jun 16 08:19:26 2015
@@ -18,14 +18,13 @@
* under the License.
*
*/
+
package org.apache.qpid.url;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import org.apache.qpid.exchange.ExchangeDefaults;
-
import java.net.URISyntaxException;
import java.util.ArrayList;
import java.util.HashMap;
@@ -60,8 +59,7 @@ public class BindingURLParser
}
//<exch_class>://<exch_name>/[<destination>]/[<queue>]?<option>='<value>'[,<option>='<value>']*
- public synchronized void
- parse(String url,AMQBindingURL bindingURL) throws URISyntaxException
+ public void parse(String url, AMQBindingURL bindingURL) throws URISyntaxException
{
_url = (url + END_OF_URL_MARKER_CHAR).toCharArray();
_bindingURL = bindingURL;
@@ -70,7 +68,7 @@ public class BindingURLParser
_index = 0;
_currentPropName = null;
_error = null;
- _options = new HashMap<String,Object>();
+ _options = new HashMap<>();
try
{
@@ -83,10 +81,10 @@ public class BindingURLParser
if (_currentParserState == BindingURLParserState.ERROR)
{
_error =
- "Invalid URL format [current_state = " + prevState + ", details parsed so far " + _bindingURL + " ] error at (" + _index + ") due to " + _error;
+ "Invalid URL format [current_state = " + prevState + ", details extracted so far " + _bindingURL + " ] error at (" + _index + ") due to " + _error;
_logger.debug(_error);
URISyntaxException ex;
- ex = new URISyntaxException(markErrorLocation(),"Error occured while parsing URL",_index);
+ ex = new URISyntaxException(markErrorLocation(),"Error occurred while parsing URL",_index);
throw ex;
}
@@ -95,7 +93,7 @@ public class BindingURLParser
catch (ArrayIndexOutOfBoundsException e)
{
_error = "Invalid URL format [current_state = " + prevState + ", details parsed so far " + _bindingURL + " ] error at (" + _index + ")";
- URISyntaxException ex = new URISyntaxException(markErrorLocation(),"Error occured while parsing URL",_index);
+ URISyntaxException ex = new URISyntaxException(markErrorLocation(),"Error occurred while parsing URL",_index);
ex.initCause(e);
throw ex;
}
@@ -106,7 +104,7 @@ public class BindingURLParser
BINDING_URL_START,
EXCHANGE_CLASS,
COLON_CHAR,
- DOUBLE_SEP,
+ HIERARCHY_PREFIX,
EXCHANGE_NAME,
EXCHANGE_SEPERATOR_CHAR,
DESTINATION,
@@ -139,10 +137,9 @@ public class BindingURLParser
return extractExchangeClass();
case COLON_CHAR:
_index++; //skip ":"
- return BindingURLParserState.DOUBLE_SEP;
- case DOUBLE_SEP:
- _index = _index + 2; //skip "//"
- return BindingURLParserState.EXCHANGE_NAME;
+ return BindingURLParserState.HIERARCHY_PREFIX;
+ case HIERARCHY_PREFIX:
+ return consumeHierarchyPrefix();
case EXCHANGE_NAME:
return extractExchangeName();
case EXCHANGE_SEPERATOR_CHAR:
@@ -183,11 +180,8 @@ public class BindingURLParser
{
char nextChar = _url[_index];
- // check for the following special cases.
- // "myQueue?durable='true'" or just "myQueue"
-
StringBuilder builder = new StringBuilder();
- while (nextChar != COLON_CHAR && nextChar != QUESTION_MARK_CHAR && nextChar != END_OF_URL_MARKER_CHAR)
+ while (nextChar != COLON_CHAR && nextChar != END_OF_URL_MARKER_CHAR)
{
builder.append(nextChar);
_index++;
@@ -197,23 +191,39 @@ public class BindingURLParser
// normal use case
if (nextChar == COLON_CHAR)
{
+ if (builder.length() == 0)
+ {
+ _error = "Exchange class is absent";
+ return BindingURLParserState.ERROR;
+ }
_bindingURL.setExchangeClass(builder.toString());
return BindingURLParserState.COLON_CHAR;
}
- // "myQueue?durable='true'" use case
- else if (nextChar == QUESTION_MARK_CHAR)
+ else
{
- _bindingURL.setExchangeClass(ExchangeDefaults.DIRECT_EXCHANGE_CLASS);
- _bindingURL.setExchangeName("");
- _bindingURL.setQueueName(builder.toString());
- return BindingURLParserState.QUESTION_MARK_CHAR;
+ return BindingURLParserState.ERROR;
+ }
+ }
+
+ private BindingURLParserState consumeHierarchyPrefix()
+ {
+ char nextChar;
+ int loop = 0;
+ do
+ {
+ nextChar = _url[_index++];
+ loop++;
+ }
+ while (nextChar == FORWARD_SLASH_CHAR && loop < 2 );
+
+ if (nextChar == FORWARD_SLASH_CHAR)
+ {
+ return BindingURLParserState.EXCHANGE_NAME;
}
else
{
- _bindingURL.setExchangeClass(ExchangeDefaults.DIRECT_EXCHANGE_CLASS);
- _bindingURL.setExchangeName("");
- _bindingURL.setQueueName(builder.toString());
- return BindingURLParserState.BINDING_URL_END;
+ _error = "Unexpected character '" + nextChar + "' encountered when expecting hierarchy prefix '/'";
+ return BindingURLParserState.ERROR;
}
}
@@ -251,7 +261,7 @@ public class BindingURLParser
nextChar = _url[_index];
}
- // This is the case where the destination is explictily stated.
+ // This is the case where the destination is explicitly stated.
// ex direct://amq.direct/myDest/myQueue?option1='1' ... OR
// direct://amq.direct//myQueue?option1='1' ...
if (nextChar == FORWARD_SLASH_CHAR)
@@ -259,7 +269,7 @@ public class BindingURLParser
_bindingURL.setDestinationName(builder.toString());
return BindingURLParserState.DESTINATION_SEPERATOR_CHAR;
}
- // This is the case where destination is not explictly stated.
+ // This is the case where destination is not explicitly stated.
// ex direct://amq.direct/myQueue?option1='1' ...
else
{
@@ -419,41 +429,4 @@ public class BindingURLParser
throw new URISyntaxException(String.valueOf(_url),"It is illegal to specify both a routingKey and a bindingKey in the same URL",-1);
}
}
-
- public static void main(String[] args)
- {
-
- String[] urls = new String[]
- {
- "topic://amq.topic//myTopic?routingkey='stocks.#'",
- "topic://amq.topic/message_queue?bindingkey='usa.*'&bindingkey='control',exclusive='true'",
- "topic://amq.topic//?bindingKey='usa.*',bindingkey='control',exclusive='true'",
- "direct://amq.direct/dummyDest/myQueue?routingkey='abc.*'",
- "exchange.Class://exchangeName/Destination/Queue",
- "exchangeClass://exchangeName/Destination/?option='value',option2='value2'",
- "IBMPerfQueue1?durable='true'",
- "exchangeClass://exchangeName/Destination/?bindingkey='key1',bindingkey='key2'",
- "exchangeClass://exchangeName/Destination/?bindingkey='key1'&routingkey='key2'"
- };
-
- try
- {
- BindingURLParser parser = new BindingURLParser();
-
- for (String url: urls)
- {
- _logger.info("URL " + url);
- AMQBindingURL bindingURL = new AMQBindingURL(url);
- parser.parse(url,bindingURL);
- _logger.info("\nX " + bindingURL.toString() + " \n");
-
- }
-
- }
- catch(Exception e)
- {
- _logger.error("Error with binding urls", e);
- }
- }
-
}
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@qpid.apache.org
For additional commands, e-mail: commits-help@qpid.apache.org