-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA256

All,

I believe I have determined the cause (or at least the fix) for this:

Despite the mod_proxy_ajp documentation, it is using packets larger
than 8192 bytes.

Setting this on the Tomcat <Connector> resolves the problem:

    packetSize="65536"

I don't see anywhere you can set the maximum packet size on
mod_proxy_ajp so I think this is the only recourse.

Is anyone familiar enough with the mod_proxy_ajp code to know how to
look for this?

It was trivial to reproduce: just send a large POST message through
mod_proxy_ajp to Tomcat.

Thanks,
- -chris

On 6/25/20 10:28, Christopher Schultz wrote:
> All,
>
> This issue is apparently trivially reproducible in my dev
> environment.
>
> Do I have to get a protocol-trace to get any more helpful
> information?
>
> Thanks, -chris
>
> On 6/24/20 10:46, Christopher Schultz wrote:
>> All,
>
>> On 6/24/20 10:29, Christopher Schultz wrote:
>>> All,
>
>>> I'm slowly switching from mod_jk to mod_proxy_ajp and I have a
>>> development environment where I'm getting Bad Gateway
>>> responses sent to clients along with this exception in my
>>> Tomcat log file:
>
>>> java.lang.IllegalArgumentException: Header message of length
>>> [8,194] received but the packetSize is only [8,192] at
>>> org.apache.coyote.ajp.AjpProcessor.readMessage(AjpProcessor.java:685
)
>
>>>
>>>
>
>> at
>>> org.apache.coyote.ajp.AjpProcessor.receive(AjpProcessor.java:626)
>>>
>>>
>
>>>
at
>>> org.apache.coyote.ajp.AjpProcessor.refillReadBuffer(AjpProcessor.jav
a
>
>>>
:
>
>>>
> 73
>
>
>> 4)
>>> at
>>> org.apache.coyote.ajp.AjpProcessor$SocketInputBuffer.doRead(AjpProce
s
>
>>>
s
>
>>>
> or
>
>
>> .java:1456)
>>> at org.apache.coyote.Request.doRead(Request.java:581) at
>>> org.apache.catalina.connector.InputBuffer.realReadBytes(InputBuffer.
j
>
>>>
a
>
>>>
> va
>
>
>> :344)
>>> at
>>> org.apache.catalina.connector.InputBuffer.checkByteBufferEof(InputBu
f
>
>>>
f
>
>>>
> er
>
>
>> .java:663)
>>> at
>>> org.apache.catalina.connector.InputBuffer.readByte(InputBuffer.java:
3
>
>>>
5
>
>>>
> 8)
>
>
>> at
>>> org.apache.catalina.connector.CoyoteInputStream.read(CoyoteInputStre
a
>
>>>
m
>
>>>
> .j
>
>
>> ava:93)
>>> at
>>> org.apache.commons.io.input.ProxyInputStream.read(ProxyInputStream.j
a
>
>>>
v
>
>>>
> a:
>
>
>> 53)
>>> at
>>> org.apache.commons.io.input.TeeInputStream.read(TeeInputStream.java:
1
>
>>>
0
>
>>>
> 6)
>
>
>> at java.io.FilterInputStream.read(FilterInputStream.java:83)
>>> at my.product.MacInputStream.read(MacInputStream.java:29) at
>>> java.io.FilterInputStream.read(FilterInputStream.java:83) at
>>> com.sun.org.apache.xerces.internal.impl.XMLEntityManager$RewindableI
n
>
>>>
p
>
>>>
> ut
>
>
>> Stream.read(XMLEntityManager.java:2890)
>>> at
>>> com.sun.org.apache.xerces.internal.impl.XMLEntityManager.setupCurren
t
>
>>>
E
>
>>>
> nt
>
>
>> ity(XMLEntityManager.java:674)
>>> at
>>> com.sun.org.apache.xerces.internal.impl.XMLVersionDetector.determine
D
>
>>>
o
>
>>>
> cV
>
>
>> ersion(XMLVersionDetector.java:148)
>>> at
>>> com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(
X
>
>>>
M
>
>>>
> L1
>
>
>> 1Configuration.java:806)
>>> at
>>> com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(
X
>
>>>
M
>
>>>
> L1
>
>
>> 1Configuration.java:771)
>>> at
>>> com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser
.
>
>>>
j
>
>>>
> av
>
>
>> a:141)
>>> at
>>> com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(A
b
>
>>>
s
>
>>>
> tr
>
>
>> actSAXParser.java:1213)
>>> at
>>> com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.
p
>
>>>
a
>
>>>
> rs
>
>
>> e(SAXParserImpl.java:643)
>>> at
>>> com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl.parse(SAXParse
r
>
>>>
I
>
>>>
> mp
>
>
>> l.java:327)
>>> at javax.xml.parsers.SAXParser.parse(SAXParser.java:195)
>
>>> This is a web service which is reading the request with a
>>> SAXParser. It's been running in production (and dev!) for
>>> years without any issues. It''s been running for a few months
>>> in development, now, with mod_proxy_ajp without any errors.
>
>>> I know about the "max packet size" and the default is 8192
>>> bytes. I haven't changed the default. Here's my <Connector>
>>> configuration:
>
>>> <Connector port="8245" address="127.0.0.1"
>>> secretRequired="false" redirectPort="443" protocol="AJP/1.3"
>>> URIEncoding="UTF-8" executor="tomcatThreadPool" />
>
>>> Here's the configuration in httpd.conf:
>
>>> <Proxy "balancer://my-api"> BalancerMember
>>> "ajp://localhost:8245" timeout=300 ping=5 ttl=60 </Proxy>
>
>>> ProxyPass "/my-api/" "balancer://my-api/my-api/"
>>> ProxyPassReverse "/my-api/" "balancer://my-api/my-api/"
>
>>> The documentation for mod_proxy_ajp[1] seems to indicate that
>>> the "Packet Size" for AJP is fixed at 8192 bytes:
>
>>> " Packet Size
>
>>> According to much of the code, the max packet size is 8 * 1024
>>> bytes (8K). The actual length of the packet is encoded in the
>>> header.
>
>>> Packet Headers
>
>>> Packets sent from the server to the container begin with
>>> 0x1234. Packets sent from the container to the server begin
>>> with AB (that's the ASCII code for A followed by the ASCII code
>>> for B). After those first two bytes, there is an integer
>>> (encoded as above) with the length of the payload. Although
>>> this might suggest that the maximum payload could be as large
>>> as 2^16, in fact, *the code sets the maximum to be 8K*. "
>>> (emphasis mine)
>
>>> Does anyone know under what circumstances mod_proxy_ajp might
>>> send more than 8192 bytes? It looks like mod_proxy_ajp doesn't
>>> have any way to set the max packet size like mod_jk does.
>
>>> I should probably be able to set the max packet size on the
>>> Tomcat side to something higher than 8192 to catch this kind
>>> of thing... but it looks like it might be a bug in
>>> mod_proxy_ajp.
>
>>> Versions are Apache httpd 2.4.25 (Debian) and Tomcat 8.5.trunk
>>> (8.5.55). mod_jk is not being used.
>
>>> Any ideas?
>
>>> -chris
>
>>> [1] https://httpd.apache.org/docs/2.4/mod/mod_proxy_ajp.html
>
>
>> Some additional information:
>
>> 1. The headers of the HTTP request seem to be arriving in a
>> correct packet before this error occurs. The headers are only a
>> few hundred bytes (~340) and the request line should be
>> relatively short (~50 bytes or so). Method is POST, protocol is
>> HTTP/1.1.
>
>> 2. Apache httpd is terminating TLS. I have no configuration for
>> forwarding TLS information over to Tomcat, so I'm assuming it's
>> not being sent as part of the first packet.
>
>> 3. Before I get the packet-too-large error, I get another error:
>
>> org.apache.catalina.connector.ClientAbortException:
>> java.io.IOException: Invalid message received with length [-1]
>> at
>> org.apache.catalina.connector.InputBuffer.realReadBytes(InputBuffer.j
a
>
>>
va
>
>
> :348)
>> at
>> org.apache.catalina.connector.InputBuffer.checkByteBufferEof(InputBuf
f
>
>>
er
>
>
> .java:663)
>> at
>> org.apache.catalina.connector.InputBuffer.read(InputBuffer.java:370)
>
>>
>
> at
>> org.apache.catalina.connector.CoyoteInputStream.read(CoyoteInputStrea
m
>
>>
.j
>
>
> ava:183)
>> at
>> org.apache.commons.io.input.ProxyInputStream.read(ProxyInputStream.ja
v
>
>>
a:
>
>
> 75)
>> at
>> org.apache.commons.io.input.TeeInputStream.read(TeeInputStream.java:1
2
>
>>
4)
>
>
> at java.io.FilterInputStream.read(FilterInputStream.java:133)
>> at my.product.MacInputStream.read(MacInputStream.java:49) at
>> java.io.FilterInputStream.read(FilterInputStream.java:107) at
>> my.product.XMLMessageProcessor.validate(XMLMessageProcessor.java:326)
>
>>
>
> at com.chadis.servlet.APIServlet.doPost(APIServlet.java:291)
>> at javax.servlet.http.HttpServlet.service(HttpServlet.java:660)
>> at javax.servlet.http.HttpServlet.service(HttpServlet.java:741)
>
>> I haven't changed any configuration, yet. But if the first error
>> is size=-1 then it's unlikely that the problem will be solved by
>> increasing my max packet size on the Tomcat end.
>
>> I'm working with my client to see if we can reproduce this
>> problem reliably. I'm sure I can get more information once I do
>> that.
>
>> -chris
>
>
-----BEGIN PGP SIGNATURE-----
Comment: Using GnuPG with Thunderbird - https://www.enigmail.net/

