[
https://issues.apache.org/jira/browse/QPID-7366?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15513665#comment-15513665
]
Keith Wall edited comment on QPID-7366 at 9/22/16 4:01 PM:
-----------------------------------------------------------
Currently, the new feature allows me to inject a message containing a header
with an empty key into the system. If the such a message is converted for a
0-8 client, the Broker fails with the following exception. In 0-10 the same
message fails on the client side on receipt.
In AMQP 0-9 the headers are transported as a field table. Of field tables, the
spec says (4.2.5.5) says that "Field names MUST start with a letter, '$' or '#'
and may continue with letters, '$' or '#', digits, or underlines, to a maximum
length of 128 characters.". So this implies that message header names cannot
be empty. In AMQP 0-10, the spec doesn't impose the same restriction - it uses
a 0-10 map for the application headers with str8 as keys. There is no
restriction disallowing empty keys.
As JMS disallows empty message property names. I suggest that
{{publishMessage}} imposes the same restriction.
{noformat}
2016-09-22 16:25:06,779 ERROR [IO-/127.0.0.1:52202]
o.a.q.t.u.InternalBrokerHolder Uncaught exception from thread
IO-/127.0.0.1:52202
java.lang.IllegalArgumentException: Property name must not be the empty string
at
org.apache.qpid.framing.FieldTable.checkPropertyName(FieldTable.java:778)
~[classes/:na]
at org.apache.qpid.framing.FieldTable.setProperty(FieldTable.java:140)
~[classes/:na]
at org.apache.qpid.framing.FieldTable.setString(FieldTable.java:558)
~[classes/:na]
at org.apache.qpid.framing.FieldTable.setObject(FieldTable.java:692)
~[classes/:na]
at org.apache.qpid.framing.FieldTable.put(FieldTable.java:1044)
~[classes/:na]
at
org.apache.qpid.framing.FieldTable.convertToFieldTable(FieldTable.java:1210)
~[classes/:na]
at
org.apache.qpid.server.protocol.v0_8.MessageConverter_Internal_to_v0_8.convertMetaData(MessageConverter_Internal_to_v0_8.java:148)
~[classes/:na]
at
org.apache.qpid.server.protocol.v0_8.MessageConverter_Internal_to_v0_8.convertToStoredMessage(MessageConverter_Internal_to_v0_8.java:75)
~[classes/:na]
at
org.apache.qpid.server.protocol.v0_8.MessageConverter_Internal_to_v0_8.convert(MessageConverter_Internal_to_v0_8.java:69)
~[classes/:na]
at
org.apache.qpid.server.protocol.v0_8.MessageConverter_Internal_to_v0_8.convert(MessageConverter_Internal_to_v0_8.java:48)
~[classes/:na]
at
org.apache.qpid.server.protocol.v0_8.ProtocolOutputConverterImpl.convertToAMQMessage(ProtocolOutputConverterImpl.java:83)
~[classes/:na]
at
org.apache.qpid.server.protocol.v0_8.ProtocolOutputConverterImpl.writeDeliver(ProtocolOutputConverterImpl.java:69)
~[classes/:na]
{no format}
There is a separate problem when the header value is null. If a header key
value pair has a null value and the message is sent to a 0-8 client, the Broker
fails in the following way. On the 0-10 path the key/value pair gets ignored.
For 0-8, field tables allow for null values expressed as VOID, so I think this
may be a defect in {{FieldTable.put}}
{noformat}
2016-09-22 16:50:27,156 ERROR [IO-/127.0.0.1:52339]
o.a.q.t.u.InternalBrokerHolder Uncaught exception from thread
IO-/127.0.0.1:52339
org.apache.qpid.AMQPInvalidClassException: Only Primitive objects allowed.
Object is: null
at org.apache.qpid.framing.FieldTable.setObject(FieldTable.java:723)
~[classes/:na]
at org.apache.qpid.framing.FieldTable.put(FieldTable.java:1044)
~[classes/:na]
at
org.apache.qpid.framing.FieldTable.convertToFieldTable(FieldTable.java:1210)
~[classes/:na]
at
org.apache.qpid.server.protocol.v0_8.MessageConverter_Internal_to_v0_8.convertMetaData(MessageConverter_Internal_to_v0_8.java:148)
~[classes/:na]
at
org.apache.qpid.server.protocol.v0_8.MessageConverter_Internal_to_v0_8.convertToStoredMessage(MessageConverter_Internal_to_v0_8.java:75)
~[classes/:na]
at
org.apache.qpid.server.protocol.v0_8.MessageConverter_Internal_to_v0_8.convert(MessageConverter_Internal_to_v0_8.java:69)
~[classes/:na]
at
org.apache.qpid.server.protocol.v0_8.MessageConverter_Internal_to_v0_8.convert(MessageConverter_Internal_to_v0_8.java:48)
~[classes/:na]
at
org.apache.qpid.server.protocol.v0_8.ProtocolOutputConverterImpl.convertToAMQMessage(ProtocolOutputConverterImpl.java:83)
~[classes/:na]
at
org.apache.qpid.server.protocol.v0_8.ProtocolOutputConverterImpl.writeDeliver(ProtocolOutputConverterImpl.java:69)
~[classes/:na]
at
org.apache.qpid.server.protocol.v0_8.AMQPConnection_0_8Impl$WriteDeliverMethod.deliverToClient(AMQPConnection_0_8Impl.java:1274)
~[classes/:na]
{noformat}
was (Author: k-wall):
Currently, the new feature allows me to inject a message containing a header
with an empty key into the system. If the such a message is converted for a
0-8 client, the Broker fails with the following exception. In 0-10 the same
message fails on the client side on receipt.
In AMQP 0-9 the headers are transported as a field table. Of field tables, the
spec says (4.2.5.5) says that "Field names MUST start with a letter, '$' or '#'
and may continue with letters, '$' or '#', digits, or underlines, to a maximum
length of 128 characters.". So this implies that message header names cannot
be empty. In AMQP 0-10, the spec doesn't impose the same restriction - it uses
a 0-10 map for the application headers with str8 as keys. There is no
restriction disallowing empty keys.
As JMS disallows empty message property names. I suggest that
{{publishMessage}} imposes the same restriction.
{noformat}
2016-09-22 16:25:06,779 ERROR [IO-/127.0.0.1:52202]
o.a.q.t.u.InternalBrokerHolder Uncaught exception from thread
IO-/127.0.0.1:52202
java.lang.IllegalArgumentException: Property name must not be the empty string
at
org.apache.qpid.framing.FieldTable.checkPropertyName(FieldTable.java:778)
~[classes/:na]
at org.apache.qpid.framing.FieldTable.setProperty(FieldTable.java:140)
~[classes/:na]
at org.apache.qpid.framing.FieldTable.setString(FieldTable.java:558)
~[classes/:na]
at org.apache.qpid.framing.FieldTable.setObject(FieldTable.java:692)
~[classes/:na]
at org.apache.qpid.framing.FieldTable.put(FieldTable.java:1044)
~[classes/:na]
at
org.apache.qpid.framing.FieldTable.convertToFieldTable(FieldTable.java:1210)
~[classes/:na]
at
org.apache.qpid.server.protocol.v0_8.MessageConverter_Internal_to_v0_8.convertMetaData(MessageConverter_Internal_to_v0_8.java:148)
~[classes/:na]
at
org.apache.qpid.server.protocol.v0_8.MessageConverter_Internal_to_v0_8.convertToStoredMessage(MessageConverter_Internal_to_v0_8.java:75)
~[classes/:na]
at
org.apache.qpid.server.protocol.v0_8.MessageConverter_Internal_to_v0_8.convert(MessageConverter_Internal_to_v0_8.java:69)
~[classes/:na]
at
org.apache.qpid.server.protocol.v0_8.MessageConverter_Internal_to_v0_8.convert(MessageConverter_Internal_to_v0_8.java:48)
~[classes/:na]
at
org.apache.qpid.server.protocol.v0_8.ProtocolOutputConverterImpl.convertToAMQMessage(ProtocolOutputConverterImpl.java:83)
~[classes/:na]
at
org.apache.qpid.server.protocol.v0_8.ProtocolOutputConverterImpl.writeDeliver(ProtocolOutputConverterImpl.java:69)
~[classes/:na]
{noformat}
> [Java Broker] Add Management operation to VirtualHost to allow publishing of
> messages through management
> --------------------------------------------------------------------------------------------------------
>
> Key: QPID-7366
> URL: https://issues.apache.org/jira/browse/QPID-7366
> Project: Qpid
> Issue Type: Improvement
> Components: Java Broker
> Reporter: Rob Godfrey
> Assignee: Keith Wall
> Fix For: qpid-java-6.1
>
>
> Sometimes it is useful to be able to publish messages into the broker without
> requiring an AMQP client. For this we can add a management operation to
> allow for the publishing of messages over HTTP.
--
This message was sent by Atlassian JIRA
(v6.3.4#6332)
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]