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

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.java:
73
>
>
4)
> at
> org.apache.coyote.ajp.AjpProcessor$SocketInputBuffer.doRead(AjpProcess
or
>
>
.java:1456)
> at org.apache.coyote.Request.doRead(Request.java:581) at
> org.apache.catalina.connector.InputBuffer.realReadBytes(InputBuffer.ja
va
>
>
:344)
> at
> org.apache.catalina.connector.InputBuffer.checkByteBufferEof(InputBuff
er
>
>
.java:663)
> at
> org.apache.catalina.connector.InputBuffer.readByte(InputBuffer.java:35
8)
>
>
at
> org.apache.catalina.connector.CoyoteInputStream.read(CoyoteInputStream
.j
>
>
ava:93)
> at
> org.apache.commons.io.input.ProxyInputStream.read(ProxyInputStream.jav
a:
>
>
53)
> at
> org.apache.commons.io.input.TeeInputStream.read(TeeInputStream.java:10
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$RewindableInp
ut
>
>
Stream.read(XMLEntityManager.java:2890)
> at
> com.sun.org.apache.xerces.internal.impl.XMLEntityManager.setupCurrentE
nt
>
>
ity(XMLEntityManager.java:674)
> at
> com.sun.org.apache.xerces.internal.impl.XMLVersionDetector.determineDo
cV
>
>
ersion(XMLVersionDetector.java:148)
> at
> com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XM
L1
>
>
1Configuration.java:806)
> at
> com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XM
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(Abs
tr
>
>
actSAXParser.java:1213)
> at
> com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.pa
rs
>
>
e(SAXParserImpl.java:643)
> at
> com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl.parse(SAXParserI
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.java
:348)
        at
org.apache.catalina.connector.InputBuffer.checkByteBufferEof(InputBuffer
.java:663)
        at
org.apache.catalina.connector.InputBuffer.read(InputBuffer.java:370)
        at
org.apache.catalina.connector.CoyoteInputStream.read(CoyoteInputStream.j
ava:183)
        at
org.apache.commons.io.input.ProxyInputStream.read(ProxyInputStream.java:
75)
        at
org.apache.commons.io.input.TeeInputStream.read(TeeInputStream.java:124)
        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/

iQIzBAEBCAAdFiEEMmKgYcQvxMe7tcJcHPApP6U8pFgFAl7zZzgACgkQHPApP6U8
pFiRLhAAjlxPNd4MoTvqVqDz2rfdwmVA25CnHH4/ruJZKku2n2J4+wMAYfqhwg06
sRb/buihuUWl4hx2lL+aDj7/8UH6pSfrY6uwAVucfTPOMu4mxFFte04DSumj2zou
EycpgYYa9SLcidIeCttFC8dwlO1QguZfyhVOkcOyJ6vNPQpbcPHcRFn1uGdxpnkC
MPloAnpB1Uj48B9jK17sl2o9+mdgcANsIUBKkoZqKQ+MbTV5yl2V4FomROjtJ/Sg
dRSOubuZsU36BYnaO5k+0Zh1SxXIUVCFjrflREZh6vPYsZf+BsDDOY43CRsN4oD2
ZcuWrT8Oq+iwtdqa/uJuHRD5wD6jIxzi0V5D5aYdHNOyb1cZTWpvy8+3sOw7cZS9
kvvDDu3kfSV3x/7ex/ZWHnaTLjkh00ejF1Dyv031Rg1UunlX+uaG1QPpGWBFoaYB
1QnaA9A3OUOYsGIEugPxKCW7Yk2rGtz3m3Hk/UYSECQhLjVrfa6Wn2DL7En2i4JH
SJLPEBmv5oWUMibL68wTDjw3j/xIxonO8S3x85NrreqDoYF/2jJ7aPG2Ak6tyqKA
1UpBa5NzmL2/1UG3GWu/aYWepTEh03qQNT3RSJW+k9D+0IeXDfvSVX600uu8fnOo
MeOLxA7XUjLqEVT/V3T2cSwBBNmwdModu53Cap2aNHJz2RH7hLE=
=u/Pl
-----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