nats-io/nats-server · error

processLeafMsgArgs Bad or Missing Reply Indicator: '%s'

Error message

processLeafMsgArgs Bad or Missing Reply Indicator: '%s'

What it means

Leaf-node protocol parse guard: in the long argument form the reply indicator token (args[1]) is not a single '+' or '|' character, so the reply/queue layout of the message is unrecognized.

Source

Thrown at server/leafnode.go:3269

	c.pa.arg = arg
	switch len(args) {
	case 0, 1:
		return fmt.Errorf("processLeafMsgArgs Parse Error: '%s'", args)
	case 2:
		c.pa.reply = nil
		c.pa.queues = nil
		c.pa.szb = args[1]
		c.pa.size = parseSize(args[1])
	case 3:
		c.pa.reply = args[1]
		c.pa.queues = nil
		c.pa.szb = args[2]
		c.pa.size = parseSize(args[2])
	default:
		// args[1] is our reply indicator. Should be + or | normally.
		if len(args[1]) != 1 {
			return fmt.Errorf("processLeafMsgArgs Bad or Missing Reply Indicator: '%s'", args[1])
		}
		switch args[1][0] {
		case '+':
			c.pa.reply = args[2]
		case '|':
			c.pa.reply = nil
		default:
			return fmt.Errorf("processLeafMsgArgs Bad or Missing Reply Indicator: '%s'", args[1])
		}
		// Grab size.
		c.pa.szb = args[len(args)-1]
		c.pa.size = parseSize(c.pa.szb)

		// Grab queue names.
		if c.pa.reply != nil {
			c.pa.queues = args[3 : len(args)-1]
		} else {
			c.pa.queues = args[2 : len(args)-1]

View on GitHub (pinned to 3a66a489d2)

Solutions

  1. Ensure peers emit only '+' or '|' reply indicators
  2. Check for version mismatch between leaf nodes
  3. Inspect raw traffic for corruption
Defensive patterns

Strategy: validation

When it happens

Trigger: Thrown at server/leafnode.go:3269 when the library encounters an invalid state.

Common situations: See trigger scenarios.


AI-assisted analysis of nats-io/nats-server@3a66a489d2 (2026-09-02). Data as JSON: /api/errors/ad861640a935ae1c. Report an issue: GitHub.