From 20c6ffe01befe17412c6d0f38f0849ef7ef04484 Mon Sep 17 00:00:00 2001 From: Kevin Jerebica Date: Sun, 8 Sep 2024 22:20:06 +0200 Subject: [PATCH] proxy: remove junk regex code --- proxlib | Bin 138880 -> 132376 bytes proxlib.c | 159 +++++++++++------------------------------------------- proxlib.h | 31 ----------- 3 files changed, 31 insertions(+), 159 deletions(-) diff --git a/proxlib b/proxlib index 201f776bf785918b30ec0269d6671fd5f1549bfb..d91e37dec7571540130a323bcd50680388a1571d 100755 GIT binary patch delta 37103 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 delta 41584 zcmcG12Uu0dw*Q`8&N=knQ4UQ|lw$9qh=L-bVlRk-iUknCu1Cd&#DZIcg;-*Yy+kzF zVoB^#qtQg8CZaJ4YK$=^F^M<)e{0S@h zrSFyMVbnjxC9Y0ezdx?jHLd<(ZSR{Kvv1aWzuPB^)DkJwi)Ksx$wXdYjxi()R=<_P z)JUBtGpYWv2U9u5s6Av4b(QQ{Z2XbQ>R8#8jo=kd9Ai07<#<75I!|7@%dscNs~lf* z+(}qm{v3*uq39VGO2tt>F%R{e?8ypApk7ftSyx_lljB2Wh>8e4pxWQyr{)@*O(K_*y$m&WSVApMg%w5bVlfrLLzB5?WFWw0Awc8z^Lk0B zukm@_8CC*xHv>R`EQW_pA1*g?Idi_m;()+j;&&eom90 z$THVcC~BL63(nP$^Bo8&U#TlKDl}VohnqFzzFcC4@)~l#8gffmD3DR?TQ1A;lRVfW zB${m=U(lnhd5u>aG*6IRvBRYUGrL!Mnj z?o>lQxrW@OhTJr(MulsQiiI`gZZ+h~YRKJd$XC^nd(@C`s3G^PA>V42oA}y$)u`B8 zql0%1`N0};pBnNLHRQEw$j{Y~*RCPIQbTSOBHq;8tWn|rMl6)qkO!3d+ZKw;9c@i1 zf)F?FM6OtMB`*Jz;WOU8s>ub2tAZ~A9sHtEB7PLrRhC!b3jUOMiuB4WoIgxFMR?^2 z&hI0h_H5-|&Tl84_G;w@&c9DQMZT$W85gV}0fl_!EY2?{o^P`EU2(C18ei-qHT$51g$OQvPKoMIhaK0z;6seWZ z|ArvA3-OM`mvg=Y@f4YrS2*92cuG2zCph1bc#6=0r~;4@0@5Ouus=i-LfYFigSv2%Sj#bposPIYkY#ipvmT@%6<^Yfqe#x&ycpE?#QDqz{72Wu=B|!J;tJzD3zbkBl6Tz>#yDiz~j zRaKci#;XUD^VEUv{Y|T1lZFTRGad+28els6`;qRGhihY^$M|d)D+@zNcDCXbl|kaTf{PWCvEWQ)q|JAtU~2nU-RIB7`Pl|GP-8JFs)xl^XL^c;JM#uEvdgy*$o(1 zsP6OdHqHL)Z6B0q>T1<6<3Sy>56XYH_<$bq3uA90Vp|p}!8NRDqjmSI(fz#EeIvTV z0@MhV9|H=NCw)wBd$Fny_o5%~@y3fcVY}wV$hW+B0V%bn6Yo<0e>h`|Hhf^U^$Ymm zS!kPY!V;1f7yLIJleCUc%%gKJX8l@Kl|Q3gaG19ZS*%bABPFjyQzPhz(R6r1y=4XK zYC5)9W{`gZd;4s~YP}#FL^~5Dfw!V{2u3hR>sh4^G}3}C<1x!Oyq0E;y~54oIMr3W zhYoR+RPtxM67oV}$nD-{FEp%S$ZduL+e8Z4m8x>mK$<)7-SqrPWJL=eQ_r8& zsR-0$z7^h@%(>!Mo*|w;F<>fHCM1Yu`7@piQydDFHZ<-zV}a5bg+e8qn_)z@*H_F! zrzedH6>lzcfhYEbiViY%qCojO8Qo)Fve`3UR^i_7u%r=`TdX_ui^Z*&M}5s1 zr+%@+@YT+ZR-?WBOikg>g4k1qv8M`R&*jfJXU+}TP)?DBomIWKb2T;lUt0D>AmxVG zQ|%AZvj&{>q8IhLdYCdO4+;3G6D+Bz*yx zLyv~C5ocqsh{AD*g^Dg*`Ss%u5MLE`R9O)FCGztXSjBsqbLVIOut9~LhpA88Vw0W7 z$9}W>I-{{U^>yOg{?sv74278t`G=OoH(Km&2GPvlC=sibFq%lA!fG@=SEDiJFI0T> zf>Ol^nkv7sEbdm037BoK%SXLf7<;j%7q9iC@lGC&LKn;CTgug*t?;NGdp;>|Uc+qK zF00VBu=hn|?|0F`RMYB2*ukg%B#9y+FNj7}Leb%@G7(4{khZZ<5sygcr6+ZuvJO{? ztZ(;Djj2()*FR(b1@ORpd*Am$1?_tizp+RDV@5>DeGWS_N3q0*z0J3&3ESz(Zh)VJo)TJON{D;Nfdlq z7<-*vDTuwEKjV60-dE5)2f7P;U&k_i%{5ZEn#}9j4?TG4pZR&uPt}Pe|EaNH#?!ch zyz=}RPsLnUbI%3HbiBl~X~jH=Zc#7uXS_5oPJ}iePZ($k)EsR-6ELXB?45aJe<566 z$R7sHkBp1mhVhpCk#P$Q(G=(DD?%~qlU_XAEq0?5Gws20_FJvq{})=(5^e8p_Nq$_ zD_nUm$FmjB(5GUKq=k0r=33q?ZUh{PXGTMx*n*Ss1+U=Rr~afud#LnyhE$t>3J+?E zFSW!@q_-i<1b;TSt(f&p{ll-bZ&^3;`^)%(=g_mRrk=$=s)LN)>Ri7Dak*$@8L>Sd zu}jUC!9P}ySdUu%W5g;Wx2|Hzk9@?_2{lICX|6Lb*V?BTv7XggG=T9Z64a$eufX@r z+`B~ZkfS}wrp6W8wKCVtO;A5K23sj+E-^vEFP4_hWt+ zdXAO!q}p|lmj|>L2R>Gh`ZshA`A4M(ue@G~N^f;=KnuIAco@}|GU$oADPWHnQ>i8g zwh&Lmt4jkHi90J)pP-fE50BJ+K`q1qaq5pjW5w2w)PcdB#lT1E2f=yb&WEZ`on_+V zAJkoSI*V6-P=Bj4N^JInIy7Xjc;JER92zIuJWvOPMvCXZSC@pw)$ZPr#yol0t;P!W zMZA*r>I3yz=vrPX)t|v4GTNC_I<^ts)6Q17(Fm4DD~Gvj zXb65Eut7#E^-}jVa5EL%zd31`e+ zp!aFoEc_6qw5VON?Y_w7Ox@71kx5v4tEy@k{!PF?D$md;mFeGtfAAK$g%+Vctj&LO zg;`HG8jW$u$w?7W;gQCqp56QPhhVz3xpj2pSrx}Omq^IVRJ~}l| z&$Sk!8a4}$#Q&m%c*{|@F+C?IE5~v=Y3XP_C8w?!At!xYR&KgBkhx{&*kt3V+}!Mz z5fLkYW-d-yIU^&gU1Mi$XT9;Yg{k*Em2s#Ng8gvfmP|)R|vq0Yi-2hs25&c0+K+8ct_yYZLS2zG_lb-f7%GCte+1`0qAfkuOV2RamV1Ojaq z=#QWqK-bos;dg9HqY^C$eUV~1LQwX7RTUlQML(#jS_rxgbSr4+ z4^>qcLD|Eqs;8iLKy7u{c#o>8>g&{7E$h_sJY7|VcQkxjrKiUgAqf8(?+{M0d{Y2C+tXVJSSNCs?`tMM`;H~;O zT0Pc(5E{f{FYkVs)OHl8Lz5n#B`bX9EM^XO(Ilu-Jd9wsM zzC^|bkljIpFOUp|)>IIiFG+p44#7x{+IiJ&R zGdy<`UUX*ij#R6XT&@3b zHtRZVPgZ%?=PD23MS_wV9{K$_5vJHtwKeT=QTSJYAgHt3Sz7lFw6ty(VQw8LQ)|-! zs8IyQH3bzN5Cl4g6v#zyMm2Y^pkg-!1AOg)$0@$JVfxvB~=lNecYPtxnsnuyTGf4eHz%=8Gqcn2?nC6`ElzuM+(}FWb>BD$1Ejbe^ zy$S%+iZhW?t4&~9bEdiU)j}|BI1?=?1HnXdCQcemgSO|4DM@NN30w!x^^@A%1=G=e z4lErirM3Xm$#nskQPSr?IgZ<%EjcX$6VI7ksq8A4E;cJMhsn|>XTWrGCjZWovf)ZO z(IFMg94XTlOn1XO(33CuA$iL^97^yl0%4(agf#TG+lY3{B&T9913f-O%_`|GTqh6m z+6!ib)ao*r!Q7s$(!En)hFH;p@0G?+1(V`-0L>0cZOBpnV#uu9aJ!tA}>mZLBO4P=tL(DIdlbEN=-Fb`#KdopSxmF|#5J5Z9zFTC{y z6nJYFLB>o3ClV+UB0!hua)@-$%KPOYcHS+g(hIzZ7E{T_WKecp12yQIkmGET_Co9S zLr=XkbNiaQQfL@cFCibJVCR{E7Oeds0Q8QRoMR50QY>>q*EO$4x%#Wc@-M)YH$Ddg+@%V@Sw({Wp8 zuaP;NSO$i0XLE)kpRpat9R4i#lpxe)vpyAsa8_#up5a*6P>kP@eT1nrVy)`quFGug z1z`xg{hc5TV;d(4!bmm}IF>CxAqW##Da@M7qPAemur;S~$i$i;`7LF=G0!T)J8-#< z8RoV^@GwDnhVg7>IMe#rUB{w3+Wa0;f~iPJVW{{+TW8a5^tJiZfhH+R-@_L+f4NRV zA6cr81+)3vh58r-mtL6vP89j->xFu)XW=^^woODsAfB%6eLfI`W}-Q%*?$8q&CQH# z?}1n77G}m^-wWHcrJ1p{KMs3anM6A~#FV4`aibu#7F|Q3&C~u4yxm6RDamM`jES@r zT^ph%RPZ7jWQs>8YAO?Jw5e;}9rnIo8L&WukaZZ_n@Owmc{|LQZJtPL)uajSj$xRH zj&(UgUb1P6_%pC2h%qbna}Pua>kx!lv#Rd2l*`~sJ2nCSvS&yff&=S+p91>TF~GK!(D-SVpY9a!>l#9+9y^cPFgC$Mz}KtBz9R??SY#f>++c)F1e*`jBiXX{f)K_2z(zy- zC6-eB)rZR)vujxSCaeJO4o%qr?3iY3^*JmiTlWK2kxhh(maGyPtrd$Hj`d>CzQ;nb z`S4I%_AFEo+OdgUXq)eZpW3rWX9S@G`w{US!~TX59a+TtSSfY^E8mIvcg8cDi5~lZ^w6p*rAz%(4Y0p5QG8jIy^d%y&6Uv z&h)g7APi<6p0w|zu7Z%lx?zQevZugQ=7y%j*eQhVaOQYa5YkxuPC-a#C$X+0SW~!n zBx|)9w@3Ezd_l-yf$-&MHt1797{h*Xp`CjH`*)mR_jDWu`C`Lste``Bj$psU<}@No zFgc7(&lK#JT1^9E5bS2c{!shnhA1n*VtecE&56$$s4u8fqCHyX@C{ka>di zaXOd{&QuX9xX_5}P~Iqm{u zTZT01*pTt&+p2Xo(4qBiu!2nK+lgvy7ac&;P;=8Ss+*bzwZ}Ga%;s8ts;)xGB#5Ly zkm(V`_TgP5-xbV>Zdx|B7=j9d?I02_XHIm(4j?fV1lw)jK&P8|yly1s(|rSc;#|A! zI%H<&O`<)PNXVe3ZBZb={3Fwh@ZbU6G_C?5$h7EIamZNqySQUFP!;W0^AN-eGVKei zLfSWbc%##AHzHP$X+v3^Oo5>@`Q#r{BW@yhgPn;cZzX<;1|xU_YuqdTF%iMG#VkyB zg~%I3QUktP9GVc@4j{;MCw8K0neLTNbl0(}i%Gb&;qy+TmI-KRR!<%fY)ykl<93*C zcH(SmQBHwC53o^!)r=p|yMzy0LUknOAXu&NLsb}8e6(6I_c&MFP^klt?-A|3uv7}R z4L^Wrhj|g6Xkx6t*^uOSp>GJYCok*m-ySQJGD#5+>-tp1{l{nWCair6$_3#nqpE90 z0InxyBCwMA=oK*kFqVpUEgBTCvH~|_Z#vQxi;_HY(sP9`na*69X5F?B$0LkC#fwFw z1Ya2@e#livVAgc;qa#pO@&KxN|1FFs4zVcC`Y$Bftrj-Hx*V&!jkyg_V0uxKbr9Gy zmReIs!M7!{Tnbme6n8&bLe zG=p$Q<`*kzd?*@KeoWWI$1LKfbSSct=N4Oyme~!prfloaoT&<~^jxlWsy5A(iJe*3 zJQuMj4Y4~2xw1*_XHe+FbU|8sC-Ybs#Qj(XWR*Oa? zXX$BeuWL(_to!?rAbiE|6k<_7-LK`C?AIDQR9Ci35N=pjQFnd--r6-TLAL}k_(J27 zgj&H!!>6ZVP$$g@BsG4)!p;R)Z*E~NJcZHq(oA3>zSJ*pleTkR@c#!U-Pb(@VYeGS z%1T%cR8J80xYHh%inihbag{$#=4mWvP2HQZ0%P#N@eb9AS{*#VFILjkGSp(t?6E?v zsVfCx1~sRT;OH{F(be=(K72Sy_pw%mXGDInk`>UT8_@x;_tl!*uk^)}j-GaFE3G}L zrHhp~Voht)9e=b3HNckOQyyb+v}bp%ODg4Gy7U>sSj*n@?5EYnn(GApsI(kmoG0DH zX*=R^xFfc58jTmEHPt4Mu?J#oM_T1Hck|f&9KDOd8M%{+lDQ@6)$=g9|ADq$`D(ej znFr)Y`zW%Kt2B`jX+l>QbMHZp6e0<(B*#|f<0J$ljnEt&DPX#3bN2rBb_+KizGEFyXHb&E` zPfXL@^uf!B*7@c%-MJ*Zm1wp5r*RkhYwW3MdVC}&1ZeERX+pCLu(vs7^(uyU0qjFM z-`fF4`0?|->$rJu$3K2-Nb5fZrqOj25r3iyo|kGI@L8D;_^iwad`5$n`E1WhQt9_^}V+-JIj~~?qtfcWR=W`+Oy{H|} z;jRegC>)N{xn(FDMD28r7)Mb%og>Cm)K2G!F^byh95JDyb~;B)q^O1tn>D*j2TPA9!b7`nqC2FU0nP4`E z+UXqGvsJ8lIwxwUa}!W=P}EN6$hZ^Y<3NN6j^`$$>XhK19nWnw+at!W`9I!)8PyBHEjI!@CSQxR)V$7zTfI!+6s$A7&{c|`B4>#JZ( z|8LF)u;~B(Xu#C!|NLy=KOPMraR0B*2L9vGfa(AKY~Vj04VeD#&j$YE(Llog&$9vb z-H}1|{MBE-{3C>^IO>RcZe$(t;wJU^NRP(!7O!7pMO(&Eq_=qeT4#!8PoWmQ#jmqQ z;uPr(UccUB2IPYHak|=Sly5Y>s&8snUHgFtDW_UA-Rw-=LIt}sPY~z^{RnFIn3wrT zg4q12T0E+b>Bpz2x92j0SVD}0^I9}^6yyycGIex3cORQePg%;5HXSoiQKz7_wJWu< zl7>?9CE+~?Z8YI1P3ZYMgjU7Op&?qlMtfx;cC+Ag;*M@IObX{Z1j=}HN$;Znc4kil(ZgSDda#kYLAZlCkWxHn zNPj}fPG)Crv)?2gMD;FnwOTpa*7i1d6Ss9zeU*)I6JeX@7_)7&|6yDH+qTWEVVj3G z(YI_{RKqq~i*1E(+xE^sY+G!uHsOg0J>(w{gI;SfhX`)t*m@A+vY`dX#Y$#a!=Fd5 zQUf=$Be$Bo>6k2n`I{&GfytS|J%Y8Mwo=h5lRZ7=M_R0hWy< z+n-=SBMTcR9Ru6c!Y0|L<0O+WBHj{wI>Db^ScfpPeNr2+$(Guo{D^I^WuW~gA173g zWEEO#L8dL|LdOKP%gOjzp=LGwlW{)X?lyQ2KYCTYH`bReQ~w_8Ya-k4^B@t6I_kU; zLf>n~#OcWH2O5{8n}oq0Sq$|hL;q-l?MIii1e{cDC#Ga;VMcKyJ=o7$Q+)bGM$&=D z4%paS@Ch;N;2-a!h(~%`ZX_DGo0kNyp|m7B0?aG2-(-uNb9G!@Zv1Y|_ylhJ-fDBn z_>U~+>h6NuuW>_t2g2MlceH`^>3B<{f#`u>rd;Q;8Ld~-VB@gG>Dp~3Fm5^-XTa0& zYS-!RC}YuVX(O)ory7Kv?wq z;H8a&#o!m-QI_(JDHaVf1Zb6QES2fPG7oZ+`3=SOCe%(F60Ek&3Unm3(>-aKN$v7r zbzGK@xHec_lvO*JPVv}8U5j9|9*tm5E_ALph~_&#NWGL5q`wG_omT{^ud)I~=ODFK zwvXr&q_)g9>eGyf?DqrI)a<|nW1v}4wwch2RU6IdG(%mja!2;?P~X47`85wP_cz@3S6h#-cAAd*rXM#pf3-Fa*C{G(~$W$?`YalA$$t+5BM6=q6%gZeaOiZDA0!(5pll^g43A zuQk1IzEfZ}Ap{HE&O`&5UmuwH^})%&%&!kj>MrUHm(kL|Z>m;9P!tTfr&|V8etXWJ`D4bR-&H;76MB zCNUc2(IlliCkMff4*l9t#X_o}f<$`FwH|bflyQq(YpE1GFJW)7DGD_@*HE23A$st= zp9Ep5lMYR=ndD}U3}?k;03z6W4Q9HeS0iw^tU3ae3}J>n^%jegt-6ECAH5cYnQrF( z^vbRqinr>qe1t&_)!MmHKGb5IHo_=DNB87JUOziZ9i1C!x~DK9k$?J&8>fB#AE=Hb z3+T2gUxh<@XaEgl5e7JF_FEw?1cmMwgXl#Q zHq#4`ZXUWdR>&t!!G@#Je=NQTt8|SMN-5 zwhD#V7x~RfojKLLwsm7_<joyZLa>Ph=39|iz&QMJ1^?x z9?sP7r~9OMpw94?nVvSxi8+OOOTYKRMf}5*wYy1r~f^Rr$=Vh6tzY^jV z??PRpJ*Rt7b**qg{b-VV=2Ud94ZHa`)pq-ttsZ+cS&1m6q&o9lNvPTvV>eR+FJDNVn;CJv3cLRJ@P9I)ln=n7o z!E)z-ydGq1wuFjCC`suepgl@*Ji&ToX0azq;y?n*P)Zh6Od@t3K(`ctPj8V_R|5~!P?Sl*iy+llYmM#CMprwET$5HO))^C)evbl>Tg1s<;{YQ^&>=6~CQ|%{s+kh)^6yPEy?C@wFVqy^CVx=t`XrD^^5CD2C-| zql8aXYrjeQ%COz5a@0l+p}_h|=J%l|Ztni=s$% z&MEAO;t;7Q7*Vo*fHBo8a~7L0m63{Tkz%)Aab2%iO;T*6bi)fYG4@lO4Fl#VRzD~{ zlg%?Tj8No}iq$B^nk*DIDjtRbBNaCqVx3}>pvYo?OLeu)MnyKvt!AOwd7|P#Z4K)b z?yn7sGOB}OYj{ac34k*U4;8DCisO0(eGU1%%w4gOR?`3pylOMiQc@<0fv)hLx+6b^ zeXjnL?`it)_B3r+;Spj-;X9P?)qRlt=Uu9+-lcllrTYKTF2!rwf8M4#%QpSr?NZ(U zaF<5@`)&GHb^Q~HxA{YjMmBual0r9X*u$>di((x0HG?5C&fr>E>E@x(_UQTCH4 z`$_y$2y&@RAW`S*|=RoOCPw7vh^e0jJllZp`Dg8;5{v=9&BBeix{Hmw?rthpS zD~uAGMU;M4c!T-yKQBt@*1lg#w_cqSViS!~k+|wb;fu+os~67`t*U>ls_7No#d3*sbh!uzHOx?TEuk_G%8%dvQlN{vL2P5nwFlEl9@NIbj!yj%p)Zw zJ~6pz9)`P6!qqn9`-$BJIBI9?UQ5T5{->ZL$A&f4QQB> zmYSPdy5-s=MM+B^mN&Ar)i*|_j=q&qT+)!WEq!&Xh3IT{aEJE2VpEd3_e_R=OC!IX zE-Iri@PyJGcYl?w@JnLmS*YtD^lp%n(xFpAa#T~kD6##LFo~#!&G92-kTz{hR>1!q z<2ys%v~lS#4`xfYaM|$GO#Crb>bUgM*%ckw%8P81L;FrC@x3}G8k5Yl^m^qFOlSUK zveGY}yrWYlrjE@^FU@-q#-hv@5SBBS!L{_}L8}lu@=E@c@Yb|7OSW?#CogER252drZWkGn#ldVQ&O~_3l z$CNd##hU8uMJMP#8hB=T6B^$702FO6cAm>t#%d$r_i9pfjd)8k?1x+q7}az{Z z3d4;^9hWh7O4)@5tc7SGer)Q<31wm=TP+sfYRF#L_V2~FL9diJV^rCXjaZnWxStEF zSLWH8ea+NCFTBfsY{R@|8NXVWR_4}$8Ch}Ac;>E#UGOeTjA1im^~+mzia+nn8mNmt z_baxKV;RMB;@BnZlTqnovx^hsSvx&`3@;ZSr&otms0j5k=0_91~Stp=N9Xe zSgu1#ujGy~DeW9P zNQJUt{n=WBlORMI;RtzZHoWX|cdYM%x$0sKs zFtIbSEum+ik+x&?E*&(eWkgDNeHtpj81RouR76nCz(JXVat7B63MkfRvqGKu*9eP? zvRPjjbC&8Di$J z=TYI7V(D>P@lo6k-J&M#oJmEo>?>K<(w`(omW%h^V(unqXp(|!>;J;LnJk4!iszqe zA@Q*&@%=Bu>TO)nU@`O4=b#`cWtE`T<8m%*tlv$X6x2lV{5_Cr zFL1t;HC5b)e1&eco9W%XsfmAcMLe+!61j!GAxUH@xTPZg;!BkwtrSUGN&P!em3|3O z`ku8`Tyy5rbFN1l#r4J{6zaECTq>`i;HE9GemB=1-cE7N?nkN;qV+GisDFFCwGSl9 z_=|Iiv@7fYB1@kt9rQ+2NS@mK^^v?;seVEtr1@4cXe8u9InPW94d7Av`X z79ZQf0#iEaJ!_L}fxffimNFF$ec}|i=Q#9~WqlV!jC9&69%^J4{b=I6-SqbOgi6*= zCC*>e@2*ANcj9Hqwdz}l+`B5S4?d#q(q$>3IC?8{^M2f(dUn&Vp*|j(v9jXRabR)Q zR#uzY6))M!YMBxx)?JY%VEH5^Ns&Ixr$P^XU>J?p6(|Mul=Qvy1F7hotVoD6wCJrL zPXe1h`q|WyUy`n`#QN!rxIll}ESG}%D`MS?r0oUmS4r=rxagLnue*)na;6bk>29sK zc4$SF!2|TJ;nen86y$59#t1K|iL5Ve1feWh*(x56mBoX%F{8;r5o6Y&k!-IIZ$e#? z2o?8phW3I?k9X*O6dEDQ0GsWyp-^399JsBS$rU(2%Vk~79fNbVc1AQ znaiiVOXaS-`z5_G?nmMoIRTq;d|^yMOcYgRD`dv!irFYC{^&?Z$jPsgj;(P{)tsq1e?zY@AFv} zbLVg4jt#?#E5f^H2q{S@LIXb6MQ&8S$Mv@vPvy?7344;VX2NVhtK1yR4V(}6Xs(cFr5!PU;~vOsD!l&2q(286ygb|RS&R2A0FqM5n3F*K>5yH8L;*C`H=ktEJ zfXb6&2u zWHp~(Derrw8%ZXt;_dn7ygQT1efANCb5nlf`@-oe z@Eu>>E;9 zsd@&fiSzk!lxjtb}?(p+GWWxEq>%k6^w>&{uKZ0;AAMA=Jl^^iElbg)t+)qo2 zsoZN3A^j#L5;pgNsh~MAF+2df^WgH~+e2TA=GWzT%0ies?OfRfIp7ct+dL8{IobqG^0ivE2EChLc3# z;c3egQ9WKe@*&CB@bJvwwO?*0$*sMF9!m)C@bX?B)cvAKvX7S!+fsSgS%C=d|1Og# z{OVjL+d|w|0wZVc0!GQBfNh6iSZb(v4VVn{p_dZQySU85vFa@5GKo%CSx_60IqcWg zAo;A>GLX4UM3Cs_v38$;%x8UJscr$g*A8SMI|^6n3QR1)9dr>Z9STy&h9cZ_@34Bu zK^C*F7*e-{4Tu9-%D$qyWo%s%ND*6b5M(*)=L({-G;fd<>?tOvTgg5<3i2-dd?H9O z8;l^;tzskLQr&9S6LF$j!={t6waoNjKBlvQ{YkO1gUw$Ha)=dC{CvV#f3*3PWwrC`J0``M3uQ>(gBb{aa9wL<>JW4AX~(1SV!G9u}f2M+r_O{!0iwZya#Tl*o55q zg&6b!$Tjim8ju^}HPckk+hV5+Aa}(}v(TelBqu8OxKiDHkvyw>ZyxE9I1bUKs}Sp7 zhOkn+b68sqxo;>0HjQAh;&2>u<7>21x`*XbR!awI@WayT`XHZ5LrLQ|(hle_DG#I> z5m5QF)Q#G_kQPyz|4k~P2>)F=TLJQiRP~Xj(N)1N5CcB#L zW;P^gzpDV)q09j6p3@1K)WiwcBPbf!^J)j+2qO(MqmC&TWadZ}n9l-JLFTe1_dyo0 zixkF7nVyo)GA7ReS@rSV-Uzi>CP7* zUr8&vgWQ!i)6RP+Wjz3SD&{}GVCrPtUU%0jvCO^}sxw{Vd4a^`K2 z9df}YkdNf0J<0zEO4F^igj&hm{q!GKY*;(xeNqZt80R7tCZ;GQd-`kyV3<@t1f}U|FEuq zE0EK==p`VRbn_R2T+tO^80A~tr#nIJ>IPi~snC7D59DXv#!od9OxA|Ekl0w)0os1h z7ijm0!oa=*&A=fj1nAgpBhaZ~sJW9acq%-n)O(5P=wj#_QcCB9y(q^Ipl#GGm{LOb zr_`rcr#mPQFttQ^NRx9Y5A~#}rhPO7<&2#XCNSep=WEs&=}biNzXSDr{~TibW}$SL zZ7T;k!swfR%29TYg7y#r?C5sz1|FRik&9z zG+RK+aEAT<6^Q998;}Nij(L#o^Xx7%pK^swZVLN;WI8f)snlu;ge#=U+ri;&8XTFY z3%GBGLdfxS&D?SG-v^)RH4>QhTLWOW!38+}@pxd)PvqTMY?%x)o7u*J%rP;U2Fzy< z2Y}3F6|{u&nDbVU`E36qkOgdWB1i!{o}i86*_?C-?Ee86c#GD)&K~L>5H1QK) z=LKH^<9t^EC95e>P(K!_NEOuNKv2kT(;Ba48OuRTYuFeH+_mhJ1G3VgayDYzVM%d_1tp zW{QcXtGWT3nU0+XX&yEd*dl_%c5Kh<7MNB5zd!qlPvIHfnqc zNIw&T=YRuN(tUv*d8eR%C<<2BmPA$1+R%Xe$Z?df7x`vw9ekKF`8dKC78y?n%7Dq&a zx01^=KD5~n;Ol>kRp$G_=QgDt-<9ovwc`5#YxjuI>OB4D(*CcVf*h~ZUsxO1s>d9y zGNca-QbNZr2G;e5dZpfPwC(EGzW{8o;t(*r8Cok5-J1cU4h8`m4yM&@Wa69clkYWM zUR#<#YCJm`7|>)GFvufVt22p1yFeiSP@)Oy$4o*LHJ)LBwCNby@6B4=1U8R94eS_{ z35vbLp3>!;fRKL|xU<0uuFk)tVVC3UOO^xf!f#8Ez z+yFMWI-p72+$ab`C*A_K4BnwhU0PBr58A+Fg3eT{3#kumeN}7V@eK_fu$_Xj$!XfO zF-kbFQ$}ZC7iUtJXulNLa}>owpR)D90p0C@X>sKKkqJ<&jQW9mm+_LcjSU$E%)VR* zoY3s7Hj?Ytn1)I5=u9Ex?K2fl%117qKF1jZfN0_+;S2AB{O59~f-8?a|xM26CP=SrZdU#dIE zp!#%M96Fsc!Ei^~LL*<1iqS1M0LR_U0cKu!2+V$eCNSqlIWRAqw%KI**=c3UYFdP; z_0oYe@~;4Av9(`;^qQm*a)(GDKqU&0$tA1LqS%uOzN?Uu`H0a ztPKsdj!ERtjZ7B^@&VHy1lhulZU))T{IG7yE*3)EUgkmpR?23P(?4d{NoN`BL}njm zfBJwNVU3GHj@M~vaa1;ewNIse?bw6C18RHJ3vW{pmLI_ z4@GUyCCh-xpZ5m#8Ga7fFM0}afbI+6ppj(nkniULhg#9f3_Cp!nD){EIHFetaFl&H zaP-=yz_ER912dDi1G5($2j+AkgL303EGIfp?wlM(W=*|mqNdZIi~!DDO+(INWuJh| zVIQ^vnaj@Sg3M>>As`FbPCZBg8({-d$ebsDEM|vj{!7^dT8JVxZxP75teBj&iqYRe zC~H_h8Ki{WAfK*dou+|oU|T(D|G&@X?gaY*qpzUhWp-u&$X0fV+U#JrJ_p&w#?ugc z*i>@CM{IFDkWv&c%0`gGtV#d8jvcML5X~}n0yN)U%Vd+GEc1cDab%>&* zu|XV|4zfv{PT6R)xQC{;MO?lGWSe+08)S#*e-mVv*lZ!l9?`xr$VcKnx<8bP-6;eP zhz}_Jm5IZnK@N#G)`1)meM}EPKM_S5;<%Wb0&-I9cpl_4(NqRe)u846TfP5*g-UafNxRCsGL+s=Q@{RbErgU4h4Fma3e6S6qTwI+1 za$h`CY6AU1ToDBFNc=Jlq*7c*>-$9fWjn}^;_|s5KZzZWf&47)x(D)$c#kIftC&iD z`dzeZ0`iBrzB9;Q;z8PF{}L;bL8?T1vT3$dZ#hW5R5=i2o^)$1$O6fKCp~`_NS~2U z3Z>O#@M6i8HrG-~M_H&y`h<40DxK&FvQqM#3{osTpha6PO{73xE4h=q-jiA#2U#!O zTMV*M+CTxZNunR(Q8r8dM?tnoyU7XLq|paJc1UXx2_|Ki)c!iyJyHTW>LY1$2uP`P zcRk1fsR!LI%A|HfKn_XnkswDTJIXu9q{l}O-#lLP{SE@}=~O*4%Vma;XdYwPaTtxnd8|96CK;D=8z6Y{dwrK~lMeeu~WV<|=cJU6` zl#~j(Tb@Zh_Q<`WK=#Sbv?BZE{h=Tq%UdZw9+dORiojrJZ|n;}nnw@^K2;hw}S7Kq}-Z6rGRd;opNi zmA8!mc_t?`0C_G4GzWPhr+onOQjR8Nzsafe-}k~v-i-o~Kjja{gS?i9Q^NRLHtqtM zr4%*;nWK2qEaoYbRgeYBLdu8*is2MUq0)ad$YRB`6=bPWP7ze3l(>MX$}bFLrIJH? zq*$3>3bI<+oCmU2S(HWl?>%LNC)o8$r!0_-iv3=YO-kuWkPnq!)O4$|9`5Fk5Z4WZ zXcK&8=t(wzZOAGCxna19Rps>_@6JSle|L%Ve*9h8Xn9LkT(W3`xLY2;O^Rz9nqaj6 ze-h9Mytk!+;@gDMncqGip#QTtV4w#%xXx3G*w7Bwfc1A30~>jF12!EtMl+@EGzomY zZ4}^PU(jx=f2a)D;HDigd;skjQ$&0QNTfaj7}b~3V#6)8PZ}9o0UPURk2ks00@#$k zZ>}`kN7|d;-2!Y8M&`8aLhftTi`ullPtIv`gYr|`Bfh|P*1^E&%4}f!zcv6n+$TTB zI8Ft2G|g-S65GHY*l9O4?R<4H5dTRkVElVzN|)xeYF#_hVka~w6Y;a!z{IuvfZZJu zfl2G!fjwqY%=Mfw1K7)xA};w_4zTy+J-|Nkp8@;+O?S0^zmO05e`TVSGQjBpaInuh z;E*Ha(3EMEzlOS;2BywG1041pIeoa-B48SQw@OJLlLj1NN2*8Wl>U_AgkEw5RldEKJ{C}o{>#!*%DeqQwfWy z3;G_5q~X`G2M!?X*`E}s8(41G>qUhT9%9+sdQgL7`ne@D5LvGZbgEgNV`^`XL5W#=!LkC zfQG2TQ$b5qQ-9D3b(Gy&sgfImepbUOgVv~n5ukNy;Kv;QP0D=(#k*<;^v&*RA7;Tt zo*iMphzTWu(HE8iD`}JIj6~qRgTSCZ{ei*HY6G*+p9Rb@pP|g@JHinO@o}c*YUKsy zF7`DrPd!TVw*3~Ezszvpe>(F^`R(l6fuTP3G%QI67D(&{ESyZ2MY>J{7Hx>Wx!+ka z4j5i3E3o9o3BZW+^c7h*JFs-MYrwKzpMc7xGzXS{`2n!vj`F}tDP4f?c8CX7*-~+YGheU9CkEU;hiHNXL-s{`Y98Njce6$gG(bUw%5_wpPH zLnM&h877JSKqI8$0ucV|g^R=}+4enXyc}%}njnf9G*R+1@RMb8chD5+pn+yer=Fl$ zQio$dTVlJ~2~)zyR+TJU1X!x;AYjEwTsVA{hGw#>6kA7M5yz=nDs?L`vhqn_RQL>F z=?$fUWjn6`mU})D7=4fC?dXQrV{}S2?CJ zw?_c0J$?^Zy}kL9X^rz8QK*^H5?HGVjn{Ab9yw4z7A}> zbSJP$&(Xl9@6%kf$^(GSs}BdZ7(h24JYu9;#xn0(ojeX~-TD(?n>|s$w%bz~|916s z6k?ZD0Jb-sb@~Z0aesJ<`Pez0Y9ANkuzixoyz7!M2H5onI_?(QAK1NL6X56FIc2^m zzXSMXtx3S%9XZGP2GCi5Gg<@8Xbm)@6~}1#++UgD`q~WFH)gm7nc?!8;TkMvyoQL` zu%TjxVVKPL3?_$5PEMtGxy;NOEzemRBhitdv2v92XujNHRxOa{oPa;dfc&6^a&H=F zk*wp1g7~)ZC7`%OK4}SBDi=9O z0j-sbvq0;l?-bB_iKE{QvYz)g%J7_^O_FH=XtT^_Qf!e)Xtoc}DsD|gajRUQ(QWcy zw)7XN@hd1vYFq$qmkG;2zsfS^*Dg82dAVCAGNt#(!EKjTH>5U&x1>rf&~5p2 zGw7aA?lYVIl1Gf*ed*55Jdh3S%-<5n`S(z|wFNzqmU}@@Wqd2p3kggHy_6*vL21%{ zpFN96Y&lo|6tKglA_x>b^$i~ee9%Y0oU-!=!WmAuqjCzFAlkplI>TP1NJXq)UR1xk_}Z-chW{wbiHQs_6(Zpp?z?-c}l$~U5x<^)#M#I#-BBs|1r=O?b0gH4s95FuvaVhH7HqYl z6tHBko4|-J7l5T6CIQPQbp%#vxg8i2$|h8cy8^6nZv(K-w0gk0(-VO8T5$fn-{>On zQ{T+hpg;6fj^&?vquHQiNFLB}{aSg@3B4|Dp47Wu23^+mhM;S@i?isuJ}D>YhJKWp zc2hr1kGJ&6jQ(xCVja*OJ&{RuS6|C`-_u9U0sW=7q_J0ecAi^~U!Hlk2Q<`uo2fL+ z-I=A~?h@gk5$>5B*^%yPSai(js1;jrp+77JbeG!*^wgva?>n(}jew$OQO;C=W0hq< zV_;U_F5p|pe*9dPLf?UPC=aexj>D9F&Lv>ZVO@YBD^3G*UuNp$3y1;c|Ak@u&#a@s zx1S#ehITpv4BKL6qDv)uj6x|AswRDE)J~B?e$K`!qfd$yP@7VW?^2{>L{MFqODmM) zUz?=fviD}?%ccd}*W82f3D0Eh`N8(4OFtW}&q$%d zdEP}eZg)}FGP_(}H}XewiH1Ww%sqDIog!I`1!t_W-VL4CWBuTaHP#_#rKG(fF3=h4 zAZJ5dfHT&av|#(%-iPOGhzm~N5SKmUhPWI~66AcH1R?23fE2Me#N~G9bh03ivmq|8 znFT3l)3YGUzp_AQ7UWGev!HzH8(Dx&cTN@{Aqoyfkg$^t2{98B{EeM#+0u8i75-Ni z6k!&uN|kWmKeM2OlLg^U7GSfSl?4&$Sx_oH3nKr|9coeBp~jpj?c_umCnxM6J2_F- ztuZM&oO?4V2A#8#V(z*0q^M*j#ffv0&sPdbq2={jTgSAb?`gTKcw@{&@wUR+p?xPY z?!333Gbjh8sy7ZY-8+VN9!oXdJCj!%Rdrq4q-yA1|C%W7V{t!=HCddXp*T@PaTJT^ zQS_F<@~UfY<@Kc}rOT~`-omn@ClKAmfaZFbYd8+Qapy_@#oz+H0#Gh^dIt=E@T>(6ro8$1sJHXOxX zHfljs*dm#BJ{ZKBEl1OItB$nR`WSoPHjHs<=b}7z z-W}9$U!He6#Q12UV;{Qdw1GxHEXYb9Eup+~lfQtU)Mh`roTFOTB6QO&o{~?~7`e}i zBRAaLC$m|fZ(yUp`1T$oUtS{iyvU*HwT^M^eVCo>6T>F4ddBK|BNh^B#Ugk2qKge~C*$k;k^;t5TDKc9g(9s;J%6q=K zvY6HqWIv_z1TQmj;ontpG`c`)QsYPI!LBWo;_UBY31fCGk%@G;RKBEe86NC`mP;dM zGQ+)7K4Q~$$swBF zEo~XRJ>u(5{e4o4`uk-Z8*@OSc=Mo?V(*jX2J`HYEMvP5%StB2ZxWmpRgTC=);ucP zS>+FD#VUVFI3s&ZzM}BBJYvlga-NxcQa)pq6luj4o|0l_Dx8+f48|E5$KI#PXB?4p zl9??%FI{Nnf}EuAqMT-xOLC86a9QTj=oMK&;Z^ZtxUb25cJzk$aR_fpeb&4s&p91# z%Rvs>9SLQXyE0W{{@;_8jOAYv#)aX&^kfeoNFo&+~ABiYL-^jJdKrYDk#3&~UA ziG6rNiBmH8AJ{M0i5K!Yg)gNCgZE0tQem)aPh&&WiTj|TYBYmBOf|g6AJB)ZZXBQy zsy>@PQYA4$@oJqpbJR=*c(j^L+hbJ)(m2(ec`;rUrr!x_8Dlw7m0~9*sj{>(Sq0GH z6cxvWn5xDy6Q-#cn*LVZV_ysvh{pKvONTEQsPEMwR{cRG(C-XYk-eCys?+u?^@wZ0 zZ1pjRa*k?BzX@tLJ2Ov3GZypJ1*$JlhnSr|s`>2pLYzGYTBO2QWwAO=_e<2r@ApHYj1! zHmWilyG^P#1H4%sV4Sw7JRJK(wTPy-s&<@d+f+C`{Nht<*_tF(k4^kl^&;(1!>O@T zWn$G`>M>)nTTLMCQSprPUbT_U->2dji~TAyQ|Ex11~R`jOWk5yD=lZ^Dp%zEZF`r- zK0FMGStF#K+5cSsMHEfJVadi(`a>2WlBQ&u>c+wNR-GaJpmx&pY&DCWo2ydka=w~J zr5{y8f6!tT$1p5a4>=esRWz&otmZI$Yn9^AtWz<}w)M)xDX_t(D#JFtc{ZySXq#t? z8jiKVlc>%ic%H3lIYY5at><9xR>8EfN8Ms+?`z!ymhM4IH`&rXWa*C9JdDB^Z6YV~ zSk2TOr_rx_yiW^4QkecHYo`Axn(2S4X8NC|nf^CxGuZbnnq-GoqGe;NHW?}4*=gzR zvh;RadV4Ir16oTC`a!J$Cr+}ZcgWKFlX^av=a{8<+)_MYDW29&bCR6VVn}B##Z*(# zZ0r@w=~YYjnx%W)(!H%sW!m1+nlkQpE!}&T)5n(H6HD)@<}-Ww%u;-%g))89w4J2E zx*4ep80w)ro=-1 z7HuxlyRtuv^{1SlOY{mp4&*XDjB{|M-V=+4C)v}9VLjxjjXIvgp0c#|o96=3#&g8; z1PS0d>Iq{H|Ms-zBzorQ&jB9d{ehEbiFYUOE%%mSV*cbU%z<0&-O6-Z=j}$nd%Vfa z{lnfZk9^<@-p8CEH@qv^iU;1`xpa;6+rs%W&TpH!*7^O&hJNoifo7ijeL~wW{Ic^~ z>!sgLrsylbMf98ISDov^VE^?T@ge@1nC(OTOY`0^{|MF`?w^nTM)*$;k_zzT--r`C z-v1-s{2^c{m%JGPSs1990g0SKvjT$o?K3-|jJW^?%!0nL;+8Cnat?CGvmf&l1{7Cr zmvff8BM*mMxw7IQVPni~sipjS8b@zSgzs}p&A~S2MWAai9{IfaVKs4uxUPNqrqtyc zhGG!RI&ZMaWZ(8`mi##V;?ogxoSzB!8)RNtU<|$^F*st(`1OvIEEd|+k~)p%8zw?s zxm?$JyrF_i&4|1!AyXUcdJa0z_+Fy?=4~H0&hvJ$QkFJ`+Wb_6JR7V!-fXd}D&&EX zJ7*v}t*C3uotM4own9_ee#X}_wWeIX736YWP3<`7V79AnFIz9;3xvM0y}2@^7e(SMvk)EI@wgimle_q@4F7py%tx2I7`=gKet`a zwcWD+J8z=_t{Cfv)2R!P)9E6=I4&7=F{!uzhb+Ow{K^$GIWvikt@Q`o-ok*U_HzwIsJZA-qu_BO~imvP>WvFm3% zc72L1|2@>QgGa*V$1vUa7TdRnL|Wog_U)UtJmU+bR@w5T2&-Z@yZ$D~8D;0ykxtMO z?fN4NS{2vW^>>zv!_yg2HiEzkH?t~6WTF3K|6-L~xq=ZtK| z*DwSbogPYv6gH`B1=M2JW(;IaTRY>K{0$*D^If`Fc6=t~pJLa~_+qqKkQdKm_lmO9t^zGBznEgnqz2zL<=durn zOMN6?XgFBTsPb46f~>>FVrn<2TdjJBsFG17%NnVVrB{yh<0b!btML;lV;-=`6ZMQ? zPozAKoa51q#^xt7;PrutM&wh;9&DXy*ykS>YCM%{A#WTV_>Y?-p30c?^BXs0eI|Ql z!-?n8QSd0a!b^z=9PG7*&f!tUK#IB9mLG>37@HstXl09A`5X6NO1Xf=c6qVC5%o&S z1?~;7)EwSu416U%zjO8sG7?@%h!K(|fkDpPbGS{IQ87(Q1~}h2?MfTH(j+=C#xm%# z`I}6}W>gDwzTX|LVLVNfh@ia%h(uvsVt6!JS#ZJGE zlKtaBQU@bSUKg)*z~d3gX^avT8tAO$*E(9h${U+RMFcv@9NNheH#VNqf>X?E1m2cl zqk&Qd{VUm3R#~!fkOkbdW$TIkSv{;CPW diff --git a/proxlib.c b/proxlib.c index d52b45a..2cbf03f 100644 --- a/proxlib.c +++ b/proxlib.c @@ -12,13 +12,8 @@ int on = 1; int debug = 2; -struct request *clt_data; - int statem; -int clt_sock = -1; -int srv_sock = -1; - #define SEGMENT_LEN 512 #define MAX_BUFF_LEN 128 * 1024 int _read_line(int fd, char **outbuff) { @@ -103,19 +98,6 @@ int parse_line(char *line, int line_count) { return ret; } -char *getheader(char *key) { - char *ret = NULL; - for (int i = 0; i < clt_data->header_num; i++) { - struct header *hdr = &clt_data->headers[i]; - if (strcmp(hdr->key, key)) - continue; - - ret = hdr->value; - } - - return ret; -} - void do_err(void) { int statem_code = statem & (~STATEM_ERR); fprintf(stderr, "[%d,%d,%d] Errored out!\n", statem, statem_code, @@ -167,10 +149,10 @@ int do_rcv_srv(void) { // TODO int do_con_srv(void) { - int ret; - // MISSING HOST + /* + int ret; struct addrinfo hints; struct addrinfo *res; @@ -189,7 +171,7 @@ int do_con_srv(void) { ret = connect(srv_sock, res->ai_addr, res->ai_addrlen); if (ret < 0) - return -1; + return -1; */ return 0; } @@ -280,40 +262,20 @@ int do_rcv_clt(struct conn *conn) { return 0; } -void do_clear(void) { +void do_clear(struct conn *conn) { statem = STATEM_RCV_CLT; + frepareq(&conn->cltreq); + frepares(&conn->srvres); } -void do_statem() { +void do_statem(struct conn *conn) { int ret = 0; - struct conn *conn = (struct conn *) calloc(1, sizeof(struct conn)); - if (!conn) { - fprintf(stderr, "Not enough dynamic memory to establish connection\n"); - return; - } - - conn->cltfd = clt_sock; for (int counter = 0; counter < MAX_BOUND; counter++) { switch (statem & (~STATEM_ERR)) { case STATEM_RCV_CLT: ret = do_rcv_clt(conn); break; - case STATEM_CON_SRV: - ret = do_con_srv(); - break; - case STATEM_FWD_SRV: - ret = do_fwd_srv(); - break; - case STATEM_RCV_SRV: - ret = do_rcv_srv(); - break; - case STATEM_FWD_CLT: - ret = do_fwd_clt(); - break; - default: - ret = -1; - break; } if (ret < 0) @@ -325,27 +287,12 @@ void do_statem() { } if (statem & STATEM_FWD_CLT) { - do_clear(); + do_clear(conn); continue; } statem <<= 1; } - - free(conn); -} - -void dohelp() { - printf( - "+====================+\n" - "| HTTP/1.0 PROXY |\n" - "+=====@0xdeadbeer====+\n" - "usage:\n" - " ./proxy [mode]\n" - "mode:\n" - " * server -> start listening as proxy\n" - " * client -> send test requests to server\n" - ); } int do_srv(void) { @@ -405,86 +352,42 @@ int do_srv(void) { return -1; } - if (!ret) { - clt_sock = new_clt_sock; - statem = STATEM_RCV_CLT; - do_statem(); - return 0; + if (ret > 0) { + fprintf(stdout, "[PROGRAM] Successfully forked a new child process" + " with PID %d\n", ret); + continue; } - fprintf(stdout, "[PROGRAM] Successfully forked a new child process" - " with PID %d\n", ret); + // child + struct conn *conn = (struct conn *) calloc(1, sizeof(struct conn)); + if (!conn) { + fprintf(stderr, "Not enough dynamic memory to establish connection\n"); + return -1; + } + + conn->cltfd = new_clt_sock; + statem = STATEM_RCV_CLT; + do_statem(conn); + free(conn); + + if (debug == 1) { + fprintf(stdout, "Finished proxying client\n"); + } + + return 0; } return 0; } -int do_clt(void) { - int ret = 0; - int client_socket; - struct sockaddr_in serv_addr; - - ret = client_socket = socket(AF_INET, SOCK_STREAM, 0); - if(ret < 0) - { - fprintf(stderr, "Failed creating socket\n"); - return -1; - } - - memset(&serv_addr, '0', sizeof(serv_addr)); - - serv_addr.sin_family = AF_INET; - serv_addr.sin_port = htons(PROXY_PORT); - - ret = inet_pton(AF_INET, "127.0.0.1", &serv_addr.sin_addr); - if(ret <= 0) - { - fprintf(stderr, "Inet_pton error\n"); - return -1; - } - - ret = connect(client_socket, (struct sockaddr *) &serv_addr, - sizeof(serv_addr)); - if(ret < 0) - { - fprintf(stderr, "Failed connecting to remote server\n"); - return -1; - } - - int bytes = 0; - do { - bytes += send(client_socket, CLIENT_MESSAGE, - sizeof(CLIENT_MESSAGE), 0); - } while (bytes != sizeof(CLIENT_MESSAGE)); - - fprintf(stdout, "Sent %d bytes to server\n", bytes); - - return 0; -} - int main(int argc, char *argv[]) { - int ret; - if (argc != 2) { - dohelp(); - return 0; - } - - ret = initres(); + int ret = initres(); if (ret < 0) { fprintf(stderr, "Failed generating trees\n"); return -1; } - const char *mode = argv[1]; - ret = strcmp(mode, SERVER_MODE); - if (ret == 0) - return do_srv(); - - ret = strcmp(mode, CLIENT_MODE); - if (ret == 0) - return do_clt(); - - fprintf(stderr, "Unknown proxy mode\n"); + return do_srv(); fretres(); } diff --git a/proxlib.h b/proxlib.h index 408a9a4..2809d59 100644 --- a/proxlib.h +++ b/proxlib.h @@ -7,23 +7,8 @@ #define MAX_BOUND 10000 #endif -#define SERVER_MODE "server" -#define CLIENT_MODE "client" - #define PROXY_PORT 2020 #define PROXY_CONN 20 -#define PROXY_MAX_MSGLEN 10000*1024 -#define PROXY_DEF_PORT "80" -#define PROXY_BASE_PORT 10 - -#define REGEX_MATCHN 4 -#define REGEX_TITLE "^([A-Z]+)[ ]+([a-zA-Z0-9\\:/_.,-]+)"\ - "[ ]+([a-zA-Z0-9_.,/-]+)[\n\r]*$" -#define REGEX_HEADER "^([a-zA-Z0-9_-]*):[ \t]+([^\r\n]*)" -#define REGEX_HOST "^([a-zA-Z0-9_/,.-]+)(:[0-9]+)?$" - -#define CLIENT_MESSAGE "GET http://archive.0xdeadbeer.org/ HTTP/1.0\r\n\r\n"\ - "Host: archive.0xdeadbeer.org\r\n"\ #define STATEM_RCV_CLT 0b00000001 #define STATEM_CON_SRV 0b00000010 @@ -32,22 +17,6 @@ #define STATEM_FWD_CLT 0b00010000 #define STATEM_ERR 0b00100000 -struct header { - char *key; - char *value; -}; - -struct request { - char *host_name; - char *host_port; - - char *method; - char *uri; - char *ver; - int header_num; - struct header *headers; -}; - struct conn { int cltfd; int srvfd;