Description
The AsyncAPI parser incorrectly reports "Referencing in this place is not allowed" when using $ref within channels.{channelName}.messages.{messageName} to reference a component message whose name contains square brackets (e.g., msg:[HandleFirst,HandleSecond]).
Note: The parser correctly allows square brackets in channel names, operation names, and when referencing channels/operations. The issue is specifically limited to message references within channel definitions.
Background
This issue was discovered through reports from FastStream users (see related issues below) where AsyncAPI generators produce component message names containing square brackets when multiple subscriber handlers are registered for the same channel. The generated AsyncAPI documents are valid according to the AsyncAPI specification, but the parser incorrectly flags $ref values within channels.messages that reference these component messages as invalid.
How to Reproduce
{
"asyncapi": "3.1.0",
"info": {
"title": "Test",
"version": "1.0.0"
},
"channels": {
"test:[HandleFirst,HandleSecond]": {
"address": "test",
"messages": {
"SubscribeMessage": {
"$ref": "#/components/messages/msg:[HandleFirst,HandleSecond]"
}
}
}
},
"operations": {
"test:[HandleFirst,HandleSecond]Subscribe": {
"action": "receive",
"channel": {
"$ref": "#/channels/test:[HandleFirst,HandleSecond]"
},
"messages": [
{
"$ref": "#/channels/test:[HandleFirst,HandleSecond]/messages/SubscribeMessage"
}
]
}
},
"components": {
"messages": {
"msg:[HandleFirst,HandleSecond]": {
"title": "TestMessage"
}
}
}
}
Expected behavior: The document should validate successfully. The $ref in channels.test:[HandleFirst,HandleSecond].messages.SubscribeMessage should be accepted.
Observed behavior: The parser reports:
Error: Referencing in this place is not allowed
Path: channels/test:[HandleFirst,HandleSecond]/messages/SubscribeMessage
What Works Correctly
The parser correctly handles square brackets in:
- ✅ Channel names (e.g.,
test:[HandleFirst,HandleSecond])
- ✅ Operation names (e.g.,
test:[HandleFirst,HandleSecond]Subscribe)
- ✅ References to channels/operations (e.g.,
$ref: "#/channels/test:[HandleFirst,HandleSecond]")
- ✅ Message references in operations (e.g.,
$ref: "#/channels/test:[HandleFirst,HandleSecond]/messages/SubscribeMessage")
What Doesn't Work
- ❌
$ref values within channels.{channelName}.messages.{messageName} that reference component messages with square brackets in their names
Root Cause Analysis
According to RFC 6901 (JSON Pointer), square brackets are valid characters in JSON pointer paths. They should be percent-encoded as %5B and %5D when used in JSON pointers, but the AsyncAPI specification and many implementations accept them directly in $ref values.
The parser's validation logic appears to incorrectly flag $ref values containing square brackets as invalid specifically when they appear within channels.messages, even though:
- Square brackets work fine in other contexts (channel names, operation names, etc.)
- The referenced component message exists in the document
- The JSON pointer syntax is correct
Related Issues
- FastStream Issue #2772: AsyncAPI generator produces unrenderable asyncapi.json if subscriber contains filter
- FastStream Issue #2447: Multiple subscriber handlers generate invalid AsyncAPI schema with square bracket channel names
Environment
- AsyncAPI Parser version: [version]
- AsyncAPI Specification version: 3.1.0 (and potentially 3.0.0 and 2.x.x)
Proposed Solution
The parser should accept $ref values containing square brackets within channels.messages when they correctly reference existing component messages in the document, following RFC 6901 guidelines for JSON pointers. The validation logic should treat square brackets in $ref values consistently across all contexts, not just selectively allow them in some places.
Description
The AsyncAPI parser incorrectly reports "Referencing in this place is not allowed" when using
$refwithinchannels.{channelName}.messages.{messageName}to reference a component message whose name contains square brackets (e.g.,msg:[HandleFirst,HandleSecond]).Note: The parser correctly allows square brackets in channel names, operation names, and when referencing channels/operations. The issue is specifically limited to message references within channel definitions.
Background
This issue was discovered through reports from FastStream users (see related issues below) where AsyncAPI generators produce component message names containing square brackets when multiple subscriber handlers are registered for the same channel. The generated AsyncAPI documents are valid according to the AsyncAPI specification, but the parser incorrectly flags
$refvalues withinchannels.messagesthat reference these component messages as invalid.How to Reproduce
{ "asyncapi": "3.1.0", "info": { "title": "Test", "version": "1.0.0" }, "channels": { "test:[HandleFirst,HandleSecond]": { "address": "test", "messages": { "SubscribeMessage": { "$ref": "#/components/messages/msg:[HandleFirst,HandleSecond]" } } } }, "operations": { "test:[HandleFirst,HandleSecond]Subscribe": { "action": "receive", "channel": { "$ref": "#/channels/test:[HandleFirst,HandleSecond]" }, "messages": [ { "$ref": "#/channels/test:[HandleFirst,HandleSecond]/messages/SubscribeMessage" } ] } }, "components": { "messages": { "msg:[HandleFirst,HandleSecond]": { "title": "TestMessage" } } } }Expected behavior: The document should validate successfully. The
$refinchannels.test:[HandleFirst,HandleSecond].messages.SubscribeMessageshould be accepted.Observed behavior: The parser reports:
What Works Correctly
The parser correctly handles square brackets in:
test:[HandleFirst,HandleSecond])test:[HandleFirst,HandleSecond]Subscribe)$ref: "#/channels/test:[HandleFirst,HandleSecond]")$ref: "#/channels/test:[HandleFirst,HandleSecond]/messages/SubscribeMessage")What Doesn't Work
$refvalues withinchannels.{channelName}.messages.{messageName}that reference component messages with square brackets in their namesRoot Cause Analysis
According to RFC 6901 (JSON Pointer), square brackets are valid characters in JSON pointer paths. They should be percent-encoded as
%5Band%5Dwhen used in JSON pointers, but the AsyncAPI specification and many implementations accept them directly in$refvalues.The parser's validation logic appears to incorrectly flag
$refvalues containing square brackets as invalid specifically when they appear withinchannels.messages, even though:Related Issues
Environment
Proposed Solution
The parser should accept
$refvalues containing square brackets withinchannels.messageswhen they correctly reference existing component messages in the document, following RFC 6901 guidelines for JSON pointers. The validation logic should treat square brackets in$refvalues consistently across all contexts, not just selectively allow them in some places.