shashank created CAMEL-26090:
--------------------------------

             Summary: camel-hl7 - add a maxFrameLength option to the HL7 MLLP 
Netty decoder
                 Key: CAMEL-26090
                 URL: https://issues.apache.org/jira/browse/CAMEL-26090
             Project: Camel
          Issue Type: Improvement
          Components: camel-hl7
            Reporter: shashank
            Assignee: shashank


The Netty decoder of camel-hl7, {{HL7MLLPNettyDecoder}} (made by 
{{HL7MLLPNettyDecoderFactory}}), is a Netty {{DelimiterBasedFrameDecoder}} 
whose maximum frame length is the constant {{Integer.MAX_VALUE}} (main 
ed3d719b379c, {{HL7MLLPNettyDecoder.MAX_FRAME_LENGTH}}). There is no option to 
set a smaller one, so the decoder keeps every byte a peer sends until the two 
end bytes arrive, however long the message gets. The camel-netty {{textline}} 
codec has {{decoderMaxLineLength}} for this, and camel-mllp has 
{{maxBufferSize}}; the HL7 Netty decoder has nothing comparable.

*Proposal*: a {{maxFrameLength}} option on {{HL7MLLPNettyDecoderFactory}} 
(stored in {{HL7MLLPConfig}}), passed to the {{DelimiterBasedFrameDecoder}} 
instead of the constant. Default {{Integer.MAX_VALUE}}, so nothing changes for 
existing routes; 0 and negative values are refused with an 
{{IllegalArgumentException}}. Netty's rule applies: the length is counted from 
the start of the data up to the end bytes (start byte included, end bytes not), 
a message of exactly the limit is decoded, and as soon as more bytes than the 
limit have arrived without the end bytes the decoder throws a 
{{TooLongFrameException}} and discards the data up to the next end bytes. A 
netty consumer passes the exception to its exception handler and closes the 
connection. The name follows Netty and camel-netty's 
{{ChannelHandlerFactories.newDelimiterBasedFrameDecoder(maxFrameLength, ...)}}. 
The Mina codec ({{HL7MLLPCodec}}) and the encoder are not changed. Documented 
in the HL7 MLLP codec table of hl7-dataformat.adoc, including that a message of 
exactly the limit fails when its first end byte arrives in a read of its own, 
so the limit needs some margin.

*Tests*: a decoder test on an {{EmbeddedChannel}} (at the limit, one byte over, 
data without end bytes and the next message, the factory, the default, invalid 
values) and a route test with a {{netty:tcp}} consumer: a connection that sends 
2000 bytes without end bytes to a listener with a limit of 1024 is closed, the 
exception handler gets the {{TooLongFrameException}}, and a normal request on a 
new connection is answered. With the decoder passing {{Integer.MAX_VALUE}} as 
on main, 4 of the 7 tests fail. camel-hl7 with the change: 79 tests, 0 failures.

*Affected*: the same constant is on main, camel-4.23.x, camel-4.22.x, 
camel-4.18.x and camel-4.14.x (read, not run). A new option, for main.

_Filed with Claude Code on behalf of allthingssecurity._



--
This message was sent by Atlassian Jira
(v10.3.26#10030026)

Reply via email to