From cc9adee697851ad47dc8c0487327e92b15e8d342 Mon Sep 17 00:00:00 2001
From: erititan <elemer.lelik@ericsson.com>
Date: Tue, 4 Jul 2017 12:42:11 +0200
Subject: [PATCH] Message length calculation corrected

---
 doc/HTTP_CNL113796_PRI.doc      | Bin 67072 -> 69120 bytes
 src/HTTP_EncDec.cc              |   2 +-
 src/HTTP_MessageLen.ttcn        |   6 +-
 src/HTTP_MessageLen_Function.cc | 268 +++++++++++++++++++-------------
 src/HTTP_Types.ttcn             |   4 +-
 src/HTTP_parse.h                |   2 +-
 src/HTTP_parse.l                |   2 +-
 src/HTTP_parse.y                |   2 +-
 src/HTTP_parse_.tab.c           |   2 +-
 src/lex.HTTP_parse_.c           |   2 +-
 10 files changed, 175 insertions(+), 115 deletions(-)

diff --git a/doc/HTTP_CNL113796_PRI.doc b/doc/HTTP_CNL113796_PRI.doc
index ea6ebe8b5c2633e7652a5be21631a4985a1568b6..60a78a3294fffc1449c8ed33b46c62376be391de 100644
GIT binary patch
delta 14353
zcmcJW2V4|K`^RVDKoAa5iqfQrfQ52L6E#W^#4d`xBA}==L6jn%SW&D@5Zh}I#Tr{K
zM#U0)iM=6MVoxmCLKGz`|KHr+0(YJ!c|ZU6^t-eB%ri63Jp0V-&h9d8zG&Ji(P9t#
zX+-%mCS(S7Iq<2vx|&I+0@=<mIoD^<U40QD?;8Eg#DqW>KRrUi%?U9gqsEOIH{|q?
z(+a7|Mqgx3B;5(|TU&o9Bh!G-F43Y(MCLSBODg-#f)}xLxHG^1wbZmu1F%zJXp*vA
z-Lwt#HbXuIsgnyKLy-#k5u*t)*CJ%P3z3oEuoKgYkP;|#XpN1AG|80^Q+Qyugpl@d
z(Ge*j1<<=2O$dsU`$*aEpQMh^n;b*PPbla*9uD!rjxH=RgHKHA3w<Bu$y_93Ewi7H
zj`HM>g_ISn`xA-_sn8=qhaG#N2Ug4l5IXtsIqE5^f1(!gtT`t_Md}qZ7u5YZ`OyeH
zA6LP?&$DaWtAZWh4ku(kl@yuKM7=h$^ih1S(3o(76VJEr|GeTd3r@vPke7J#$Gt}q
z(vsg*Y|p|d7AO+*(gP_w;p~?_5*xTXGL9YLoTL0;)XI*-3DG9$qhNhVS7ygH<O_NV
zWo(4byF?PQ4)qAV6jH&9!m;8cIyuxH@)Zfk!pYMejdSg!<KaulTZJzQM8<6eCG}M3
zi@Ln_m|E9cEfq|!6|1)Wxg0(3@I_PE@a$knh@+FdyWUu>dTo5#czgJH(EatD^_2U5
zbfJN*GDAWe8rUf_BpxamBMh8tlolA+)$IRh;8e4JuZ~>Lu$fSir%FYG3|)i_FO`h#
zhOR<}w@OBRaZL#ym5h;MsZhdKCF79TrN*e2;#y<Pjamr>{OBvO&}}JAFcO-OdZ=U^
zH}X-IkV;fCS~O@YWJpyqmNak@GCWyEE8fpiF9$o$RO%+t?;{D&H?iv-&^fqIaERTA
z@PtS&K}Dq^cVlazBJa8t`S2BaqN1QLROC}v-<Q|-f_|qj==;*X#-UsgU1jXZb&?-8
zrdsuVT|MyM)67jwFB)0VG?POzv?mUYh>waL8$ZS_VYJ=Em}tAmn3VYO(NT7z5~9-V
zVj`05Mny-*+eIcMB}GS0jE-`%3x`rvbYwzQbdp^}a&mOssMzRaMbU($v17)@N5n!q
zeqwa|#ALhCNeOYawI;iXVX?SJbaHaUm}t9L*XZ~$6JzWmBVr>{Vk0JwO^CM}of03(
zc9PNbq-d44skiBQPAV6fIdBGnJ%f992@VVl3<#p`=CSpZeWQiut<c@`=AIm;v0}<K
zNv0y}CUjyGlfLrV$+P35;s-><N6C}ro119qWoeJQj<Kk#$2HW;GLPxVohAMBIMPUa
z92=o3GX0t(N3)oZV?;!uP7`e{WwvH96SS7|0^-rN4T;esaiK&M50XRmMYf8D2J;Q6
z>!LkfzGY&po<}TrL)7IcV=v^82{gyTQX8hzjTQqqheAs&+QfP>6*V=LeW-X)azcJ$
z+q!M}>$a^ck(X3_sF<Uaq}NEsvCFOE#~T`|t?-D3MtP5&!ECGUF}`F^K1V3oi}{oJ
z1NQPoFJXdLFZ%!N>@T~Fw=tYIL9nroiJ!Y)d174l>JxGh{H#x?ZPP3&vU8NZ{`Ga)
zg|Z_T$}a5sb=UVBzhAbCm*mt)GL({d!gqeJ&gY%yZEDZwXt0Sd`7`c!)Z8W`e9=HY
zOGDBBCaU=6j`IOf6Y!dbge4PxaZK1)sSb#`qoEabv`eHSNB>rDU%!2L>EWqkr+$1`
zbgAg|+t<r#B-szyaYoHCF3MIi-ny;zK68fB7an|$24C<c<+`7jv{u)yYpSwdAHJNQ
zx++}oWhbl860~=7eRox_pnR<dH4KARxegwZ4Mv2#1{FZ30U=@_1^q!Zm;jQ149o{B
zX@o;A&2g}#6%LE&e?(%sso4PP@7SA)oCbD!dH>3xEBkitTeoxH&ijY%ugqULM=43K
zk&I&!%m;jcHLb63TAjYr;m(#aVXEYn95FZ$pmmglasOop@#ka%mM&_c{ZFRfdbRVf
zjabF2w4haEPZbH9et0um@{MUQleC}%ox-WeWuUC;Rn>!6Rj*2pmK6U~yuKv=Xg(zK
zY9#4ON!+U{HfQp^ScKa#^<MBzHsW(MG|89D!>U82<QR;re-e~U_<|ZL{<6z8#iV|X
zujnf$OBdn1Y6!<V!=1FG16};7sAXcSw@*r*oI8DP?~~0Xn~UBSEqhy}lw>O<88wnR
zgLnp_S*6?PHSaK8K1V~pc!$jue_pb76#cE|f^f+<<g3uo#J_W0^BUI)(XPR3t!QFP
z7b<EUCCfn1rhrT^6=Z?wU>5lI<ML0e{NX_jo#6d6na{7C#AP)uuEI2-x#*Ys&sUns
zm#nQ6b!zByok*z-IW63wB-&~it+LPD$VUSCqM4)x^Vw`L2dn{wU@ce&ioklnX3mXZ
z6F3e|fRo@9I0Mdt3t-?yY%YOkpd360FThLi3b5(-55T72KLMM9?ZH=OipjAf`o_}2
z){|u88+{(He;cI;(iaW?{Yk2IHg3Fnb=4+eUFl?76L#tO+{yeIoxnHqFU}~jV|{N8
z+<-gq021I0dVw&|7lea;fL*F&b+1)Zm;lTL?3%S0tOVbIEnqv?1NMVoz<F>B+yxK8
zbMOMZd;adx?aRL$*?s%b<t>-jE}t*_o1QW~C1&~jA&R?N#Rhk#^5br1oUW01j8{}1
zz3A@IpEb#vV@<JUSQD(;N>CrerwMQbQji34z*?{eR0Avct|^d$?jQ_AG^8UutZBT5
zSjlZ%gUzW-GEHVC)cp?iYoWXj&<Cuo#z1IKf_>JeH}C<h?JO`I%md7hl|ZoN6ZV-s
z258?9FuSaQ4Pf^1wmC85;IpT<o}NGO!-lo1*REKK4U)A#ES#N{nYAKw()f|%F-cp?
zFG}4x8G)-h*hOL~qpw)T*s<cHK@6A(QotmT3ev!Quox@>Yrr9J7(4`zz)SE7yaq-X
z7AC+9I07f&3|v4c=+Q`mV8YID5DAh&#p8;HWtUDLly5w^dTH*`g-hohoSHm!{K$SR
zDLY8lcui9*gdDxMnVFi!kO@gxl-)@CPfZu-C2xyf#Fll0bwDs$F!&FpVay=Gkh<+p
zhCCb02j{>gP({Oh2Ghn8vC+QTXhX<S1BnF_)Av4Nu9Q~!I2moIt5C?UhI%3`GA61^
z{YpB(ccV<y00+!m(unmo1+W(90M;sNv7-sDAs`b>1=Bzlm;q*j*<cQs3+90wFdr-c
zd%#|>9~=M&!O!3sC<h)NvH1k50efcm?)jtJ*UlX;{$U&cZ}a+9i)JsHoiP#H@rz~;
zMGs76*1|%R-8q=YJn$Jz+UaElbv0G2q_L*r<!sA@#88khO=6}!ZXjB#E5qGdO(~|M
zC{?qnt8ImEq8?|WC`^a@*$1#?IcdNfWUg4GqcQ{n20Tn-TOpQNY^xu$(@@|yBFK)N
zR_5p+z#J_D%+b>UbM!309Gwl+9bF9BJ`)=2(L(m3?&<y?9+YcthmP?vHo8?e?-m{_
z?w}>@TC`V08tXq%1R%f1q7Od6JB5Ad1d9?DAuJf$;=Hv3L%=#(U}-_Ww-hssP($r6
z5A~m=M(rAz=o%AqN3P3g_LLZt@c5|5ji__G?J}av;>rm)gEqhq2-Ua8ehBCcLO~bM
z4Ri<n!2mE23<AuQ1z;gq1bza$!5MHCoCD{<Cr}L<n_+&HVPgq8fR4Z)j0NMs9FPs>
zf_Y#E*a>!nJzy^=2Dibl;4ydto`Pqf5gy^2fH%M0`t8k?6IV_g0*dY49Y{B@BN<EB
z;R?m!0>zfkIss3q1-X7$6GiYNhShR}!Blss2r~8*sqP@b`lDvZ$rNL*KL5Ds>*Gqp
z7~}_<@-dfkjDLOf*OXAs3bu+iec8Di3g!ag9J2FONVg)i_9Co$)dm&b@?f56P0IqB
z*XzMTDb<?35457&I?UA)SyR7`@@7PbmA1f1U?;a3Xazig7hos5lG^)Pc(1El>pwj}
zOqZGHTGht0!U$qRy#v-+)e|C#MGcD(77gZzg3jjDGVr$6QXBdEz<OL93k*|W23U4u
z&=L59U=RX2gHX^FbOYT%56~0z0=+>P=mYu!_QJ37={@|zw(Q!abNoMC9V7G_aIG~@
zd$_?@Op-|7O_1RZ(>$i4UNP<PjipR2ZkR_upW69Jw>CJ0s529+?*gm-X%8~$o(~$(
zX`fb9Q~9S(TAaSnzbg6R(sE8un6Bg>yPVPzw;?{H4e`d?BtPOod-X{C8;OK29-ykD
zkTj@UkAz5QSdVy3GL_mTlpCyG7bI%sJT=s%kg3%r>7!m3Bx-eeYp6?;%twQsCYi4W
zJx#JU8uS!0gF1er7rQ5^AFK3H`kC()5|uImy;SSKv05GKK9{nypyDSf`P}D9nMzyk
zeN@}Rv06Q!`&LRc$v*e3lqh5>?G=Qp*Y7KTJ=B(~w+fe4TnXikhd(i(1tLTJPdeX_
zMtJ9+EY}~`P9$551xo?g0S<wSU>dj!UIDxyCC0!GcmRL!|ClHHUsU=p>crIaKknhz
zjj{h*m&ya<U3EBjd1CS~EzXXfPuak^(@B%|aSf<+auy^%PF{m;|I`uK{*<~Gxru2J
zy6&&5M`^{-fOK2>HZ2&!_UW0}7N^UwZJRLz+k+Wp*e;vG<mQ<fD4v^{fUVZl0gw!y
z8jbCtsc{^UyU8Ls9OO<L#1UFPtqb;jvW~;34_R*7vdw*(-#LLt*EyE__XT*h7Z>eb
zXDe|_jf*WGG%V+4h-s$#pB?oMwEL9%VdpWc*s}9KmGuZLU-xiA?4qrw7kY(w{<=Uv
zE4RIQ{i3l?g0wTA1&y@|EpUIbz09YmhrMjg<dC1*M=sj8viYo{C~=Ng+sgCHGi2M(
z+jPm_erwUj<e4Tt2i{7|$*;d{#shn+C8?Ja6Ds%ZUGXe2>wd$+)+fZ17w*l7t~}bn
zZLLki`+Dt0+E&<HO$@SM-|l^T+an(L^Gi)nCdQr3)zfd&!|8q4^o55LI#m<}uE||w
zJa?FLNW(n`Bu%OPq^iqB`}R%zbxoqBfm^-VUa}`$u9xoUU3w`Z%;DXtdR`M28prMN
zxR7mA`8xAnThj?#W6St}k9*(WK9lyN+@o+*&eqY_`^gOU%{u&e$GYFTJI#pgbD`ou
zSI>&=Bs}(h+iN|G`kwyKf>;_w6t!r4d&8a0yKj8b+LCoSDCgy*UBlcgQ_soLW+Y$9
z@2I`qf0HahTXyHUu5mC9TKszFP{#0Grm4Eav-(Vl)*j*Nb#wT&L#=v;cA2s#%k5oW
z(vG2Vx)z?rV`g2?+&;wBb=CIXy~Tr4PPaJG+Wh7?*TBkwmvyFz`Z$J`XTLXHbjf&g
z8~<+&8{IFbUG!%821_1z40SOpo+bT|-?5j?rtAWn`Cj8s8!VH(T3~<r<h`Ray9Xcr
z*kpgP<->DlZ13!!@?ur{^a+1F&Zj3A^=kTYRa@!zZ+o}Dv~{?w`uLq*9aBD~f4cq5
zc|_Ukp(m?9T^aN9$EqS5y;j3!-Mx1G!l%^N<=1?_tA2mf#9;sOf-Iw#R4@7WwjCzL
z@6<D2A2?Eaa>m2wt*h)Eii15@%MwkS`Q;p!b)KnPRb?F(b$Hhfi^J{oL+6WAQzl)o
zyJbL^+nF!Ae&iHs>Jc)e_0EucD^_(gNS2xRDyPn#Hj@q3G`o3=o44S@q|tpZ_8*mO
zF|)KFjTR0p&|kPS@uBym?48jmll3L{)BR`bKZtF;YTvQ3_M^mIzB8OZZm`AkC3><y
zq`Mo=oMN@pZ_k4to9x<JykJpx$6IFEgHKgTypN=sofFNAb^FVuF#S;F61_ObjEbm@
z584j(U+=t3y210vs++O#jys0CKDq8cynJlOf{Ig}oTgjfnDV08iHT7wZFKGDt@nvt
zbZpJSkJ+|?a~*znGVyuGdA>AGGfMM+T{7{GeW@(8^2xYFt8e>l__3vNTJ+L^Noi)D
zYo}%;w+$KCMXdMpn%^7F?PXT!J*cvJ$e?=mnQxx=J+s+ubAhkPr~_-?mPAdliXXOL
zd+GdB$FINeS#jJ~a?5R{xctDxpY!7@W$w3czW9Bzdugi$y6=|`IX-dAHlG)lN;3ai
z*87G@^1RBuH;R*GkGrpRGwj;#&DnYK-}j8woAXD{+4_dJ90Pti(Pi1Ynb|uU7q%#W
znX_%8^q#?WlNa4B=EVJM`BT->)V4WBr7oF6UCke@9ow?0_1tTzhcBGC7Z$Ycao3bL
zdQ0~Xh;@D%me$4p#zC=uoRoGd3oI<Q{x+abgWrt34D@&XF!@Mfd_)+Py~y8mV<dO=
zhwl%SoX!#tIQr%r53X5iVW8=vsMVLl-Q`<y-@ADpa9tLnbEw0pLEM(^*PCD8dWLT4
z*6q3Ba-YzcN27ClFA4i*{+yVZjjy%nd?D~bT=K9HMOO=)gVy{u<MQB38%sVdIG&a)
zp7iX7f8?+hG3D02x4M?i$+ajPd(`HrEV83@NZ*Y%ZoBtq_q=<%theJ6v8-wIa;Kp`
zHf(TZTB}Q4uGu+gIU6+(JDPXq!e#%+BKvtmc8aDaMx4GD(BI9{FSK}hRQsk6)?B=@
zZNaI~4I2txZR$U8d&`Q78AZ)k1{7!9dt7R9aZr*$z})xO3JvdOC#L?@xBFT@hgWSq
zO@8S2QMT24{jBn*FHQQ1iymb64Epi0OYyP|iOnBb*rY5y?%!_6_ZC{4XGLAot7lR+
z@=bx|ZLepRE#_<;Rynbmg<lV^0pDEdZC2*}yyfV#J7TrR?`%JUULWWhWVmAe<ago4
z*PHJ?c(r&}W?)HkySsxvv>sMzC=OWr(~7eNP8JEj?6_Kfe50(a-BN@0vu+GpF>`%Y
zUeV26d!oNN($>as^_Gemx6`j3xtO|ld-#(6cfR?vmq~15gJWyO?pb5P6Z5*hd$riE
z)cDQS)sA`MJ;5(>j&J2UpKon1t_(PwkREWlLDH-hcTT58Z(qFS{kf!VPyTu|>ZH5*
zjjfl1Vp==QpEtGYT#>={!pBo&uO9_3NSKm2cWJ^+H}Rlv$2@)3b$G)8BSy?CdOl)=
zwN_z8L7%53XWsO0KET~~pWpV|n;$(5D9Rf@VEVXyH;q0FKJeGYl!d0H<Cki0zr5*D
z%j0&Z((<OS8?oj0&BHfc{d4oV!6(Oe7#bTn^3kR#tw(Y9`t6@ojmHhu)!L+YH*JwA
zp;Kn)QG<oXa`X8+x%#yiLwadJICqgcEo{r3kw+{H;`GAtOdsD=b*JAia)~~No2v`p
z61W1cfl|P}v8)8_TY!alCmM<OZxSr7>*Hn8W5C`>um|JpAuoHr$e!S_haGI`$CheP
z#rK(bJOzwtz*{RBnk2Y16Kh}#ngP}dMeXd-G^>R@iegV=*pitoa@l&5EwzLN5*j8@
zBTax6umMeh9k2%uz!5YDcsov71NJTHJUk9Rvv>{HArm(Uvq2$P2a3Q3a1vYu<=_Q)
z30{Lk=>9|S5`-Jk^xRUqI=2b!Lq~?!hnEb2Cuj@WgOOl7hy!^bA1nt)z$w5yYtk=I
zWYX_yb>2+n*50(*Y?_HB+sbvn9m#RdbWGj=l{J9}eVK1TALbdWNU=Iw8WdS)eL}FV
zBVsZFUlb;gNaBTcW9`~eLZn~G^ZZJl7k!=Im>yi(Qf2KR!8#!eRvG6TtI2&Jx1wG1
zjnw46sK<g%%U7?b4b!*!igoCHuu9LRG+<dPmD;6P(Xv*TE;CZo-1(WNr$SSAxsj}{
zf28o&mwbmc(O2?(zLJLzEAhifRm9_;2q}gRf)mI{f9wcEWB&!Hk3rEy$y%gM5qk`&
zk}#wK5!g=yOX~0k_8CSPSS}zGM1o``*+|cUjs|#q+|P(sy|Jg2%Tr`*&^R$`@nZ(F
zMTrRZFbtJ2TceaDB7F-Q!^Yi8n4J<O-H<XyD#<}AP=I{_F>C=Yq%(FHNlGRmW#oX1
zAP{p<KO;i(Rxg)Lffw0eW_SE-@csdkV9Zn?136$N*bKIS-QWN?0*-;x-~zY`O2AEU
z3p@wxB)kTz(5deLn*?5gB($FarWn9C?1OR{m<FbU8DJKe4YI*pFdys%2f-&$4g4@O
zwgX*2H!uh+1ZTlH&;)Z_N01HJ%l|!KFL(l;0yE62=0;Eq!A>85Gq`Y7Pr7539=)|n
z%86*$Y7;tgwJ~-3Pg@yt3kx_gy2H+$6x~SzdjN|kp=)#CUKSV3)hsrcyF0>K=5loR
zzwK>bMR(`ITJ<hkqAMQY@4L$PG_<z2Emu3~=wLYMD0^xu)*&LIkg$|yt=_6JJnYeb
z_RUl{=m+ZdUFc)ov-;nhS!Fjn{EJgr_e`><03xDI*Q{!X6KX1VC<t#Ew3dxSfKx^u
z0ro2dle`FdP>&<MI%$z$Gi}12bjJ7B#W)v}kYF*n<8MSnW(~-9*2Z+}FU_^+H}v8!
zgSArIQI|7=wWhh!X=jFOImFXjXMC*KE0JHU@`<7CN}^-(AHrVC<%O>%KbU++?au})
zUNc6Y&1%G6n0yFTd<vwD3Hs+*KOJ^UaY`;dm!aj^!)k!@<?-cCO%%5PM=+7>L!4<7
z3X9P-<6NYw(p>r73nMt=rwBO)`|a)T)e%pkz37Zf$2d;j>2itI4<+_mTqo*KD%FyD
z(f*~*+M&){>9kUN8{Ku`><fK7!ay@TtO2&aPhWnpw6T#xBTjM1+Gb*A3rksZEX8dK
zt^N&{vfpQN$7tT~&14C1HuHH7QhcpQ6yI$jJ&9w44ta(Y{}s1L=pLzu4YNHGDTWJ4
zMvAB>bC4p+$xWp25z&ScyCt$hidWdg87aG=2|~*5pavkt{ZC6W20OR`A{j_=6GYem
z#f^~SZmBWS4LD|ZL2`M-<ISAepD;2BhpaapP=KWqsNGYEt?DI?U5@JNjAuF)syaTk
zI@I#1uUZY>wYiF#MrddSfvM8UAPqX6YC3&2=t$LcdT7v*sOfappyN@aW3I3(;4>Ww
z9<B>E^E&M`=&--+;l0P}cx%w9^)RpFu0f~P!@N!l4LY@c=5?BB(5dw^uVbS@r`FHB
zPGb!^wSMMx8fws~^)s(yph2hB&y5v+(qTF(w__f3_{+H%#*bgltNDaI?bYDiQju+)
zFWdv|hICDd9UBoJA7R(0B0V``7y|u|SK~yvZx<U1w<+vz#ptTH9>&ZI%v;Q>3gNA{
zr)1-BFdoE$IAulx(nK%;u)&fHCV~{e3Qk6v3erG2U@vUgA8};@mj6*n7LKPYWlTOx
zxsP4px7${WyUpdkixmrhKr|Cd{xt1fhORUAy4cdHcj>w;Sa!$J^!GBZJFR-3&c)M|
zDj7G4zNtzKIpm@E%OjxzsMh>$lfmQ{atGbML(b#x$4--Dq!+fKkend5NN;kOlwmE<
zlZ4SNf3-DIt%_FsHA~Bgqv;>gIUV}ugG`4_SxK01yU}AGLz}aSkM#@p4T{N*O>~&Q
z6cZeivx)7KT=MB6m(OvW_d1TlBmMeIIj+B>Z%AN>UqFbrYoJd^psSZ>fRAf{pQMv(
fh+klkXRsvLJJ8cRKb_-d=k?}1c6*4p#oYe^*z>}t

delta 12944
zcmb`O2S60Z_s3`9=v{hIL=F^`NH1ceir5VjJJ=Bjf`|?E><Vh4j(|o*#2O8@)A$oq
zup6VH*bo~*Ni@L(B_d+s|DD@A%5nHh^7}7-c6Q#pnR)Z(?e6T}x_Fyl@mj%pXPaaq
z-Si1rghLK|Y-ng;()nQV(P3h4ctnAQfRMU&`Akd*bg`)uqH7Gu#OR69#2A0AHVuIZ
zaS0)0qKL;wlUKQ=L^lXbXsnW}DA<e_u{6t$KmJr|)T|TODKYf8v|jVn8+uicFF+b)
zPe>S2S-EHuAtp+MoVF(-l8J-S4usr+g0mxb3ew4433;GQNZ;;+bc2gxoe9|ty^j+K
zL3KjVpk(_SsSt{3QwTYRiv6Or2=T;$5EYH#6GKhe*aa@kMIzQS+hnQ0h0n`UR<Zde
zt1e4rBa-Q`ygNqVgL)<q&hq3-<WtuEP$lBlI481(<Qrx#Xui$zq!ZLVon-d4E^g|t
z9(GiW!8FhfhYV@Fy0_?R1YauaOg6!hdcxNSzAa+GDcNN5FgHG*IgSwN)JX)t!6+6e
zLoiBA6=4(3wyV%%6Sgo~k|nIZKU!sZ1c)-Z8UgErLzx|ipd!=bwVMKTb|gH9c4VWJ
zr7|zd@{&ok@6?p#8<OQ^lP8>nxwcnHcPHeL#1~lt{T?zU`BXL*d3jTwTB&8a%1mz(
zx9q#M93$`Drm5`o?5Iu1RH1mF`gA2VS64S57iSlGTC=md^w@`frDZKGaHR%X9i;`X
z&MgWev^qB`t<&n*czj&TzVZ0yW^#3HTUkSHEgBl7-9=X5-lE{Jwv(*DqeX$HPGb$v
z76p+yuCf|lEeZ;Bx-=T~r%scxCc0f^6?|y5j%?U&bcU|13peK$1($R^r8V4KS`;|w
z^^g^~wkX)3XD=&oV+CD#KfAei>c|<ne&(Vv+{I7Bu;Wm_enG>7f;&cp&6wmaQ)$sq
zcYP~aLmu>3{SeNNIvWT%fAI(ds-))O<m~C>;!XcFd_)%-U*lZFAts$Tjef!YK|=!l
z{rb@))7VC(XQo|I&&bS;qnt%zWX-dhXZN1nE57%vrl6)kd|>Z^^i^{v&xsfj5i-I|
zNqvcO^j$=qsyb(&zQiQTYVen2ggQssDN9bj7BY>-oX|LGHaCh$)afBx3z4;P)Y)-C
zynr}|dXp%1@?{7S#DT;R4S^NkoV*r#TIt9UYl#`7c{3E~sPc9ZefctC&bO=8tboq7
zbW+AJ=zhyDIIC<cB^qyGMFkz!it4MM6g|0e;fi?orlL*t)%B~YWs*5kNi;8kA-rdP
z#PvhoGrX~b`I2V+N`{RA@imKa#geNjBL5#=3ga7A&~e*d;-^csalUL_T22<M{`7nk
z2fDU{85ML~EqYV)=E<!~$1dgU%1Pgqvn%CT3MBKSlGsKGe<5qO=iQQzC5oI|q_gkO
zmnayQbdLEF6+Y$`*jTv!%TTqF@1l8}lD`wEA<B|L$hQM8wmAiz$7&KX4veQ8I$Bdf
zr&!^i<;7=<PaQs$efZSjw6kezSFfEbmBchkaLef+;you;ZOe0>e91pCM|R#QsKfVm
zN~N(kw|{v}82`UJx+iai0xOAdqtMwULYI&PFb`yc^Pm_!1dqV)pbn_%5n>92bb@dr
z)v^1Uer=}%5@>9vKq{~wD8gi1KY#ti`RnKRr|svbB8^F68YNf*Nh4LL(bn|yzT1aI
zx8fLg<V#wQr*qqpL*%ZtwxU+&F5hjATI+5<eOCXw3F^}Pn(fSY+ImDBv84m;$5KI;
zp@A<e3M;M^ToV^uE7)7Ocl(y@DN@OTMoBC$k-69mOK!NZS+n%4gGHF^jOQ=G9dJ6e
zRFYkS+dK^w#67LD|F@Ttp8w8)68|~Up<Un|$DVfeFP_vtxpU!8?)SNSGge<%UH_y$
zxls}$mEb~PF5-u+t<%=9`8fC*D?s`1`yULI27Nni((504TRwCLv<h8C0m=^}jSqpw
zB?qpqq-g;{>}XHNSya$XD5`n>^!eS3ck@o>?c1DkG3Dv=rwbY-u~JEd^nSh&7Xf+S
z@LnZ+NwbKP1ru-1GF(RFYf8K-YQF0E$F~wyzF7s`wjIOGy-J4ABepjETluxgQ*C=V
zg%70W9=4;xZc$w#VHCTht^>6%Yo8WBy?XKL@jdCq=`U+vrbr~SW5y4UK~Ngey`Rkz
z&B4nCh0gh(d{f`%l*swUlwTgQW#`|xT7J?sR&30h!8c$V*ba7rJa7i&g9304$lq?B
zLB?)5uK~O5yayt7@6iJ6{$mM*pbPK>JwON;2!?`DU^JKn>R!}UmX%z~udFK*mmS=>
zN%ohzFm+-4&P|ip{itcvHHqroaT1o?8j|HUF*A<ZCAftJpE%!Hi=$;O_QP4ntW(yZ
ztdrR|UJllSOz;T20eYBFA&3F1Kq|-t{{d&f4N$I6<6Yl!xrhP>Dsod%E}OTVE_7Qe
zGGgXW25}$(BmvgbG9c@1JC0e8J3%&JJ-+~dfLg$;P(v>=OQLbitYM)x7ci?<gA~B5
zYqAXQkxC$V_4L)9OSy*+?md{Di5-%Ix#?e}tVqdTu_!SraV!g7GgIRzk}wl)g6*WY
zBPa8pxWK(TC+f)BxdqC>&!7T41(l!<yaykEjsadd0VgmN3<G1pSTGLE2O_WptOpwb
z1)IQea0=vsYoHK32CtvnO6LFgxA{9VXvWtWYw|_2M6naXSyGlSoqD>%bFt)Mr<2#A
zHb+B?yo`r;V1tkuE;D*OI%38#qh!W3H{uE8e}OvS(~b~d&=d3qRaDo`oWAI(LleE-
zxdOVx+n#>ot)rXQ6qQ(s(Ffk<RLRGJItA)9vR$CN@uPqa@!2afWMlmqu&!zV>&_d^
zv+jBT)?F{q2lNI0AOHk`V9*bQfc{_>NCI=gJTM<5gMDB>I0bS+9ykpu+KJFH4*mkK
zLEVeWhqtetKg<8+e*fK$^d0GImSdm1BRzIv?8sO`42>lVV*Z-rtG*;4)Tl}J#B(%}
z${L>}*s8@Os#yuUmElpA$tUp5ur`RctYM}~jFqD&!xhbCs3)z)Hz%pp_;l3N4U<Ec
zH<b4FwXtLm>qL)#RyL75x})64ILcS~I4yUvrl)*^MV;8BGB5i9=H);j@8#K$%>m5A
z%)88!wcri-(0t<maRy^0?^?7##X@^}U8uvYrv*ZDb|lHI!kKGI9s9IX!zD0g@?ZLN
zNT0*>KfN48dTa`1*3{ux$q?@gfdHrgHJ}dK0YhK}jDacW4?@8JFcTz#RbVwp0jVGt
z<bj*u7PtfI!8`EY5V2&3X|xA^z#jyFKoAXLKmwQv62UBx0XBndunX)4d%$&Y1N;OE
zK@lhhZ$Uk10PI~p2b6#SycShGu6le2NcM%7<#VSbW#2VwG%w$s#k(GNR!Q{Xe!@}~
zNkJj+8=BV5e3WSnGn14dikjk2B#CpTAPqpdV8yz$Wr#PH%j(E?BQrr^;5VL!OpBd!
z!`VsHn?)j<Pcsk%Wb<0vJhrwp&(JnA!Fb);M{N)bv*i}_ZLlRR@J~_Fx1a+8#3BuS
zqAXN05pw;f;*|`UAXFkMEPz<B+y*Q-9)n*&6{rR*SgM+L_q2H?qj_e-f5~9RC0k29
z7@SQ*f((?jE$Nt`-E^M6oi$OH#V89$7J4kqSV*z(nMa2Oo717e7GR%Jwx#%Ouo~wo
z3oK=6aH$|w1!_PYXaG&11+;;VF?9{SrW9`_{urvnd9rx??^XEUrry`_e}6p}Pf*{+
zdGVJeTrqKRYFf}BFeMi;q;&~6(~#Dv<q}OD^u&JQsu!Otui_-@5Y!WY7<5%h%ayp|
z#}OamLY%3=n3<o<e<fFryk4{VXvu{R8y2TX)}q~paV`5nUapRtf_5Y_ofiF3m+<)3
zk`{f%N4D$>dAYtk74)S@=A}SSk<43xo<t^R>5yUaw#!T0==w1&btIA&_PZ(Yxm4Do
zKR3#amv0LaxwcyS-Ho*NyIU*2OC)k_d9?C_8}SfVPPFFK_Olxq2^4Ehey*i4UeJrQ
z!|%0PVvTrTf%s`sR~2rCSU-835*JD17VhI_P?JS@+z?u_XbB`?qMg{+iXyNNUwjIs
z`b#FL&Uo1{Q7MZ4yu_NOFA0M1!IFj8k6tRmzHI3-?8h&=hrRc5CjWkUGOD|-n1Oxv
ziZ39kUoi#y$dzAmeZ@bmoWvpHx_T7Xm#$siAIEoAUxHEFQa)4Gb$%G&uph4zcU!Vw
z9_h|BGf~y3Av5lK8s+Pi&gnR7#-z@(E!2`yOOI}K8f1AfZdHfrDe0v{v-_6xUuaqO
zWHEOkcfu;;(l1v{7_-Erbk95Ydp%;?7acy*Z}`SbBgb#_EKSYnEo}Gp$-9OQ*54ky
z`^OdS_U&vOhLnx}F!M%$@a4R|^vH{c9csJh%nNbcCfNLP`Ek)1hYgQTtb6k~FZJ$-
zz==yE7k0XvaDUCF(7PGwyY()N9RG_$|H!!OL2Hdqr^Y+z*Qr0d96S9~_?U62E`xe*
zDmT0O$l~j7hZGH^e|gTV=%so%W#jyUX%n;h8%|qsPE{>w-TKe(O;Kt;@lNgHAq8Kr
ze0uhk{)OS^0`DK(vg73Ogd~l_qG@Y3k3RDK@k28f-OG*ji$4-OH#I)YIp>XKPS-Ii
z3zZ|IJKX*Kb?%w@eud=7pUd`!r@P(=7UewpVS0Ms+Jwy6C+~dcF?K=9$7|cJ=M3I=
zGj__ck=d$~tt}JlPLxGYO1yW@a{VQ*U#r*sH1%ZOZ{<2yE57)(`a{>8+bh?2WvwoL
z8Y$AvX<zo|v|CzNH;Z3{)>#zXjW%Dfa%ohT>;Yo4nn0)26K0Q}-~mc!^2lPrx6?x}
zm#*saN5x!Wmpj_kJ<jbh_kH@~DVrNw{UeIPPMp#ET-)4b*PGwozB!!PC+Lb^X8S&M
z&+C4^@I<Z8X#bxMe7S9T<%sV2AF2wkSnukSxv1t<v8m|x+)<Ys>MwN8fB$}-hknU4
z`=8cy-|@b->W4Lldw=+l*Uz|m(2{;r>egQl%-;G`{Y8zLkz06zU1!^bv&I+HZ@x;s
zA>8DB?wbKBA2L&|{<`5Xb;}$ppB@)al(*+9cWKUDIJ3}Tu6{~Nw(+((*`?ecGk@wa
zHf;2Sel?C;=6Ux&AN`AH;_%BaCM_6wDQ}J8mHadPHIv-*2K0Lw7ii`3#%!>WZhwEH
zlEn9m*K5A`WB6~SNg4G^2lNhq_E}K-fn5i=?zZjx&D1sDPuE_wCH%Se$Jw#sWVIyk
zgC+CVSmlOX)x7Sw+`8Q_n_u?G>|*uB2CItAX*!FP5AF}WdM>PP%Ge=})w4p(ME%Yz
z4jFagmvpjlz~IN{h8}f%c=pG=N7opob_gpzy~L-x?a4Ynuk#6`SF|q@I!@}dUQIvS
z>_x%|mB*EFE1%7&Rvv7U`%c&HtGpqHRZmWTw%T1wzn7bV@!8XZ|6`cH%)xTf#84fh
zq<!I6+~4M%ztJTu?#G`iG`%)mGmYqTX#Kk{okaJx9!VZidA&Bp|BU*aV?F1bQh#<o
zV*ANz;XT{+`ZZ&2<yE{t<el8`w&HY`9o^3g3lBIOMLk?o8hrow!<Xj|B@Z;W-0xuP
zwR`$$yQ*G()~c_2BvuG7IdofBK5Uw+bA0^Hf~h*~#x4vT;l4Uvb5Qcbn}PmYHt5=g
zo?3n(+x*b(9MQ|7x~|E$Vt)%*onzJR;J6N@KO6Vjw!=fyHTXc0Ra9bd*KZ0&ZOIw?
z!|J7RhcA40XhjdVleq>rjDl8;*?G+KsL!TlKWN>KJaWX|-9vq}&5>7*+unM_cvnRR
zD}6cV_gxR1E^C=S?_~b-;>o>B<`=%(AGdAOm22BNjn=c&t}maPdOK9~VDvXtmhrx8
z=(Q>ft<uUz$%fr44SLqJ8|u5|t8NaRI}a!tc0a}=V{3<331zjH;|H(2;;nLcz{7qM
zP0mlDhnMTT`<&jJ{Pz0RoUtxm8o$NAp75ggz9XNj4Y#>%lD<Jl$1QCI8Q|WzYr{;#
z>+^?chK21C_dj|}^<4Gg{@m<Y;|7Q>PpUY0OgzB0Y<8_j*F6ieSDOW%Gq5<CQhKF)
zQTqc~L;Bi{owGSLE22DZ@R<7pPhIjEko#)g=5zNFu9v7!s|?>4mHC57oaS(wW%IhG
zsO65h7PrYa-_gFZdq~<$vxdU3;&&PkdVeP<Q|>)hM{Dh@y~lff7Itx`<{pFB@02Xm
zKKB)M99_Q1bg#|+@}*_(O`i^JIO#KO`sU*+19q3~vuS5kYiq3GUz^o!%QN2<BYWM?
z>()Qrz|~+xyD#>JR~h&SWB13DA9!@XmyzH8t<f9PxMjZPqCb+;{dNuY@~K>q=s4==
zn=-4qeZJOPuV-x<vuaQPy`QgtG)ix3-hpv5(tk~!F-m06%Oyr^F)y5mOTvq;m3;IF
z^8PhErt6(;mw&u5*1Njm^kwIf?tu;uY-~QL)%I~*Fg1VnGo7TXZ+3p)sc!Dh6u;8G
zVG+mHsg<ad=zf)zaBP|9W_O2}vhR{g!hiJoUF(loT4y`2&9U=clV3Q!D%&UVp3kYd
z8!rFUt*W%_D<^l4x!r3gr=BnJ?sL`b%I3n!mEA`zn5AcRM&+@#{lNZ)1FN@(Mn2oA
zX0O-rty4eotS8-x_z1ntX*S)*=+|js+%ftztp}GQwoVV=)OGRN6EEgMXmm!GDeMQ{
z8=w#rgPY(EU>{Ds1Y7W15Bup(2XCV<f)qT&%wP?m1@@|tz3O6bi6n1q@Z`Z3zHB)P
zRRT5E5z(W)K3d{|i4b#uJ1c1qIsw)TMe9Pe!d}m?Cvf)s!X6{onw_n}WeZ$%EcvF(
z6sZNUq6r@jIa{%4vzXKE1~Z3(F+f*`#(z^vBezC|sbeIXzy)}N9$-9}4q^ZWX&?g>
zfXjf5-f%>kz;MK^hP36<y^T?W@p3~8wig?1i{v;vnza3k7K_n$J1pBf6EBQ90-x#3
zz}HspSTr{-z=<o>%M6&*LV|^Po7$+^cA48J%G_zg4pVwP)3L>p&6QxumSs*m?9i8!
zV>z5<Nk{I`m6Lm+9dr8C4*7Pl+|9DI{DgJ%!;T=i<>`>Dt}R-ZEMn1$N1Nktqxr4s
zV6mEIDQerpZt!?pKEv`9F~fg4h@b38Bo=v$1S#i{$|%P1XeiAF%cbZcQd1eju*;Nk
z2C0l2IIaXAnlT>H$e0f{f#aYMJeKkoQav47|G|a^WhddGj<=5;#KQ*0Tq(@9A}J4$
zPJ~^{fGxUXFx$3EIf;~UUCJAzGPKd9jCnX_h<QxOBOEX)q`W~2`yzLJBN~rBAA#S%
z@8AtkL;ohgl-U6sz-NH{Ch7rvL0{kx`hgHI3NYV}1M09#3$T-SEbzvafPH-F3wnay
zpbzlV#21kMI0ytmAOs|V`5+hMf!E*-P{EZ)4H$z^uo|R*Ti_k=$8{tC%mj&G7uXF7
zK@mU%5%vqC9#A6!!1gqKe{Wi}M?gpKaiyE~=+mq{p%S047@7yz{A6NGkAM(kVj&_M
zR}IF-rkc6)6Jz{aLkz+Yq{9km9M>HPtNy|Glp4oKPw%y-zwH(3utBO|s48s8)N)^r
zWOVB=s%@YEoCD2ABpXTd8Izl}zcr#ZCaLq^oF%$w|6uX0{b7z??ClZ0p<(wFQVH0W
z4raUK9k&`sh6E~+AY)~csHsDOgLKH_zPh+w>Cu>*c68Itk+d2Nyfv17cgtPxnq>yj
zw%$tE&mw7Ine^SQAR2gkvF`hjdP%$dpy{34J}T^X8ZS1wldRO|`9{xGB{5a@?Fa&q
ztifBcLoh~}EJaR0l=V|vNtuLgHp--0AFqFWII31=p??yQ!eHB}aQ8lVtL09olwA}%
z-M@*?xzv9-_Q*zw^QWE4U6t@vTzGkB<<nVH=;Csl_TvXtu#Zsjg$_FAVTQ2dL+awQ
z<)*rw@b;Z$S>G&W*0Gdz$Wq)vX~Q4pRR7QATt}Mrr>&?ELCrk-J5qd+LewxSL<8xJ
z6e2PJDgKc!uwzzFL&`jG0V%?g+(gPwtzVJCTf`SiY+(?A6nB0y2Py9UWEoQS_FxB6
ztO6t#CaeM+$pr}Tx{lmMiX{Pgf|Pw2{3lYj9#BSaY<;08o=|;&GY*51Q<)g_K}D8M
zp&ehjSU11@^0$QMIuQzV5Iil~8KpqSO-|=?1v;*BI)fDGxX9`BQ=sGAsADX#%deG=
zE8h6YZ02=*73konV(GYe9S;RMUUE9!73i=}vw0u#?KmjVVYlAqI<^XQn*7YS(_Vp2
zlb?AVQw2Ire&%%y6zDYhnb*-$pwr}M6N&9AOsB=N#)W=-lY*0QbzN%Xr>Ev`M_XHA
zw2dF8`ga@?niM;ILR{R0j>Bu_Cr%hAPJbIMz&X5o<Hz;d?0+%XL%%bi+dew$GXZlK
zb1QQ{eem(>SSE}?CKh}N;=l|L4-x<?PeeKkB!Ssr4wwt(0apG2u>WSTP?~45B{)u3
z;$n4%j<T10x-MCQWXx0Il2z?cHllq-y%INHmCa3YbjEyTPQ-;|)GKrIx#)}}0dg}l
zUJJPR;4Ws8>hfQ}qZ$b&m&h<uL`uj-GL#I$|6m9rKao%}kOYuGa+?f*MhPUPq#)y<
z3fDuoWm_3FD%=XCQj#%W6}<{FUaN8<6?ScziEH8jT34u@QKZK86tLk?{f|Z}>_F>;
z0e6?%=c&nY8GW_5aAAO-o3n?zi>FgSfV-QMyMLg!ledp+fRn3pu!pO+M}S{YkZVS+
h7PnG`x#{Bx8}2c;A>JyZSd();8L!Q)=P+S?{|_E4cpd-%

diff --git a/src/HTTP_EncDec.cc b/src/HTTP_EncDec.cc
index f385420..7de835b 100644
--- a/src/HTTP_EncDec.cc
+++ b/src/HTTP_EncDec.cc
@@ -9,7 +9,7 @@
 ******************************************************************************/
 //
 //  File:               HTTP_EncDec.cc
-//  Rev:                R1C
+//  Rev:                R1D
 //  Prodnr:             CNL113796
 //  Contact:            http://ttcn.ericsson.se
 //  Reference:          RFC7230 - RFC7235
diff --git a/src/HTTP_MessageLen.ttcn b/src/HTTP_MessageLen.ttcn
index c983c7a..088f357 100644
--- a/src/HTTP_MessageLen.ttcn
+++ b/src/HTTP_MessageLen.ttcn
@@ -6,14 +6,18 @@
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
+*   Eduard Czimbalmos
 *   Eszter Susanszky
 ******************************************************************************/
 //
 //  File:               HTTP_MessageLen.ttcn
-//  Rev:                R1C
+//  Rev:                R1D
 //  Prodnr:             CNL113796
 //  Contact:            http://ttcn.ericsson.se
 
 module HTTP_MessageLen {
   external function ef_HTTPMessage_len(in octetstring pl_stream) return integer
+  external function ef_HTTPMessage_len_forConnectResp(in octetstring pl_stream) return integer
+  external function ef_HTTPMessage_len_forHeadResp(in octetstring pl_stream) return integer
+  external function ef_HTTPMessage_len_forConnClosed(in octetstring pl_stream) return integer
 }
diff --git a/src/HTTP_MessageLen_Function.cc b/src/HTTP_MessageLen_Function.cc
index 0921f06..2e6d252 100644
--- a/src/HTTP_MessageLen_Function.cc
+++ b/src/HTTP_MessageLen_Function.cc
@@ -1,148 +1,204 @@
 /******************************************************************************
-* Copyright (c) 2015  Ericsson AB
+* Copyright (c) 2016  Ericsson AB
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
+*   Eduard Czimbalmos
 *   Eszter Susanszky
 ******************************************************************************/
 //
 //  File:               HTTP_MessageLen_Function.cc
-//  Rev:                R1C
+//  Rev:                R1D
 //  Prodnr:             CNL113796
 //  Contact:            http://ttcn.ericsson.se
 
 #include "HTTP_Types.hh"
 #include "HTTP_MessageLen.hh"
-//#include <stdlib.h>
+#include <string>
+#include <stdio.h>
+#include <strings.h>
+#include <ctype.h>
+
 
 using namespace HTTP__Types;
 
 namespace HTTP__MessageLen {
-  
+
   enum ReqResp {request, response, def};
   enum Transfer_Encoding {chunked, notchunked, none};
+
+  // return the length of the first line in the buffer including the \r\n
+  // So 2 is returned for empty line
+  // -1 if there is no \r\n in the buffer
+  // handles the line folding if needed
+
+  int get_http_line(const char *buff, int length, bool folding=false){
+    int ret_val=0;  // store the length of the line
+    bool end_found=false; // is the line ending found? 
+    while(length>0){
+      ret_val++;
+      length--;
+      if(*buff == '\n'){
+        if( !folding || !((length>0) && (buff[1] == ' ' || buff[1] == '\t')) ){  // not line folding. ie the \n is not followed with space or tab
+          end_found=true;  // this is the end of the line
+          break;
+        }
+      }
+      buff++;
+    }
+    return end_found?ret_val:-1;
+  }
   
-  INTEGER ef__HTTPMessage__len(const OCTETSTRING& pl__stream)
+  INTEGER f_HTTPMessage_len_common(
+      const OCTETSTRING& pl__stream,
+      const boolean connClosed,
+      const boolean head_req,
+      const boolean connect_req)
   {
     int stream_length = pl__stream.lengthof();
-    if(stream_length < 0) return -1;
-
-    int content_length = 0;
-    int end_of_startline = 0;
-    int end_of_headers = 0;
-    int end_of_te = 0;
-    int end_of_msg = 0;
-    int end_of_chunklngth = 0;
-
-    ReqResp reqresp = def;
-    Transfer_Encoding te = none;
+    if(stream_length < 16) return -1;  
+    // The smallest syntatically correct HTTP message is:
+    // A / HTTP/0.0\r\n\r\n
+    // Which is 16 octet
     
-    const unsigned char* streamptr = pl__stream;
-    const unsigned char* ptr = pl__stream;
-    const CHARSTRING crlf = "\r\n";
-    const CHARSTRING crlfcrlf = "\r\n\r\n";
+    const char *stream=(const char *)(const unsigned char *)pl__stream;
+    int line_length=-1;
+    int resp_code=0;
+    bool is_request=false;
+    bool is_chunked=false;
+    int content_length=-1;
     
-    // go to the end of stream, stop if end of startline found
-    while(ptr-streamptr + 2 <= stream_length && end_of_startline == 0)      
-    {
-      if(memcmp(ptr, (const char*)crlf, 2) == 0) end_of_startline = 1;
-      else ptr++;
+    // skeep leading /r/n
+    // there should'n be any but be conservative
+    while((line_length=get_http_line(stream,stream_length))==2){
+      stream+=line_length;
+      stream_length-=line_length;
     }
-    
-    // startline hasn't arrived
-    if(end_of_startline == 0) return -1;
-    else ptr += 2;
-    
-    //check if request or response
-    if(memcmp(streamptr, "HTTP/", 5) == 0 ) reqresp = response; else reqresp = request;
-    
-    // \r\n\r\n -> empty header list, return -1
-    if(memcmp(ptr, (const char*)crlf, 2) == 0 ) return -1;
-    
-    while(ptr-streamptr + 4 <= stream_length && end_of_headers == 0)
+    if(line_length==-1){ // there is no whole line in the buffer
+      return -1;
+    }
+    // parse the header line
     {
-      if(memcmp(ptr, (const char*)crlfcrlf, 4) == 0 ) {end_of_headers = 1;}
-      else
-      {
-        if(ptr-streamptr + 15 <= stream_length && strncasecmp((const char*)ptr, "Content-Length:", 15) == 0)
-        {
-          ptr+= 15;
-          content_length = (int)strtol((const char*)ptr, NULL, 10); 
-        } else if(ptr-streamptr + 18 <= stream_length && strncasecmp((const char*)ptr, "Transfer-Encoding:", 18) == 0)
-        {
-          te = notchunked;
-          ptr += 18;
-          
-          while(end_of_te == 0)
-          {
-            if(ptr-streamptr + 2 <= stream_length && memcmp(ptr, (const char*)crlf, 2) == 0 ) {end_of_te = 1; ptr += 2;}
-            else if(ptr-streamptr + 9 <= stream_length && !strncasecmp((const char*)ptr, "chunked\r\n", 9)) {te = chunked; end_of_te = 1; ptr += 9;}   //chunked/r/n (last encoding is chunked)
-            else { ptr++; }
-          }
-        
-          if(end_of_te == 0) return -1;
-        } else ptr++;
+      std::string str(stream,line_length);
+      if(sscanf(str.c_str(),"HTTP/%*d.%*d %d ",&resp_code)==1){
+        // response received
+        is_request=false;
+      } else {
+        // it should be a request
+        is_request=true;
       }
     }
+    stream+=line_length;
+    stream_length-=line_length;
+
+    // search for the end of the headers
+    while((line_length=get_http_line(stream,stream_length,true))!=2){
+      if(line_length==-1){ // there is no whole line in the buffer
+        return -1;
+      }
+      // check for specific headers
+      // Content-Length
+      if((line_length>17) && (strncasecmp(stream, "Content-Length:", 15) == 0) ){ // the minimum length of the Content-Length is 18: 15 (Content-Length:) + at least 1 digit + crlf
+        content_length = (int)strtol(stream+15, NULL, 10);
+      }
+      if((line_length>26) && (strncasecmp(stream, "Transfer-Encoding:", 18) == 0) ){ // the minimum length 27: 18 (Transfer-Encoding:) + 7 (chunked) + crlf
+        std::string str(stream+18,line_length-18); // just the data part
+        if(str.find("chunked")!=std::string::npos){
+          is_chunked=true;
+        }
+      }
+      stream+=line_length;
+      stream_length-=line_length;
+    }
     
-    if(end_of_headers == 0) return -1;
-    else ptr += 4;
-    
-    if( te == none) {
-    
-      if(content_length > 0) return ptr-streamptr + content_length;
-      else if( reqresp == request ) return ptr-streamptr;
-      else if( reqresp == response ) return -1;
-      
-    } else if(te == notchunked) {
+    // skip the empty line
+    stream+=line_length;
+    stream_length-=line_length;
     
-      if( reqresp == request ) return ptr-streamptr;
-      else return -1;
-      
-    } else if(te == chunked) {
-      
-      const unsigned char* chunksize_ptr = ptr;
-      while(ptr-streamptr + 2 <= stream_length && end_of_chunklngth == 0)
-      {
-        if(memcmp(ptr, (const char*)crlf, 2) == 0) end_of_chunklngth = 1;
-        else ptr++;
+    // See RFC7230 3.3.3
+    if( !is_request && ( head_req || (resp_code==204) || (resp_code==304)  || (resp_code>=100  && resp_code<=199))){ // See RFC7230 3.3.3 1.
+      // no body
+      const char *stream_begin=(const char *)(const unsigned char *)pl__stream;
+      return stream-stream_begin;
+    } else if(!is_request && connect_req && (resp_code>=200  && resp_code<=299)){ // See RFC7230 3.3.3 2.
+      // no body
+      const char *stream_begin=(const char *)(const unsigned char *)pl__stream;
+      return stream-stream_begin;
+    } else if(is_chunked){ // See RFC7230 3.3.3 3.
+      int chunk_length=-1;
+      if((line_length=get_http_line(stream,stream_length))==-1){
+        return -1;
       }
-      if(end_of_chunklngth == 0) return 0;
-      
-      int chunk_length = (int)strtol((const char*)chunksize_ptr, NULL, 16);
-      
-      while(chunk_length != 0 && ptr-streamptr <= stream_length)
-      {
-        end_of_chunklngth = 0;
-        
-        // chunksize + \r\n + next char
-        ptr += chunk_length + 2 + 1;
-        
-        chunksize_ptr = ptr;
-        while(ptr-streamptr + 2 <= stream_length && end_of_chunklngth == 0)
-        {
-          if(memcmp(ptr, (const char*)crlf, 2) == 0) end_of_chunklngth = 1;
-          else ptr++;
+      chunk_length=(int)strtol(stream, NULL, 16);
+      stream+=line_length;
+      stream_length-=line_length;
+      while(chunk_length>0){
+        if(chunk_length<=stream_length){ // skip the chunk data
+          stream+=chunk_length;
+          stream_length-=chunk_length;
+        }
+        // read the CRLF
+        if((line_length=get_http_line(stream,stream_length))!=2){
+          return -1;
+        }
+        stream+=line_length;
+        stream_length-=line_length;
+        // read the next chunk size
+        if((line_length=get_http_line(stream,stream_length))==-1){
+          return -1;
         }
-        if(end_of_chunklngth == 0) return -1;
-        else chunk_length = (int)strtol((const char*)chunksize_ptr, NULL, 16);
+        chunk_length=(int)strtol(stream, NULL, 16);
+        stream+=line_length;
+        stream_length-=line_length;
       }
-      if(chunk_length > 0) return -1;
-      
-      //find \r\n\r\n
-      while(ptr-streamptr + 4 <= stream_length && end_of_msg == 0)
-      {
-        if( memcmp(ptr, (const char*)crlfcrlf, 4) == 0) end_of_msg = 1;
-        else ptr++;
+      // skip trailers
+      while((line_length=get_http_line(stream,stream_length))!=2){
+        if(line_length==-1){ // there is no whole line in the buffer
+          return -1;
+        }
+        stream+=line_length;
+        stream_length-=line_length;
       }
-      if(end_of_msg == 0) return -1;
-      
-      return ptr+4-streamptr;
+      // skip the final CRLF
+      stream+=line_length;
+      stream_length-=line_length;
+      const char *stream_begin=(const char *)(const unsigned char *)pl__stream;
+      return stream-stream_begin;
+    } else if(content_length>=0){ // See RFC7230 3.3.3 5.
+      const char *stream_begin=(const char *)(const unsigned char *)pl__stream;
+      return stream-stream_begin+content_length;
+    } else if(is_request){ // See RFC7230 3.3.3 6.
+      const char *stream_begin=(const char *)(const unsigned char *)pl__stream;
+      return stream-stream_begin;
+    } else if(connClosed){ // See RFC7230 3.3.3 7.
+      return pl__stream.lengthof();
     }
     
     return -1;
+
+  }
+
+  INTEGER ef__HTTPMessage__len(const OCTETSTRING& pl__stream)
+  {
+    return(f_HTTPMessage_len_common(pl__stream, false,false,false));
+  }
+
+  INTEGER ef__HTTPMessage__len__forConnectResp(const OCTETSTRING& pl__stream)
+  {
+    return(f_HTTPMessage_len_common(pl__stream, false,false,true));
   }
+
+  INTEGER ef__HTTPMessage__len__forHeadResp(const OCTETSTRING& pl__stream)
+  {
+    return(f_HTTPMessage_len_common(pl__stream, false,true,false));
+  }
+
+  INTEGER ef__HTTPMessage__len__forConnClosed(const OCTETSTRING& pl__stream)
+  {
+    return(f_HTTPMessage_len_common(pl__stream, true,false,false));
+  }
+
 }
diff --git a/src/HTTP_Types.ttcn b/src/HTTP_Types.ttcn
index 793f5f3..803999a 100644
--- a/src/HTTP_Types.ttcn
+++ b/src/HTTP_Types.ttcn
@@ -9,7 +9,7 @@
 ******************************************************************************/
 //
 //  File:               HTTP_Types.ttcn
-//  Rev:                R1C
+//  Rev:                R1D
 //  Prodnr:             CNL113796
 //  Contact:            http://ttcn.ericsson.se
 //  Reference:          RFC7230 - RFC7235
@@ -165,4 +165,4 @@ module HTTP_Types
     charstring            raw_message
   }
   
-}with {extension "version R1C"}
+}with {extension "version R1D"}
diff --git a/src/HTTP_parse.h b/src/HTTP_parse.h
index 8ecc1ac..913e4b8 100644
--- a/src/HTTP_parse.h
+++ b/src/HTTP_parse.h
@@ -9,7 +9,7 @@
 ******************************************************************************/
 //
 //  File:               HTTP.y
-//  Rev:                R1C
+//  Rev:                R1D
 //  Prodnr:             CNL113
 //  Updated:            2014-10-10
 //  Contact:            http://ttcn.ericsson.se
diff --git a/src/HTTP_parse.l b/src/HTTP_parse.l
index a025018..dbf76a5 100644
--- a/src/HTTP_parse.l
+++ b/src/HTTP_parse.l
@@ -12,7 +12,7 @@
 ******************************************************************************/
 //
 //  File:               HTTP.l
-//  Rev:                R1C
+//  Rev:                R1D
 //  Prodnr:             CNL113796
 //  Contact:            http://ttcn.ericsson.se
 //  Reference:          RFC7230 - RFC7235
diff --git a/src/HTTP_parse.y b/src/HTTP_parse.y
index f2b8982..02603bc 100644
--- a/src/HTTP_parse.y
+++ b/src/HTTP_parse.y
@@ -11,7 +11,7 @@
 ******************************************************************************/
 //
 //  File:               HTTP_parse.y
-//  Rev:                R1C
+//  Rev:                R1D
 //  Prodnr:             CNL113796
 //  Contact:            http://ttcn.ericsson.se
 //  Reference:          RFC7230 - RFC7235
diff --git a/src/HTTP_parse_.tab.c b/src/HTTP_parse_.tab.c
index ad48af8..859eacc 100644
--- a/src/HTTP_parse_.tab.c
+++ b/src/HTTP_parse_.tab.c
@@ -88,7 +88,7 @@
 ******************************************************************************/
 //
 //  File:               HTTP_parse.y
-//  Rev:                R1C
+//  Rev:                R1D
 //  Prodnr:             CNL113796
 //  Contact:            http://ttcn.ericsson.se
 //  Reference:          RFC7230 - RFC7235
diff --git a/src/lex.HTTP_parse_.c b/src/lex.HTTP_parse_.c
index 4766465..74cbd06 100644
--- a/src/lex.HTTP_parse_.c
+++ b/src/lex.HTTP_parse_.c
@@ -2984,7 +2984,7 @@ char *HTTP_parse_text;
 ******************************************************************************/
 //
 //  File:               HTTP.l
-//  Rev:                R1C
+//  Rev:                R1D
 //  Prodnr:             CNL113796
 //  Contact:            http://ttcn.ericsson.se
 //  Reference:          RFC7230 - RFC7235
-- 
GitLab