iQIzBAEBCAAdFiEEMmKgYcQvxMe7tcJcHPApP6U8pFgFAl76FUoACgkQHPApP6U8
pFh+VRAAsxgojDBxkBhZe827nNXA5BC/Y7FZQCn6y2HxvQnJ7GsGVednrtQpNZPb
QgoTTKwu0OFkDyGLAaZ6pqRevUWbYB/Tin8wLe9+fh/pefg/E1W56zTTJFrGoa7A
FB/bKiF1t5C4EaC9k/i0i3MEZVuro6JxygmqZz54lttQS9OocQ2CM9/e3DIULkIQ
EX1lWAX0fwOJmYzO8RWuKktoKyagwk0SxTG40azEfCRYezXIsW58IDXPc2vS1+V6
FiiL0OEj8XKxZ2kMlpswZskrS7HvW9LJTCsFAsOC2KRYKA7Lwi8LaUtEYxDonBip
3XMKwzuokhi8Xt2r3fdQnLWiuAwnUDb5YC4OWXrS08lJ0OC1j7dnWd+C78QwtWDX
n+fAzhuDpeCMF0pfZsYd0+bjywMkebXhnkU05oP/WEySpuVJg1Q+1NrXd/2xQi6o
4QAnTuJc56M3fhr9UGy9i0mOo/jCOqFwutDGUPg/byktt7gUOXNDOUAS5gRTTQzz
mUvzKBxJJ/ipPjhtPVzsCzIE3xPHMJ9ttXn9Qd89anifwfBGrOyoMSOc4pGATOzv
hHCVhhvlPjOY04umZ4aqkRAnK8+fdmsRh0SHxt+VJNEnVs2I3h6oBDRuHEhPMHIb
D4Pjv5J0cNmGZ0rapSGy+v6qdPuICPw0SZPl0Ik0C7ft1/JZEFw=
=NLiq
-----END PGP SIGNATURE-----

---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscr...@tomcat.apache.org
For additional commands, e-mail: users-h...@tomcat.apache.org

Reply via email to