haproxy経由のvarnishでPOSTをパースしようとしてハマったメモ

varnishでPOSTデータをパースしようとしていて、しばらくハマってました。。。
原因はvarnishでパースをするとPOSTデータが切れてしまうという現象。。。

■原因
haproxyの不具合。(使用していたのはepelの1.4.19-1)
(1.4.20-1で直ってました。fedora16のupdateから持って来て確認)
changelogはこちら。 http://haproxy.1wt.eu/download/1.4/src/CHANGELOG

■詳細
POSTデータがそこそこ大きいのでパケットが分割され、次のパケットの間に、

IP 192.168.x.x.http > 192.168.x.xx.34693: Flags [.], ack 3863, win 151, options [nop,nop,TS val 1921941632 ecr 1942253543], length 0

というパケットがあり、Varnish側が終了したと判断し、コネクションをCLOSEしていたと推測される。
なので、次のパケットが来る前の不完全な状態のPOSTデータとなっていた。

tcpdumpは以下。(POSTしているデータは全く同じ内容です)
 ●1.4.19-1

0x0b40:  3041 2530 4425 3041 2530 4425 3041 2d2d  0A%0D%0A%0D%0A--
      0x0b50:  2d2d 2d2d 2d2d 2d2d 2d2d 2d2d 2d2d 2d2d  ----------------
      0x0b60:  2d2d 2d2d 2d2d 2d2d 2d2d 2d2d 2d2d 2d2d  ----------------
      0x0b70:  2d2d 2d2d 2d2d 2d25 3044 2530 4125 4532  -------%0D%0A%E2
      0x0b80:  2538 3025                                %80%
21:44:49.221422 IP 192.168.x.x.http > 192.168.x.x.34693: Flags [.], ack 3863, win 151, options [nop,nop,TS val 1921941632 ecr 1942253543], length 0 ☆
      0x0000:  4500 0034 b4fe 4000 4006 01f0 c0a8 0144  E..4..@.@......D
      0x0010:  c0a8 0141 0050 8785 e74a 3494 98f2 2ccd  ...A.P...J4...,.
      0x0020:  8010 0097 b221 0000 0101 080a 728e 8080  .....!......r...
      0x0030:  73c4 6fe7                                s.o.
21:44:49.221491 IP 192.168.x.x.34693 > 192.168.x.x.http: Flags [.], seq 3863:4867, ack 1, win 115, options [nop,nop,TS val 1942253543 ecr1921941632], length 1004
      0x0000:  4500 0420 726b 4000 4006 4097 c0a8 0141  E...rk@.@.@....A
      0x0010:  c0a8 0144 8785 0050 98f2 2ccd e74a 3494  ...D...P..,..J4.
      0x0020:  8010 0073 87e8 0000 0101 080a 73c4 6fe7  ...s........s.o.

 ●1.4.20-1

 0x0b40:  3041 2530 4425 3041 2530 4425 3041 2d2d  0A%0D%0A%0D%0A--
      0x0b50:  2d2d 2d2d 2d2d 2d2d 2d2d 2d2d 2d2d 2d2d  ----------------
      0x0b60:  2d2d 2d2d 2d2d 2d2d 2d2d 2d2d 2d2d 2d2d  ----------------
      0x0b70:  2d2d 2d2d 2d2d 2d25 3044 2530 4125 4532  -------%0D%0A%E2
      0x0b80:  2538 3025                                %80%
14:57:43.004932 IP 192.168.x.xx.50111 > 192.168.x.xx.http: Flags [P.],seq 3911:4915, ack 1, win 115, options [nop,nop,TS val 2004234985 ecr1983794750], length 1004
      0x0000:  4500 0420 83c3 4000 4006 2f41 c0a8 0141  E.....@.@./A...A
      0x0010:  c0a8 0142 c3bf 0050 ab0a c0b6 54ee fa9b  ...B...P....T...
      0x0020:  8018 0073 87e6 0000 0101 080a 7776 32e9  ...s........wv2.

めでたく。POSTデータが切れることはなくなりましたが、まだパースするには対応しないといけない問題があります。。。

まぁ、POSTをパースしなければこの問題起きないというか、気づくことすらなかったんですけどね。。。(;´∀`)

いろいろとご協力、ご教授頂いた、@xcirこと、いわなちゃんさん ありがとうございます。

まぁ、自分のvarnish力とC言語力のないこと。。。orz