Hi Rainer and Mladen,
I made the paketSize port to tomcat 5.5 tree. Now, I start some
testing and ...
- I have successfull send more than 8k to the client with a download
request.
But I must patch o.a.c.connector.Response and
AjpAprProcessor.SocketOutputBuffer
and JkInputStream to set correct outputbuffer size. Currenty I'm not
port this back to tomcat 6.0.x!
- second use case: Test a post file upload
mod_jk don't send more then 8k at a fileupload request!
use case: - ( Sorry for the long description)
Send a http POST file upload
--
Request:
POST /fileupload/fileuploaddemo.jsp HTTP/1.1
Accept: */*
Accept-Language: de-de
Accept-Encoding: gzip, deflate
Cookie: JSESSIONID=246F48F8E1C82B3EB7B800EEDA3256BB.node01
Referer: http://127.0.0.1:2090/fileupload/fileuploaddemo.htm
User-Agent: Mozilla/5.0 (Macintosh; U; Intel Mac OS X; de-de)
AppleWebKit/418.9.1 (KHTML, like Gecko) Safari/419.3
Content-Length: 16832
Content-Type: multipart/form-data; boundary=----------0xKhTmLbOuNdArY
Connection: keep-alive
Host: 127.0.0.1:2090
------------0xKhTmLbOuNdArY
Content-Disposition: form-data; name="name"
16k.bin-5
------------0xKhTmLbOuNdArY
Content-Disposition: form-data; name="myimage"; filename="16k-5.bin"
Content-Type: application/macbinary
∏i}sÕå 94^~>às›7˚Ñ3à=µ˚≈aµÓ¥‹Ç1Î;A˛4Ô˚7ÿé{>+W¡/@ŒòΩƒn€;XP√nfi
$çÈé!˘Ç∑ä[†|¡oHœsØ„Œ∑#E<§
Ì>Ï4Ñ‘¨GçOl‡∑Ã≥˙QA7fÈïéP∞ÚUnk£(X∆Qj‰®6Ód ∞èd"_<µü°|µ«Tªı;…
ª.œ•Œ›iüfl⁄¨Û»´^§ÁÚZGG±Úò√'?;HÛ€Õ¬fl§ΩKÆ}drxwLXálzoçæ9—
˜√Yt‡®ÇànÓÏJ´JÈ0∑ê≠2=B1§wt≠´›— òà-9‘Ÿ√¶áÚÈXTµ^=AscËeCEîp—
Ã,SÀ˙fiYã?∏"∂ûM.Ûi¸êƒõRìÊÏ·àO0ß$r¥ÛWé≈^xw>g'[EMAIL PROTECTED]
[EMAIL PROTECTED]'éq"Ò≠îÙ®E’q˜ÒÕRπb≠·ß}ìR>!6.
\V¿Y¿[cÁ~RÅ_TÛd0¢2mºY1}fi`5A†—{•Lúî¢
ÁO35∑bµJ‹¯–"∑ÂJkï7LWÄ,ôœÚŒ*¨äŸ2RÅe∞÷ã∞9Èê›Õ†‚/fi√då&
·X®`cõÄê∫n‹(˙‚§ê…[–{ˇØTÓˇ-ƒ#J`mHwƒ¡#·ˇ∆ô!˝p™°6èÈØ*
±LVç©”LÄîAmHvÀ√®%bÁ8ˆ^"IB›—[gÍ¿Ã/˜«˛ ih}ÿꈡxÔ[EMAIL PROTECTED]|
ŸI]FƒÍæ9Âı≤ä§á;aÑ“'rŒ|˘k\Y:U∂–ú¡¥ëãCO›tËBzQ0Ñfi{ù˘ïóo®9˚ñ–
dÉX’”òôÏq†ú›¿¯Ès¸·ËûÌWÎñM£{Ñ-¡ùm®YÑ0|y»èÚ(SµÑ˛ñ,tr‰Z©tÛ£ëµ⁄¥]
ì.∂óÈπ:ÁS.ä0Z«{iQ&Õ9†ˇcØ·◊d§kÚG [EMAIL PROTECTED]
>…
%ÙHbzw^÷+?Ä7êÀ2ó“\dûBÓáçÛf‘3( ([á˝b⁄⁄ä¯RtZ…⁄ô,
“ bÌ>ˆ∑w•t)bì¢ ◊êBÉNP~;ú„c†5éF˝d7c96D%√<¢éä…©Z—˚·¸æ6<û
√˝˛zO·Ø98W{ Ñ!‡ÍpG[∑©cîTHÊü7Ëj¯ò ƒ•N•"›"¶L›tÄ:˝Œ8Ç
$∞õŒ2üˆBT–Ú}É=Z™“®¶
·„€dÉêµ§àÆLJHN°^>—ï#∑Ôfl˙–1Ä‹·ãµ≤à≥‚ÔÜ>7¿`⁄ç´êR¥ƒ∆’·M΄¡ßr~ˆ
±Ú>ˆ°Er∏$Õûv`¸)„¿2mÃg\a?¨t◊ êΩwñœ°F—.-ñ¡k¥Ö¨ıGå€="b/è€∏dÕ◊
„5ÛÀu”%˜å]üÓä)¨>˜‚üór≤iGè»ımâØe¿é¬øòmªr©<?±•âÂñÊäë∞ïå¯"O¶¶o§¸–
ƒ†ŸË‡›iflZëzÿ¿ ç'√+¨˘*Ÿ¸»§=⁄õ‡$G}T÷/πŸ˝†$°A8-„Vêfi≈…Ä¥x’7C߀M]
˛âj=ºã÷C±|§:[EMAIL PROTECTED])AúéBÁz–v≥å« òÚneNít0ÏÅJS˙j∏Ï£öIg RöAÖ0ã`¨ë
+vTù¶4À⁄ظ¢°¨¥ùZs´Ô\ñ±¢≥ìÔ“`˘ºmLWˆ∏fi0E°˝Æ-C)•; ¨àÀˇ„ı¢æs~D6k ´‰
M"€Â/0ÚÑ∏n9`Khb™ÊÊ‹3ïOfiÍe? ôÏÇ_I[ªß
£Ñ¿¿“Øflµ›Ö·∑¸ú·ÖVıR◊îp ÿi‹-ˆ¨¸'0QÛ∏Nz∂≠Q€oÓ–$ç{ØÉ
eùP^"œÚX˛`ÓxQ1µû)f˘;™¿sÔ√A>Ω£¡ˇ±Õî©NZñ⁄IUÌòl†¸\#‘∂çî¶fl”>™-
˘Ïø'aË “!~=ã¥M?õ`ΩÁ‚e ÂÒBa3”¨Ï≤K”Á
˚M”ñ¯‚/çú˚’"˛%“˝ìÒ6N∫§–æ/a§$„ih∑ZøBfiw*;Ø≈H¬äûÕfiÊ …¢
S”lÑŒD™;j≠¿“Ø^aÜ&VÛJ˙‚Ö<c~a¸N‡[&fcvY Ôm~ãæø÷¥0ÎÒxø
€•ÜF®fiπ|{BTyT6£ØX¨ÍØÁ|È •Zã∞™Œ/¶Eâ‹U|ë≤°∂ ÑËmR‡ç<π√Z√ër4`ı%
â0Ò∞sÚ‡)8›T±∫o–√©Ÿ˝ÄHΩ‡sܺ"À•ú≈•µËfcÌ≤=Túùûı%‰üxf61„µïnZÀyV
‚7¢?^3˚lZu<VdzºBˆ<¥}€/i¡Vœvd€˚œLg˙Ŭ„lEØÊoc6K
9vâà*3ªßNÈ"›(ÂXRÒ``ÿ˘Ω•Ÿ”d<[EMAIL PROTECTED]
áØnΩt,x∆úêÑ"”ÍÌ^0LD#'F-˜[‹SíÜ{§˛˚Ó }{ô’ıjÍ}qñ),Dn¿><ìËÀX
—nì¨'˚^Wâfl)±Æ˛U3µâü;B∑}¬2ñ Oóû£$ì^—Ì≥ùK‹≤®ÅÑ,.Úß]
ÖN≤G«åCmC%:19¿Óö7tımg´lâ§Ñø^hÚwDOḭ̀_%Ñûd»G1bÒ,ç—$õ}aÛöQ=§æ≤7Ü
[≠kÛŸÒ¥ùD}(∏7^∏~ãk$Ø?ıZGÁNü˘$ÿÂ0ı∆Hpiº±KÑ)Jx˙¢™ÁƒS¶Çàp—VƒX"Êë
¥ã‡©Ú†‡ã∞n^çÔv36yn
)
== SNIP ==
== mod_jk log analyse: ===
a)Apache -> JK_AJP13_FORWARD_REQUEST -> Tomcat )
jk_ajp_common.c (893): sending to ajp13 pos=4 len=450 max=16384
[Tue Dec 12 13:09:57 2006] [5167:0000] [debug]
ajp_connection_tcp_send_message::
jk_ajp_common.c (893): 0000 12 34 01 BE 02 04 00 08 48 54 54 50 2F
31 2E 31
- .4......HTTP/1.1
[Tue Dec 12 13:09:57 2006] [5167:0000] [debug]
ajp_connection_tcp_send_message::
b) only 8k are sent (Apache -> DATA -> Tomcat )
[Tue Dec 12 13:09:57 2006] [5167:0000] [debug]
ajp_send_request::jk_ajp_common.c
(1273): request body to send 16832 - request body to resend 0
[Tue Dec 12 13:09:57 2006] [5167:0000] [trace]
ajp_read_into_msg_buff::jk_ajp_co
mmon.c (1098): enter
[Tue Dec 12 13:09:57 2006] [5167:0000] [trace]
ajp_read_fully_from_server::jk_aj
p_common.c (1052): enter
[Tue Dec 12 13:09:57 2006] [5167:0000] [trace]
ajp_read_into_msg_buff::jk_ajp_co
mmon.c (1135): exit
[Tue Dec 12 13:09:57 2006] [5167:0000] [trace]
ajp_connection_tcp_send_message::
jk_ajp_common.c (889): enter
[Tue Dec 12 13:09:57 2006] [5167:0000] [debug]
ajp_connection_tcp_send_message::
jk_ajp_common.c (893): sending to ajp13 pos=4 len=8192 max=16384
[Tue Dec 12 13:09:57 2006] [5167:0000] [debug]
ajp_connection_tcp_send_message::
jk_ajp_common.c (893): 0000 12 34 1F FC 1F FA 2D 2D 2D 2D 2D 2D 2D
2D 2D 2D
- .4....----------
== max is 16 k ==
c) Tomcat answer please send more packet size max 16k (Apache <-
JK_AJP13_GET_BODY_CHUNK <- Tomcat )
Tue Dec 12 13:09:57 2006] [5167:0000] [debug]
ajp_connection_tcp_get_message::j
k_ajp_common.c (1029): received from ajp13 pos=0 len=3 max=16384
[Tue Dec 12 13:09:57 2006] [5167:0000] [debug]
ajp_connection_tcp_get_message::j
k_ajp_common.c (1029): 0000 06 3F FA 00 00 00 00 00 00 00 00 00 00
00 00 00
- .?..............
[Tue Dec 12 13:09:57 2006] [5167:0000] [trace]
ajp_connection_tcp_get_message::j
k_ajp_common.c (1035): exit
d) but only 8k are sent again (Apache -> DATA -> Tomcat )
...
k_ajp_common.c (1029): received from ajp13 pos=0 len=3 max=16384
[Tue Dec 12 13:09:57 2006] [5167:0000] [trace]
ajp_process_callback::jk_ajp_comm
on.c (1461): exit
[Tue Dec 12 13:09:57 2006] [5167:0000] [trace]
ajp_connection_tcp_send_message::
jk_ajp_common.c (889): enter
[Tue Dec 12 13:09:57 2006] [5167:0000] [debug]
ajp_connection_tcp_send_message::
jk_ajp_common.c (893): sending to ajp13 pos=4 len=8192 max=16384
[Tue Dec 12 13:09:57 2006] [5167:0000] [debug]
ajp_connection_tcp_send_message::
jk_ajp_common.c (893): 0000 12 34 1F FC 1F FA FB F7 CE A6 2F AC 2B
FF 23 42
- .4......../.+.#B
e) Tomcat answer, please send more with packet size 16k (Apache <-
JK_AJP13_GET_BODY_CHUNK <- Tomcat )
...
f) rest are send (Apache -> DATA -> Tomcat )
...
g) tomcat response header and body are send
...
h) Tomcat send end response
OK, but why mod_jk don't use configured max packet size?
===
==== mod_jk 1.2.20 config
<IfModule !mod_jk.c>
LoadModule jk_module "modules/mod_jk.so"
</IfModule>
JkShmFile "logs/mod_jk.shm"
JkLogFile "logs/mod_jk.log"
JkLogLevel trace
JKWorkerProperty worker.list=loadbalancer,jkstatus
JKWorkerProperty worker.node01.port=7309
JKWorkerProperty worker.node01.host=localhost
JKWorkerProperty worker.node01.type=ajp13
JKWorkerProperty worker.node01.max_packet_size=16384
JKWorkerProperty worker.loadbalancer.balance_workers=node01
JKWorkerProperty worker.loadbalancer.type=lb
JKWorkerProperty worker.jkstatus.type=status
JkMount /jkstatus jkstatus
JkMount /last* loadbalancer
JkMount /fileupload* loadbalancer
====
search at mod_jk source and found following hardcoded size cutter:
====
jk_ajp_common.c
L1444:
case JK_AJP13_GET_BODY_CHUNK:
{
int len = (int)jk_b_get_int(msg);
if (len < 0) {
len = 0;
}
if (len > AJP13_MAX_SEND_BODY_SZ) {
len = AJP13_MAX_SEND_BODY_SZ;
The size at tomcat SEND_BODY message are cut to default and not to
worker max_paket_size
Why the first send body not use the worker max_packet_size:
L1341 ??
if (ae->left_bytes_to_send > 0) {
int len = ae->left_bytes_to_send;
if (len > AJP13_MAX_SEND_BODY_SZ) {
len = AJP13_MAX_SEND_BODY_SZ;
Other fix length setting found at L1101
read_buf += AJP_HEADER_LEN; /* leave some space for the buffer
headers */
read_buf += AJP_HEADER_SZ_LEN; /* leave some space for the
read length */
/* Pick the max size since we don't know the content_length */
if (r->is_chunked && len == 0) {
len = AJP13_MAX_SEND_BODY_SZ;
}
Wrong or right?
Regards
Peter