From f72c4bdba5bbf0958fad10e30ea8ea1f00f5a858 Mon Sep 17 00:00:00 2001 From: justincc Date: Fri, 18 Nov 2011 22:52:59 +0000 Subject: [PATCH] Replace HttpServer_OpenSim.dll with Oren Hurvitz's patch applied. This will hopefully address mantis 5471, 5694 and 5718. This code is now in opensim-libs, along with Diva's slightly older patches (which were already applied to the DLLs in the opensim tree). Thanks Oren! --- bin/HttpServer_OpenSim.dll | Bin 115712 -> 115712 bytes bin/HttpServer_OpenSim.pdb | Bin 409088 -> 413184 bytes bin/HttpServer_OpenSim.xml | 10909 +++++++++++++++++------------------ 3 files changed, 5453 insertions(+), 5456 deletions(-) diff --git a/bin/HttpServer_OpenSim.dll b/bin/HttpServer_OpenSim.dll index 95ea5dd7ffc4891df56a52ba27d558cb81ea2d1a..d910bb9d27ff9026d5b061592f6c1b05f4cd0801 100755 GIT binary patch literal 115712 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 z zuH75y|WcnZ2>3pM^EBr5KGRPU*9hkKG3P@ry5EOmQm zQD_+K5fX|$G;>3HXpQk8J!jb_<3+g_qPE+JJa8S7t#i)`>~0Bx8ByLA zbSw7@6EI)EhDa-)W%PP><(s6me0?0VjJ_@iMuTT;?*EzU5+lf;n+6sCJ}5B%F+99E zNX5{=zY+NF24H3afILG~k2!8bz!-Wj{x7TsBI*^Xc|3#nbdU(HZ!I zz;@?@OmSDsTLHL`8rZg1^(qzI`WT0CzxZWy6z2Thn3801TH<2hHwLEd?9^9t`pm*H zki`zvp*Y*H9nugxQZuxNc*^W zaA{0W&IZ9dP5|qoz>wI^Q?FpjL4JWMdZ?bfkHy9Q@pLKI|LeDW-zOkdF2RPy&e>Yb3UMFzZ z(|ZDJ)O!MK)O!MK)O!MK)O!MK)O!MK)O!MK)O!MK)O!Ma3R3icg-4)I1lXty1=y$z z1=y$z1=y$z1=y$z1=y$z1=y$z1=y$z1=y$z1=y$z1=y$z1=y$z1=y$z1=y$z1=y$z z1=y$z1=y$z1=y$z1=y$z1=y$z1=y$z1=yerM=&*p>dv+!JE zRGkFvxwGhO(bO*NHAQh_t8^SxhGY?kFZuvpPh(MhfyQcs#?oGDEK%$m&{}q9uCu%g zd0$VlPeukxgX@8*@0(gp+g$+126VnLOf^>Q(Yjxw(Fo&zun(Y#akj1xh_Vl`vRG-- zeZc5I^bS*Bt(X1Cn2hcBpyaXC)X%cd<>zg|H3{@u_N`F#g8C z{n=n1fL=@6Db@8UDEz>VAN$G(=X?SCNSsTjJ7t@O7frr`4gwcV`g?;9UN$)M6-oOC0$X3Iiz{{s2|j*-`*+0`+`l`3A#^t9;!bN^(#T7mY1Pl*Lx1! zWjLr7Zo z@Rj_Jd|my&Uyhc)DHbZIj>sbUUl7YnH$9;)VSZ#VA$K@>tYS>|lyF>TOEG zP#$dkFr^&+0p6u9L&xIXBn2ARm0v|yU16BU;1HZjLKKoX0HCT6fH(knk^rt@?*^$X zkTF2*=pO@(VX7it+~p);bro^Y~Q74+-0Z5k7$f3#0rZ7li zUfB2TDq|!FCp3{AOqp6RUO#{%U5@_|Dtpi$C;e%gV{)ZC=R9q~_!~D)HSL9dSKN8k zw2$<`2JN0GFPtww1+lzy!4wvdIQ_(lY%bYwPHTETp5=uiuBf*NZ`(Uac;ue(P9Y7; zLl+<1wH#2IO0G9WE?7UTqxnl?_!&q6mw>x-*(+&pFqB$DE-^-O#0c|d`i6)^JFa2m zZg-Zu6etc|KFHv^zyYoi!;MnFGiV^;?GINGMlIFqfZJ!sbX2>xf&X4MCIE6{_l}9OOI&hLKxnj zz>a#KK`E6E2KOjcJ39zoeuBi{kHK$w89a5n@eJI-Q5uYTpG6D}0@gHy%ko8eZ@9b< z$qTIc0vd6^qTWSJ0`JdDL}^u7za<~Y8Ed~T$AVj^!r`Gk)y1m!j&QH4O&#p1Lu{bX zeglJj&M(qo^KU})uP`;8W~sx#wG5L$+dT}d80C}j)Zy+NIC)=!UD}37CsmO|qm;2B zY|rFIXkwU4Uo@waT|`8NjU5hV9sPWYLF# zif%_+v0~-0M=%TCRwU=+5> zJ*^IpiOSU+v^#)_o-9$}NF%lzu-WYJgqBl!9?i;Gmqon|6fT-Zu+f)}7Tt6dUnTJN zhOG5kS5|L5Uj>56sQ)7{7xOR)v179?L2g2Z!c8ZUf-saSOlVDMhOnz|@H+c|cW`ddmvs51BCo5FMMLRQ!e}-$sn%E63UfeRdprxy zrb4M21f^&9mztqCsNsMc6$Eq$^lNlT5_b^q16huo&35%ugy5RRZp_W+vB@3EkfSu5 z*Ydp%66q*baof_izOBy~*$#`j53p&Xg_Yhm<(5x9{gn>>P(;CXf#_SQxr}cASmrC{ z&Lw?zl_N^NpEYkcR1(x1Xa(L?Lz@6yaq;Gl>LiCZ`hih*>#^eY16IP{*>IaO&WLi( z&-3u|ou%t*^IoiY`!9fl;K14NkC0>D3+(Po?o9LqqKMPfstHIMqcvgN!#vNnD?~RW z66S;lB8uJ_t{_l@d#3Sg1%XEk&Km{*Ys|LXpA5DXE&eva)8iZGDOz^GRD~GEusmzr z1%UPWB3^gEmX67C)@)&1Z?HF!pUwiVYLy)Fg9|q9GSPWvM27GkhG=3k3Z2Ksx@}O% z;f`S7=e`I_TJEdf94YN9eFeu{b$hWpqWrNJODOhYTTuY(eb2HnUO(#4vQ5O}y7^q4 zH69ISu7i(fPC{Z8`hzT^RWO^T2t{X-QwwHL!(@+OJzB!RMrolsq9Tw+jTT{CAL7`} z?<|GuLs$_ar0$DM;?;{su)^p@PPLu$EaYcD%1>Y>HkI_HOI)Sm?&ey%@+?xs_OZTR z3Ff>#v#-N#>riSsH9L0=-=-vrPg?t*)hB3;)m|(+nu+*BW(a{U6Y$F`o^JkP7 zljGljs!?7-=W}%8r0Mf~>-8Bl!jstuPegcI?-B1RC66)|Wu3|kz~c(jGGMS@Fw{Aq zd!X<{vQ--qdQ9(R#KD&+oRPzfVGTJ25IN_@J1QZ76Ci->Aa3)h1usj0Q`Z9`EI8I> zFN5+C3o3re5M^IOtX;|jUi93qNi9Adi^=#=UR`)ElyW6C9O$W|<}Q^iNFEjgZxQf< z6~XomB#xV^hAFJ7Z4^D;QjpCK;&7SxPKEC@GViealP@pYEZVBYq*>mYRkd#2JFliJ z()^wt=8Q7q;hb7NWf7J0Nc8{epqi}1&z@*Z4*W&nMc8%JKr-!f3eYn3Flc^AZ}j(0 zn$+x_H7_jJiAd{UNlUUFrbUnGEgKcRD*NW{TKr29|BxE5;SEz{!o!#VN2c~mc&Edm zs{{8>ap39<0K6@c6ZcHGxB`3@-o`NN=SkBi1Qxj@HR1b%{JrEUg76KcPaX4JcM14J=(BvE{E zBf4>-vm||_>#brMHSgv0Y71!ZGP=1>za&U|T$Rbyn#uYD6L5F=KNfg54o{2~EB4?N zf@2l?>y;?ySR7D6z?C z@cQk)UyG`(+PVL+|9_Kybp5j`8&9C&{0i?JY(v*~cr8D{vV?nJbYaj9;N7oMbfCYP6biV8X6DFcB}( zV0pEOr|!f-yqJw+siGCFhqPo@0YfAea%K8(w;yXJYWnt7()mSdgz z4B$r!&-VWTyC&jrEHZ$x$Y@4!$mKzBw?4bo!NpHEz~nT;Kc7Y}7qCe|rfAcsgGYfs zT#V9jXl|&*-x3+~&%q=3cHAiVm#XkG3||}vXQ`*!CcfQ+l}FsoN2eSW_Ey3#0hlP` zJ}7?1=QXe^AMHU>)1J(x5YviRW5QV%lL3rr#lx8Kj)kzLWK7#T4#;E(C5LbA1GH`m)bg|s(cqu$`i-uYPKPHP!fD}4L`-QZgkc##Q z*M;h-OuNnS?`M?|3~+@dLTA=t+SWX}E<3+EpGHN|_2gc4+rfG*g1VJ`S`W%0>l6+% z?KRqtX)n0&KRgtwKohs-%o>$hhD)OL8O67MD7XM#I|O8R;3f&m|I7F+-Xu(^R=&uN z3u%)F4CB<%-~rmi6mxq`z!Y=(B`oZH@SP^j+V*hqqfHzf26tQFN~-~rFi94-gGNJn z09s|Io^tgYPPYbW*h6Nt*ldn6;ODqne{bm+*3(kb{|;**Ryc5mY*g(O_(_CIRU*UF zP$RRKLjOeMmQ~rn);3CQQaxEI;RtJ4wSGQf>#J0&a}ds{c7c5OtL~D%0^z|1YJ@MG zGWrgPRenp4G0Yd3Td2P_@~U7|Ugt|xRpkvhwcJgPWz?}!_Qo*bSvk0143j(;g0W=N z&P$(TxXLIS>uFjS!GMN{v0rdu8Dpwni6JpTT68FpJOVV9?%+rqdqX;kNOT>p+a2DBd>%GbP8CY5r@u@+#*)`qn*_^x0Hr(0b}4Cu(HXK2^i6` zw6pF)(By(3=1!Q>IV1SGIxmTr30=4swD;c1#P|;y7VC2RDf3jgIp^tsALF=?hq|PT zECE?Bz;ILBY^++GTjUg)4STg|ujWlwxJrg)^{1SS$-V>X&>iV4+h-PY_iCl#g0k7Z zBp)vo6Sz|kOR5rtg(N4pWD#y2kJ^0aM#U*S885XZSjDhnStC`rFP@uA(~?9_Y3_D- z*9QjaAZWnOrqJjX?B|O&U^VNX3*Ao1D=5`?F|Ggn{HzE@zElCW> zyalM!mEQs1aIZns{$%N5&ANyj=lCjbN#K_dh}tC=(c6jmqRQJ$I{&zVv$sO7WEgqF z&rAVzs+QaU{f7RG`6VnpeS>JI|2*U!TR`a^ebS9fI-Q6M!y`k!8cxfjApzhj3ubez z-Q{m50DM!18C+|R^$!*RgiR(dS&6o`)*kPlEYKb-`H;x~EQg-BM$%2q03)T#QKf4} zO5zKQl(OjKq5TsKeU z%(u?F-n11N`Z(lV8~}Vo0O#lTf!7_#t63pThxE*mFFVuj`gHW;3&vI*$Gk=5&`OZ zI4q#QAs+H!s0ql2^e1|&CfSU3_aM^28W*N+o%C`M6UL@cwSOU>xZVtc_!kL~k~jc( zKLm&afDb}|H~{!70laIC4!lT>r2ZVdKjfPv#esmohX8Q^K#?)VKly$jI9-#A;HDiy zkaxbs2zI?pBi6qei}b|-0Ly{oL>PFl3lYQtz$YO<95UyDJ)1faK#Yj86*k6fq9aMfnrNhvIf74btv8mQ&R`j5v zmQEgD{sIE}{pg@tnsu)c_aNN4z`ZZr9f6xyPj?1x8r5_KZhn=jJH!G0*uc%!J5Jo| zGAo%}kSZ->zKE2z!fGqFcz1|Hv{1D2Hy-b!@wXCx=pR)CC^PxDJ06yQhOl-g1UrjW zADZ=Nl$l}Ge~F^VFHvx}#AR*AG!$p%Sl5H5fLZ1O5I~=d8D!WxroEiEu>N}$0x&JR z8p#A^>M{5Gl7ivhi+3sG{|I4$f)xQ5qW-f){}K}Xj}8BoE0L#^|5gKyc=>t|hfO@| zktubkbW-56yfvVl$A>R*-CA(-cO3UeKSH)FKQj$b?^>W>$dc1ge{%qXYEe^~lSdOA z?W3q$@KEPQc6&O~c?G;Y`+G7$_;Id!GKp>m0WA-{LY0)SP?f)ow3kPDo+(fSU)4f9 zi}=z)urE#RI*1K$zOj-k8iTuvR0-JFBRIN9bTCeXvd!@(GW`pv-a|~$D;266+<`BO zTlTLiRC~sXn(mcmru(<7P}RBB$|YN29{>@u?&xO84~4SvbDb-LWH(2})Kv;YxSlE3 z*(=$#X?x+tAz%7ZRTh~c>B&PrPhXMNUB|3^>{hD*%`nw%@I3_0dp`i0;ks<-QQdig zwIaYEdP6wa9)P&lQA%MFAsZw)pT4@JuC16 zn~*d)|4leeS=AP;BXu>Z(8Z`zAlD7VsE*`oM1n8tCH=@yNY~7cmHX0KBGO%%?)6|& zmKkvVW|oW}gC!dq{i&8`ER#Mt=jW{3wVy!I!|WWZVNXG5H=CzXffVZvdyMxQ2T-03w(6c{c(a z_txTxg_fJ}>PZjbHkO+SFzkf;0TRNA6w99idTC34My&qxWz++av0xM@z_&eDjrjt+ zhMK01xFS3=WGZMNo;So$;}+2M4+SZGZTndBv>E7^FkWqi`Q%p-D4mV>1D3hQ7Bje{ ziLc^(jltJ|b2G*ZJ?)g`-3m}~U;XxOg9qcEN#XeCOW>pln~qFVs3dA6!U4{&Y6F~6 z8xxjyJ7e8JlDIk$-}yQi3U%2Oki<#`22COufDfhieic+=dV6EkFbSdw_B4-CgIDYQ z4BnD7=_T#bG@sNaUi!;(TRGS*Bt6bxNUi)t7su}(8;zc# zUVGuV2xB5u7J6y$U1#@|fNqD~7oo8G!tiN*yRXK080|Q;yxCwp8)4#WJ3IO6`vr1SMjlK1+C2(j~gqnXRT9ct;Qfo;B_%@ zHzHaVItA`I^g;&9AcOKBp${B6b=IrqB3KN#lZF`+n?tN+L{;B^#I?j0kUEuXI1~Oe zezcqfuZY0%;8f`}@M4xR?xl&WNX7OZfvjv^Q6_i4YuZOaKb+38gRXszdQk=y!T1Nu zj!w~*(QDrSCqpq@1Hlg2ZK73Zwr9?DX*<_58Bgzfpx>hKrO+*cMbY-5Ee*e&KCaE+ z!V-U6)zfYGn0f^v&AJsE(tqRD1g!G6iLLtKvC?J+Omd=b8}e7|W`7iZ@d?(d*!jT6 zqeKBsiRFe08nvCMJ$9lF+06o0jgU>YHHABzdNp_2HL=oo+q)In)BRl9?+2@f>>ZWA zkBlu3)_tdLnJ9LUwvHGuBlHVhK{hrJ#j-?u3^dpIwjYXH{RrESAN$j3{X{1eGfg>*!4%N@{vDF8~Dy?S&hcqo8Dxy^_jG_0hFVsvejMfKBzlrU2Mn4{Q#AW9orp0$@u$utfto%~cT$TNEt9|8!QQ z9TO7N2)I{8+HVNmH$~b{3f&Jz+A-eMI8R5~(W7Yh>yh?d;I4g+xQn$86G?eXpTlA} z6D1KE2JMY}Yr}+^5!h)}7{1Epp97yeo>dY?O_x=JatOMk8q{ION-_UO@M8t*ojN4L z#=SJ3L%p>9G1IF_>8*Fp;V}1?I~a`M4ua7=JN-plLC@&^bDj7(N79=lLmBf_8v zW9l{dFB-gNlhT4~*Wzo|#$ZZh(wqo)Rl}5sMljFdfv+dy!ptU-!rH*S{S2C3YWO~N z?o;aAtP;TS1%?wmxs4S*=5MPx4cfqxMVEgjD01H{uDDV=j6AOBMpf?5=yB(YvGA1o z+Sb`6)XTu!`-_-p^ztF*-YbcMV^EGh24(u60m&RM-FH0bc^MWrW4k>&m}<7NYvl4@ z2R(*k%F=~91%#8>HNFbbWC_)q#wL(hF^)-NOda!Y2!m2G%fRYIyt-^5qi%O|M(OhJ z1!5dmEM1OtIRJ780moF_Ok|?|lL(B)WZ_EEaW^Lx)Tzdb=D%Kp zz8yNfBB>{0a-oBe#7Qp7Hsmjv zFtK>XOyC3|vyjxxV;oGLQ*i+{!RT_9{~@>;D~II7=p?olh6c^Jb2Hk}Om}B<9M7)i zD4yL3JlxBeYpc*A>BO3`v?9_%MV-%)5FH(SG88p&g}oKgoK9nO!U z@*Uh2;K}fyByGo^JQE|4Uw|qvP+kgQO^(%BrN;d25gx$p4TUd6_y*1f_@@9a)mL}6 zG>Mb3L`cK0(v`;26AK#))cpkrgSux^*XV_m28NL@uSSmf->A7m!z=1RtT6B#M%u`Z z^Nv8a{KtV8sQw-TF%Jp9D$nmG_Viwd&qVwZm@P_{%*DJ%H$a#%;xl^DnKZ~TFvvi! zDDACh!ca7hwd+)jcMb1=Ij<~EOvd{d{9$3j4i+Zh_z0v+aeVZ10`Bj|b&^=p;9AB0 zAr9Iv)+)xQEipZV(Img{9(+%>JwSFtIz2+C6Lf+Uni+cl$F4PItaC0qtN5%d@I+8? zpgqJ)rK5V#3`5K_g47T#h7|RvdcsgDn2+GIp->oA^nvlAyJHbX#vzq3RpvXV`r(Jo~B)gJ|cIz0g0!xhq9*PWwhvQm-p@t44S+P0~^fl9U zI>GdwL+oNf0!;6Dc(guvf#8+^ESezejEu=SBgyK)3K*%$Sg%F5_gOpY{0x*|MBJ6^ z;qvqMT`)hw;T(P`{GC2+VCuk@Q)f(@K?v@b!gDuF)F(nYJc#!b^WffhnZNjy_TN_>@?VNy=~NSU+JBer@ji)ujQ%IiKgm0a$oLr;FCN(QKr%rs^ilti z%F19;-30H^_`^=C8bXV?6MtA|QQ%b8ZeD{M@=;0rK_@HBfz;jjTYzvI@7?hSr?P^- z1m0N8!OsbDXRCGg-)&nZVtjVXvtOQr@|-EpLu2z}wptN85zo&9;;6N;%iu1=`{Isz zI(|2vJ0}R=-XVOYLu!}e>8S5I_c*rtt3Z|}N$36);kPvr{%+HEn{2gNbGF%0$2ISS z=gQ{GVvgz`Lpnbi^UxSueZ7UTy3$Pjsx&D-D9<<3gg3SFxvf0U$dK}r8B$JVKWcZ> zzp@fHmuTD4+iLS(a(-jqd3}z$2Tw?#pE#%XpBQUalk%N;TYa^7QPEcK zmzd(rX^gd}JWrD6#qzvao)63Od3k;y&(sj(_R4c$h;et4=NUuC41KIF9%A`?duYv& ztzML8atq>2*n(*ty#?V{Y(dU%kmuJ0{{1b;;k$6Rs^pexOIt12lK3ae^Er9GwIwCF z*>p-^&*=A$&sXUGKyA;N+2)JXQE*=q(U8?M{h1d9p+5kot$rfU z4`-6j)LBgNu^z$~%wh?iJd34YnME012MFqnJbx?CkMV3)?(8wMo7LReo%v>Ufjn0M zVyiFDCbiq-`G7npZ%w%!D9>Z$d9FNvv^CRuZR@*%pV)?+9Iy=`tF~Fbjji6^hIBrV z=fC8c+m?_mw+{xj-6+#Yvp-Ao^0K0^L$3s zjd=ITH&R01PNKCV&>0LnJn*?qXWQs{-RA2;aSB{W_5 z_-zV?wWuM%+!i{SzU{>~2VYmY5jgt@=3LAlnWJMRY_57pd>(v<;MUnk#doH$0-WuH zZ&DHSe1m!46=PH8_8MR&pyywcuv>-7?l7}q9=UwU4+WD@Nw;JccF4O(rbtBAPM`vgk7Y3 ziT5-3`qf41a>0BBzIOHb!1u2BuEiI+nD>7OpEoGX7?8SY5%Wg%yztVF?yw!-I2aLM zUVJyJH+23i=Jr)J!P@BKCC8+?+t4&^FjC~i|=oe`XefDAVK9sDWxB%X%e=d zw5lJd>Eg>pN#z&nXz`VR*$&@v;@e7m&#L3aw_}uL`x|wVLAfl7vix3DXA0Lxi|-|c zr6F*AUX(TKC3S^iz;}6+Qu>|xvQYV=r1y^ciumr76y8xc2+jM2%AeHT684CM{Yk;L z3RIqqQW7fiqWGQ{OfxcK+z7e82}}&TBkxMQk0o9_@(1y?*tel|#v|{EBqrG`_ju$l z5;nsopJV7lj^-nbz7NH>kN8?5p9toW@NKQqk(kN6pCV!HkqnGMTGUxKIqQgYi0=~k zI#pMsTYR_K57=8ox+CMn_k!@!9qC6M#^`Sj<AEa2Y}oFCx1_sV~Y+e{H>OzJE=J5r|uXFQ$}wQtkk@%(I4 z(&$t7HMQaSQBwz=vF5ROwlw$QIkR~Zp5z{-&^r$-K0`IbEY3(r1fv=q!fd=zJjIbEIBvKa2+ zmXpnha6U<$*K#57XQvr!zC3r7=kD^{U!Dia^DudST1?wMCfx^q4okJ;NGQd$nE*_mb9c z;OVzAk1T~gwOrf}wZ4P6kG1{YMDRUM$A{*Sf>BNGp%;sYWrwfdGcJl)%kEg zyVZH1d_enL#5%0~LhyD8o)L9hJ7awh&p!2=cJedQ{vGi1PW$6{9+f5hM0xsI;y;lk z=P$_fPk8phR?M*bR5CXS@YWo0`f@2irsUFgM9uFg;i>D`g`F1xep%-wfattm+qoL< zJ3C49JDud@NqNrcWPbPRycwZKb>4;N>75VYneO_YUCZ6gaIf9!EH#|}-^)@T z*axhf+x>yP_sYfH9(a#me6?qq~M zG446QbK}2(nlL#2W4M1dzBe9G@5xic|3BKk1iq@``hRBbOY&a!ge?hM0$~$~fME+E zBqS_Rc7lL{;U#$_Pm;Wl_rjteAc(cvDxxTA6)Y7OY@u#Nu?59c+$wdYRSPYmxKwLx z-P`~7oSA#yO#*)U`}O~Od^nl!nf=VnnKR41H=%bfIBR-S54ou~<^BMu?i)Gc@4aVu zX>2Y4)nm{-;tKO=^krvLX|-%uX5WjDKgfO%^!03#!=IR*Mi|Y<8ZPH|$gwNvaM3@9 z!tBoZ1e~|vmf}mMUHXuFY@eRK95J&`AJ7GThJaS~8Re6rzRv{E%a~rnA#Y}SZ=W*o zbvYmHLv{I0pB1Rf(LPhbf4k2#Uz+%^&uqB+<^Iuk;rczfG~V|yeU#}T&>Znh?(e)g z;xD;%@j2q-+~x67e3wh9rS!WjUdwj&`eXeP5@xS|3lw$iw+j9C-F_7JlYXP&)+6p; z{ixQ|vN^))pPmpahQ_RrvEr{7r?KL}{zQvXhG8x6Xn*PtT8lmjz7)S@s(Z*A{i($# z3@Alj)R%I^v;m|abYIdvdF}w}E%$T(c{8mUzPi7WHjtunK+uBR224qiV)+2#{B;1e zTI@h-i@r?9!EcMvyk^beWk0Z4=&v_?-W)Px#M-mNZOy&RgU{NxsGUGqIdXhHsq<_4O6G zP@ZoiR#W=dnl#3DjSEfl{n&*nd|O>;k#D-*oaP*Y$bq-28MPn>2gPjgZRa;@Qy#4` z*ZS^qp2cd7x!G4BI+F)}tueRzcDv9$zMsRQ(ZAN1eZEI%`-y+8F|*?T$vaB~TVtx@ z|Akcp{qXL9jBtFc>~2u2Tpgb%v8}~^t@8HxE;5?{Lbl4?@qJ`J@iH?g-Y_{(eCnXl z@*I(tLt!_2kH#0vp(0Zwge($6$pgREq?7UMuol%n>bvL5DEcsdraag2`!0T-q`ffu zwI;NA?-)eoED)y*qH-39PYj}RjuYQ9+U(t$uo%eGhf1^Adso5| zIZh-oIwh%X3q@B4Es=#{ia`$~6yWPa(=_r?jmC>j22qWQ!~o7=ix`%FQPKo~Z#z&9 zkoW2)b)rP1_tm){Wt3&m9~kv9=p-ajA_i-ORBn(H#l;S~RZbEs9CWul zUtGsX=P*r7%GEjaPn?IN_~{0XNW2KB)}W%qby)9)44RTy#JijnuQh3L;$r?*fkr_$ zidmU>znnoH__fAdnYdTt`U3w5J#r$8uP=%r{n?`dRF4(()eAUSU~S6 z(kSU>(FSjM z()~a`(SDHb{jy3NFd>_ggsK*YO~^G#F+eXmA!AgH_=wRa#LHI!@i=WHiw)w5N$OJZzJq3~M)4h^&E6N2D^*xPrQ)~Q`^V%OpjLxUCodKe@sdGbCoho^@g}1U zA|d5c)grtDb$*>w3h3S%{|?6tNoi6m#I5YN8FT$PSo!nTHg_`u;jz6xhanSAY zAE+NWXm|XVYO6t7w{CO%R^wIuw>s$dc(1kHLA!BH{|<48bEoz@&-#h@vxCN2xW~f3 z)+8FYJ8T3!Ut&eku+*v6-Qpu1PmE8UZQUdOt!pG^rz-1yCth9ZcI=4gA8Fx>tp{xs zQ=fX9`nl-FDx2z1gs-0uXGA4iY3&si4q9vdQk>Kwy;QP?#772gNi72UlF=zi`8_Q5 zu&O`hqx>EfFKHwxzsJOvjJAo}Qa55RrI@Dytx+Bq_cGcH4R)>dxEM2xin>kgO1;5) zLTqEy%KGzw_&K8!^2yYjtpnm9qf;_5?OveYGuo2z;OHGG2gFH6+eH7g2jSO^Cz@^I z+_Z*jZWKd9dzV!RoWoW(_$Ct+r-Yak)9*s21dGPJtsCX()m3n zZe^t7JtyvQg?v%m<_h_uli&Sm#hxgdm^Rt-lH*sOI?aXZQs;PnCw}gvc`4BEOnxN! zqvCagNY<~2&o$z9cvbY_>2ag@C~d9vniy=*H$bn8d`4QHZ-^R3TApu+n;7Z(y&>*r zr0f2Mc*;R*tvAH$j5cuZc~g9({X|asm7YI{_4!n(&0Ve;6P^>oGn!L@-%NQ@EYe6^nZ8b( z5_Jx`);cA=H0THECDwc5KAe3}$*u)DEe;s;W1tTO&OX`i=JcmLAB&F+x;_0_&nKd8 ztoFMz{bkQ*VwZ!CdHyLD;8G2x`Lpzso^M3Jpgkzdx1yfW2C)}@--q5$38T3keT#S?l4LY8l2K1~!e@~Y{M>T>Z3WSoBqHO`%h_qY3 z7%Z#Uk1RmE!^1(l<1bb5@}x=gx=!UW39?5ah28AE6(~_w81xIEBzc`dPXHy$7c@fd zvtm-@BSjSNl#k}yF7io(Xuj)GCWG1ND?&8bqs?o^nPprE*Hr+}~3!*2qVeM^70rh%Aqu zvVqY?Z(ipmvZq|ZNYA3ZTeBPiR!7oR?%IK6NyQhyVE)n=`5O;LGRP~iVDAVYk&TC?FW!WS`rzF`# z{pG01HhNqRmZc6V5_yu|>q;TXCOTK%;Gk#aF!{MgKC*PqlS6PxmfDCcoqSni5Y5vg z7v0(sCNn(fESw;5@@ zR3zVZ&@C}V@^g*6OS}9eW`g|Ipygc_iwV+mKBc)?tnE?&l%x^*?h-jc_Rz?CGeQ=d z(Lp)HN*mEQ+8r~|89BGd|01T$K{Sr0%3LSS?Knf3<)8w5VQGQMf#%c;sItCl?tx($BSvcEyU?6z3c$T2#ec&gjK zfNn78xo!nwsl3r3(kM&i?+qdgcd1OArRDj14*7yX?{w=KyHtL`XtVd6j6Sio^4|uH z$`}CToy{`ylI33~Qw<`^zfNXq#H|@@)6Z-~{p??2nbWgwj~^A=;2`Q}%k4Hws?L}g z+iatlNXA__kE6WNeo2>Ql*hC<=z5?P4%(eDHFl+go&;Lupw~0z#;$hIUx6-jkT3I+ z*vlQ%189wncqe16jgn|h5=Ep<*UBMI-D}hp5-JtH4TAPV*2$fW^qTof`CE;Al**Oz zcLq@^SIU!&Hi3Af;EpnPcB*7cyCWAo}n zvW~dWHCg?|cE|6QtaDuGXIaJaHpg#o*6(7Y=n0hbcE_(3<&2^h?`yGlIDS`qkGarM z#QTZkcLMRE=x?asosOUE?nc|a@5DNOyh9g7KZFIb!;Tjd-~CzXMo-C~I)0tH7l>UB z>fL>78&o8ICJ%5+(@gR&agSWYTMZk5M#tSNU((3?50vZy`MN>rJ(kD^doE=5sN8A%sHGp1_Zhzl@Ow=D z()dxk|4Kg2XtQ@}kHz9w@>PQtBIK{+r#hshUEBR~RV7OhmQ{gxLe5^I5%q~D*cZ~E(>S;NohT@UmjJRi{H^7Kj z1+B7+LA2Ixm7@(Jd*ZipffJ8%%Gy4^Wu)k z!y1V?q;f=_W^{^I^UuljrBoKZet%wOGotnTC2`NoiaPQ;;VbWXvGt-{#YpcEyd=*H zvLCPCUzU>?>GkHzay}zU<)r6j>1U+Ze@A76(KhToHOC#5{!1y9ZQ{=K%i~^?O%B=| z_XnA}%=Wu6?znu@py_El;@*=P_2jojOi#N%?n9Z~phG^?^Rc*3_^?OFT)UoO~qf?Sr`mt(Sh~k}+w9=1L zFEH95-iZ54T%76=)_%0^_o^WV(YoKKK4L_@pg{Q4zcuo{(({8jpNfl6yv^R@J$vGz z$y9^B>G{_)32Kn>yRcWhH$e?IsIFHEP=P_0!7ouwH0WCRC8`Sy zqTG|zT!Se0B(=z(J9>5TCaW5Q9_f_@)SwaPo}yMc=vkSfUUX1_NLR0!c$0gN@TRM` z4VvBiDVeTL8AR*iPU^1)E$WSDgw+=YE$!W3bXNa1XgT~kE0Pgeu}6Csdb>F2PrXaM zU2VksyO|E6RZo^m#I0dH{uXGbV^cL2CExZQoK_>T7l)MXAPpV;G3VT*iTX&hAA)S zM^-{^@^Cen{iuiB5;I)oJ7|q}ger2-MsL2F>Y(eqqtskRt%6p`W7Qf)hj~>u)|Lb; z|83p^^`?#|^0RByc=dq}i9NEN-Xit2PQ_P}jn$I+juGu7767HLrc&#^TdeXORHKU3 zT#dY2vmf!6s6`ryo!JGVM16ia#}kiazaCSfJZlJT5Km<*t4xhy)GDZClT_JS?U&c} z*WRh>VMdhSH!B0WC_iVqn5ix>XiCm2-kGXGBQDDqd&VO;qLFV9i$t8EMV1KzTOV zB`XjMR96QT0p&XAm|CdLbI^8iv6|qZ&%KM)1rGYoyF^{bh;sidrbeY+W#2+dFrKVzCm=pxlC0WMCY5!xWCxDP4x!R z>gA-T(LuMzC;RAq8}@l)H(#@=<5aeJKksv)FRYq$nrN{_Kp#1%KtxpiX1hkafjn2+ zsLI!(?r>0zTA}iPVEfhiR;o80wA{B^-E}d{?O@4%+4WfqKZGyZS!p`=NT@pnLm1GKwPgr`ms*siN5~? z`qZG8`)>1YQ3r0&ey92#^x-A4TXei{`xdEN)J%h7bN?l_tMvxGgO&H~YSUHVB2GjZ`IYkA&VD|+SMn>B%4nPD(QjS+epO@8zKTJ306nc>|h5~O9_OK6MuY5yB6X^ml|t$SrX#7NKK%6h^G!t&Xb`RRds`kOh>SA(n{7({ylcwfLi9glV{ zhgh2oqBG2MtscK5KRt5JwZ3IPt!>V=wm5#<5%QNBd9T7V_`|KoHDZf%xb-R{ZB>r2 zW<6x5xj12@^-qnww+~#JFvj{9qYd7B2i60{J48N+gN)x%_>HrM8^2TV8)p?5zi;4IXiYSJiGzxOF3^6W=b$-ayhVAF#ymFY ziiGjjCG2-f5-PHm>X1DDO|Tjrbe=WATIHZ|R*AKNQLCVP5EHF?4WfGxW!B6`I0x1t zQ>_Jz^o@|IR`#Rhw^WLY%(f;O^kMw2ggMrwjPz_@VXe`Ae3D&ZUBl>v9DB|K2^H4u z+K=mAVeNHLk*Kf^?x);0qAX7*%(H4A=dy6_7g`a6_QoAaxX`+hkg;P>hUy% zq!nLX;zp~9QLCW2|0=8VVe)GgH243&Dlv#=`)jQk29YK3V{3syWKaCq%6x|6=^lB# zmE)lEtn0184jN}|vGN(Ua-YA^D%42Oc(~EJx0O@zUNaaw`PN>8ZXJxBeCq(CZDRM} zHHo)aQ-4b#56j(yuSwit?O?P;{9^Fd#Cxp#XUR{GxZPHdBZRhzmr`y`yw7^;IYNi! zfx+v<16IZJ+V6$IH&_o?4>LL}-x++H+GFLuKz>@+JqTTZ=NpC)?ZLDUQ_bneZcW`` zbja_g_|PwIKkG0f*gXc+5)(Mh$xLT4UBGk+s1mgux%Y5zDRLe@!v&H(p zxJrENN|Vyj983J8T^TGvxqJ9VSq$FXLM2Q9Rm`{BPUod%n9jbvK=GDBP>&b}8Y4!6 zqQya#i26$Q#qE3cC8~sOuc^#&*ZOR3ov-$7;POxBbmoCt;v!C`ia9}cxA*mkW#7Y( z5i8l(o%?#`Y-IYw4!-V?H^NtO-7T@5LuxskjZZy9nO>oLi@P7*&8giBYKeVA6=eGu zr+H?64EM=c^huIDg~!`rIj-)L?v%CMh$@a{nOHjHlbrAKoEN#J&^exFcT66|B90}p z;Pwd3cbBSfUbM72uc4fmmKC{m&v#QLh9EU53YbPi+M~ODESq2K3Qw_=nBj12_fl|l zc+2>Pn6m=Z5?b<_gKyS39CAz1k-v%gKVo`2s1iHaeYQGkUkYj0PKVU>y~l}bOXC4f zlfqcgJS5>YEV1@{JmJJ4DU1}qc{ouJE{$GN0)`cYl?f1?TU1tX_MGs)cDpWSjO=QL-5DsdsGC90W2_mCye9d3#*AF;2d4V?RB z%-IO4#I^0*me|4^cgP*gahE~6X--#yLQ1|tY`3-cb=TS*GU`54t=+TI&(D%?$C7m9 zJj`*wKedh$?ifDGX~h$F?XxsFdUjY?Gt?WPfd+w}j148Old z|I-q>!)y0zT(-BE66Z`3*8CF)qs05JknYsTm+U|aLps@FZER~!9r7Ot12cFS>8J$I z7?BBTTYwZ7_87u=I7|$OiT#hm#ED!^jZ#pYg2gF#ObX}0S8@7hF9S&%@0dhLk4a6J zT$hb}J?tBE2H%dcbZW)ln;QArsp(nu0&t|zbL;oFzV_|dGdsr8nvf{oUdMg1qm4&8 z4VEgmk+vaqI`dH;CH$cF{G#WSv+>V1vwVN<(Gp^{-C>u_-5=aDf?nMaJ(CUm zK9}TgOzELSDYOiUquRL1*D@S;UT1SBb84NKYWb7o^_tW&>m$v{a)pU%SBqQ9W7^ui zp6%EZdLacpKk8VvHLGX;XqvXh*5!$=n52lhEwgTN_bc7jZkzdRwRX3)Zv8%7J9oJen=g~9o2`<&gpi2C6IPLp=dlnAuPAJ~Bv&^oe)`2l2zOMy? zEGu{aq#kHXN%Q}wV^H_uj_rH4{Tbb7+V0YjhFpX8ieXDWR-~a8aiR;TS9AyUiC$c< zexOR=({_*yh4FBh7!DI_!q5|(ZFh>aZKn0ZP)?@{UJD(Aw9}AsHvXsKUoqZd5R3mg zcz?kH{Ex-|9MKcscV*ujh;aSu3#Itys|7ASGzX1PZ@jpk5 z#rv0w#OLCCxGz9Xvk`tS-tI6L`OX&$kG2Sk5G5iEA$iBuW*=SI&K)1$d1w zrJ1P)<1g%Tmm{cR^ zHe?N-{ft$=%D*+KM7@x|D`~9yI_}n_O!Zd&(@Eu=*KE~odgE1NR0Fb40|9nv{G*bQ?82`KVZlCjgI%VWTQI)M75DNFzI8koas=e{o1zqko-zL?w=XI_apPgGWCN&bZOfB_9*zqmL$^ zP?6CeA?`J!KTEDhNeaYi@p+#QaK)D7d|KQzdNKM7Jpo7M$w;A+^h}9x>qNL+GF40J z3b}@R(I&*5k#e2*L&D;eL69ev_U_UBIqsU2o4CCqqNwM#l)s@~+Xc}gK`pgil%TiZ z7Nl$)-HKdZ9R1VeuhfarFQ!O~?sxmFm@%)U_^iw^$5QU#a^h1o2v6>AsdtERV~8fE z<)rRm-yCcHn5{Ulr(U#&>yl$FW)AhGJ=}jD=8$_(p0%k55O-_pVU&L{4vp(l?}MA_ z{;;@b%rB5;V%mw+7vTFv>Z@G47ua_X*Cfyf@6eSk*IHKT7+$HWT-+tZGT*9#`3Z%6CQOkXIjN_$rBwEk7F zH4)OlGfDSxtKDbO6WsgQz0aC6Zi(DyEgn|{P6OQgtvBK#>4)H(;yq*)cUhl)1n#Hg zA?y4uJCWwyqhE_X3eLXtW7eT@>jaIFW6Hz*Cy^fiJWp!_zI~fWEIwS3PR2eorZASA@Zqi_obddnPcTxaDLortQ=9eSd8W8ctHzq z2B)+T8W>~$woc1cIedpm(sD!O%)%Kdr#bH5tWe>OPWeXvY(rj!>@H(^THRUrRwo+Q zCpw*0KZl#@a=McrB`FXjLmI_T6b3u{p-Z<5>7l;i7ta??2YsV3(wTbWWu1K<%9q?5 zJ6|WhM(#cEwt<|~e6D-GsWpY^A@{~T-?@kUF#aegjg*_XXJ$eV_k;#e9Of%EYWz)I%8=%oq-iYSa#=P$-b;G&n3~3AsNgbG za2cktd@?;t#_vKb8lj8e`$cMvq%zk?(n95uv`2{~EmR^yvgEn zUDi!p-$5ut=Wa(-Y|)!tPxFXgNNILkD2End{7TaN=9nT-8t<8`wf3-V_i+0jV=aA56?Z+(!o{ine6D%K5&^@_!5c zYGcw{EVoy=El#pbKH^+H=k}$!`}2&2>W-psGd|~be@lKHw>;@v4(U-eS`$(J0+FbA z>?<1SiHiDIqM|<28DYLi?V-4zE9x_y6^-kK;=v;7Gp(afWs(m0472T{MX$v!6i*i& zi=|e(Gx-{fDa_z%T-vde+3MvYvNSF)%FJ4BeO%Nx%g?ie&qETR@%3&@ruw{SoybLb z&H<&8$cmV^wghX&h@B$Ex61)1U#CCrv}WV&ycWudXjX znSKoAr+VFo5}x3?oba?3&+mT1^Iq{K-A{Y=#?`=0&)`wd+?T%4b5&ZAIH87@e3ZP1 z+pC7#tDakGizq93GpU~2ZV~5L!)-^lL=o<*TvXDv$09DLFNXR+TFiYVLwjt;2s-Im z#C2K3CEp_UBb`NDN4&pV{75E?_2Mpt_jij{&>x5lD_QIk2SM)@FM{q7uY&FsZ-YK8 zJ_7xf_y_0#@h#{<4tbbEKFc9r;E*qK$X7Y!n+WL@$3=q2i+9E;%BH@=d%DZ4@9;wYsaAS?vY2M|1D$2fiO1Xjt>lCld<`fy0pUFq zYoLcx9^#>thj}RFd=I5O#*>TGDm>j2lf?qhki5S~+|}Th;ypa&Nhk1L=v0p-$=#Rf2}vA0KL+}= zBK}{PmRfi>cFInR_=lLDU}||N%plKJDU*YEPFN=YC6+j)KB7x}6uz3>{seX>5Pt)^ zH?n&tyALrv!Bi$v$Q-8COm{Lp#8f1aZ#L5dOSS`gI~sU6Vu#Y#M#k{!t7%AL3Wq*CjOG%#P>5@ z&vXOR9ZYvJJ;?MB(-Tbn*%WI7)16EYF+IWbU=H~nXDa%TJDX_oPj2bmscT0DefF+Dhx+{c-UJaT62 zlKD)FnJ!_vsbDbDJUEVgk24j89Fpl0rt6vRV0w`0;X;aaoZVtPhi6*M^dQsYOhpm< zGA(AhglSC?rQn%BGCQ@R7@s*Hq#w5x5~oI z>{&#MHNB90moUwqPwrx-HS-66Pi%rtePQpYG|@x6{B*Wu4Y`y0_D#onGzqNvEXF=XRdmxv}%Loge7@X6KA9 zeY*_qGOEi3T^4tFwaX=4uju-tu6w#3?0T~6XI;PU8sDu?xBPA`-8Oc+uG@{>j&wWT zEg_?O#+Zz?$0`%^~3(!2)vi{JfQLT#!C_2?>Pl;^<0cyFM&6a)8iAG zjz~&}yBcqW6?jMZ4UT(Lrys$+o2fg@giPYk%FF_-%IpQYBC`+Z+4wqTP5b3$NIRD| z&!M-=N|YC$(n1NnD4`GUu#d-{T!QG0n&gNitb_424Ah}N%03XgcY{!VJTV}Kz;~$V zi~YHNVmN%p!e^WqjFnj)>Uypy!5-cuNMH&iP%iSt1=zu(-Md;*AQ};}2_dm3g0~A6 z<8jv#v06;TSNkSmS8s|~hh4oNAjS`|t9Kn{*&9TK*eT|TyOF|f?C9N#eX{$-5?CWu z;z870dP_lLz2%?>eNTeE;Cl-6sE@9@9>;ts#D_le{mOR~RK~vn8XNyMXmb3YL9^m1 zWSSy(PW&m*0r4M!PWAl_^t^aVvyej`h@S)rmL*U~>8*!*N&>x?WmW>Ee>VO@36%a{ zIo98q&Pt?M3lb@v&Pn9kgK2-JmnMA!-5PS)};Ro zmkM-AVmoz>!FN46WrON8GrCY}?!0u$gS}57_W@o03_6l&zm&TXYf~4>aVJxE$sg!S zAs=G8zbl3LxEs~|JErj&~O)XWo z{_IxxzQ8n`Lwzr=59Ol!s_ussx$pUeSd{xQXmjotpjYQom>ZdD3Gd3Kl-;fKHv39% zb$r`Vquckv{*=P70YtTg8wXN(bdGv7xyP4#WVuI^9!DKVkRDlj^yv|&$K#CyDaXXF zs}g9$k$c}DqE9e=fvGN`-3kvQr0sqa?(T8biS~$y8}eIxO=28$n-{u@0JNVMyXvvvBtUDYLPvS=Zz=vuXh5yiec-QwZuDZU5RZ__2%9Rd zfR^;)D~X8+nToIqnlcHlQ}FlVt1rpmq=APMZqQV$byC594^%s-U+s!Ksj0;LHV8z}*o(3)Cy- z$sX{%5L5y81ZS!21x_s}PN$&ly`oNLgA)XmIFZ5kClD?N{7YpY@RxxqgzF1VJ@#Ew zMFXf3+0g$I;rfB|h3pUCe}XD#{{e6dH4uCWN?#@#1Wu(o2b?9K3NyoC#LWlw3cnfx zeibP0Rbyt6m@kHcA7|x(?*&zuJ7x0w?%)&~{1jXCn5l>-0AvzziaVr8;Veg|9^diJlm|3QPU(Ga#zN7F>q;hcT zF)t~xjA^r&4o;Y93({7Y(TLuNc}wAYyK~`tC-PC^Cro!BH-)wGLeOV1k16bQF9v-Z zUwu;I9qfci@h4CvK0wY=dCuS5gf zUo-tyguwX*REmFz<#2z;G((2r&Xg^nJ>*KzzH&9fEPhJjpe^9iSTnl=hTnCyj zH-JAzZiIU@)3Nd@a0)<`7$>iWyAV`~@$wqbGI=dHlR%Z2EPn*|6i|gP3SAHPLYzh^ zoY4_oEVqJl3DatMGdNYCkgB`|?q*OaTI6=PBTQGw+re20iq~YwpTNDE>E-e+a4rLt zVy)Z>_Zm>#j*>rx`wFJ(<KkAc6P>Fshq__u*dyp!q)xbI+kr+gBeyFiuLA%6q+ zPEg#imxti~DX79*q@ITRXP^pijd}*|-JnX`D}M|3eM}#aN5HwC=^jbnp!&Id5u68^ z?w7xV`*EDRDZIDn75E+iRpLqc8r;7IRd_Ga8=wc}G00gu4pm=)GlXfL`Ud=SnGRRqfj^AtDD`i+i>1m~wrf2Q!AE^!ajdsR>HcZ1^F7OFSg_kl`0!=D59FF_@q z+3ySY!%Tmr`oXWX8ec|hAH5{C$m>yQ= zf%6Qg!rt9T(BG=j;5-Yeuva@4?&m<2cwUVIeF5*&#Mf2S1h`*h`a4wu&dZ=m{85#{ zeOyg~`%j=!{8>$b`vlX!sB&;lGCid(0RLT3^as3|Qi=DN{!Pt<`%5(&^eZ(NzF&i4 zF1F@@Dr-Jy4{IUl0PAAVLDph~IR~_xm?169D_4My7C*Fx$;$Iw3WZdQIwGsUN3W zX?LdmEbZ~Mr_%0Be3>hp>ol@cq|>g>#a+T(uI+Mrmpxsc>~e9}maa#-9_{+C zuAXiayIs(&qFa5pH@l^0G-j;KxF+Lh#yc4wX4GU}nz=c1Yvzv3DOrcIj%2-&bv)~{ ztgo|v+x_M4$GUsg!?F_kM}K!Get9045#1%mEOGAy3z^cepe`8I3pjk`_M9OO_f|2?*NlgvZHwBu* z9C^~J>OfNj8M>0nbC_Wh!I=nW;6w?C@q2|@5aKaR;G!$AE3;>0jLXF{o zfn2@P`e2|jVu~rsg5l~=V`HE?5~!K90v;vJwP8DzD1+oOEf|gj8UxJ}{o#NpN3j~p z0@a}!R5B{fJQo|5NK1Vr*yL}H*a2sRB9lWcjWyA#l(aWx=&NnP`^dDsaV~l3uE_pE*Up8XGuag;_KL6)WVVGmTC-lZngk5JEd6O zxD@fYUy6yLn$=PH=y9Y6`eZ-FT+KNmDH{7WYfhjg?60a1%nem93q)oFA}d49%kUZK zfax2if9iH2U6e;o%_UiCkxvfR2TVwpvm7}!H~Q;!GdVp7v1$XW&eROkf{lS_4dw*= z^$oV{=Qa8<3Pa7o%g~D)ZN!ynjIeB7Zj5TT!qHlCexS<8_k8~ff4I6i*c8!>@`k4R zKm*2ymLpft)(T>h_7W5QHKw7X*;7cWuQ-3MNt!q&m_UYeF+Po4Y*A5*p=)Z*tb0+k zEm&Q*WkQn$tJ~@f2+$R9E{Yux7<~4SvpbkpsMJUt+J;m_TTOD0Fh!peKV?T}>LG*_-QwRbuXHDDDPPURn=L zMIBNr=4yW!in%^eOLcS#A<8i&G=;e18pS1|1=C68m4@o;_0S9FO`$mU(D-8Nj7$qO)<){=04|OWLsNE`Q{$=P46>fv6sQjR>uI2h z8UBXAh5q^$Ozw7LaNMb^%yl}{A1_4DBkO{M=Ejs~dAQ_K|0<4Vra}s3oD=}#1Y759M3?m3#-F8*gRkEv~d+Ma-<`9enHl^Gql&uiv z1gZnU6=c(nR2O3bYyVPG_U*(4-GBHpaY&5|pHP#rH=>ixP zS_?oOwV>bC1VklSUb?-}#-yi=2RCaCHw*XnG7JqKG~_`74AZ!vR&xOPl)@~F2!BmY z<-`D{y?}0&W*###$5s z&5X1-Z^NNNl^VBJLIGjp%0_f|N&+2TRD?`Nq}VhLI2j%cTr=%r5ACdMgw@8qv6Ad= z7_xrUwlcsf1!ZcYj#^n0YVZdeIW4Ut!kn7zrp%lk%?{g#0eR02RJXv~;v~w$Hi~u- zbPqCKsPZ7t$FQU+9$I`p%-}NUXPu=Bv+^}lH54l~Q8Yp1W!k6>j{=#g$?1tETzj@% z$Y^ohg=v#2my|m`wUizLh5V;zS!Lx!bmL%S?c`vfzD8(IieU2NYT52WMJUj z8k?=MDbyUXm3~DXrjZ)dK)}dt@zv(+;Bb5-_@ad zls_CrqM|x#9aPqv<&>zbcUBwdosCokt>`GW$ym&6G_rBplY|>xh)|0}5&6vv2P&HV z)wFcc{kRQdW~0snJu=d~nzfH%Xa$E1HAZO+2TF#d6$v#(tpx}TV&P8dSP+J1`dfQ; zp}QCzIzY4v?qE(6!MKL$0M$p$q^Ar~>TiUG#z2}5(}1m2((+Jy{&tJS3V$uSQ*^xv zz3hgVBT2+(Sx%BB!iuq7Q@4e7beh~~brOL#35!V$O_9~264q)18Z=njNZOUPoNg9Y zQ(OaMokY-Tk(tm0wnc>*z*lg+`mM}B;Oy0Bzi&-J;g3Q9=ntPjI4P9A@2vse$nD}6k&-XVsQiDxK zo74+lSi^&Ka5coL7uYajbfL5Z5_Ce~%l5Rs;}s7^u5M%7m%S=6V>O6MnBrK7k^N2L z3PjxVI3Q2{Tr+mHotu_osS&1z<28rfcnnZy{#$NRuEpRYhG|-Ix=b+bQyJnVKh1@_ zwNu%kcN%!0iHa&Qt4d7eT^%vaUlphqr7+VW;%W@Ama2vzb@Li(BQt;1=$#gHpqju^ zKgh$DA3>J%eeB9Mcx`dL>)u(J9P^tY}OS+ikRo z4a;XiKC?nW%;GZ}$qJlEWp;Gq%tqZwT?|uFS_bo!TiUh)B&Rd5qO)RUSTEd3;AU|^ zag39=b6_k*0_Z|Kagk?RPBhFcns%ZA7?Of#n=z{D?FB}Sm>k4XpX6TX6sUvh#H8xV z|7_lrR|mg#6>pOeFP$O*E+h1cUVUJ6V^_$yx$U7BDw_jr<+6l$%Yy}twJ&Vn8l=O% zHZ;bUww1IY1+#$-vKmoHO0h#R3wbbfU{fchJt^d`cT6x!8vIR70cFa$l7RY21gydAgp;%&V1KNRffVpiwQ9bPOK;4D0QX;#(-EcHagn|le3Gj$z z7xW@&Ntn=;0ov?EM1SL)mPVnCA5lp=RDot2VV2@eY%1UMc3D#QZO=2|qM4dNQ3i!* z+uL+mDd3s-QOR%`(2BbF70p3zbLN`jw%u5S71vfqz|nG?DK9N#oe!5&@8zSy!rCBG$ z_7Zh?4fO;$vvG2;IUHf_ZYzJ?a9Yjl3QP%bh>0-tm+_z|bl0y#n^Ifamb`lxr9F?^ zyso8@v>bP2<0igit&)cW$mfDUpsA!Dn*(E5{Fj~yliG_=uD?JHPnDikfGDU~UPI}6UoSQhT0VZ%ZX zAvpBrj%j{q>pIsq6?YHlC0z@%e`7;!?HNA;W_w`bYP~5Eu-68a%N*&plTq6k?F81* z(_J+R?1+&z_hI+xI+0HsMxhZ|hdxCL#B3CH^wU!9$k$@-$afX4qbHTL1D6Y|J4f5P zwkf^dX3_TKH0%=VF-C%9mp->Niwr&s;Z;T+1>iMIG|u;i=dkC`ZM&IGJFi$QOl%3( z(`g#7x+aEJi8)xChbFc}A{YUcSXc4tK^M_p3-Ca402D8b2%M7e8idN`a5!KT720t+ zh^x>E)WOT~;X&1QaYEgpEr&&83eBBZ2hp`)28BTDgw0VDbRc%q8?l#4AYomx@y9evM~WQR~^3dHrDsFw;Kg@60kk8#v@NC-<_4ND zd}ud-s@yIDwR$_&lz?M1lk6s~!W6`(4(-AjJG=t6R345hTk8GIu=$%IXl%cPF$3ZB zlC1Ygbsd?{jO~pEDhX|AxK1iukT*WGSBFl+er5*m=xKKLJ9xMf=M4sX-HayJC;gQT ze47LkZ06H%-c8bHdS+5{&H{Og3r8VVPdE|Orc7AZUY}94Vd=wFG;8%T^g-IMHdjT= zb}&to=K28@LR(O}r`sz6Za-t?u)FP+m0eoX%Jz*8yNbGhYE922qo#L3ie_$}xQed> z>H7yf*KF9ZWYjW2WGl@T%6!_hp{EG@q_JW|;!JwF(!a}0V)a-y9t z0b`nBd$R$WG@wf`9cR!Lp&4k|HercjUxgs+r-^kq>Cr|y+p=xor8c9orKuj97EXXl zXWpVQ=CD~!+i}QeUfXEo-;PC_BDk$(PlN4zp(y7z)dwT!7U)hiL15Dr^Pqk3tv6t` z{U$0~Xhs6z%24)tV&<`LoX8IQ;nb4C-r;DfUtJLzK5Q5XKG=wj3M!>OiO?OMOHHZL zIWqxsbW2YAn3pd)h(eu92fbeCO0J_P&jv`lqmRz0Bj4oO!NXLtvW_;$E77?Ejvl1D zD-0Y53CP)!;yT;=Q{*$rnNP_pirV;1!^lVJStw2rn@J&UGlFxbgxWBs1R`iUx|>vJ z7oAiq0M~d05e%Rcxpw(tl`51{~4~2rKr2G)L=9?w>!$ila}NBQ=q@&_7M&o z!WfBseM|3X@arSM1 zVE5wvB04Mn(=*kWn~{P4F7g z_MkS%*N6RK_c-ARkTw`*HnR;o-LywTuu*FjeRhEU62#p~oB@*qt)&qp(J-f^yV-sYa~Sm!s*7BPi&|!=5o1 zP$|PrIH~2T@Hj$GVRgv0@Ym&lT42D^0LA?gCi%Myc z({(wR*wuXR2fbe(O5##P*j$_N>wN@mqfvqE=mogZF*fvi&mkRu%tc6DI&b6Ac{xzV9~S0FeuDcT3Fz=J{$7Y z^%yAJ9a-Cj(bN#3ZJ?vSVSB_uv@{@d8OCsfU$B+VMmjosy};P06(OX{I*c?}JM)(9 zCv+g5cQ{LAtp548n=__Do8Dv0MRrw55oZ~Wz2admOUlXstJiV&&4(g&xxAB zGMp2r_pf4CIGUV^NWtJ$6~rpVB~#kTp`@Zu``BAyxXWG@XpW|1`VJZm_sB#c-`*^$ zs;nF)O6TSl7LBc}EcI8TOO&9mtZoRkg!Ra?uTc-@^&XYnUdp=UiA4EE&;^0jY%k3S zt;C&dM?2wc7Cx+xX8D87xG-s_N{Lp{y#=-u>S+e0`$fF4gwX}92`ivHOi!j@D&p%# z_VzLHqIQ{)GA_^ab<%kemJ>Zv!VB2|J!^!$H@fhn^B)yuxnW9H+--a2>*4-T!9-9O05Vg!!My953`}jGRZ(s>bw2 z77yPynePvphp=c17h!B)*IhTGp)nt7BRPt-7N-i+9)xSkB$hqV5=|fK5wZQrJiePi7 zk*jGggHI0eLCF-l;6yH-0pS+Q7mvk7Pj!h@?ucQi3l#zikX%+Tk=*fX*OlV}f zIW9ggvG;mxU!H@p!>uhY~> zq%WHBVgvm=P}@xVH5h-`0y|ir|+x$;Kl~0V&y7E1|$juD2Gd8UGqEzm~>)#pE#@7^e?Z zwEt{e=Kp8GM!H7)i2p3gC|8v8{pNbF~ff_>V57Zv}1i_`)rI_Qg5yQ}=tKp~T zG196Ot0JTuj)g}v6tATaMk{=5 zQId*x9^}xmXJMe~XCCK;1I_bstE!yVC)$(Kh&Bzbc<~8DIqqE2-s;R|JkAAOQXZaP zhgA)xStxQUv6d@lyHWX!p^jlO@YV=d6OT_}<)!;kRHLwBr08UKa3yh!7(HmVwStRf zP8HDa*r$V#aMS6o-{S)raZ?9+7a5k{GtuEvjg(OQY*jC=CBo!$4e z10`5Yk)@_!I`AVNxGINy}6iTc#@zrxEGQg z!(JVqOfC;&!mO@~b_dw9QENsgZ+bHIP~)WhSfpGAe(;VVZ=AE))a-N>GPm)>+e-dR zEmRT01!)*xd>BG~oecr&eWr0BqCxaM9&u`C}#yAC-UJ(2*0zj2@aldQ{oav85x*hE6Ien>eCuBs?dN zSSxaK(H-#U^srTnGe<{}9&olX%c_tD2X-54@KAIUCFsPmi@^(JDh3yhLWW&4S3cW%TFsnE zOxpIt6TaFogwd`~Kt&lg7wG(lOh|eVR&QaoD=IV;Z@6erePgFBkD^9pfc{VO1C*QF z>fyrc8+5km22DAonVz@AEm40X)*HN6jF}aCAXxJ|OF7;W!7y+0ppL+nt$uKa202!C z&dvl`sU`Kbv{6>qz>6CU0%B4WT4m6_Kjp~pafm6v8#zQw5bwznDb?7jz&02*9f^ug zm*agDYw>2K%f)c~9Y-N8d?X|@fH(U!;Vnh9JsD~Y|q&L@n|nKW@Y@>zFmr6?8EoaH>Ff=g@XN~O={de|wQIh8Pnsx{KX2W+NH zbJcW#R}w2>D7aSjZa8!HED-!-N(gl)RF7PcRuain=i9*T;qFTn2t%Po8kK}3g^fSBYVm5qQk0<) z|FBJl+^P3qa~ol8S=jy2PJ<5c1ps z$Q`@>klZrJhT8c1>Lp_q;e9&7!hd}E1e>||OJ&6f^W~vL%o%{w0i;PiRm(hrch4+^ z1hIdKH?-lo68QOr?C$5@P-kjmk1ZarKD*Y~enHr1E9!Bpdt3`rU5fJR-Zd3}ae#t% zt~G*EKg)x>s6^B*Xp@8}5*F&-kLph2Ihs24=xmm-9ZU8-Tc}2^Wj#`s11JpDntG}p z7bHn?Q+wgN66}^1N?}18#AV~nfcWdPr6T-it|e(4N`YEN*OK}WrADQuv7IgKdQUbI zcGo(}qr7xlB6G5FMf(LQZ#oS|zg;zH0Emtw{u zO@#v*pazsPg88WrdI0_}FLXu(^_*y$6hhBoeNYRUJvE2sN#fY!qAmAwywz|meBGtc zAx3b#BD}))Kg+RW3U4@h(NN{_2@LsB~pX*wL=9rz%pMy32=nfRdXUiq!HD zgxBKH(;4AB{zt{9)RsXUtD!R7N|4fRL9R3y1|rlT8qjMCIZZv-qw1F`PO5zsXh)He zd2q2YJQlNmRLJC4Y5XW=v;=NpW}|EnLk#i6`m6r03t_kI_ZFt%?4=+bjB7ZUaY?h* z{Ffr(s;}R0_U!7o)7C)#jsIm<-&^65Li7bcn;`XQDXnsJE46LKBD5!U+(NWkGzQwQ zZ#9N7^+D=ydYHB4Q0xBtzo}^35!|*|?K{^n78XhO>^Vk@NA}37|0D6*{f%3CG`@%h z@zAg%+q1p?X+M~3VT&n+C?U^F#?k zyH+pzTx4a3%wRzJ7qqQSRKaTtX(eLPd}f!QR5z6{8+^S! zuzgUoB)zKBJxF8@#|mv2>_9zLP!Ay~1%ynq*GK1KRhWk`V(=`M4(Ttq)o#b2iHB?q zvW>-rGNgnnHK+yIb9R5Fxthwf5@n+@l6AKVq4fGn_fEE>&#gdATBVSZz}6N*kZq;c zc(e-A^&**Z_}QfhO?EETx_!Iqyr>6J3sU}Wi-gKV9Jj<#gV__2vn|8uT9qb9N&(k+ zkQPaq>R$`)N^XNXxTq~?9T8m%a2Y3^X%$9k(L_q6(>5j9{8eYno6;2L{=fFFH8zgx zI^UV)?#wQ^BhFAXMQc}DMV3v)T1m92gt9G2vZUB-B)>={6v9A|Dbb-rT2I$e9W^tA zgS_n4LG2$w8&pK&!Y-7?1{5?&W7G)J)Qm3pCix3ChM^WuZasH1PaeM511;O#zfmtY=?GZ=YJ z`xxT9th^kT*-!#ZM|~^KuaZ+vL;2HxGy~RQ*a6xwj#&WTTI!P@&DIIbShW}(hCFZ3 z`($L9dVdeA|JF!#8_zUARm5-P8OpE5Z%uHQMvTPUqj*v0%B>Dd`v>schh(m*q1hk* zAI1ByFBzw7uT7cOff2gtkSNTenwNc3rF%99$mxG#nJ;(Mz&p0dp{gCMKBM$slsOOs zmIu_y%l8a!?#(p5Dd1)E-bWOx2Tp+d$bUB8Q>^WPR5roU{A~gbN)4mMhjFI$v9Uc( zwR3zwMpv1j44xBt)=UMpZf69OWi%VX#z@!_ zBOI3RCwtyOHi>%aL!f|-Nvz*)3g~$^d(I?0%MfUPv|^eAqTe=$s|EZ@47>ggj7&Ss z*=Ie7+#T!W(DpW(b)sgZMqxa{-mNY5(<=~+%>}Qzm9OLcx+{qb~6Vjop z=ek*yh`CfSH#<$8HXgk?CLgookgRLfM4Fs9QPG>Gm!p>3ku1FVh?fsBU zQh}OB?Wxr$Ej@hiA!s*h9s1BJ<9UCA*w-8%B@;XC&`L+9o*}>KF~g4Ol1Rn|^jkE3 zC(l}5U3sJx`rO@#*SGxSj?VmL`;%SJ?|Sq0ndQhlZD`)Tna0RGwDytmPj-!Z=uY6C z9+qM!-&T2ApP;X6vzL^qOuElgGGJ5ly?g-qoDUi^s<|mkH`;je2mM;oG~*?uD7n~b za<)@g)UU8qrhiUeLEGH=36mP;n9cdMYdA~siB?Xqllx~e|2NBanjv~W%%ZmUZ1(17 zO-_Gns{-ohU z!o@XX(X zk;k!0vAQ>J2KAnL@640Z2REBJj|+I3u-FJg+c5vYHcnAmhJ=bT$yrhRm;&?(RtNR~ zC#J}mnG^ZE2qiCz#b@Oi`f#K#H9A*A^0p+CF4aPrmC5dydOkDUng2EGX}>Q3+vm_T z`H9{&@q|^`kTB`X=T6;(62?Bo6Z!?aae*jO#J0`|;En%&|K&Wj4Nf z56l_m=R_UO*>u(+y}0pbj3n8wJhYhqt*d9hepY_a^iu08G$!nvxhYD@mSVn+*)GO?)~_OE&Y_;N%7{-a?3R_X0o1{?yGm7f10mPk zsDW80t5=V(MlCsQJar^BtlA)zjyY&S>PzZeCVtflQCrYo>dp*h{zsO_VUM&-Tumdq z&fPbN);@`O&?2c1*co40S#6)MdZUy|&P(U-)XB-5ZD*7wu~^k=Q@Gdug4A4~}&8p4NG@ zfE@ciU{5ThX-)Y7bGc4L+=wetTmh8tXFO00P>TZ z)yCD@ruRL1M{m|Hy^q`rd3AM){<28QcHsFu=4Rz!0TgAn1Rm$Dt3lHKB(rOe;Q4cS z%I2yakD6f?-p6WvtX5BG?5dS1KFAp~S8MwquuGf93@|N#KwTs+n;{-mZ|#5vVjJop z4e^D|(Nl!~V4 z99sA6t^*FEWE=D;ayFdZQ|{LKIqV(a{U+M#4jlTOw0wk?J~BOYXZ>OHMvc+k&RLW9 zO+k-aSF!@^RlR1LS5vJ`DW)fqdQmsN2T+^?tvP?S0O|?T&!C3RvaV*0a>Ob4eB>Jw z+Ut7&EA5N%$StQKJ$Wsa@jdTy-H4gOIXtl)y{NV~!xO+J$K(#H1&mC6FMY0`W;8NNGmk~qdMP5~qhd@@&BQ?Z#U=N(Nm=#mE&JcU}r1|o~e4+WBJY28m7T9Nq) zEPJ8btto3h!?pyA6JC@OjfE0JLp!EKI7Pz9=d&awz~5}2B(fKh>I0&k=N zeUtm4w%5fFI#ud$wVHLpCY$O#VlnfZp(l^u^rG8hZ3&eaS-Rs;jp2!b)a-PM>pKHQ-HIxG@wv?=`cD~ z-&CV$8{=9Y8N%erR{dtXPVaF;eD(-NINHAPsX89{09J3;z%&s}RT9a)HLHe`%c8+JuZ z)ZrA-?zZ$Lv+R}`pwQUXWJh>oo9r5mtylFxoyReu$=u#vO%>B%0M2nYtwuOw=D^*~V}yU~-@5!B1fXOt#zzg=_)O(r^rTB0Lk?!8Cw zMm3m4;+ivJZi;G&JVNYKb&^ZkGV7C8fwzlPCtk=$+)qeI$e~KHl`skc!0IJ4QH(}( zwHqG98qS+}4^rmC$hGIAd}2d6K%+s0x_i5n8Ds?Bl@mZ*%DLLHBvvmoQa-^5edsno zOBKY?Y45p{8__OW5E``TW!rq2?NN^}^~v^(5CfeUCJ(55XjZF%tz5cYY+K43jKPqP z9i~aryjOdlW<7CgO<%`7WEhZf0p{{h;L91e9uO`fmylPQ&>+Nip4PPqghlW^aU4jjXx>s?n%t z2rDyv9FMIwA=kCnm;<*1v$~r+i(;(_xhTEmAt2qTBXyiqn+_{AGwN9X&gohy%4@eQ z*CcXXy$yIE9||XSWcd*(-^@t6J;!0k)%ccjlFz9iGjOBLrXPpqJ`N1z-62AM93DJ% z1-#5n^uxPba7|oWI919a4YR~Hl4Z+wx}>_kJ}tShJJBbz`1iGqXm(K7WjZu-G?cH~ zR|%n4)>!y&fxN;-h4%V9cwK7XX><0Z2X(EQZp~^?&Zxs^j|9VmlvK^=(&bS7=o}y? zei;AuGXXcG`D}7!mc!LNM`oKcFCKXA&DP+|jTuLgTh&UFpF8&~VSdBJcYcN6N}ur* zZWF5h(i}Y3;7u=|A^eDn*58g2wf!vm&+0|nwQ!{?DabqmO5573p=H$_5iFVJN_b?h zh;bWjfMQdrYkD^W)AR=5#N{#==?;q>b{5_GQ{!1(InekFSit8bsJ*QGyv3)6)Ul^j zQx}oSl5H8f7c?it9rcCl5lL-9{0vPa=YtseE{sgtWRj!qZPvHCdbW4rqs^8Jl?QDO zJ#%8gsYBF8bP@?w&KHthZlo>cXk}MjH6pn=&l$?e3#f%I7$!H;!KH0x0K?sw+@Ik< zV#o(`V(|b+HGj=Lb{v`ffqT8#mD#is{j;8-<2O?txR$jaI-08;+dHIt1QwQd;8FaW zHF*n<&mOIBzve77AJ5q^$RkHj0ybir`h^m1Hm`Pv(#O0laJXd~jw?T(YgKMwCNQy6WW>f?&2FZihp$V8id&QQ zE^2j<*yZ>q(#(R?7MjKpw}`VQHcvswOz)hONmR3u&+!hoR}kmK^CDUufis71$d-O} zW_!?1-EFg`9X?b12vd9quKCQXpZLJy9lzE5hwnD0U-(z!|G}@!yl;5y`=9a#qq-Bt zua)GyO;01mh7&b{Lc{ny4adR3L=DuT5_Jyig5roY8DSGs57?wBO`2%p78@pvUoD{_ zPPmAYGd#wRvE3+I1acYka)yUp@+^+769itP;Ma@3&*!7~aXBStJOCBH67B36;dmn$ zuP}m=|qdiiJ z_Sed&Wo5LdPzn!~&@wy}uqjSa6%dDq&?gQJr-r!z>KZF2IE`?E7;+W*XM0A_f^8?< zQh?4TJRtdq8`RvA+f$0-XWboGKrLX};Y7JnlrvEPSVz+Sc1t}*7SuQaN*t$N3s|XtCQwC^3&>!^Is*O^#M~jxKsErh&KFlfF z6ZPSaK)5IBP9I?Ehw*=p5ae)lk4)<@#tDLY&2RM7K$JSzr3V!p5c7jL1to|FPIz*r ztn|jE@CjrCh?((>%LWh}CvbZVz=g#bjLz~gUrPgqhR z{7>P(bcYoDJ8{|%-4NW3gy0m`t?x!`Hfj8OP?$tT=^oi7P?>@m-Vc}ckO6rYdJKMg z93EUA3Oul~r-%a?tQIbC9v4c`SQosl1Qo}RDhIa!P6n%eDfDga|7 zeXZ2*I2))F!5Q;}Wu6e&ZoU9XBM9*q07HhusWmA&71zlW)RP}X@zd-F!h~Zz0KQxt zp}Jfbj2^$D_;Ur#p96(n;)FiW!#8y@-=y-QGK+Q!JUan2b#Am%z=(FH@?yf|WCcw{ zj^o!`#bj-(7+;}wPENweK-Pf{IVWq=>nj}fbskts)^dEb2E?lU)2B#7Jf5sg3v7*M zgiz@y$M6uWN`g0038wN z*GNKeIZzC;rBVxS0^-4&uAg#Kz+T3DLkXoT3d5_O$l|;CYGzlYnAIk8LhRx z&p@%p%X%T5)M~tsP6C#+Ulbs>L9a4IbSa8|44}Xo zDzYO-SA2;e+Eq5L8_=zhZoWw44I3N309~yGSZG$EV_1PejQ|Wj2YuXXu*BF>d{vYQ zwAvJ>c>y@0jr=H^f1Ne8q55`UGV(Whdf7a*$8l%^0JkHRhjJEIjtv@P>d-wf-np&=lhj^Y=I9inNQa1D>qHo}RSZA*Ot+=EB4O$-{F(nW`Z z$fhGI8SorN*anxXFyqUaBEAf)fM>xdz?2rEV|}K_7Q+*%PQKi4_tD$Wv~^UB8ca2s z0h$YL(C_#AASPx(A&ja56uo1($WR?sil9hfAW{U=A5Qd{GH{#zlp9om{OK{UI>0zc z8Z8oMVf>%*Wpf=Ik=U50;ER;#pWynwNxa>=#~{n?n2UdO?Ac!*{?;$`{pyaV!lBO| zI575?&p&kbsQ;O@@4WbXH_yhubJumB{n+BEKY!^fQMqvKi$6U%SO3XxUVrx9zjgj; z^Vfd*wR5+9cgOhyxAgzTfoESlu<18~FBRW-?`7x9??3!^HRp{VA9?-o4WItRSN`<3 zU-kd$x?4YX>(w1Ux%m4}{_f#VH?HkDwC0%~e*Kf*C_AP{UczO_!nGP_K)w3~pp%|X zO({#I;KH3VhypOT0cQZ7m5bwm(>E9;gU(=>45M`~sZ`g$zJ8~$!Sru{iv=gE0-k=h z*Mpz@to{LCZs0$^_xQ)cZ&z*+0g}<(Z~}3Jal@p^5_k=#q$wO-^SweKH`Y7m8oWfT zF@YCj$yS>&8SQ{YG;Zv17w_byhFb)adaN#`f7ms(I9yOHB z9*$GPI6W@hAaH@_fGY_6lLGvcDB#bpsM|2U)+>l{AI~3q8jdf1v9Edovg%eUVRA1# zP=J37Q%7tFE=(3FjQ|WH%HvwE0tYA=XE2f6R;P``Eo$Yn5K1=ya?h5PFtpbybn$Ct zqV=`t;V9(D1)6W)FM4pM0!)N0gP=+_Rw|(aS7);;@cV!%w{G&%83v|XHEpfYy7;L-+&(=$ohKB8KVF6g!~`#aCUDPz8Yl2P znA~MVp&o1~W~rX|I~-HT3z-`8_7z>HPB!LFpKI_vw({;ZWaA)qoF`@jBNZl3pybOL z&{aI#)2=KIlY_ldsV;q=M`2I>`w%!y4&tv>lLCTgXaJL^ArAu%dP0c-0c*qLb7?J0 ztOZ?DXrkovDBa){6$sn6L<+4jq=&4xLqYM3=(kIW(qH^t_&+hH5rTzDP|DSFKj?9L9+x89J(vvzBY* zIuLvfh(9D6+*idQ`@qq91-$|eiS|*yz!ljivh{?>))P_8KT1R`8rIVo zm=R&U=TMZu#%?c@984KVI1>#QA)v_%K(in15nnU;Dm=HZ`u?C-_R%WYhsY;+Axi!@ zO8yL@%;sm%9Kuz`EMXo2wfIrBz)JO)mFh8(>hvhO?R%JWlzd10m*ji3DEW5e!DfCN zb#mu>QSyVpm7uZ~H7S_M52EG<(Uy$cIML+qqvRqG(&EA?$Pw8t>Co15lz^7D{1dG8&uP2pGWJ}rC2=|t?U(RwLl~mr2DulaTXOF~Erq{c69nRR?%W2It#>y#*Q5w&!wQmR=#B#LR6qfE z%3k@xa zmsS}pmv)@0J9`C}j$x%`yQ?)1?D9$!Uxl8>8UVCEepBLJ6@7R?09hxhcpZXGjW?}&4jh~onj-I^#rsmj9C+C{?pPU_Uj*q=-Z0y8MqjR(G!eVHjW4zJr zJNavj?--^Eq~J?o19Jsa?lt^gPJESD>kYMdb@u5;&I`2Whkx@Ycd;=aUBds%-*L># zf9N3HaBy;{=PQqnTt0o|^WR!~WMcPV!bOq;x6I65eBhD!hh{!>dhyiEEZ!=7@xhse z2WMySW_)~4?P7Cb{{Hh#ymWge!_5r7iTR-q=PU5tT{HOh5qvk+sa*AOeE-8klki&sy?To=!7oIz~uyEuAUNOFSeimO(aBBO>1?)w@&wp<* zjeS!3#o_+~1CHs(Fzbwo+eaf~8Uv>7s%N`9@jv~2#~dcZr9X!YV<^4POkx+-`>=?2 zA47hWjn08d-|lb;aj!zcMN+rfdkBU0MByQ3-?TN zjEk-PrR@F=)ajeRxJ#;mMNRujT>WszesjA(vCs6PA3N?r*<6zC6iRm<%6Pi#a1t%- z{%Llw)A+gPbw6C|vpTr1Z~NjKzvQi7SZ^Iddt!=daDMKX8#nB(HqNVioa3OAe&TZy zn>!ZK(@8v|(zyUkgX-u@KZiq%oB=Ml4delA1Hnca!BTr&!#oF^ycHZZuqlL?hmOT3 z3<&$(Y2Uj0Y@vm_)@GZxJ%@3jfqpoHpETvp$P6PZ;{@PfyA5&Q{#+*oI`Ka)&+G?B ka_bD=KA>+4`&rL%y#KYIR~*xa&M#wI+An_o|6$;N01myQJ^%m! literal 115712 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 diff --git a/bin/HttpServer_OpenSim.pdb b/bin/HttpServer_OpenSim.pdb index b6b77f75ebcc8b228a47a5fa4012037b16579c3e..b9161e1802f78b40d40abb781c7a8650f0c0dc5d 100644 GIT binary patch delta 110924 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 E7p4qXFaQ7m diff --git a/bin/HttpServer_OpenSim.xml b/bin/HttpServer_OpenSim.xml index 27386b7def..d31bcca992 100644 --- a/bin/HttpServer_OpenSim.xml +++ b/bin/HttpServer_OpenSim.xml @@ -1,5456 +1,5453 @@ - - - - HttpServer_OpenSim - - - - - The request could not be understood by the server due to malformed syntax. - The client SHOULD NOT repeat the request without modifications. - - Text taken from: http://www.submissionchamber.com/help-guides/error-codes.php - - - - - All HTTP based exceptions will derive this class. - - - - - Create a new HttpException - - http status code (sent in the response) - error description - - - - Create a new HttpException - - http status code (sent in the response) - error description - inner exception - - - - status code to use in the response. - - - - - Create a new bad request exception. - - reason to why the request was bad. - - - - Create a new bad request exception. - - reason to why the request was bad. - inner exception - - - - Implements HTTP Digest authentication. It's more secure than Basic auth since password is - encrypted with a "key" from the server. - - - Keep in mind that the password is encrypted with MD5. Use a combination of SSL and digest auth to be secure. - - - - - Authentication modules are used to implement different - kind of HTTP authentication. - - - - - Tag used for authentication. - - - - - Initializes a new instance of the class. - - Delegate used to provide information used during authentication. - Delegate used to determine if authentication is required (may be null). - - - - Initializes a new instance of the class. - - Delegate used to provide information used during authentication. - - - - Create a response that can be sent in the WWW-Authenticate header. - - Realm that the user should authenticate in - Array with optional options. - A correct authentication request. - If realm is empty or null. - - - - An authentication response have been received from the web browser. - Check if it's correct - - Contents from the Authorization header - Realm that should be authenticated - GET/POST/PUT/DELETE etc. - options to specific implementations - Authentication object that is stored for the request. A user class or something like that. - if is invalid - If any of the parameters is empty or null. - - - - Used to invoke the authentication delegate that is used to lookup the user name/realm. - - Realm (domain) that user want to authenticate in - User name - Password used for validation. Some implementations got password in clear text, they are then sent to client. - object that will be stored in the request to help you identify the user if authentication was successful. - true if authentication was successful - - - - Determines if authentication is required. - - HTTP request from browser - true if user should be authenticated. - throw from your delegate if no more attempts are allowed. - If no more attempts are allowed - - - - name used in HTTP request. - - - - - Initializes a new instance of the class. - - Delegate used to provide information used during authentication. - Delegate used to determine if authentication is required (may be null). - - - - Initializes a new instance of the class. - - Delegate used to provide information used during authentication. - - - - Used by test classes to be able to use hardcoded values - - - - - An authentication response have been received from the web browser. - Check if it's correct - - Contents from the Authorization header - Realm that should be authenticated - GET/POST/PUT/DELETE etc. - First option: true if username/password is correct but not cnonce - - Authentication object that is stored for the request. A user class or something like that. - - if authenticationHeader is invalid - If any of the paramters is empty or null. - - - - Encrypts parameters into a Digest string - - Realm that the user want to log into. - User logging in - Users password. - HTTP method. - Uri/domain that generated the login prompt. - Quality of Protection. - "Number used ONCE" - Hexadecimal request counter. - "Client Number used ONCE" - Digest encrypted string - - - - - - Md5 hex encoded "userName:realm:password", without the quotes. - Md5 hex encoded "method:uri", without the quotes - Quality of Protection - "Number used ONCE" - Hexadecimal request counter. - Client number used once - - - - - Create a response that can be sent in the WWW-Authenticate header. - - Realm that the user should authenticate in - First options specifies if true if username/password is correct but not cnonce. - A correct auth request. - If realm is empty or null. - - - - Decodes authorization header value - - header value - Encoding that the buffer is in - All headers and their values if successful; otherwise null - - NameValueCollection header = DigestAuthentication.Decode("response=\"6629fae49393a05397450978507c4ef1\",\r\nc=00001", Encoding.ASCII); - - Can handle lots of whitespaces and new lines without failing. - - - - Gets the current nonce. - - - - - - Gets the Md5 hash bin hex2. - - To be hashed. - - - - - determines if the nonce is valid or has expired. - - nonce value (check wikipedia for info) - true if the nonce has not expired. - - - - name used in http request. - - - - - Gets or sets whether the token supplied in is a - HA1 generated string. - - - - - Class to make dynamic binding of redirects. Instead of having to specify a number of similar redirect rules - a regular expression can be used to identify redirect URLs and their targets. - - - [a-z0-9]+)", "/users/${target}?find=true", RegexOptions.IgnoreCase) - ]]> - - - - - redirects from one URL to another. - - - - - Rules are used to perform operations before a request is being handled. - Rules can be used to create routing etc. - - - - - Process the incoming request. - - incoming HTTP request - outgoing HTTP response - true if response should be sent to the browser directly (no other rules or modules will be processed). - - returning true means that no modules will get the request. Returning true is typically being done - for redirects. - - If request or response is null. - - - - Initializes a new instance of the class. - - Absolute path (no server name) - Absolute path (no server name) - - server.Add(new RedirectRule("/", "/user/index")); - - - - - Initializes a new instance of the class. - - Absolute path (no server name) - Absolute path (no server name) - true if request should be redirected, false if the request URI should be replaced. - - server.Add(new RedirectRule("/", "/user/index")); - - - - - Process the incoming request. - - incoming HTTP request - outgoing HTTP response - true if response should be sent to the browser directly (no other rules or modules will be processed). - - returning true means that no modules will get the request. Returning true is typically being done - for redirects. - - - - - Gets string to match request URI with. - - Is compared to request.Uri.AbsolutePath - - - - Gets where to redirect. - - - - - Gets whether server should redirect client. - - - false means that the rule will replace - the current request URI with the new one from this class. - true means that a redirect response is sent to the client. - - - - - Initializes a new instance of the class. - - Expression to match URL - Expression to generate URL - - [a-zA-Z0-9]+)", "/user/${first}")); - Result of ie. /employee1 will then be /user/employee1 - ]]> - - - - - Initializes a new instance of the class. - - Expression to match URL - Expression to generate URL - Regular expression options to use, can be null - - [a-zA-Z0-9]+)", "/user/{first}", RegexOptions.IgnoreCase)); - Result of ie. /employee1 will then be /user/employee1 - ]]> - - - - - Initializes a new instance of the class. - - Expression to match URL - Expression to generate URL - Regular expression options to apply - true if request should be redirected, false if the request URI should be replaced. - - [a-zA-Z0-9]+)", "/user/${first}", RegexOptions.None)); - Result of ie. /employee1 will then be /user/employee1 - ]]> - - Argument is null. - - - - - Process the incoming request. - - incoming HTTP request - outgoing HTTP response - true if response should be sent to the browser directly (no other rules or modules will be processed). - - returning true means that no modules will get the request. Returning true is typically being done - for redirects. - - If request or response is null - - - - We dont want to let the server to die due to exceptions thrown in worker threads. - therefore we use this delegate to give you a change to handle uncaught exceptions. - - Class that the exception was thrown in. - Exception - - Server will throw a InternalServerException in release version if you dont - handle this delegate. - - - - - Delegate used to let authentication modules authenticate the user name and password. - - Realm that the user want to authenticate in - User name specified by client - Can either be user password or implementation specific token. - object that will be stored in a session variable called if authentication was successful. - throw forbidden exception if too many attempts have been made. - - - Use to specify that the token is a HA1 token. (MD5 generated - string from realm, user name and password); Md5String(userName + ":" + realm + ":" + password); - - - - - - Let's you decide on a system level if authentication is required. - - HTTP request from client - true if user should be authenticated. - throw if no more attempts are allowed. - If no more attempts are allowed - - - - Interface for sessions - - - - - Remove everything from the session - - - - - Remove everything from the session - - True if the session is cleared due to expiration - - - - Session id - - - - - Should - - Name of the session variable - null if it's not set - If the object cant be serialized. - - - - When the session was last accessed. - This property is touched by the http server each time the - session is requested. - - - - - Number of session variables. - - - - - Event triggered upon clearing the session - - - - - Arguments sent when a is cleared - - - - - Instantiates the arguments for the event - - True if the session is cleared due to expiration - - - - Returns true if the session is cleared due to expiration - - - - - Delegate for when a IHttpSession is cleared - - this is being cleared. - Arguments for the clearing - - - - Cookies that should be set. - - - - - Adds a cookie in the collection. - - cookie to add - cookie is null - - - - Copy a request cookie - - - When the cookie should expire - - - - Gets a collection enumerator on the cookie list. - - collection enumerator - - - - Remove all cookies - - - - - Returns an enumerator that iterates through the collection. - - - - A that can be used to iterate through the collection. - - 1 - - - - Gets the count of cookies in the collection. - - - - - Gets the cookie of a given identifier (null if not existing). - - - - - Creates request parsers when needed. - - - - - Creates request parsers when needed. - - - - - Create a new request parser. - - Used when logging should be enabled. - A new request parser. - - - - Create a new request parser. - - Used when logging should be enabled. - A new request parser. - - - - Parses a HTTP request directly from a stream - - - - - Event driven parser used to parse incoming HTTP requests. - - - The parser supports partial messages and keeps the states between - each parsed buffer. It's therefore important that the parser gets - ed if a client disconnects. - - - - - Parse partial or complete message. - - buffer containing incoming bytes - where in buffer that parsing should start - number of bytes to parse - Unparsed bytes left in buffer. - BadRequestException. - - - - Clear parser state. - - - - - Current state in parser. - - - - - A request have been successfully parsed. - - - - - More body bytes have been received. - - - - - Request line have been received. - - - - - A header have been received. - - - - - Gets or sets the log writer. - - - - - Create a new request parser - - delegate receiving log entries. - - - - Add a number of bytes to the body - - buffer containing more body bytes. - starting offset in buffer - number of bytes, from offset, to read. - offset to continue from. - - - - Remove all state information for the request. - - - - - Parse request line - - - If line is incorrect - Expects the following format: "Method SP Request-URI SP HTTP-Version CRLF" - - - - We've parsed a new header. - - Name in lower case - Value, unmodified. - If content length cannot be parsed. - - - - Parse a message - - bytes to parse. - where in buffer that parsing should start - number of bytes to parse, starting on . - offset (where to start parsing next). - BadRequestException. - - - - Gets or sets the log writer. - - - - - Current state in parser. - - - - - A request have been successfully parsed. - - - - - More body bytes have been received. - - - - - Request line have been received. - - - - - A header have been received. - - - - - Used to inform http server that - - - - - Eventarguments used when an exception is thrown by a module - - the exception - - - - Exception thrown in a module - - - - Container for posted form data - - - - Contains some kind of input from the browser/client. - can be QueryString, form data or any other request body content. - - - - - Base class for request data containers - - - - - Adds a parameter mapped to the presented name - - The name to map the parameter to - The parameter value - - - - Returns true if the container contains the requested parameter - - Parameter id - True if parameter exists - - - - Returns a request parameter - - The name associated with the parameter - - - - Representation of a non-initialized class instance - - - Variable telling the class that it is non-initialized - - - - Initializes a new instance of the class. - - form name. - - - - Initializes a new instance of the class. - - form name. - if set to true all changes will be ignored. - this constructor should only be used by Empty - - - Creates a deep copy of the HttpInput class - The object to copy - The function makes a deep copy of quite a lot which can be slow - - - - Add a new element. Form array elements are parsed - and added in a correct hierarchy. - - Name is converted to lower case. - - name is null. - Cannot add stuff to . - - - - Returns true if the class contains a with the corresponding name. - - The field/query string name - True if the value exists - - - - Parses an item and returns it. - This function is primarily used to parse array items as in user[name]. - - - - - - - Outputs the instance representing all its values joined together - - - - Returns all items as an unescaped query string. - - - - - Extracts one parameter from an array - - Containing the string array - All but the first value - - string test1 = ExtractOne("system[user][extension][id]"); - string test2 = ExtractOne(test1); - string test3 = ExtractOne(test2); - // test1 = user[extension][id] - // test2 = extension[id] - // test3 = id - - - - Resets all data contained by class - - - - Returns an enumerator that iterates through the collection. - - - - A that can be used to iterate through the collection. - - 1 - - - - Returns an enumerator that iterates through a collection. - - - - An object that can be used to iterate through the collection. - - 2 - - - - Form name as lower case - - - - - Get a form item. - - - Returns if item was not found. - - - Instance to help mark a non-initialized form - - - Initializes a form container with the specified name - - - - Makes a deep copy of the input - - The input to copy - - - - Adds a file to the collection of posted files - - The file to add - If the file is already added - If file is null - If the instance is HttpForm.EmptyForm which cannot be modified - - - - Checks if the form contains a specified file - - Field name of the file parameter - True if the file exists - If the instance is HttpForm.EmptyForm which cannot be modified - - - - Retrieves a file held by by the form - - The identifier of the file - The requested file or null if the file was not found - If name is null or empty - If the instance is HttpForm.EmptyForm which cannot be modified - - - Disposes all held HttpFile's and resets values - - - - Retrieves the number of files added to the - - 0 if no files are added - - - - Interface for form content decoders. - - - - - - - Stream containing the content - Content type (with any additional info like boundry). Content type is always supplied in lower case - Stream enconding - A http form, or null if content could not be parsed. - If contents in the stream is not valid input data. - - - - Checks if the decoder can handle the mime type - - Content type (with any additional info like boundry). Content type is always supplied in lower case. - True if the decoder can parse the specified content type - - - - Lists content type mime types. - - - - - text/plain - - - - - text/haml - - - - - content type for javascript documents = application/javascript - - - - RFC 4329 states that text/javascript have been superseeded by - application/javascript. You might still want to check browser versions - since older ones do not support application/javascript. - - Browser support: http://krijnhoetmer.nl/stuff/javascript/mime-types/ - - - - - text/xml - - - - - A list of content types - - - - - - - Semicolon separated content types. - - - - Returns an enumerator that iterates through a collection. - - - An object that can be used to iterate through the collection. - - - - - Searches for the specified type - - Can also be a part of a type (searching for "xml" would return true for "application/xml"). - true if type was found. - - - - Get this first content type. - - - - - Fetch a content type - - Part of type ("xml" would return "application/xml") - - All content types are in lower case. - - - - A HttpModule can be used to serve Uri's. The module itself - decides if it should serve a Uri or not. In this way, you can - get a very flexible http application since you can let multiple modules - serve almost similar urls. - - - Throw if you are using a and want to prompt for user name/password. - - - - - Method that process the url - - Information sent by the browser about the request - Information that is being sent back to the client. - Session used to - true if this module handled the request. - - - - Set the log writer to use. - - logwriter to use. - - - - Log something. - - importance of log message - message - - - - If true specifies that the module doesn't consume the processing of a request so that subsequent modules - can continue processing afterwards. Default is false. - - - - - Webhelper provides helpers for common tasks in HTML. - - - - - Used to let the website use different javascript libraries. - Default is - - - - - Creates a link that invokes through ajax. - - url to fetch - link title - - optional options in format "key, value, key, value". - Javascript options starts with ':'. - - a link tag - - WebHelper.AjaxRequest("/users/add/", "Add user", "method:", "post", "onclick", "validate('this');"); - - - - - Builds a link that updates an element with the fetched ajax content. - - Url to fetch content from - link title - html element to update with the results of the ajax request. - optional options in format "key, value, key, value" - A link tag. - - - - A link that pop ups a Dialog (overlay div) - - url to contents of dialog - link title - name/value of html attributes. - A "a"-tag that popups a dialog when clicked - - WebHelper.DialogLink("/user/show/1", "show user", "onmouseover", "alert('booh!');"); - - - - - Create/Open a dialog box using ajax - - - - - - - - - Close a javascript dialog window/div. - - javascript for closing a dialog. - - - - - Create a <form> tag. - - name of form - action to invoke on submit - form should be posted as ajax - html code - - WebHelper.FormStart("frmLogin", "/user/login", Request.IsAjax); - - - - - Create a link tag. - - url to go to - link title (text that is displayed) - html attributes, name, value, name, value - html code - - WebHelper.Link("/user/show/1", "Show user", "id", "showUser", "onclick", "return confirm('Are you shure?');"); - - - - - Build a link - - url to go to. - title of link (displayed text) - extra html attributes. - a complete link - - - - Build a link - - url to go to. - title of link (displayed text) - extra html attributes. - a complete link - more options - - - - Obsolete - - Obsolete - Obsolete - Obsolete - Obsolete - Obsolete - Obsolete - - - - Obsolete - - Obsolete - Obsolete - Obsolete - Obsolete - Obsolete - Obsolete - Obsolete - - - - Render errors into a UL with class "errors" - - class used by UL-tag. - items to list - an unordered html list. - - - - Render errors into a UL with class "errors" - - class used by UL-tag. - items to list - an unordered html list. - - - - Render errors into a UL with class "errors" - - - - - - - Generates a list with html attributes. - - StringBuilder that the options should be added to. - attributes set by user. - attributes set by any of the helper classes. - - - - Generates a list with html attributes. - - StringBuilder that the options should be added to. - - - - - Purpose of this class is to create a javascript toolkit independent javascript helper. - - - - - Generates a list with JS options. - - StringBuilder that the options should be added to. - the javascript options. name, value pairs. each string value should be escaped by YOU! - true if we should start with a comma. - - - - Removes any javascript parameters from an array of parameters - - The array of parameters to remove javascript params from - An array of html parameters - - - - javascript action that should be added to the "onsubmit" event in the form tag. - - - All javascript option names should end with colon. - - - JSHelper.AjaxRequest("/user/show/1", "onsuccess:", "$('userInfo').update(result);"); - - - - - - Requests a url through ajax - - url to fetch - optional options in format "key, value, key, value", used in JS request object. - a link tag - All javascript option names should end with colon. - - - JSHelper.AjaxRequest("/user/show/1", "onsuccess:", "$('userInfo').update(result);"); - - - - - - Ajax requests that updates an element with - the fetched content - - Url to fetch content from - element to update - optional options in format "key, value, key, value", used in JS updater object. - A link tag. - All javascript option names should end with colon. - - - JSHelper.AjaxUpdater("/user/show/1", "userInfo", "onsuccess:", "alert('Successful!');"); - - - - - - A link that pop ups a Dialog (overlay div) - - url to contents of dialog - link title - A "a"-tag that popups a dialog when clicked - name/value of html attributes - - WebHelper.DialogLink("/user/show/1", "show user", "onmouseover", "alert('booh!');"); - - - - - Close a javascript dialog window/div. - - javascript for closing a dialog. - - - - - Creates a new modal dialog window - - url to open in window. - window title (may not be supported by all js implementations) - - - - - - Class that receives Requests from a . - - - - - Client have been disconnected. - - Client that was disconnected. - Reason - - - - - Invoked when a client context have received a new HTTP request - - Client that received the request. - Request that was received. - - - - - Generic helper functions for HTTP - - - - - Version string for HTTP v1.0 - - - - - Version string for HTTP v1.1 - - - - - An empty URI - - - - - Parses a query string. - - Query string (URI encoded) - A object if successful; otherwise - queryString is null. - If string cannot be parsed. - - - - This provider is used to let us implement any type of form decoding we want without - having to rewrite anything else in the server. - - - - - - - Should contain boundary and type, as in: multipart/form-data; boundary=---------------------------230051238959 - Stream containing form data. - Encoding used when decoding the stream - if no parser was found. - If stream is null or not readable. - If stream contents cannot be decoded properly. - - - - Add a decoder. - - - - - - - Number of added decoders. - - - - - Use with care. - - - - - Decoder used for unknown content types. - - - - - A session stored in memory. - - - - - - - A unique id used by the sessions store to identify the session - - - - Id - - - - - - Remove everything from the session - - - - - Clears the specified expire. - - True if the session is cleared due to expiration - - - - Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources. - - 2 - - - - Session id - - - - - Should - - Name of the session variable - null if it's not set - - - - when the session was last accessed. - - - Used to determine when the session should be removed. - - - - - Number of values in the session - - - - - Flag to indicate that the session have been changed - and should be saved into the session store. - - - - - Event triggered upon clearing the session - - - - - This decoder converts XML documents to form items. - Each element becomes a subitem in the form, and each attribute becomes an item. - - - // xml: somethingdata - // result: - // form["hello"].Value = "something" - // form["hello"]["id"].Value = 1 - // form["hello"]["world]["id"].Value = 1 - // form["hello"]["world"].Value = "data" - - - The original xml document is stored in form["__xml__"].Value. - - - - - - - Stream containing the content - Content type (with any additional info like boundry). Content type is always supplied in lower case - Stream encoding - Note: contentType and encoding are not used? - A http form, or null if content could not be parsed. - - - - - Recursive function that will go through an xml element and store it's content - to the form item. - - (parent) Item in form that content should be added to. - Node that should be parsed. - - - - Checks if the decoder can handle the mime type - - Content type (with any additional info like boundry). Content type is always supplied in lower case. - True if the decoder can parse the specified content type - - - - - - - - - - - Represents a field in a multipart form - - - - The server encountered an unexpected condition which prevented it from fulfilling the request. - - - - - Initializes a new instance of the class. - - - - - Initializes a new instance of the class. - - error message. - - - - Initializes a new instance of the class. - - error message. - inner exception. - - - - Current state in the parsing. - - - - - Should parse the request line - - - - - Searching for a complete header name - - - - - Searching for colon after header name (ignoring white spaces) - - - - - Searching for start of header value (ignoring white spaces) - - - - - Searching for a complete header value (can span over multiple lines, as long as they are prefixed with one/more whitespaces) - - - - - Adding bytes to body - - - - - A reverse proxy are used to act as a bridge between local (protected/hidden) websites - and public clients. - - A typical usage is to allow web servers on non standard ports to still be available - to the public clients, or allow web servers on private ips to be available. - - - - - - - Base url requested from browser - Base url on private web server - - // this will return contents from http://192.168.1.128/view/jonas when client requests http://www.gauffin.com/user/view/jonas - _server.Add(new ReverseProxyModule("http://www.gauffin.com/user/", "http://192.168.1.128/"); - - - - - Method that determines if an url should be handled or not by the module - - Url requested by the client. - true if module should handle the url. - - - - Method that process the url - - Information sent by the browser about the request - Information that is being sent back to the client. - Session used to - - - - Contains all HTTP Methods (according to the HTTP 1.1 specification) - - See: http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html - - - - - - The DELETE method requests that the origin server delete the resource identified by the Request-URI. - - - - This method MAY be overridden by human intervention (or other means) on the origin server. - The client cannot be guaranteed that the operation has been carried out, even if the status code - returned from the origin server indicates that the action has been completed successfully. - - - However, the server SHOULD NOT indicate success unless, at the time the response is given, - it intends to delete the resource or move it to an inaccessible location. - - - A successful response SHOULD be 200 (OK) if the response includes an entity describing the status, - 202 (Accepted) if the action has not yet been enacted, - or 204 (No Content) if the action has been enacted but the response does not include an entity. - - - If the request passes through a cache and the Request-URI identifies one or more currently cached entities, - those entries SHOULD be treated as stale. Responses to this method are not cacheable. - - - - - - The GET method means retrieve whatever information (in the form of an entity) is identified by the Request-URI. - - - - If the Request-URI refers to a data-producing process, it is the produced data which shall be returned as the - entity in the response and not the source text of the process, unless that text happens to be the output of the process. - - - The semantics of the GET method change to a "conditional GET" if the request message includes an - If-Modified-Since, If-Unmodified-Since, If-Match, If-None-Match, or If-Range header field. - A conditional GET method requests that the entity be transferred only under the circumstances described - by the conditional header field(s). The conditional GET method is intended to reduce unnecessary network - usage by allowing cached entities to be refreshed without requiring multiple requests or transferring - data already held by the client. - - - - - - The HEAD method is identical to GET except that the server MUST NOT return a message-body in the response. - - - The meta information contained in the HTTP headers in response to a HEAD request SHOULD be identical to the - information sent in response to a GET request. This method can be used for obtaining meta information about - the entity implied by the request without transferring the entity-body itself. - - This method is often used for testing hypertext links for validity, accessibility, and recent modification. - - - - - The OPTIONS method represents a request for information about the communication options available on the request/response chain identified by the Request-URI. - - - This method allows the client to determine the options and/or requirements associated with a resource, or the capabilities of a server, without implying a resource action or initiating a resource retrieval. - - - - - The POST method is used to request that the origin server accept the entity enclosed - in the request as a new subordinate of the resource identified by the Request-URI in the Request-Line. - - - POST is designed to allow a uniform method to cover the following functions: - - - Annotation of existing resources; - - Posting a message to a bulletin board, newsgroup, mailing list, or similar group of articles; - - Providing a block of data, such as the result of submitting a form, to a data-handling process; - - Extending a database through an append operation. - - - - If a resource has been created on the origin server, the response SHOULD be 201 (Created) and - contain an entity which describes the status of the request and refers to the new resource, and a - Location header (see section 14.30). - - - The action performed by the POST method might not result in a resource that can be identified by a URI. - In this case, either 200 (OK) or 204 (No Content) is the appropriate response status, depending on - whether or not the response includes an entity that describes the result. - - Responses to this method are not cacheable, unless the response includes appropriate Cache-Control - or Expires header fields. However, the 303 (See Other) response can be used to direct the user agent - to retrieve a cacheable resource. - - - - - - The PUT method requests that the enclosed entity be stored under the supplied Request-URI. - - - - - If the Request-URI refers to an already existing resource, the enclosed entity SHOULD be considered as a - modified version of the one residing on the origin server. - - If the Request-URI does not point to an existing resource, and that URI is capable of being defined as a new - resource by the requesting user agent, the origin server can create the resource with that URI. - - If a new resource is created, the origin server MUST inform the user agent via the 201 (Created) response. - - If an existing resource is modified, either the 200 (OK) or 204 (No Content) response codes SHOULD be sent to - indicate successful completion of the request. - - If the resource could not be created or modified with the Request-URI, an appropriate error response SHOULD be - given that reflects the nature of the problem. - - - - The recipient of the entity MUST NOT ignore any Content-* (e.g. Content-Range) headers that it does not - understand or implement and MUST return a 501 (Not Implemented) response in such cases. - - - - - - The TRACE method is used to invoke a remote, application-layer loop- back of the request message. - - - - - Contains all HTTP Methods (according to the HTTP 1.1 specification) - - See: http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html - - - - - - The DELETE method requests that the origin server delete the resource identified by the Request-URI. - - - - This method MAY be overridden by human intervention (or other means) on the origin server. - The client cannot be guaranteed that the operation has been carried out, even if the status code - returned from the origin server indicates that the action has been completed successfully. - - - However, the server SHOULD NOT indicate success unless, at the time the response is given, - it intends to delete the resource or move it to an inaccessible location. - - - A successful response SHOULD be 200 (OK) if the response includes an entity describing the status, - 202 (Accepted) if the action has not yet been enacted, - or 204 (No Content) if the action has been enacted but the response does not include an entity. - - - If the request passes through a cache and the Request-URI identifies one or more currently cached entities, - those entries SHOULD be treated as stale. Responses to this method are not cacheable. - - - - - - The GET method means retrieve whatever information (in the form of an entity) is identified by the Request-URI. - - - - If the Request-URI refers to a data-producing process, it is the produced data which shall be returned as the - entity in the response and not the source text of the process, unless that text happens to be the output of the process. - - - The semantics of the GET method change to a "conditional GET" if the request message includes an - If-Modified-Since, If-Unmodified-Since, If-Match, If-None-Match, or If-Range header field. - A conditional GET method requests that the entity be transferred only under the circumstances described - by the conditional header field(s). The conditional GET method is intended to reduce unnecessary network - usage by allowing cached entities to be refreshed without requiring multiple requests or transferring - data already held by the client. - - - - - - The HEAD method is identical to GET except that the server MUST NOT return a message-body in the response. - - - The meta information contained in the HTTP headers in response to a HEAD request SHOULD be identical to the - information sent in response to a GET request. This method can be used for obtaining meta information about - the entity implied by the request without transferring the entity-body itself. - - This method is often used for testing hypertext links for validity, accessibility, and recent modification. - - - - - The OPTIONS method represents a request for information about the communication options available on the request/response chain identified by the Request-URI. - - - This method allows the client to determine the options and/or requirements associated with a resource, or the capabilities of a server, without implying a resource action or initiating a resource retrieval. - - - - - The POST method is used to request that the origin server accept the entity enclosed - in the request as a new subordinate of the resource identified by the Request-URI in the Request-Line. - - - POST is designed to allow a uniform method to cover the following functions: - - - Annotation of existing resources; - - Posting a message to a bulletin board, newsgroup, mailing list, or similar group of articles; - - Providing a block of data, such as the result of submitting a form, to a data-handling process; - - Extending a database through an append operation. - - - - If a resource has been created on the origin server, the response SHOULD be 201 (Created) and - contain an entity which describes the status of the request and refers to the new resource, and a - Location header (see section 14.30). - - - The action performed by the POST method might not result in a resource that can be identified by a URI. - In this case, either 200 (OK) or 204 (No Content) is the appropriate response status, depending on - whether or not the response includes an entity that describes the result. - - Responses to this method are not cacheable, unless the response includes appropriate Cache-Control - or Expires header fields. However, the 303 (See Other) response can be used to direct the user agent - to retrieve a cacheable resource. - - - - - - The PUT method requests that the enclosed entity be stored under the supplied Request-URI. - - - - - If the Request-URI refers to an already existing resource, the enclosed entity SHOULD be considered as a - modified version of the one residing on the origin server. - - If the Request-URI does not point to an existing resource, and that URI is capable of being defined as a new - resource by the requesting user agent, the origin server can create the resource with that URI. - - If a new resource is created, the origin server MUST inform the user agent via the 201 (Created) response. - - If an existing resource is modified, either the 200 (OK) or 204 (No Content) response codes SHOULD be sent to - indicate successful completion of the request. - - If the resource could not be created or modified with the Request-URI, an appropriate error response SHOULD be - given that reflects the nature of the problem. - - - - The recipient of the entity MUST NOT ignore any Content-* (e.g. Content-Range) headers that it does not - understand or implement and MUST return a 501 (Not Implemented) response in such cases. - - - - - - The TRACE method is used to invoke a remote, application-layer loop- back of the request message. - - - - - New implementation of the HTTP listener. - - - Use the Create methods to create a default listener. - - - - - Contains a listener that doesn't do anything with the connections. - - - - - Listen for regular HTTP connections - - IP Address to accept connections on - TCP Port to listen on, default HTTP port is 80. - Factory used to create es. - address is null. - Port must be a positive number. - - - - Initializes a new instance of the class. - - IP Address to accept connections on - TCP Port to listen on, default HTTPS port is 443 - Factory used to create es. - Certificate to use - - - - Initializes a new instance of the class. - - IP Address to accept connections on - TCP Port to listen on, default HTTPS port is 443 - Factory used to create es. - Certificate to use - which HTTPS protocol to use, default is TLS. - - - Exception. - - - - Will try to accept connections one more time. - - If any exceptions is thrown. - - - - Can be used to create filtering of new connections. - - Accepted socket - true if connection can be accepted; otherwise false. - - - - Start listen for new connections - - Number of connections that can stand in a queue to be accepted. - Listener have already been started. - - - - Stop the listener - - - - - - Gives you a change to receive log entries for all internals of the HTTP library. - - - You may not switch log writer after starting the listener. - - - - - True if we should turn on trace logs. - - - - - Catch exceptions not handled by the listener. - - - Exceptions will be thrown during debug mode if this event is not used, - exceptions will be printed to console and suppressed during release mode. - - - - - A request have been received from a . - - - - - Initializes a new instance of the class. - - IP Address to accept connections on - TCP Port to listen on, default HTTP port is 80. - Factory used to create es. - address is null. - Port must be a positive number. - - - - Initializes a new instance of the class. - - The address. - The port. - The factory. - The certificate. - - - - Initializes a new instance of the class. - - The address. - The port. - The factory. - The certificate. - The protocol. - - - - Creates a new instance with default factories. - - Address that the listener should accept connections on. - Port that listener should accept connections on. - Created HTTP listener. - - - - Creates a new instance with default factories. - - Address that the listener should accept connections on. - Port that listener should accept connections on. - Certificate to use - Created HTTP listener. - - - - Creates a new instance with default factories. - - Address that the listener should accept connections on. - Port that listener should accept connections on. - Certificate to use - which HTTPS protocol to use, default is TLS. - Created HTTP listener. - - - - Can be used to create filtering of new connections. - - Accepted socket - - true if connection can be accepted; otherwise false. - - - - - A client have been accepted, but not handled, by the listener. - - - - - Event arguments used when a new header have been parsed. - - - - - Initializes a new instance of the class. - - Name of header. - Header value. - - - - Initializes a new instance of the class. - - - - - Gets or sets header name. - - - - - Gets or sets header value. - - - - - Priority for log entries - - - - - - Very detailed logs to be able to follow the flow of the program. - - - - - Logs to help debug errors in the application - - - - - Information to be able to keep track of state changes etc. - - - - - Something did not go as we expected, but it's no problem. - - - - - Something that should not fail failed, but we can still keep - on going. - - - - - Something failed, and we cannot handle it properly. - - - - - Interface used to write to log files. - - - - - Write an entry to the log file. - - object that is writing to the log - importance of the log message - the message - - - - This class writes to the console. It colors the output depending on the logprio and includes a 3-level stacktrace (in debug mode) - - - - - - The actual instance of this class. - - - - - Logwriters the specified source. - - object that wrote the logentry. - Importance of the log message - The message. - - - - Get color for the specified logprio - - prio for the log entry - A for the prio - - - - Default log writer, writes everything to null (nowhere). - - - - - - The logging instance. - - - - - Writes everything to null - - object that wrote the log entry. - Importance of the log message - The message. - - - - Will contain helper functions for javascript. - - - - - Requests a url through ajax - - url to fetch. Url is NOT enclosed in quotes by the implementation. You need to do that yourself. - optional options in format "key, value, key, value", used in JS request object. All keys should end with colon. - a link tag - onclick attribute is used by this method. - - - // plain text - JSHelper.AjaxRequest("'/user/show/1'"); - - // ajax request using this.href - string link = "<a href=\"/user/call/1\" onclick=\"" + JSHelper.AjaxRequest("this.href") + "/<call user</a>"; - - - - - - Ajax requests that updates an element with - the fetched content - - url to fetch. Url is NOT enclosed in quotes by the implementation. You need to do that yourself. - element to update - options in format "key, value, key, value". All keys should end with colon. - A link tag. - - - JSHelper.AjaxUpdater("'/user/show/1'", "user", "onsuccess:", "alert('hello');", "asynchronous:", "true"); - - - - - - Opens contents in a dialog window. - - url to contents of dialog - link title - name, value, name, value, all parameter names should end with colon. - - - - Close a javascript dialog window/div. - - javascript for closing a dialog. - - - - - Delegate used by to populate select options. - - current object (for instance a User). - Text that should be displayed in the value part of a <optiongt;-tag. - Text shown in the select list. - - // Class that is going to be used in a SELECT-tag. - public class User - { - private readonly string _realName; - private readonly int _id; - public User(int id, string realName) - { - _id = id; - _realName = realName; - } - public string RealName - { - get { return _realName; } - } - - public int Id - { - get { return _id; } - } - } - - // Using an inline delegate to generate the select list - public void UserInlineDelegate() - { - List<User> items = new List<User>(); - items.Add(new User(1, "adam")); - items.Add(new User(2, "bertial")); - items.Add(new User(3, "david")); - string htmlSelect = Select("users", "users", items, delegate(object o, out object id, out object value) - { - User user = (User)o; - id = user.Id; - value = user.RealName; - }, 2, true); - } - - // Using an method as delegate to generate the select list. - public void UseExternalDelegate() - { - List<User> items = new List<User>(); - items.Add(new User(1, "adam")); - items.Add(new User(2, "bertial")); - items.Add(new User(3, "david")); - string htmlSelect = Select("users", "users", items, UserOptions, 1, true); - } - - // delegate returning id and title - public static void UserOptions(object o, out object id, out object title) - { - User user = (User)o; - id = user.Id; - value = user.RealName; - } /// - - - - Arguments used when more body bytes have come. - - - - - Initializes a new instance of the class. - - buffer that contains the received bytes. - offset in buffer where to start processing. - number of bytes from that should be parsed. - - - - Initializes a new instance of the class. - - - - - Gets or sets buffer that contains the received bytes. - - - - - Gets or sets number of bytes from that should be parsed. - - - - - Gets or sets offset in buffer where to start processing. - - - - - Response that is sent back to the web browser / client. - - A response can be sent if different ways. The easiest one is - to just fill the Body stream with content, everything else - will then be taken care of by the framework. The default content-type - is text/html, you should change it if you send anything else. - - The second and slighty more complex way is to send the response - as parts. Start with sending the header using the SendHeaders method and - then you can send the body using SendBody method, but do not forget - to set ContentType and ContentLength before doing so. - - - public void MyHandler(IHttpRequest request, IHttpResponse response) - { - - } - - - - - Add another header to the document. - - Name of the header, case sensitive, use lower cases. - Header values can span over multiple lines as long as each line starts with a white space. New line chars should be \r\n - If headers already been sent. - If value conditions have not been met. - Adding any header will override the default ones and those specified by properties. - - - - Send headers and body to the browser. - - If content have already been sent. - - - - Make sure that you have specified ContentLength and sent the headers first. - - - If headers have not been sent. - - offest of first byte to send - number of bytes to send. - - - This method can be used if you want to send body contents without caching them first. This - is recommended for larger files to keep the memory usage low. - - - - Make sure that you have specified ContentLength and sent the headers first. - - - If headers have not been sent. - - - - This method can be used if you want to send body contents without caching them first. This - is recommended for larger files to keep the memory usage low. - - - - Send headers to the client. - - If headers already been sent. - - - - - - - Redirect client to somewhere else using the 302 status code. - - Destination of the redirect - If headers already been sent. - You can not do anything more with the request when a redirect have been done. This should be your last - action. - - - - redirect to somewhere - - where the redirect should go - - No body are allowed when doing redirects. - - - - - The body stream is used to cache the body contents - before sending everything to the client. It's the simplest - way to serve documents. - - - - - Defines the version of the HTTP Response for applications where it's required - for this to be forced. - - - - - The chunked encoding modifies the body of a message in order to - transfer it as a series of chunks, each with its own size indicator, - followed by an OPTIONAL trailer containing entity-header fields. This - allows dynamically produced content to be transferred along with the - information necessary for the recipient to verify that it has - received the full message. - - - - - Kind of connection - - - - - Encoding to use when sending stuff to the client. - - Default is UTF8 - - - - Number of seconds to keep connection alive - - Only used if Connection property is set to ConnectionType.KeepAlive - - - - Status code that is sent to the client. - - Default is HttpStatusCode.Ok - - - - Information about why a specific status code was used. - - - - - Size of the body. MUST be specified before sending the header, - unless property Chunked is set to true. - - - - - Kind of content in the body - - Default is text/html - - - - Headers have been sent to the client- - - You can not send any additional headers if they have already been sent. - - - - The whole response have been sent. - - - - - Cookies that should be created/changed. - - - - - Type of HTTP connection - - - - - Connection is closed after each request-response - - - - - Connection is kept alive for X seconds (unless another request have been made) - - - - - Contains server side HTTP request information. - - - - - Called during parsing of a . - - Name of the header, should not be URL encoded - Value of the header, should not be URL encoded - If a header is incorrect. - - - - Add bytes to the body - - buffer to read bytes from - where to start read - number of bytes to read - Number of bytes actually read (same as length unless we got all body bytes). - If body is not writable - bytes is null. - offset is out of range. - - - - Clear everything in the request - - - - - Decode body into a form. - - A list with form decoders. - If body contents is not valid for the chosen decoder. - If body is still being transferred. - - - - Sets the cookies. - - The cookies. - - - - Create a response object. - - Context for the connected client. - A new . - - - - Gets kind of types accepted by the client. - - - - - Gets or sets body stream. - - - - - Gets whether the body is complete. - - - - - Gets or sets kind of connection used for the session. - - - - - Gets or sets number of bytes in the body. - - - - - Gets cookies that was sent with the request. - - - - - Gets form parameters. - - - - - Gets headers sent by the client. - - - - - Gets or sets version of HTTP protocol that's used. - - - Probably or . - - - - - - Gets whether the request was made by Ajax (Asynchronous JavaScript) - - - - - Gets or sets requested method. - - - Will always be in upper case. - - - - - - Gets parameter from or . - - - - - Gets variables sent in the query string - - - - - Gets or sets requested URI. - - - - - Gets URI absolute path divided into parts. - - - // URI is: http://gauffin.com/code/tiny/ - Console.WriteLine(request.UriParts[0]); // result: code - Console.WriteLine(request.UriParts[1]); // result: tiny - - - If you're using controllers than the first part is controller name, - the second part is method name and the third part is Id property. - - - - - - Gets or sets path and query. - - - - Are only used during request parsing. Cannot be set after "Host" header have been - added. - - - - - Contains a connection to a browser/client. - - - - - Disconnect from client - - error to report in the event. - - - - Send a response. - - Either or - HTTP status code - reason for the status code. - HTML body contents, can be null or empty. - A content type to return the body as, i.e. 'text/html' or 'text/plain', defaults to 'text/html' if null or empty - If is invalid. - - - - Send a response. - - Either or - HTTP status code - reason for the status code. - - - - Send a response. - - - - - - send a whole buffer - - buffer to send - - - - - Send data using the stream - - Contains data to send - Start position in buffer - number of bytes to send - - - - - - Closes the streams and disposes of the unmanaged resources - - - - - Using SSL or other encryption method. - - - - - Using SSL or other encryption method. - - - - - The context have been disconnected. - - - Event can be used to clean up a context, or to reuse it. - - - - - A request have been received in the context. - - - - - A have been disconnected. - - - - - Initializes a new instance of the class. - - Reason to disconnection. - - - - Gets reason to why client disconnected. - - - - - - - - - - Initializes a new instance of the class. - - The request. - - - - Gets received request. - - - - - The website module let's you handle multiple websites in the same server. - It uses the "Host" header to check which site you want. - - It's recommended that you do not - add any other modules to HttpServer if you are using the website module. Instead, - add all wanted modules to each website. - - - - - - domain name that should be handled. - - - - - Method that process the url - - Information sent by the browser about the request - Information that is being sent back to the client. - Session used to - - - - Name of site. - - - - - represents a HTTP input item. Each item can have multiple sub items, a sub item - is made in a HTML form by using square brackets - - - // becomes: - Console.WriteLine("Value: {0}", form["user"]["FirstName"].Value); - - - All names in a form SHOULD be in lowercase. - - - - Representation of a non-initialized . - - - - Initializes an input item setting its name/identifier and value - - Parameter name/id - Parameter value - - - Creates a deep copy of the item specified - The item to copy - The function makes a deep copy of quite a lot which can be slow - - - - Add another value to this item - - Value to add. - Cannot add stuff to . - - - - checks if a sub-item exists (and has a value). - - name in lower case - true if the sub-item exists and has a value; otherwise false. - - - Returns a formatted representation of the instance with the values of all contained parameters - - - - Outputs the string in a formatted manner - - A prefix to append, used internally - produce a query string - - - - Add a sub item. - - Can contain array formatting, the item is then parsed and added in multiple levels - Value to add. - Argument is null. - Cannot add stuff to . - - - - Returns an enumerator that iterates through the collection. - - - - A that can be used to iterate through the collection. - - 1 - - - - Returns an enumerator that iterates through a collection. - - - - An object that can be used to iterate through the collection. - - 2 - - - - Outputs the string in a formatted manner - - A prefix to append, used internally - - - - - Number of values - - - - - Get a sub item - - name in lower case. - if no item was found. - - - - Name of item (in lower case). - - - - - Returns the first value, or null if no value exist. - - - - - Returns the last value, or null if no value exist. - - - - - Returns the list with values. - - - - - - - name in lower case - - - - - Container class for posted files - - - - - Creates a container for a posted file - - The identifier of the post field - The file path - The content type of the file - The name of the file uploaded - If any parameter is null or empty - - - - Creates a container for a posted file - - If any parameter is null or empty - - - Destructor disposing the file - - - - Deletes the temporary file - - True if manual dispose - - - - Disposing interface, cleans up managed resources (the temporary file) and suppresses finalization - - - - - The name/id of the file - - - - - The full file path - - - - - The name of the uploaded file - - - - - The type of file - - - - - PrototypeJS implementation of the javascript functions. - - - - - Requests a url through ajax - - url to fetch. Url is NOT enclosed in quotes by the implementation. You need to do that yourself. - optional options in format "key, value, key, value", used in JS request object. All keys should end with colon. - a link tag - onclick attribute is used by this method. - - - // plain text - JSHelper.AjaxRequest("'/user/show/1'"); - - // ajax request using this.href - string link = "<a href=\"/user/call/1\" onclick=\"" + JSHelper.AjaxRequest("this.href") + "/<call user</a>"; - - - - - - Determins if a list of strings contains a specific value - - options to check in - value to find - true if value was found - case insensitive - - - - Ajax requests that updates an element with - the fetched content - - URL to fetch. URL is NOT enclosed in quotes by the implementation. You need to do that yourself. - element to update - options in format "key, value, key, value". All keys should end with colon. - A link tag. - - - JSHelper.AjaxUpdater("'/user/show/1'", "user", "onsuccess:", "alert('hello');", "asynchronous:", "true"); - - - - - - A link that pop ups a Dialog (overlay div) - - URL to contents of dialog - link title - name, value, name, value - - A "a"-tag that popups a dialog when clicked - - Requires Control.Modal found here: http://livepipe.net/projects/control_modal/ - And the following JavaScript (load it in application.js): - - Event.observe(window, 'load', - function() { - document.getElementsByClassName('modal').each(function(link){ new Control.Modal(link); }); - } - ); - - - - WebHelper.DialogLink("/user/show/1", "show user", "onmouseover", "alert('booh!');"); - - - - - create a modal dialog (usually using DIVs) - - url to fetch - dialog title - javascript/html attributes. javascript options ends with colon ':'. - - - - - Close a javascript dialog window/div. - - javascript for closing a dialog. - - - - - javascript action that should be added to the "onsubmit" event in the form tag. - - remember to encapsulate strings in '' - - All javascript option names should end with colon. - - - JSHelper.AjaxRequest("/user/show/1", "onsuccess:", "$('userInfo').update(result);"); - - - - - - The request requires user authentication. The response MUST include a - WWW-Authenticate header field (section 14.47) containing a challenge - applicable to the requested resource. - - The client MAY repeat the request with a suitable Authorization header - field (section 14.8). If the request already included Authorization - credentials, then the 401 response indicates that authorization has been - refused for those credentials. If the 401 response contains the same challenge - as the prior response, and the user agent has already attempted authentication - at least once, then the user SHOULD be presented the entity that was given in the response, - since that entity might include relevant diagnostic information. - - HTTP access authentication is explained in rfc2617: - http://www.ietf.org/rfc/rfc2617.txt - - (description is taken from - http://www.submissionchamber.com/help-guides/error-codes.php#sec10.4.2) - - - - - Create a new unauhtorized exception. - - - - - - Create a new unauhtorized exception. - - reason to why the request was unauthorized. - inner exception - - - - Create a new unauhtorized exception. - - reason to why the request was unauthorized. - - - - The server understood the request, but is refusing to fulfill it. - Authorization will not help and the request SHOULD NOT be repeated. - If the request method was not HEAD and the server wishes to make public why the request has not been fulfilled, - it SHOULD describe the reason for the refusal in the entity. If the server does not wish to make this information - available to the client, the status code 404 (Not Found) can be used instead. - - Text taken from: http://www.submissionchamber.com/help-guides/error-codes.php - - - - - Initializes a new instance of the class. - - error message - - - - The "basic" authentication scheme is based on the model that the - client must authenticate itself with a user-ID and a password for - each realm. The realm value should be considered an opaque string - which can only be compared for equality with other realms on that - server. The server will service the request only if it can validate - the user-ID and password for the protection space of the Request-URI. - There are no optional authentication parameters. - - - - - Initializes a new instance of the class. - - Delegate used to provide information used during authentication. - Delegate used to determine if authentication is required (may be null). - - - - Initializes a new instance of the class. - - Delegate used to provide information used during authentication. - - - - Create a response that can be sent in the WWW-Authenticate header. - - Realm that the user should authenticate in - Not used in basic auth - A correct auth request. - - - - An authentication response have been received from the web browser. - Check if it's correct - - Contents from the Authorization header - Realm that should be authenticated - GET/POST/PUT/DELETE etc. - Not used in basic auth - Authentication object that is stored for the request. A user class or something like that. - if authenticationHeader is invalid - If any of the paramters is empty or null. - - - - name used in http request. - - - - - A session store is used to store and load sessions on a media. - The default implementation () saves/retrieves sessions from memory. - - - - - Creates a new http session with a generated id. - - A object - - - - Creates a new http session with a specific id - - Id used to identify the new cookie.. - A object. - - Id should be generated by the store implementation if it's null or . - - - - - Load an existing session. - - Session id (usually retrieved from a client side cookie). - A session if found; otherwise null. - - - - Save an updated session to the store. - - Session id (usually retrieved from a client side cookie). - If Id property have not been specified. - - - - We use the flyweight pattern which reuses small objects - instead of creating new each time. - - Unused session that should be reused next time Create is called. - - - - Remove expired sessions - - - - - Remove a session - - id of the session. - - - - Load a session from the store - - - null if session is not found. - - - - Number of minutes before a session expires. - - Default time is 20 minutes. - - - - This class is created as a wrapper, since there are two different cookie types in .Net (Cookie and HttpCookie). - The framework might switch class in the future and we dont want to have to replace all instances - - - - - Let's copy all the cookies. - - value from cookie header. - - - - Adds a cookie in the collection. - - cookie to add - cookie is null - - - - Gets a collection enumerator on the cookie list. - - collection enumerator - - - - Remove all cookies. - - - - - Returns an enumerator that iterates through the collection. - - - - A that can be used to iterate through the collection. - - 1 - - - - Remove a cookie from the collection. - - Name of cookie. - - - - Gets the count of cookies in the collection. - - - - - Gets the cookie of a given identifier (null if not existing). - - - - - Inversion of control interface. - - - - - Add a component instance - - Interface type - Instance to add - - - - Get a component. - - Interface type - Component if registered, otherwise null. - - Component will get created if needed. - - - - - Checks if the specified component interface have been added. - - - true if found; otherwise false. - - - - Add a component. - - Type being requested. - Type being created. - - - - Contains server side HTTP request information. - - - - - Chars used to split an URL path into multiple parts. - - - - - Assign a form. - - - - - - Creates a new object that is a copy of the current instance. - - - - A new object that is a copy of this instance. - - 2 - - - - Decode body into a form. - - A list with form decoders. - If body contents is not valid for the chosen decoder. - If body is still being transferred. - - - - Cookies - - the cookies - - - - Create a response object. - - A new . - - - - Called during parsing of a . - - Name of the header, should not be URL encoded - Value of the header, should not be URL encoded - If a header is incorrect. - - - - Add bytes to the body - - buffer to read bytes from - where to start read - number of bytes to read - Number of bytes actually read (same as length unless we got all body bytes). - If body is not writable - bytes is null. - offset is out of range. - - - - Clear everything in the request - - - - - Gets or sets a value indicating whether this is secure. - - - - - Path and query (will be merged with the host header) and put in Uri - - - - - - Gets whether the body is complete. - - - - - Gets kind of types accepted by the client. - - - - - Gets or sets body stream. - - - - - Gets or sets kind of connection used for the session. - - - - - Gets or sets number of bytes in the body. - - - - - Gets headers sent by the client. - - - - - Gets or sets version of HTTP protocol that's used. - - - Probably or . - - - - - - Gets or sets requested method. - - - - Will always be in upper case. - - - - - - Gets variables sent in the query string - - - - - Gets or sets requested URI. - - - - - Uri absolute path splitted into parts. - - - // uri is: http://gauffin.com/code/tiny/ - Console.WriteLine(request.UriParts[0]); // result: code - Console.WriteLine(request.UriParts[1]); // result: tiny - - - If you're using controllers than the first part is controller name, - the second part is method name and the third part is Id property. - - - - - - Gets parameter from or . - - - - - Gets form parameters. - - - - - Gets whether the request was made by Ajax (Asynchronous JavaScript) - - - - - Gets cookies that was sent with the request. - - - - - The object form class takes an object and creates form items for it. - - - - - Initializes a new instance of the class. - - - form name *and* id. - action to do when form is posted. - - - - - Initializes a new instance of the class. - - form name *and* id. - action to do when form is posted. - object to get values from - - - - Initializes a new instance of the class. - - form action. - object to get values from. - - - - write out the FORM-tag. - - generated html code - - - - Writeout the form tag - - form should be posted through ajax. - generated html code - - - - Generates a text box. - - - - generated html code - - - - password box - - - - generated html code - - - - Hiddens the specified property name. - - Name of the property. - The options. - generated html code - - - - Labels the specified property name. - - property in object. - caption - generated html code - - - - Generate a checkbox - - property in object - checkbox value - additional html attributes. - generated html code - - - - Write a html select tag - - object property. - id column - The title column. - The options. - - - - - Selects the specified property name. - - Name of the property. - The items. - The id column. - The title column. - The options. - - - - - Write a submit tag. - - button caption - html submit tag - - - - html end form tag - - html - - - - Can handle application/x-www-form-urlencoded - - - - - - Stream containing the content - Content type (with any additional info like boundry). Content type is always supplied in lower case - Stream encoding - - A HTTP form, or null if content could not be parsed. - - If contents in the stream is not valid input data. - - - - Checks if the decoder can handle the mime type - - Content type (with any additional info like boundry). Content type is always supplied in lower case. - True if the decoder can parse the specified content type - - - - - - - http://www.faqs.org/rfcs/rfc1867.html - - - - - multipart/form-data - - - - - form-data - - - - - - - Stream containing the content - Content type (with any additional info like boundry). Content type is always supplied in lower case - Stream enconding - A http form, or null if content could not be parsed. - If contents in the stream is not valid input data. - If any parameter is null - - - - Checks if the decoder can handle the mime type - - Content type (with any additional info like boundry). Content type is always supplied in lower case. - True if the decoder can parse the specified content type - - - - Invoked when a client have been accepted by the - - - Can be used to revoke incoming connections - - - - - Initializes a new instance of the class. - - The socket. - - - - Client may not be handled. - - - - - Accepted socket. - - - - - Client should be revoked. - - - - - The purpose of this module is to serve files. - - - - - Initializes a new instance of the class. - - Uri to serve, for instance "/files/" - Path on hard drive where we should start looking for files - If true a Last-Modifed header will be sent upon requests urging web browser to cache files - - - - Initializes a new instance of the class. - - Uri to serve, for instance "/files/" - Path on hard drive where we should start looking for files - - - - Mimtypes that this class can handle per default - - - - - Determines if the request should be handled by this module. - Invoked by the - - - true if this module should handle it. - - - Illegal path - - - - check if source contains any of the chars. - - - - - - - - Method that process the Uri. - - Information sent by the browser about the request - Information that is being sent back to the client. - Session used to - Failed to find file extension - File type is forbidden. - - - - return a file extension from an absolute Uri path (or plain filename) - - - - - - - List with all mime-type that are allowed. - - All other mime types will result in a Forbidden http status code. - - - - characters that may not exist in a path. - - - fileMod.ForbiddenChars = new string[]{ "\\", "..", ":" }; - - - - - Helpers to make XML handling easier - - - - - Serializes object to XML. - - object to serialize. - XML - - Removes name spaces and adds indentation - - - - - Create an object from a XML string - - Type of object - XML string - object - - - - The requested resource was not found in the web server. - - - - - Create a new exception - - message describing the error - inner exception - - - - Create a new exception - - message describing the error - - - - cookie sent by the client/browser - - - - - - Constructor. - - cookie identifier - cookie content - id or content is null - id is empty - - - - Gets the cookie HTML representation. - - cookie string - - - - Gets the cookie identifier. - - - - - Cookie value. Set to null to remove cookie. - - - - - Returns item either from a form or a query string (checks them in that order) - - - - Representation of a non-initialized HttpParam - - - Initialises the class to hold a value either from a post request or a querystring request - - - - The add method is not availible for HttpParam - since HttpParam checks both Request.Form and Request.QueryString - - name identifying the value - value to add - - - - - Checks whether the form or querystring has the specified value - - Name, case sensitive - true if found; otherwise false. - - - - Returns an enumerator that iterates through the collection. - - - - A that can be used to iterate through the collection. - - 1 - - - - Returns an enumerator that iterates through a collection. - - - - An object that can be used to iterate through the collection. - - 2 - - - - Fetch an item from the form or querystring (in that order). - - - Item if found; otherwise HttpInputItem.EmptyLanguageNode - - - - Contains a connection to a browser/client. - - - Remember to after you have hooked the event. - - TODO: Maybe this class should be broken up into HttpClientChannel and HttpClientContext? - - - - Initializes a new instance of the class. - - true if the connection is secured (SSL/TLS) - client that connected. - Stream used for communication - Used to create a . - Size of buffer to use when reading data. Must be at least 4096 bytes. - If fails - Stream must be writable and readable. - - - - Process incoming body bytes. - - - Bytes - - - - - - - - - - - Start reading content. - - - Make sure to call base.Start() if you override this method. - - - - - Clean up context. - - - Make sure to call base.Cleanup() if you override the method. - - - - - Disconnect from client - - error to report in the event. - - - BadRequestException. - - - - Send a response. - - Either or - HTTP status code - reason for the status code. - HTML body contents, can be null or empty. - A content type to return the body as, i.e. 'text/html' or 'text/plain', defaults to 'text/html' if null or empty - If is invalid. - - - - Send a response. - - Either or - HTTP status code - reason for the status code. - - - - Send a response. - - - - - - send a whole buffer - - buffer to send - - - - - Send data using the stream - - Contains data to send - Start position in buffer - number of bytes to send - - - - - - This context have been cleaned, which means that it can be reused. - - - - - Context have been started (a new client have connected) - - - - - Overload to specify own type. - - - Must be specified before the context is being used. - - - - - Using SSL or other encryption method. - - - - - Using SSL or other encryption method. - - - - - Specify which logger to use. - - - - - Gets or sets the network stream. - - - - - Gets or sets IP address that the client connected from. - - - - - Gets or sets port that the client connected from. - - - - - The context have been disconnected. - - - Event can be used to clean up a context, or to reuse it. - - - - - A request have been received in the context. - - - - Class to handle loading of resource files - - - - Initializes a new instance of the class. - - - - - Initializes a new instance of the class. - - logger. - - - - Loads resources from a namespace in the given assembly to an URI - - The URI to map the resources to - The assembly in which the resources reside - The namespace from which to load the resources - - - resourceLoader.LoadResources("/user/", typeof(User).Assembly, "MyLib.Models.User.Views"); - - Will make the resource MyLib.Models.User.Views.list.Haml accessible via /user/list.haml or /user/list/ - - The amount of loaded files, giving you the possibility of making sure the resources needed gets loaded - If a resource has already been mapped to an uri - - - - Retrieves a stream for the specified resource path if loaded otherwise null - - Path to the resource to retrieve a stream for - A stream or null if the resource couldn't be found - - - - Fetch all files from the resource that matches the specified arguments. - - The path to the resource to extract - - a list of files if found; or an empty array if no files are found. - - Search path must end with an asterisk for finding arbitrary files - - - - Fetch all files from the resource that matches the specified arguments. - - Where the file should reside. - Files to check - - a list of files if found; or an empty array if no files are found. - - - - - Returns whether or not the loader has an instance of the file requested - - The name of the template/file - True if the loader can provide the file - - - - Small design by contract implementation. - - - - - Check whether a parameter is empty. - - Parameter value - Parameter name, or error description. - value is empty. - - - - Checks whether a parameter is null. - - Parameter value - Parameter name, or error description. - value is null. - - - - Checks whether a parameter is null. - - - Parameter value - Parameter name, or error description. - value is null. - - - - cookie being sent back to the browser. - - - - - - Constructor. - - cookie identifier - cookie content - cookie expiration date. Use DateTime.MinValue for session cookie. - id or content is null - id is empty - - - - Create a new cookie - - name identifying the cookie - cookie value - when the cookie expires. Setting DateTime.MinValue will delete the cookie when the session is closed. - Path to where the cookie is valid - Domain that the cookie is valid for. - - - - Create a new cookie - - Name and value will be used - when the cookie expires. - - - - Gets the cookie HTML representation. - - cookie string - - - - When the cookie expires. - DateTime.MinValue means that the cookie expires when the session do so. - - - - - Cookie is only valid under this path. - - - - - Used when the request line have been successfully parsed. - - - - - Initializes a new instance of the class. - - The HTTP method. - The URI path. - The HTTP version. - - - - Initializes a new instance of the class. - - - - - Gets or sets http method. - - - Should be one of the methods declared in . - - - - - Gets or sets the version of the HTTP protocol that the client want to use. - - - - - Gets or sets requested URI path. - - - - - Delegate used to find a realm/domain. - - - - - Realms are used during HTTP Authentication - - - - - - - A complete HTTP server, you need to add a module to it to be able to handle incoming requests. - - - - // this small example will add two web site modules, thus handling - // two different sites. In reality you should add Controller modules or something - // two the website modules to be able to handle different requests. - HttpServer server = new HttpServer(); - server.Add(new WebSiteModule("www.gauffin.com", "Gauffin Telecom AB")); - server.Add(new WebSiteModule("www.vapadi.se", "Remote PBX")); - - // start regular http - server.Start(IPAddress.Any, 80); - - // start https - server.Start(IPAddress.Any, 443, myCertificate); - - - - - - - - - Initializes a new instance of the class. - - Used to get all components used in the server.. - - - - Initializes a new instance of the class. - - - - - Initializes a new instance of the class. - - Form decoders are used to convert different types of posted data to the object types. - - - - - - Initializes a new instance of the class. - - A session store is used to save and retrieve sessions - - - - - Initializes a new instance of the class. - - The log writer. - - - - - Initializes a new instance of the class. - - Form decoders are used to convert different types of posted data to the object types. - The log writer. - - - - - - - Initializes a new instance of the class. - - Form decoders are used to convert different types of posted data to the object types. - A session store is used to save and retrieve sessions - The log writer. - - - - - - - - Adds the specified rule. - - The rule. - - - - Add a to the server. - - mode to add - - - - Decodes the request body. - - The request. - Failed to decode form data. - - - - Generate a HTTP error page (that will be added to the response body). - response status code is also set. - - Response that the page will be generated in. - . - response body contents. - - - - Generate a HTTP error page (that will be added to the response body). - response status code is also set. - - Response that the page will be generated in. - exception. - - - - Realms are used by the s. - - HTTP request - domain/realm. - - - - Process an incoming request. - - connection to client - request information - response that should be filled - session information - - - - Can be overloaded to implement stuff when a client have been connected. - - - Default implementation does nothing. - - client that disconnected - disconnect reason - - - - Handle authentication - - - - - true if request can be handled; false if not. - Invalid authorization header - - - - Will request authentication. - - - Sends respond to client, nothing else can be done with the response after this. - - - - - - - - Received from a when a request have been parsed successfully. - - that received the request. - The request. - - - - To be able to track request count. - - - - - - - Start the web server using regular HTTP. - - IP Address to listen on, use IpAddress.Any to accept connections on all IP addresses/network cards. - Port to listen on. 80 can be a good idea =) - address is null. - Port must be a positive number. - - - - Accept secure connections. - - IP Address to listen on, use to accept connections on all IP Addresses / network cards. - Port to listen on. 80 can be a good idea =) - Certificate to use - address is null. - Port must be a positive number. - - - - shut down the server and listeners - - - - - write an entry to the log file - - importance of the message - log message - - - - write an entry to the log file - - object that wrote the message - importance of the message - log message - - - - Server that is handling the current request. - - - Will be set as soon as a request arrives to the object. - - - - - Modules used for authentication. The module that is is added first is used as - the default authentication module. - - Use the corresponding property - in the if you are using multiple websites. - - - - Form decoder providers are used to decode request body (which normally contains form data). - - - - - Server name sent in HTTP responses. - - - Do NOT include version in name, since it makes it - easier for hackers. - - - - - Name of cookie where session id is stored. - - - - - Specified where logging should go. - - - - - - - - Number of connections that can wait to be accepted by the server. - - Default is 10. - - - - Gets or sets maximum number of allowed simultaneous requests. - - - - This property is useful in busy systems. The HTTP server - will start queuing new requests if this limit is hit, instead - of trying to process all incoming requests directly. - - - The default number if allowed simultaneous requests are 10. - - - - - - Gets or sets maximum number of requests queuing to be handled. - - - - The WebServer will start turning requests away if response code - to indicate that the server - is too busy to be able to handle the request. - - - - - - Realms are used during HTTP authentication. - Default realm is same as server name. - - - - - Let's to receive unhandled exceptions from the threads. - - - Exceptions will be thrown during debug mode if this event is not used, - exceptions will be printed to console and suppressed during release mode. - - - - - Serves files that are stored in embedded resources. - - - - - Initializes a new instance of the class. - Runs to make sure the basic mime types are available, they can be cleared later - through the use of if desired. - - - - - Initializes a new instance of the class. - Runs to make sure the basic mime types are available, they can be cleared later - through the use of if desired. - - The log writer to use when logging events - - - - Mimtypes that this class can handle per default - - - - - Loads resources from a namespace in the given assembly to an uri - - The uri to map the resources to - The assembly in which the resources reside - The namespace from which to load the resources - - resourceLoader.LoadResources("/user/", typeof(User).Assembly, "MyLib.Models.User.Views"); - - will make ie the resource MyLib.Models.User.Views.stylesheet.css accessible via /user/stylesheet.css - - The amount of loaded files, giving you the possibility of making sure the resources needed gets loaded - - - - Returns true if the module can handle the request - - - - - Method that process the url - - Information sent by the browser about the request - Information that is being sent back to the client. - Session used to - true if this module handled the request. - - - - List with all mime-type that are allowed. - - All other mime types will result in a Forbidden http status code. - - - - Container to bind resource names to assemblies - - - - - Instantiates an instance of - - The dot seperated uri the resource maps to - The full resource name - The assembly the resource exists in - - - - Retrieves a stream to the resource - - Null if the resource couldn't be located somehow - - - - Retrieves the assembly the resource resides in - - - - - Retrieves the full name/path of the assembly - - - - - Retrieves the extension of the resource - - - - Returns the Uri without extension - - - Retrieves the full path name to the resource file - - - - Helpers making it easier to work with forms. - - - - - - Used to let the website use different JavaScript libraries. - Default is - - - - - Create a <form> tag. - - name of form - action to invoke on submit - form should be posted as Ajax - HTML code - - - // without options - WebHelper.FormStart("frmLogin", "/user/login", Request.IsAjax); - - // with options - WebHelper.FormStart("frmLogin", "/user/login", Request.IsAjax, "style", "display:inline", "class", "greenForm"); - - - HTML attributes or JavaScript options. - Method will ALWAYS be POST. - options must consist of name, value, name, value - - - - Creates a select list with the values in a collection. - - Name of the SELECT-tag - collection used to generate options. - delegate used to return id and title from objects. - value that should be marked as selected. - First row should contain an empty value. - string containing a SELECT-tag. - - - - - Creates a select list with the values in a collection. - - Name of the SELECT-tag - Id of the SELECT-tag - collection used to generate options. - delegate used to return id and title from objects. - value that should be marked as selected. - First row should contain an empty value. - string containing a SELECT-tag. - - - - // Class that is going to be used in a SELECT-tag. - public class User - { - private readonly string _realName; - private readonly int _id; - public User(int id, string realName) - { - _id = id; - _realName = realName; - } - public string RealName - { - get { return _realName; } - } - - public int Id - { - get { return _id; } - } - } - - // Using an inline delegate to generate the select list - public void UserInlineDelegate() - { - List<User> items = new List<User>(); - items.Add(new User(1, "adam")); - items.Add(new User(2, "bertial")); - items.Add(new User(3, "david")); - string htmlSelect = Select("users", "users", items, delegate(object o, out object id, out object value) - { - User user = (User)o; - id = user.Id; - value = user.RealName; - }, 2, true); - } - - // Using an method as delegate to generate the select list. - public void UseExternalDelegate() - { - List<User> items = new List<User>(); - items.Add(new User(1, "adam")); - items.Add(new User(2, "bertial")); - items.Add(new User(3, "david")); - string htmlSelect = Select("users", "users", items, UserOptions, 1, true); - } - - // delegate returning id and title - public static void UserOptions(object o, out object id, out object title) - { - User user = (User)o; - id = user.Id; - value = user.RealName; - } - - - name, id, collection or getIdTitle is null. - - - - Creates a select list with the values in a collection. - - Name of the SELECT-tag - Id of the SELECT-tag - collection used to generate options. - delegate used to return id and title from objects. - value that should be marked as selected. - First row should contain an empty value. - name, value collection of extra HTML attributes. - string containing a SELECT-tag. - - name, id, collection or getIdTitle is null. - Invalid HTML attribute list. - - - - Generate a list of HTML options - - collection used to generate options. - delegate used to return id and title from objects. - value that should be marked as selected. - First row should contain an empty value. - - collection or getIdTitle is null. - - - sb is null. - - - - Creates a check box. - - element name - element value - determines if the check box is selected or not. This is done differently depending on the - type of variable. A boolean simply triggers checked or not, all other types are compared with "value" to determine if - the box is checked or not. - a list with additional attributes (name, value, name, value). - a generated radio button - - - - Creates a check box. - - element name - element id - element value - determines if the check box is selected or not. This is done differently depending on the - type of variable. A boolean simply triggers checked or not, all other types are compared with "value" to determine if - the box is checked or not. - a list with additional attributes (name, value, name, value). - a generated radio button - - value in your business object. (check box will be selected if it matches the element value) - - - - - Creates a check box. - - element name - element id - determines if the check box is selected or not. This is done differently depending on the - type of variable. A boolean simply triggers checked or not, all other types are compared with "value" to determine if - the box is checked or not. - a list with additional attributes (name, value, name, value). - a generated radio button - will set value to "1". - - - - Creates a RadioButton. - - element name - element value - determines if the radio button is selected or not. This is done differently depending on the - type of variable. A boolean simply triggers checked or not, all other types are compared with "value" to determine if - the box is checked or not. - a list with additional attributes (name, value, name, value). - a generated radio button - - - - Creates a RadioButton. - - element name - element id - element value - determines if the radio button is selected or not. This is done differently depending on the - type of variable. A boolean simply triggers checked or not, all other types are compared with "value" to determine if - the box is checked or not. - a list with additional attributes (name, value, name, value). - a generated radio button - - - - form close tag - - - - - - Add a component instance - - Interface type - Instance to add - - - - Get a component. - - Interface type - Component if registered, otherwise null. - - Component will get created if needed. - - - - If instance cannot be created. - - - - Checks if the specified component interface have been added. - - - true if found; otherwise false. - - - - Add a component. - - Type being requested. - Type being created. - Type have already been mapped. - - - - Session store using memory for each session. - - - - - Initializes the class setting the expirationtimer to clean the session every minute - - - - - Delegate for the cleanup timer - - - - - Creates a new http session - - - - - - Creates a new http session with a specific id - - Id used to identify the new cookie.. - A object. - - Id should be generated by the store implementation if it's null or . - - - - - Load an existing session. - - - - - - - Save an updated session to the store. - - - - - - We use the flyweight pattern which reuses small objects - instead of creating new each time. - - EmptyLanguageNode (unused) session that should be reused next time Create is called. - - - - Remove expired sessions - - - - - Remove a session - - id of the session. - - - - Load a session from the store - - - null if session is not found. - - - - Number of minutes before a session expires. - Default is 20 minutes. - - - - - Used to queue incoming requests. - - - - - Initializes a new instance of the class. - - Called when a request should be processed. - - - - Used to process queued requests. - - - - - Gets or sets maximum number of allowed simultaneous requests. - - - - - Gets or sets maximum number of requests queuing to be handled. - - - - - Specifies how many requests the HTTP server is currently processing. - - - - - Used two queue incoming requests to avoid - thread starvation. - - - - - Method used to process a queued request - - Context that the request was received from. - Request to process. - - - - Response that is sent back to the web browser / client. - - - - A response can be sent if different ways. The easiest one is - to just fill the Body stream with content, everything else - will then be taken care of by the framework. The default content-type - is text/html, you should change it if you send anything else. - - The second and slightly more complex way is to send the response - as parts. Start with sending the header using the SendHeaders method and - then you can send the body using SendBody method, but do not forget - to set and before doing so. - - - - - // Example using response body. - class MyModule : HttpModule - { - public override bool Process(IHttpRequest request, IHttpResponse response, IHttpSession session) - { - StreamWriter writer = new StreamWriter(response.Body); - writer.WriteLine("Hello dear World!"); - writer.Flush(); - - // return true to tell webserver that we've handled the url - return true; - } - } - - - todo: add two examples, using SendHeaders/SendBody and just the Body stream. - - - - Initializes a new instance of the class. - - Client that send the . - Contains information of what the client want to receive. - cannot be empty. - - - - Initializes a new instance of the class. - - Client that send the . - Version of HTTP protocol that the client uses. - Type of HTTP connection used. - - - - Add another header to the document. - - Name of the header, case sensitive, use lower cases. - Header values can span over multiple lines as long as each line starts with a white space. New line chars should be \r\n - If headers already been sent. - If value conditions have not been met. - Adding any header will override the default ones and those specified by properties. - - - - Send headers and body to the browser. - - If content have already been sent. - - - - Make sure that you have specified and sent the headers first. - - - If headers have not been sent. - - offset of first byte to send - number of bytes to send. - - - This method can be used if you want to send body contents without caching them first. This - is recommended for larger files to keep the memory usage low. - - - - Make sure that you have specified and sent the headers first. - - - If headers have not been sent. - - - - This method can be used if you want to send body contents without caching them first. This - is recommended for larger files to keep the memory usage low. - - - - Send headers to the client. - - If headers already been sent. - - - - - - - Redirect client to somewhere else using the 302 status code. - - Destination of the redirect - If headers already been sent. - You can not do anything more with the request when a redirect have been done. This should be your last - action. - - - - redirect to somewhere - - where the redirect should go - - No body are allowed when doing redirects. - - - - - The body stream is used to cache the body contents - before sending everything to the client. It's the simplest - way to serve documents. - - - - - The chunked encoding modifies the body of a message in order to - transfer it as a series of chunks, each with its own size indicator, - followed by an OPTIONAL trailer containing entity-header fields. This - allows dynamically produced content to be transferred along with the - information necessary for the recipient to verify that it has - received the full message. - - - - - Defines the version of the HTTP Response for applications where it's required - for this to be forced. - - - - - Kind of connection - - - - - Encoding to use when sending stuff to the client. - - Default is UTF8 - - - - Number of seconds to keep connection alive - - Only used if Connection property is set to . - - - - Status code that is sent to the client. - - Default is - - - - Information about why a specific status code was used. - - - - - Size of the body. MUST be specified before sending the header, - unless property Chunked is set to true. - - - - - Kind of content in the body - - Default type is "text/html" - - - - Headers have been sent to the client- - - You can not send any additional headers if they have already been sent. - - - - The whole response have been sent. - - - - - Cookies that should be created/changed. - - - - - Used to create and reuse contexts. - - - - - Used to create es. - - - - - Creates a that handles a connected client. - - Client socket (accepted by the ). - A creates . - - - - Create a secure . - - Client socket (accepted by the ). - HTTPS certificate to use. - Kind of HTTPS protocol. Usually TLS or SSL. - A created . - - - - A request have been received from one of the contexts. - - - - - Initializes a new instance of the class. - - The writer. - Amount of bytes to read from the incoming socket stream. - Used to create a request parser. - - - - Create a new context. - - true if socket is running HTTPS. - Client that connected - Network/SSL stream. - A context. - - - - Create a new context. - - true if HTTPS is used. - Remote client - Network stream, uses . - A new context (always). - - - - Create a secure . - - Client socket (accepted by the ). - HTTPS certificate to use. - Kind of HTTPS protocol. Usually TLS or SSL. - - A created . - - - - - Creates a that handles a connected client. - - Client socket (accepted by the ). - - A creates . - - - - - True if detailed trace logs should be written. - - - - - A request have been received from one of the contexts. - - - - - Custom network stream to mark sockets as reusable when disposing the stream. - - - - - Creates a new instance of the class for the specified . - - - The that the will use to send and receive data. - - - The parameter is null. - - - The parameter is not connected. - -or- - The property of the parameter is not . - -or- - The parameter is in a nonblocking state. - - - - - Initializes a new instance of the class for the specified with the specified ownership. - - - The that the will use to send and receive data. - - - Set to true to indicate that the will take ownership of the ; otherwise, false. - - - The parameter is null. - - - The parameter is not connected. - -or- - the value of the property of the parameter is not . - -or- - the parameter is in a nonblocking state. - - - - - Creates a new instance of the class for the specified with the specified access rights. - - - The that the will use to send and receive data. - - - A bitwise combination of the values that specify the type of access given to the over the provided . - - - The parameter is null. - - - The parameter is not connected. - -or- - the property of the parameter is not . - -or- - the parameter is in a nonblocking state. - - - - - Creates a new instance of the class for the specified with the specified access rights and the specified ownership. - - - The that the will use to send and receive data. - - - A bitwise combination of the values that specifies the type of access given to the over the provided . - - - Set to true to indicate that the will take ownership of the ; otherwise, false. - - - The parameter is null. - - - The parameter is not connected. - -or- - The property of the parameter is not . - -or- - The parameter is in a nonblocking state. - - - - - Closes the current stream and releases any resources (such as sockets and file handles) associated with the current stream. - - - - - Releases the unmanaged resources used by the and optionally releases the managed resources. - - true to release both managed and unmanaged resources; false to release only unmanaged resources. - - - + + + + HttpServer_OpenSim + + + + + A session store is used to store and load sessions on a media. + The default implementation () saves/retrieves sessions from memory. + + + + + Creates a new http session with a generated id. + + A object + + + + Creates a new http session with a specific id + + Id used to identify the new cookie.. + A object. + + Id should be generated by the store implementation if it's null or . + + + + + Load an existing session. + + Session id (usually retrieved from a client side cookie). + A session if found; otherwise null. + + + + Save an updated session to the store. + + Session id (usually retrieved from a client side cookie). + If Id property have not been specified. + + + + We use the flyweight pattern which reuses small objects + instead of creating new each time. + + Unused session that should be reused next time Create is called. + + + + Remove expired sessions + + + + + Remove a session + + id of the session. + + + + Load a session from the store + + + null if session is not found. + + + + Number of minutes before a session expires. + + Default time is 20 minutes. + + + + Contains server side HTTP request information. + + + + + Called during parsing of a . + + Name of the header, should not be URL encoded + Value of the header, should not be URL encoded + If a header is incorrect. + + + + Add bytes to the body + + buffer to read bytes from + where to start read + number of bytes to read + Number of bytes actually read (same as length unless we got all body bytes). + If body is not writable + bytes is null. + offset is out of range. + + + + Clear everything in the request + + + + + Decode body into a form. + + A list with form decoders. + If body contents is not valid for the chosen decoder. + If body is still being transferred. + + + + Sets the cookies. + + The cookies. + + + + Create a response object. + + Context for the connected client. + A new . + + + + Gets kind of types accepted by the client. + + + + + Gets or sets body stream. + + + + + Gets whether the body is complete. + + + + + Gets or sets kind of connection used for the session. + + + + + Gets or sets number of bytes in the body. + + + + + Gets cookies that was sent with the request. + + + + + Gets form parameters. + + + + + Gets headers sent by the client. + + + + + Gets or sets version of HTTP protocol that's used. + + + Probably or . + + + + + + Gets whether the request was made by Ajax (Asynchronous JavaScript) + + + + + Gets or sets requested method. + + + Will always be in upper case. + + + + + + Gets parameter from or . + + + + + Gets variables sent in the query string + + + + + Gets or sets requested URI. + + + + + Gets URI absolute path divided into parts. + + + // URI is: http://gauffin.com/code/tiny/ + Console.WriteLine(request.UriParts[0]); // result: code + Console.WriteLine(request.UriParts[1]); // result: tiny + + + If you're using controllers than the first part is controller name, + the second part is method name and the third part is Id property. + + + + + + Gets or sets path and query. + + + + Are only used during request parsing. Cannot be set after "Host" header have been + added. + + + + + Class that receives Requests from a . + + + + + Client have been disconnected. + + Client that was disconnected. + Reason + + + + + Invoked when a client context have received a new HTTP request + + Client that received the request. + Request that was received. + + + + + Delegate used by to populate select options. + + current object (for instance a User). + Text that should be displayed in the value part of a <optiongt;-tag. + Text shown in the select list. + + // Class that is going to be used in a SELECT-tag. + public class User + { + private readonly string _realName; + private readonly int _id; + public User(int id, string realName) + { + _id = id; + _realName = realName; + } + public string RealName + { + get { return _realName; } + } + + public int Id + { + get { return _id; } + } + } + + // Using an inline delegate to generate the select list + public void UserInlineDelegate() + { + List<User> items = new List<User>(); + items.Add(new User(1, "adam")); + items.Add(new User(2, "bertial")); + items.Add(new User(3, "david")); + string htmlSelect = Select("users", "users", items, delegate(object o, out object id, out object value) + { + User user = (User)o; + id = user.Id; + value = user.RealName; + }, 2, true); + } + + // Using an method as delegate to generate the select list. + public void UseExternalDelegate() + { + List<User> items = new List<User>(); + items.Add(new User(1, "adam")); + items.Add(new User(2, "bertial")); + items.Add(new User(3, "david")); + string htmlSelect = Select("users", "users", items, UserOptions, 1, true); + } + + // delegate returning id and title + public static void UserOptions(object o, out object id, out object title) + { + User user = (User)o; + id = user.Id; + value = user.RealName; + } /// + + + + The server understood the request, but is refusing to fulfill it. + Authorization will not help and the request SHOULD NOT be repeated. + If the request method was not HEAD and the server wishes to make public why the request has not been fulfilled, + it SHOULD describe the reason for the refusal in the entity. If the server does not wish to make this information + available to the client, the status code 404 (Not Found) can be used instead. + + Text taken from: http://www.submissionchamber.com/help-guides/error-codes.php + + + + + All HTTP based exceptions will derive this class. + + + + + Create a new HttpException + + http status code (sent in the response) + error description + + + + Create a new HttpException + + http status code (sent in the response) + error description + inner exception + + + + status code to use in the response. + + + + + Initializes a new instance of the class. + + error message + + + + A session stored in memory. + + + + + Interface for sessions + + + + + Remove everything from the session + + + + + Remove everything from the session + + True if the session is cleared due to expiration + + + + Session id + + + + + Should + + Name of the session variable + null if it's not set + If the object cant be serialized. + + + + When the session was last accessed. + This property is touched by the http server each time the + session is requested. + + + + + Number of session variables. + + + + + Event triggered upon clearing the session + + + + + + + A unique id used by the sessions store to identify the session + + + + Id + + + + + + Remove everything from the session + + + + + Clears the specified expire. + + True if the session is cleared due to expiration + + + + Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources. + + 2 + + + + Session id + + + + + Should + + Name of the session variable + null if it's not set + + + + when the session was last accessed. + + + Used to determine when the session should be removed. + + + + + Number of values in the session + + + + + Flag to indicate that the session have been changed + and should be saved into the session store. + + + + + Event triggered upon clearing the session + + + + + cookie being sent back to the browser. + + + + + + cookie sent by the client/browser + + + + + + Constructor. + + cookie identifier + cookie content + id or content is null + id is empty + + + + Gets the cookie HTML representation. + + cookie string + + + + Gets the cookie identifier. + + + + + Cookie value. Set to null to remove cookie. + + + + + Constructor. + + cookie identifier + cookie content + cookie expiration date. Use DateTime.MinValue for session cookie. + id or content is null + id is empty + + + + Create a new cookie + + name identifying the cookie + cookie value + when the cookie expires. Setting DateTime.MinValue will delete the cookie when the session is closed. + Path to where the cookie is valid + Domain that the cookie is valid for. + + + + Create a new cookie + + Name and value will be used + when the cookie expires. + + + + Gets the cookie HTML representation. + + cookie string + + + + When the cookie expires. + DateTime.MinValue means that the cookie expires when the session do so. + + + + + Cookie is only valid under this path. + + + + + Contains a connection to a browser/client. + + + + + Disconnect from client + + error to report in the event. + + + + Send a response. + + Either or + HTTP status code + reason for the status code. + HTML body contents, can be null or empty. + A content type to return the body as, i.e. 'text/html' or 'text/plain', defaults to 'text/html' if null or empty + If is invalid. + + + + Send a response. + + Either or + HTTP status code + reason for the status code. + + + + Send a response. + + + + + + send a whole buffer + + buffer to send + + + + + Send data using the stream + + Contains data to send + Start position in buffer + number of bytes to send + + + + + + Closes the streams and disposes of the unmanaged resources + + + + + Using SSL or other encryption method. + + + + + Using SSL or other encryption method. + + + + + The context have been disconnected. + + + Event can be used to clean up a context, or to reuse it. + + + + + A request have been received in the context. + + + + + A have been disconnected. + + + + + Initializes a new instance of the class. + + Reason to disconnection. + + + + Gets reason to why client disconnected. + + + + + + + + + + Initializes a new instance of the class. + + The request. + + + + Gets received request. + + + + + Contains a listener that doesn't do anything with the connections. + + + + + Listen for regular HTTP connections + + IP Address to accept connections on + TCP Port to listen on, default HTTP port is 80. + Factory used to create es. + address is null. + Port must be a positive number. + + + + Initializes a new instance of the class. + + IP Address to accept connections on + TCP Port to listen on, default HTTPS port is 443 + Factory used to create es. + Certificate to use + + + + Initializes a new instance of the class. + + IP Address to accept connections on + TCP Port to listen on, default HTTPS port is 443 + Factory used to create es. + Certificate to use + which HTTPS protocol to use, default is TLS. + + + Exception. + + + + Will try to accept connections one more time. + + If any exceptions is thrown. + + + + Can be used to create filtering of new connections. + + Accepted socket + true if connection can be accepted; otherwise false. + + + + Start listen for new connections + + Number of connections that can stand in a queue to be accepted. + Listener have already been started. + + + + Stop the listener + + + + + + Gives you a change to receive log entries for all internals of the HTTP library. + + + You may not switch log writer after starting the listener. + + + + + True if we should turn on trace logs. + + + + + Catch exceptions not handled by the listener. + + + Exceptions will be thrown during debug mode if this event is not used, + exceptions will be printed to console and suppressed during release mode. + + + + + A request have been received from a . + + + + + + + + http://www.faqs.org/rfcs/rfc1867.html + + + + + Interface for form content decoders. + + + + + + + Stream containing the content + Content type (with any additional info like boundry). Content type is always supplied in lower case + Stream enconding + A http form, or null if content could not be parsed. + If contents in the stream is not valid input data. + + + + Checks if the decoder can handle the mime type + + Content type (with any additional info like boundry). Content type is always supplied in lower case. + True if the decoder can parse the specified content type + + + + multipart/form-data + + + + + form-data + + + + + + + Stream containing the content + Content type (with any additional info like boundry). Content type is always supplied in lower case + Stream enconding + A http form, or null if content could not be parsed. + If contents in the stream is not valid input data. + If any parameter is null + + + + Checks if the decoder can handle the mime type + + Content type (with any additional info like boundry). Content type is always supplied in lower case. + True if the decoder can parse the specified content type + + + + The requested resource was not found in the web server. + + + + + Create a new exception + + message describing the error + inner exception + + + + Create a new exception + + message describing the error + + + + Delegate used to let authentication modules authenticate the user name and password. + + Realm that the user want to authenticate in + User name specified by client + Can either be user password or implementation specific token. + object that will be stored in a session variable called if authentication was successful. + throw forbidden exception if too many attempts have been made. + + + Use to specify that the token is a HA1 token. (MD5 generated + string from realm, user name and password); Md5String(userName + ":" + realm + ":" + password); + + + + + + Let's you decide on a system level if authentication is required. + + HTTP request from client + true if user should be authenticated. + throw if no more attempts are allowed. + If no more attempts are allowed + + + + Authentication modules are used to implement different + kind of HTTP authentication. + + + + + Tag used for authentication. + + + + + Initializes a new instance of the class. + + Delegate used to provide information used during authentication. + Delegate used to determine if authentication is required (may be null). + + + + Initializes a new instance of the class. + + Delegate used to provide information used during authentication. + + + + Create a response that can be sent in the WWW-Authenticate header. + + Realm that the user should authenticate in + Array with optional options. + A correct authentication request. + If realm is empty or null. + + + + An authentication response have been received from the web browser. + Check if it's correct + + Contents from the Authorization header + Realm that should be authenticated + GET/POST/PUT/DELETE etc. + options to specific implementations + Authentication object that is stored for the request. A user class or something like that. + if is invalid + If any of the parameters is empty or null. + + + + Used to invoke the authentication delegate that is used to lookup the user name/realm. + + Realm (domain) that user want to authenticate in + User name + Password used for validation. Some implementations got password in clear text, they are then sent to client. + object that will be stored in the request to help you identify the user if authentication was successful. + true if authentication was successful + + + + Determines if authentication is required. + + HTTP request from browser + true if user should be authenticated. + throw from your delegate if no more attempts are allowed. + If no more attempts are allowed + + + + name used in HTTP request. + + + + + Contains some kind of input from the browser/client. + can be QueryString, form data or any other request body content. + + + + + Base class for request data containers + + + + + Adds a parameter mapped to the presented name + + The name to map the parameter to + The parameter value + + + + Returns true if the container contains the requested parameter + + Parameter id + True if parameter exists + + + + Returns a request parameter + + The name associated with the parameter + + + + Representation of a non-initialized class instance + + + Variable telling the class that it is non-initialized + + + + Initializes a new instance of the class. + + form name. + + + + Initializes a new instance of the class. + + form name. + if set to true all changes will be ignored. + this constructor should only be used by Empty + + + Creates a deep copy of the HttpInput class + The object to copy + The function makes a deep copy of quite a lot which can be slow + + + + Add a new element. Form array elements are parsed + and added in a correct hierarchy. + + Name is converted to lower case. + + name is null. + Cannot add stuff to . + + + + Returns true if the class contains a with the corresponding name. + + The field/query string name + True if the value exists + + + + Parses an item and returns it. + This function is primarily used to parse array items as in user[name]. + + + + + + + Outputs the instance representing all its values joined together + + + + Returns all items as an unescaped query string. + + + + + Extracts one parameter from an array + + Containing the string array + All but the first value + + string test1 = ExtractOne("system[user][extension][id]"); + string test2 = ExtractOne(test1); + string test3 = ExtractOne(test2); + // test1 = user[extension][id] + // test2 = extension[id] + // test3 = id + + + + Resets all data contained by class + + + + Returns an enumerator that iterates through the collection. + + + + A that can be used to iterate through the collection. + + 1 + + + + Returns an enumerator that iterates through a collection. + + + + An object that can be used to iterate through the collection. + + 2 + + + + Form name as lower case + + + + + Get a form item. + + + Returns if item was not found. + + + + Small design by contract implementation. + + + + + Check whether a parameter is empty. + + Parameter value + Parameter name, or error description. + value is empty. + + + + Checks whether a parameter is null. + + Parameter value + Parameter name, or error description. + value is null. + + + + Checks whether a parameter is null. + + + Parameter value + Parameter name, or error description. + value is null. + + + + Contains all HTTP Methods (according to the HTTP 1.1 specification) + + See: http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html + + + + + + The DELETE method requests that the origin server delete the resource identified by the Request-URI. + + + + This method MAY be overridden by human intervention (or other means) on the origin server. + The client cannot be guaranteed that the operation has been carried out, even if the status code + returned from the origin server indicates that the action has been completed successfully. + + + However, the server SHOULD NOT indicate success unless, at the time the response is given, + it intends to delete the resource or move it to an inaccessible location. + + + A successful response SHOULD be 200 (OK) if the response includes an entity describing the status, + 202 (Accepted) if the action has not yet been enacted, + or 204 (No Content) if the action has been enacted but the response does not include an entity. + + + If the request passes through a cache and the Request-URI identifies one or more currently cached entities, + those entries SHOULD be treated as stale. Responses to this method are not cacheable. + + + + + + The GET method means retrieve whatever information (in the form of an entity) is identified by the Request-URI. + + + + If the Request-URI refers to a data-producing process, it is the produced data which shall be returned as the + entity in the response and not the source text of the process, unless that text happens to be the output of the process. + + + The semantics of the GET method change to a "conditional GET" if the request message includes an + If-Modified-Since, If-Unmodified-Since, If-Match, If-None-Match, or If-Range header field. + A conditional GET method requests that the entity be transferred only under the circumstances described + by the conditional header field(s). The conditional GET method is intended to reduce unnecessary network + usage by allowing cached entities to be refreshed without requiring multiple requests or transferring + data already held by the client. + + + + + + The HEAD method is identical to GET except that the server MUST NOT return a message-body in the response. + + + The meta information contained in the HTTP headers in response to a HEAD request SHOULD be identical to the + information sent in response to a GET request. This method can be used for obtaining meta information about + the entity implied by the request without transferring the entity-body itself. + + This method is often used for testing hypertext links for validity, accessibility, and recent modification. + + + + + The OPTIONS method represents a request for information about the communication options available on the request/response chain identified by the Request-URI. + + + This method allows the client to determine the options and/or requirements associated with a resource, or the capabilities of a server, without implying a resource action or initiating a resource retrieval. + + + + + The POST method is used to request that the origin server accept the entity enclosed + in the request as a new subordinate of the resource identified by the Request-URI in the Request-Line. + + + POST is designed to allow a uniform method to cover the following functions: + + + Annotation of existing resources; + + Posting a message to a bulletin board, newsgroup, mailing list, or similar group of articles; + + Providing a block of data, such as the result of submitting a form, to a data-handling process; + + Extending a database through an append operation. + + + + If a resource has been created on the origin server, the response SHOULD be 201 (Created) and + contain an entity which describes the status of the request and refers to the new resource, and a + Location header (see section 14.30). + + + The action performed by the POST method might not result in a resource that can be identified by a URI. + In this case, either 200 (OK) or 204 (No Content) is the appropriate response status, depending on + whether or not the response includes an entity that describes the result. + + Responses to this method are not cacheable, unless the response includes appropriate Cache-Control + or Expires header fields. However, the 303 (See Other) response can be used to direct the user agent + to retrieve a cacheable resource. + + + + + + The PUT method requests that the enclosed entity be stored under the supplied Request-URI. + + + + + If the Request-URI refers to an already existing resource, the enclosed entity SHOULD be considered as a + modified version of the one residing on the origin server. + + If the Request-URI does not point to an existing resource, and that URI is capable of being defined as a new + resource by the requesting user agent, the origin server can create the resource with that URI. + + If a new resource is created, the origin server MUST inform the user agent via the 201 (Created) response. + + If an existing resource is modified, either the 200 (OK) or 204 (No Content) response codes SHOULD be sent to + indicate successful completion of the request. + + If the resource could not be created or modified with the Request-URI, an appropriate error response SHOULD be + given that reflects the nature of the problem. + + + + The recipient of the entity MUST NOT ignore any Content-* (e.g. Content-Range) headers that it does not + understand or implement and MUST return a 501 (Not Implemented) response in such cases. + + + + + + The TRACE method is used to invoke a remote, application-layer loop- back of the request message. + + + + + Contains all HTTP Methods (according to the HTTP 1.1 specification) + + See: http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html + + + + + + The DELETE method requests that the origin server delete the resource identified by the Request-URI. + + + + This method MAY be overridden by human intervention (or other means) on the origin server. + The client cannot be guaranteed that the operation has been carried out, even if the status code + returned from the origin server indicates that the action has been completed successfully. + + + However, the server SHOULD NOT indicate success unless, at the time the response is given, + it intends to delete the resource or move it to an inaccessible location. + + + A successful response SHOULD be 200 (OK) if the response includes an entity describing the status, + 202 (Accepted) if the action has not yet been enacted, + or 204 (No Content) if the action has been enacted but the response does not include an entity. + + + If the request passes through a cache and the Request-URI identifies one or more currently cached entities, + those entries SHOULD be treated as stale. Responses to this method are not cacheable. + + + + + + The GET method means retrieve whatever information (in the form of an entity) is identified by the Request-URI. + + + + If the Request-URI refers to a data-producing process, it is the produced data which shall be returned as the + entity in the response and not the source text of the process, unless that text happens to be the output of the process. + + + The semantics of the GET method change to a "conditional GET" if the request message includes an + If-Modified-Since, If-Unmodified-Since, If-Match, If-None-Match, or If-Range header field. + A conditional GET method requests that the entity be transferred only under the circumstances described + by the conditional header field(s). The conditional GET method is intended to reduce unnecessary network + usage by allowing cached entities to be refreshed without requiring multiple requests or transferring + data already held by the client. + + + + + + The HEAD method is identical to GET except that the server MUST NOT return a message-body in the response. + + + The meta information contained in the HTTP headers in response to a HEAD request SHOULD be identical to the + information sent in response to a GET request. This method can be used for obtaining meta information about + the entity implied by the request without transferring the entity-body itself. + + This method is often used for testing hypertext links for validity, accessibility, and recent modification. + + + + + The OPTIONS method represents a request for information about the communication options available on the request/response chain identified by the Request-URI. + + + This method allows the client to determine the options and/or requirements associated with a resource, or the capabilities of a server, without implying a resource action or initiating a resource retrieval. + + + + + The POST method is used to request that the origin server accept the entity enclosed + in the request as a new subordinate of the resource identified by the Request-URI in the Request-Line. + + + POST is designed to allow a uniform method to cover the following functions: + + + Annotation of existing resources; + + Posting a message to a bulletin board, newsgroup, mailing list, or similar group of articles; + + Providing a block of data, such as the result of submitting a form, to a data-handling process; + + Extending a database through an append operation. + + + + If a resource has been created on the origin server, the response SHOULD be 201 (Created) and + contain an entity which describes the status of the request and refers to the new resource, and a + Location header (see section 14.30). + + + The action performed by the POST method might not result in a resource that can be identified by a URI. + In this case, either 200 (OK) or 204 (No Content) is the appropriate response status, depending on + whether or not the response includes an entity that describes the result. + + Responses to this method are not cacheable, unless the response includes appropriate Cache-Control + or Expires header fields. However, the 303 (See Other) response can be used to direct the user agent + to retrieve a cacheable resource. + + + + + + The PUT method requests that the enclosed entity be stored under the supplied Request-URI. + + + + + If the Request-URI refers to an already existing resource, the enclosed entity SHOULD be considered as a + modified version of the one residing on the origin server. + + If the Request-URI does not point to an existing resource, and that URI is capable of being defined as a new + resource by the requesting user agent, the origin server can create the resource with that URI. + + If a new resource is created, the origin server MUST inform the user agent via the 201 (Created) response. + + If an existing resource is modified, either the 200 (OK) or 204 (No Content) response codes SHOULD be sent to + indicate successful completion of the request. + + If the resource could not be created or modified with the Request-URI, an appropriate error response SHOULD be + given that reflects the nature of the problem. + + + + The recipient of the entity MUST NOT ignore any Content-* (e.g. Content-Range) headers that it does not + understand or implement and MUST return a 501 (Not Implemented) response in such cases. + + + + + + The TRACE method is used to invoke a remote, application-layer loop- back of the request message. + + + + + Priority for log entries + + + + + + Very detailed logs to be able to follow the flow of the program. + + + + + Logs to help debug errors in the application + + + + + Information to be able to keep track of state changes etc. + + + + + Something did not go as we expected, but it's no problem. + + + + + Something that should not fail failed, but we can still keep + on going. + + + + + Something failed, and we cannot handle it properly. + + + + + Interface used to write to log files. + + + + + Write an entry to the log file. + + object that is writing to the log + importance of the log message + the message + + + + This class writes to the console. It colors the output depending on the logprio and includes a 3-level stacktrace (in debug mode) + + + + + + The actual instance of this class. + + + + + Logwriters the specified source. + + object that wrote the logentry. + Importance of the log message + The message. + + + + Get color for the specified logprio + + prio for the log entry + A for the prio + + + + Default log writer, writes everything to null (nowhere). + + + + + + The logging instance. + + + + + Writes everything to null + + object that wrote the log entry. + Importance of the log message + The message. + + + + Inversion of control interface. + + + + + Add a component instance + + Interface type + Instance to add + + + + Get a component. + + Interface type + Component if registered, otherwise null. + + Component will get created if needed. + + + + + Checks if the specified component interface have been added. + + + true if found; otherwise false. + + + + Add a component. + + Type being requested. + Type being created. + + + + Returns item either from a form or a query string (checks them in that order) + + + + Representation of a non-initialized HttpParam + + + Initialises the class to hold a value either from a post request or a querystring request + + + + The add method is not availible for HttpParam + since HttpParam checks both Request.Form and Request.QueryString + + name identifying the value + value to add + + + + + Checks whether the form or querystring has the specified value + + Name, case sensitive + true if found; otherwise false. + + + + Returns an enumerator that iterates through the collection. + + + + A that can be used to iterate through the collection. + + 1 + + + + Returns an enumerator that iterates through a collection. + + + + An object that can be used to iterate through the collection. + + 2 + + + + Fetch an item from the form or querystring (in that order). + + + Item if found; otherwise HttpInputItem.EmptyLanguageNode + + + Container for posted form data + + + Instance to help mark a non-initialized form + + + Initializes a form container with the specified name + + + + Makes a deep copy of the input + + The input to copy + + + + Adds a file to the collection of posted files + + The file to add + If the file is already added + If file is null + If the instance is HttpForm.EmptyForm which cannot be modified + + + + Checks if the form contains a specified file + + Field name of the file parameter + True if the file exists + If the instance is HttpForm.EmptyForm which cannot be modified + + + + Retrieves a file held by by the form + + The identifier of the file + The requested file or null if the file was not found + If name is null or empty + If the instance is HttpForm.EmptyForm which cannot be modified + + + Disposes all held HttpFile's and resets values + + + + Retrieves the number of files added to the + + 0 if no files are added + + + + The object form class takes an object and creates form items for it. + + + + + Initializes a new instance of the class. + + + form name *and* id. + action to do when form is posted. + + + + + Initializes a new instance of the class. + + form name *and* id. + action to do when form is posted. + object to get values from + + + + Initializes a new instance of the class. + + form action. + object to get values from. + + + + write out the FORM-tag. + + generated html code + + + + Writeout the form tag + + form should be posted through ajax. + generated html code + + + + Generates a text box. + + + + generated html code + + + + password box + + + + generated html code + + + + Hiddens the specified property name. + + Name of the property. + The options. + generated html code + + + + Labels the specified property name. + + property in object. + caption + generated html code + + + + Generate a checkbox + + property in object + checkbox value + additional html attributes. + generated html code + + + + Write a html select tag + + object property. + id column + The title column. + The options. + + + + + Selects the specified property name. + + Name of the property. + The items. + The id column. + The title column. + The options. + + + + + Write a submit tag. + + button caption + html submit tag + + + + html end form tag + + html + + + + This provider is used to let us implement any type of form decoding we want without + having to rewrite anything else in the server. + + + + + + + Should contain boundary and type, as in: multipart/form-data; boundary=---------------------------230051238959 + Stream containing form data. + Encoding used when decoding the stream + if no parser was found. + If stream is null or not readable. + If stream contents cannot be decoded properly. + + + + Add a decoder. + + + + + + + Number of added decoders. + + + + + Use with care. + + + + + Decoder used for unknown content types. + + + + + We dont want to let the server to die due to exceptions thrown in worker threads. + therefore we use this delegate to give you a change to handle uncaught exceptions. + + Class that the exception was thrown in. + Exception + + Server will throw a InternalServerException in release version if you dont + handle this delegate. + + + + + Contains a connection to a browser/client. + + + Remember to after you have hooked the event. + + TODO: Maybe this class should be broken up into HttpClientChannel and HttpClientContext? + + + + Initializes a new instance of the class. + + true if the connection is secured (SSL/TLS) + client that connected. + Stream used for communication + Used to create a . + Size of buffer to use when reading data. Must be at least 4096 bytes. + If fails + Stream must be writable and readable. + + + + Process incoming body bytes. + + + Bytes + + + + + + + + + + + Start reading content. + + + Make sure to call base.Start() if you override this method. + + + + + Clean up context. + + + Make sure to call base.Cleanup() if you override the method. + + + + + Disconnect from client + + error to report in the event. + + + + Send a response. + + Either or + HTTP status code + reason for the status code. + HTML body contents, can be null or empty. + A content type to return the body as, i.e. 'text/html' or 'text/plain', defaults to 'text/html' if null or empty + If is invalid. + + + + Send a response. + + Either or + HTTP status code + reason for the status code. + + + + Send a response. + + + + + + send a whole buffer + + buffer to send + + + + + Send data using the stream + + Contains data to send + Start position in buffer + number of bytes to send + + + + + + This context have been cleaned, which means that it can be reused. + + + + + Context have been started (a new client have connected) + + + + + Overload to specify own type. + + + Must be specified before the context is being used. + + + + + Using SSL or other encryption method. + + + + + Using SSL or other encryption method. + + + + + Specify which logger to use. + + + + + Gets or sets the network stream. + + + + + Gets or sets IP address that the client connected from. + + + + + Gets or sets port that the client connected from. + + + + + The context have been disconnected. + + + Event can be used to clean up a context, or to reuse it. + + + + + A request have been received in the context. + + + + + Helpers to make XML handling easier + + + + + Serializes object to XML. + + object to serialize. + XML + + Removes name spaces and adds indentation + + + + + Create an object from a XML string + + Type of object + XML string + object + + + + Can handle application/x-www-form-urlencoded + + + + + + Stream containing the content + Content type (with any additional info like boundry). Content type is always supplied in lower case + Stream encoding + + A HTTP form, or null if content could not be parsed. + + If contents in the stream is not valid input data. + + + + Checks if the decoder can handle the mime type + + Content type (with any additional info like boundry). Content type is always supplied in lower case. + True if the decoder can parse the specified content type + + + + Invoked when a client have been accepted by the + + + Can be used to revoke incoming connections + + + + + Initializes a new instance of the class. + + The socket. + + + + Client may not be handled. + + + + + Accepted socket. + + + + + Client should be revoked. + + + + + Arguments sent when a is cleared + + + + + Instantiates the arguments for the event + + True if the session is cleared due to expiration + + + + Returns true if the session is cleared due to expiration + + + + + Delegate for when a IHttpSession is cleared + + this is being cleared. + Arguments for the clearing + + + + Event arguments used when a new header have been parsed. + + + + + Initializes a new instance of the class. + + Name of header. + Header value. + + + + Initializes a new instance of the class. + + + + + Gets or sets header name. + + + + + Gets or sets header value. + + + + Class to handle loading of resource files + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + logger. + + + + Loads resources from a namespace in the given assembly to an URI + + The URI to map the resources to + The assembly in which the resources reside + The namespace from which to load the resources + + + resourceLoader.LoadResources("/user/", typeof(User).Assembly, "MyLib.Models.User.Views"); + + Will make the resource MyLib.Models.User.Views.list.Haml accessible via /user/list.haml or /user/list/ + + The amount of loaded files, giving you the possibility of making sure the resources needed gets loaded + If a resource has already been mapped to an uri + + + + Retrieves a stream for the specified resource path if loaded otherwise null + + Path to the resource to retrieve a stream for + A stream or null if the resource couldn't be found + + + + Fetch all files from the resource that matches the specified arguments. + + The path to the resource to extract + + a list of files if found; or an empty array if no files are found. + + Search path must end with an asterisk for finding arbitrary files + + + + Fetch all files from the resource that matches the specified arguments. + + Where the file should reside. + Files to check + + a list of files if found; or an empty array if no files are found. + + + + + Returns whether or not the loader has an instance of the file requested + + The name of the template/file + True if the loader can provide the file + + + + redirects from one URL to another. + + + + + Rules are used to perform operations before a request is being handled. + Rules can be used to create routing etc. + + + + + Process the incoming request. + + incoming HTTP request + outgoing HTTP response + true if response should be sent to the browser directly (no other rules or modules will be processed). + + returning true means that no modules will get the request. Returning true is typically being done + for redirects. + + If request or response is null. + + + + Initializes a new instance of the class. + + Absolute path (no server name) + Absolute path (no server name) + + server.Add(new RedirectRule("/", "/user/index")); + + + + + Initializes a new instance of the class. + + Absolute path (no server name) + Absolute path (no server name) + true if request should be redirected, false if the request URI should be replaced. + + server.Add(new RedirectRule("/", "/user/index")); + + + + + Process the incoming request. + + incoming HTTP request + outgoing HTTP response + true if response should be sent to the browser directly (no other rules or modules will be processed). + + returning true means that no modules will get the request. Returning true is typically being done + for redirects. + + + + + Gets string to match request URI with. + + Is compared to request.Uri.AbsolutePath + + + + Gets where to redirect. + + + + + Gets whether server should redirect client. + + + false means that the rule will replace + the current request URI with the new one from this class. + true means that a redirect response is sent to the client. + + + + + Used to queue incoming requests. + + + + + Initializes a new instance of the class. + + Called when a request should be processed. + + + + Used to process queued requests. + + + + + Gets or sets maximum number of allowed simultaneous requests. + + + + + Gets or sets maximum number of requests queuing to be handled. + + + + + Specifies how many requests the HTTP server is currently processing. + + + + + Used two queue incoming requests to avoid + thread starvation. + + + + + Method used to process a queued request + + Context that the request was received from. + Request to process. + + + + Parses a HTTP request directly from a stream + + + + + Event driven parser used to parse incoming HTTP requests. + + + The parser supports partial messages and keeps the states between + each parsed buffer. It's therefore important that the parser gets + ed if a client disconnects. + + + + + Parse partial or complete message. + + buffer containing incoming bytes + where in buffer that parsing should start + number of bytes to parse + Unparsed bytes left in buffer. + BadRequestException. + + + + Clear parser state. + + + + + Current state in parser. + + + + + A request have been successfully parsed. + + + + + More body bytes have been received. + + + + + Request line have been received. + + + + + A header have been received. + + + + + Gets or sets the log writer. + + + + + Create a new request parser + + delegate receiving log entries. + + + + Add a number of bytes to the body + + buffer containing more body bytes. + starting offset in buffer + number of bytes, from offset, to read. + offset to continue from. + + + + Remove all state information for the request. + + + + + Parse request line + + + If line is incorrect + Expects the following format: "Method SP Request-URI SP HTTP-Version CRLF" + + + + We've parsed a new header. + + Name in lower case + Value, unmodified. + If content length cannot be parsed. + + + + Parse a message + + bytes to parse. + where in buffer that parsing should start + number of bytes to parse, starting on . + offset (where to start parsing next). + BadRequestException. + + + + Gets or sets the log writer. + + + + + Current state in parser. + + + + + A request have been successfully parsed. + + + + + More body bytes have been received. + + + + + Request line have been received. + + + + + A header have been received. + + + + + Response that is sent back to the web browser / client. + + A response can be sent if different ways. The easiest one is + to just fill the Body stream with content, everything else + will then be taken care of by the framework. The default content-type + is text/html, you should change it if you send anything else. + + The second and slighty more complex way is to send the response + as parts. Start with sending the header using the SendHeaders method and + then you can send the body using SendBody method, but do not forget + to set ContentType and ContentLength before doing so. + + + public void MyHandler(IHttpRequest request, IHttpResponse response) + { + + } + + + + + Add another header to the document. + + Name of the header, case sensitive, use lower cases. + Header values can span over multiple lines as long as each line starts with a white space. New line chars should be \r\n + If headers already been sent. + If value conditions have not been met. + Adding any header will override the default ones and those specified by properties. + + + + Send headers and body to the browser. + + If content have already been sent. + + + + Make sure that you have specified ContentLength and sent the headers first. + + + If headers have not been sent. + + offest of first byte to send + number of bytes to send. + + + This method can be used if you want to send body contents without caching them first. This + is recommended for larger files to keep the memory usage low. + + + + Make sure that you have specified ContentLength and sent the headers first. + + + If headers have not been sent. + + + + This method can be used if you want to send body contents without caching them first. This + is recommended for larger files to keep the memory usage low. + + + + Send headers to the client. + + If headers already been sent. + + + + + + + Redirect client to somewhere else using the 302 status code. + + Destination of the redirect + If headers already been sent. + You can not do anything more with the request when a redirect have been done. This should be your last + action. + + + + redirect to somewhere + + where the redirect should go + + No body are allowed when doing redirects. + + + + + The body stream is used to cache the body contents + before sending everything to the client. It's the simplest + way to serve documents. + + + + + Defines the version of the HTTP Response for applications where it's required + for this to be forced. + + + + + The chunked encoding modifies the body of a message in order to + transfer it as a series of chunks, each with its own size indicator, + followed by an OPTIONAL trailer containing entity-header fields. This + allows dynamically produced content to be transferred along with the + information necessary for the recipient to verify that it has + received the full message. + + + + + Kind of connection + + + + + Encoding to use when sending stuff to the client. + + Default is UTF8 + + + + Number of seconds to keep connection alive + + Only used if Connection property is set to ConnectionType.KeepAlive + + + + Status code that is sent to the client. + + Default is HttpStatusCode.Ok + + + + Information about why a specific status code was used. + + + + + Size of the body. MUST be specified before sending the header, + unless property Chunked is set to true. + + + + + Kind of content in the body + + Default is text/html + + + + Headers have been sent to the client- + + You can not send any additional headers if they have already been sent. + + + + The whole response have been sent. + + + + + Cookies that should be created/changed. + + + + + Type of HTTP connection + + + + + Connection is closed after each request-response + + + + + Connection is kept alive for X seconds (unless another request have been made) + + + + + Response that is sent back to the web browser / client. + + + + A response can be sent if different ways. The easiest one is + to just fill the Body stream with content, everything else + will then be taken care of by the framework. The default content-type + is text/html, you should change it if you send anything else. + + The second and slightly more complex way is to send the response + as parts. Start with sending the header using the SendHeaders method and + then you can send the body using SendBody method, but do not forget + to set and before doing so. + + + + + // Example using response body. + class MyModule : HttpModule + { + public override bool Process(IHttpRequest request, IHttpResponse response, IHttpSession session) + { + StreamWriter writer = new StreamWriter(response.Body); + writer.WriteLine("Hello dear World!"); + writer.Flush(); + + // return true to tell webserver that we've handled the url + return true; + } + } + + + todo: add two examples, using SendHeaders/SendBody and just the Body stream. + + + + Initializes a new instance of the class. + + Client that send the . + Contains information of what the client want to receive. + cannot be empty. + + + + Initializes a new instance of the class. + + Client that send the . + Version of HTTP protocol that the client uses. + Type of HTTP connection used. + + + + Add another header to the document. + + Name of the header, case sensitive, use lower cases. + Header values can span over multiple lines as long as each line starts with a white space. New line chars should be \r\n + If headers already been sent. + If value conditions have not been met. + Adding any header will override the default ones and those specified by properties. + + + + Send headers and body to the browser. + + If content have already been sent. + + + + Make sure that you have specified and sent the headers first. + + + If headers have not been sent. + + offset of first byte to send + number of bytes to send. + + + This method can be used if you want to send body contents without caching them first. This + is recommended for larger files to keep the memory usage low. + + + + Make sure that you have specified and sent the headers first. + + + If headers have not been sent. + + + + This method can be used if you want to send body contents without caching them first. This + is recommended for larger files to keep the memory usage low. + + + + Send headers to the client. + + If headers already been sent. + + + + + + + Redirect client to somewhere else using the 302 status code. + + Destination of the redirect + If headers already been sent. + You can not do anything more with the request when a redirect have been done. This should be your last + action. + + + + redirect to somewhere + + where the redirect should go + + No body are allowed when doing redirects. + + + + + The body stream is used to cache the body contents + before sending everything to the client. It's the simplest + way to serve documents. + + + + + The chunked encoding modifies the body of a message in order to + transfer it as a series of chunks, each with its own size indicator, + followed by an OPTIONAL trailer containing entity-header fields. This + allows dynamically produced content to be transferred along with the + information necessary for the recipient to verify that it has + received the full message. + + + + + Defines the version of the HTTP Response for applications where it's required + for this to be forced. + + + + + Kind of connection + + + + + Encoding to use when sending stuff to the client. + + Default is UTF8 + + + + Number of seconds to keep connection alive + + Only used if Connection property is set to . + + + + Status code that is sent to the client. + + Default is + + + + Information about why a specific status code was used. + + + + + Size of the body. MUST be specified before sending the header, + unless property Chunked is set to true. + + + + + Kind of content in the body + + Default type is "text/html" + + + + Headers have been sent to the client- + + You can not send any additional headers if they have already been sent. + + + + The whole response have been sent. + + + + + Cookies that should be created/changed. + + + + + represents a HTTP input item. Each item can have multiple sub items, a sub item + is made in a HTML form by using square brackets + + + // becomes: + Console.WriteLine("Value: {0}", form["user"]["FirstName"].Value); + + + All names in a form SHOULD be in lowercase. + + + + Representation of a non-initialized . + + + + Initializes an input item setting its name/identifier and value + + Parameter name/id + Parameter value + + + Creates a deep copy of the item specified + The item to copy + The function makes a deep copy of quite a lot which can be slow + + + + Add another value to this item + + Value to add. + Cannot add stuff to . + + + + checks if a sub-item exists (and has a value). + + name in lower case + true if the sub-item exists and has a value; otherwise false. + + + Returns a formatted representation of the instance with the values of all contained parameters + + + + Outputs the string in a formatted manner + + A prefix to append, used internally + produce a query string + + + + Add a sub item. + + Can contain array formatting, the item is then parsed and added in multiple levels + Value to add. + Argument is null. + Cannot add stuff to . + + + + Returns an enumerator that iterates through the collection. + + + + A that can be used to iterate through the collection. + + 1 + + + + Returns an enumerator that iterates through a collection. + + + + An object that can be used to iterate through the collection. + + 2 + + + + Outputs the string in a formatted manner + + A prefix to append, used internally + + + + + Number of values + + + + + Get a sub item + + name in lower case. + if no item was found. + + + + Name of item (in lower case). + + + + + Returns the first value, or null if no value exist. + + + + + Returns the last value, or null if no value exist. + + + + + Returns the list with values. + + + + + + + name in lower case + + + + + Helpers making it easier to work with forms. + + + + + + Used to let the website use different JavaScript libraries. + Default is + + + + + Create a <form> tag. + + name of form + action to invoke on submit + form should be posted as Ajax + HTML code + + + // without options + WebHelper.FormStart("frmLogin", "/user/login", Request.IsAjax); + + // with options + WebHelper.FormStart("frmLogin", "/user/login", Request.IsAjax, "style", "display:inline", "class", "greenForm"); + + + HTML attributes or JavaScript options. + Method will ALWAYS be POST. + options must consist of name, value, name, value + + + + Creates a select list with the values in a collection. + + Name of the SELECT-tag + collection used to generate options. + delegate used to return id and title from objects. + value that should be marked as selected. + First row should contain an empty value. + string containing a SELECT-tag. + + + + + Creates a select list with the values in a collection. + + Name of the SELECT-tag + Id of the SELECT-tag + collection used to generate options. + delegate used to return id and title from objects. + value that should be marked as selected. + First row should contain an empty value. + string containing a SELECT-tag. + + + + // Class that is going to be used in a SELECT-tag. + public class User + { + private readonly string _realName; + private readonly int _id; + public User(int id, string realName) + { + _id = id; + _realName = realName; + } + public string RealName + { + get { return _realName; } + } + + public int Id + { + get { return _id; } + } + } + + // Using an inline delegate to generate the select list + public void UserInlineDelegate() + { + List<User> items = new List<User>(); + items.Add(new User(1, "adam")); + items.Add(new User(2, "bertial")); + items.Add(new User(3, "david")); + string htmlSelect = Select("users", "users", items, delegate(object o, out object id, out object value) + { + User user = (User)o; + id = user.Id; + value = user.RealName; + }, 2, true); + } + + // Using an method as delegate to generate the select list. + public void UseExternalDelegate() + { + List<User> items = new List<User>(); + items.Add(new User(1, "adam")); + items.Add(new User(2, "bertial")); + items.Add(new User(3, "david")); + string htmlSelect = Select("users", "users", items, UserOptions, 1, true); + } + + // delegate returning id and title + public static void UserOptions(object o, out object id, out object title) + { + User user = (User)o; + id = user.Id; + value = user.RealName; + } + + + name, id, collection or getIdTitle is null. + + + + Creates a select list with the values in a collection. + + Name of the SELECT-tag + Id of the SELECT-tag + collection used to generate options. + delegate used to return id and title from objects. + value that should be marked as selected. + First row should contain an empty value. + name, value collection of extra HTML attributes. + string containing a SELECT-tag. + + name, id, collection or getIdTitle is null. + Invalid HTML attribute list. + + + + Generate a list of HTML options + + collection used to generate options. + delegate used to return id and title from objects. + value that should be marked as selected. + First row should contain an empty value. + + collection or getIdTitle is null. + + + sb is null. + + + + Creates a check box. + + element name + element value + determines if the check box is selected or not. This is done differently depending on the + type of variable. A boolean simply triggers checked or not, all other types are compared with "value" to determine if + the box is checked or not. + a list with additional attributes (name, value, name, value). + a generated radio button + + + + Creates a check box. + + element name + element id + element value + determines if the check box is selected or not. This is done differently depending on the + type of variable. A boolean simply triggers checked or not, all other types are compared with "value" to determine if + the box is checked or not. + a list with additional attributes (name, value, name, value). + a generated radio button + + value in your business object. (check box will be selected if it matches the element value) + + + + + Creates a check box. + + element name + element id + determines if the check box is selected or not. This is done differently depending on the + type of variable. A boolean simply triggers checked or not, all other types are compared with "value" to determine if + the box is checked or not. + a list with additional attributes (name, value, name, value). + a generated radio button + will set value to "1". + + + + Creates a RadioButton. + + element name + element value + determines if the radio button is selected or not. This is done differently depending on the + type of variable. A boolean simply triggers checked or not, all other types are compared with "value" to determine if + the box is checked or not. + a list with additional attributes (name, value, name, value). + a generated radio button + + + + Creates a RadioButton. + + element name + element id + element value + determines if the radio button is selected or not. This is done differently depending on the + type of variable. A boolean simply triggers checked or not, all other types are compared with "value" to determine if + the box is checked or not. + a list with additional attributes (name, value, name, value). + a generated radio button + + + + form close tag + + + + + + Add a component instance + + Interface type + Instance to add + + + + Get a component. + + Interface type + Component if registered, otherwise null. + + Component will get created if needed. + + + + If instance cannot be created. + + + + Checks if the specified component interface have been added. + + + true if found; otherwise false. + + + + Add a component. + + Type being requested. + Type being created. + Type have already been mapped. + + + + Arguments used when more body bytes have come. + + + + + Initializes a new instance of the class. + + buffer that contains the received bytes. + offset in buffer where to start processing. + number of bytes from that should be parsed. + + + + Initializes a new instance of the class. + + + + + Gets or sets buffer that contains the received bytes. + + + + + Gets or sets number of bytes from that should be parsed. + + + + + Gets or sets offset in buffer where to start processing. + + + + + Used to create and reuse contexts. + + + + + Used to create es. + + + + + Creates a that handles a connected client. + + Client socket (accepted by the ). + A creates . + + + + Create a secure . + + Client socket (accepted by the ). + HTTPS certificate to use. + Kind of HTTPS protocol. Usually TLS or SSL. + A created . + + + + A request have been received from one of the contexts. + + + + + Initializes a new instance of the class. + + The writer. + Amount of bytes to read from the incoming socket stream. + Used to create a request parser. + + + + Create a new context. + + true if socket is running HTTPS. + Client that connected + Network/SSL stream. + A context. + + + + Create a new context. + + true if HTTPS is used. + Remote client + Network stream, uses . + A new context (always). + + + + Create a secure . + + Client socket (accepted by the ). + HTTPS certificate to use. + Kind of HTTPS protocol. Usually TLS or SSL. + + A created . + + + + + Creates a that handles a connected client. + + Client socket (accepted by the ). + + A creates . + + + + + True if detailed trace logs should be written. + + + + + A request have been received from one of the contexts. + + + + + Custom network stream to mark sockets as reusable when disposing the stream. + + + + + Creates a new instance of the class for the specified . + + + The that the will use to send and receive data. + + + The parameter is null. + + + The parameter is not connected. + -or- + The property of the parameter is not . + -or- + The parameter is in a nonblocking state. + + + + + Initializes a new instance of the class for the specified with the specified ownership. + + + The that the will use to send and receive data. + + + Set to true to indicate that the will take ownership of the ; otherwise, false. + + + The parameter is null. + + + The parameter is not connected. + -or- + the value of the property of the parameter is not . + -or- + the parameter is in a nonblocking state. + + + + + Creates a new instance of the class for the specified with the specified access rights. + + + The that the will use to send and receive data. + + + A bitwise combination of the values that specify the type of access given to the over the provided . + + + The parameter is null. + + + The parameter is not connected. + -or- + the property of the parameter is not . + -or- + the parameter is in a nonblocking state. + + + + + Creates a new instance of the class for the specified with the specified access rights and the specified ownership. + + + The that the will use to send and receive data. + + + A bitwise combination of the values that specifies the type of access given to the over the provided . + + + Set to true to indicate that the will take ownership of the ; otherwise, false. + + + The parameter is null. + + + The parameter is not connected. + -or- + The property of the parameter is not . + -or- + The parameter is in a nonblocking state. + + + + + Closes the current stream and releases any resources (such as sockets and file handles) associated with the current stream. + + + + + Releases the unmanaged resources used by the and optionally releases the managed resources. + + true to release both managed and unmanaged resources; false to release only unmanaged resources. + + + + Serves files that are stored in embedded resources. + + + + + A HttpModule can be used to serve Uri's. The module itself + decides if it should serve a Uri or not. In this way, you can + get a very flexible http application since you can let multiple modules + serve almost similar urls. + + + Throw if you are using a and want to prompt for user name/password. + + + + + Method that process the url + + Information sent by the browser about the request + Information that is being sent back to the client. + Session used to + true if this module handled the request. + + + + Set the log writer to use. + + logwriter to use. + + + + Log something. + + importance of log message + message + + + + If true specifies that the module doesn't consume the processing of a request so that subsequent modules + can continue processing afterwards. Default is false. + + + + + Initializes a new instance of the class. + Runs to make sure the basic mime types are available, they can be cleared later + through the use of if desired. + + + + + Initializes a new instance of the class. + Runs to make sure the basic mime types are available, they can be cleared later + through the use of if desired. + + The log writer to use when logging events + + + + Mimtypes that this class can handle per default + + + + + Loads resources from a namespace in the given assembly to an uri + + The uri to map the resources to + The assembly in which the resources reside + The namespace from which to load the resources + + resourceLoader.LoadResources("/user/", typeof(User).Assembly, "MyLib.Models.User.Views"); + + will make ie the resource MyLib.Models.User.Views.stylesheet.css accessible via /user/stylesheet.css + + The amount of loaded files, giving you the possibility of making sure the resources needed gets loaded + + + + Returns true if the module can handle the request + + + + + Method that process the url + + Information sent by the browser about the request + Information that is being sent back to the client. + Session used to + true if this module handled the request. + + + + List with all mime-type that are allowed. + + All other mime types will result in a Forbidden http status code. + + + + The purpose of this module is to serve files. + + + + + Initializes a new instance of the class. + + Uri to serve, for instance "/files/" + Path on hard drive where we should start looking for files + If true a Last-Modifed header will be sent upon requests urging web browser to cache files + + + + Initializes a new instance of the class. + + Uri to serve, for instance "/files/" + Path on hard drive where we should start looking for files + + + + Mimtypes that this class can handle per default + + + + + Determines if the request should be handled by this module. + Invoked by the + + + true if this module should handle it. + + + Illegal path + + + + check if source contains any of the chars. + + + + + + + + Method that process the Uri. + + Information sent by the browser about the request + Information that is being sent back to the client. + Session used to + Failed to find file extension + File type is forbidden. + + + + return a file extension from an absolute Uri path (or plain filename) + + + + + + + List with all mime-type that are allowed. + + All other mime types will result in a Forbidden http status code. + + + + characters that may not exist in a path. + + + fileMod.ForbiddenChars = new string[]{ "\\", "..", ":" }; + + + + + The server encountered an unexpected condition which prevented it from fulfilling the request. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + error message. + + + + Initializes a new instance of the class. + + error message. + inner exception. + + + + Class to make dynamic binding of redirects. Instead of having to specify a number of similar redirect rules + a regular expression can be used to identify redirect URLs and their targets. + + + [a-z0-9]+)", "/users/${target}?find=true", RegexOptions.IgnoreCase) + ]]> + + + + + Initializes a new instance of the class. + + Expression to match URL + Expression to generate URL + + [a-zA-Z0-9]+)", "/user/${first}")); + Result of ie. /employee1 will then be /user/employee1 + ]]> + + + + + Initializes a new instance of the class. + + Expression to match URL + Expression to generate URL + Regular expression options to use, can be null + + [a-zA-Z0-9]+)", "/user/{first}", RegexOptions.IgnoreCase)); + Result of ie. /employee1 will then be /user/employee1 + ]]> + + + + + Initializes a new instance of the class. + + Expression to match URL + Expression to generate URL + Regular expression options to apply + true if request should be redirected, false if the request URI should be replaced. + + [a-zA-Z0-9]+)", "/user/${first}", RegexOptions.None)); + Result of ie. /employee1 will then be /user/employee1 + ]]> + + Argument is null. + + + + + Process the incoming request. + + incoming HTTP request + outgoing HTTP response + true if response should be sent to the browser directly (no other rules or modules will be processed). + + returning true means that no modules will get the request. Returning true is typically being done + for redirects. + + If request or response is null + + + + Used when the request line have been successfully parsed. + + + + + Initializes a new instance of the class. + + The HTTP method. + The URI path. + The HTTP version. + + + + Initializes a new instance of the class. + + + + + Gets or sets http method. + + + Should be one of the methods declared in . + + + + + Gets or sets the version of the HTTP protocol that the client want to use. + + + + + Gets or sets requested URI path. + + + + + Delegate used to find a realm/domain. + + + + + Realms are used during HTTP Authentication + + + + + + + A complete HTTP server, you need to add a module to it to be able to handle incoming requests. + + + + // this small example will add two web site modules, thus handling + // two different sites. In reality you should add Controller modules or something + // two the website modules to be able to handle different requests. + HttpServer server = new HttpServer(); + server.Add(new WebSiteModule("www.gauffin.com", "Gauffin Telecom AB")); + server.Add(new WebSiteModule("www.vapadi.se", "Remote PBX")); + + // start regular http + server.Start(IPAddress.Any, 80); + + // start https + server.Start(IPAddress.Any, 443, myCertificate); + + + + + + + + + Initializes a new instance of the class. + + Used to get all components used in the server.. + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + Form decoders are used to convert different types of posted data to the object types. + + + + + + Initializes a new instance of the class. + + A session store is used to save and retrieve sessions + + + + + Initializes a new instance of the class. + + The log writer. + + + + + Initializes a new instance of the class. + + Form decoders are used to convert different types of posted data to the object types. + The log writer. + + + + + + + Initializes a new instance of the class. + + Form decoders are used to convert different types of posted data to the object types. + A session store is used to save and retrieve sessions + The log writer. + + + + + + + + Adds the specified rule. + + The rule. + + + + Add a to the server. + + mode to add + + + + Decodes the request body. + + The request. + Failed to decode form data. + + + + Generate a HTTP error page (that will be added to the response body). + response status code is also set. + + Response that the page will be generated in. + . + response body contents. + + + + Generate a HTTP error page (that will be added to the response body). + response status code is also set. + + Response that the page will be generated in. + exception. + + + + Realms are used by the s. + + HTTP request + domain/realm. + + + + Process an incoming request. + + connection to client + request information + response that should be filled + session information + + + + Can be overloaded to implement stuff when a client have been connected. + + + Default implementation does nothing. + + client that disconnected + disconnect reason + + + + Handle authentication + + + + + true if request can be handled; false if not. + Invalid authorization header + + + + Will request authentication. + + + Sends respond to client, nothing else can be done with the response after this. + + + + + + + + Received from a when a request have been parsed successfully. + + that received the request. + The request. + + + + To be able to track request count. + + + + + + + Start the web server using regular HTTP. + + IP Address to listen on, use IpAddress.Any to accept connections on all IP addresses/network cards. + Port to listen on. 80 can be a good idea =) + address is null. + Port must be a positive number. + + + + Accept secure connections. + + IP Address to listen on, use to accept connections on all IP Addresses / network cards. + Port to listen on. 80 can be a good idea =) + Certificate to use + address is null. + Port must be a positive number. + + + + shut down the server and listeners + + + + + write an entry to the log file + + importance of the message + log message + + + + write an entry to the log file + + object that wrote the message + importance of the message + log message + + + + Server that is handling the current request. + + + Will be set as soon as a request arrives to the object. + + + + + Modules used for authentication. The module that is is added first is used as + the default authentication module. + + Use the corresponding property + in the if you are using multiple websites. + + + + Form decoder providers are used to decode request body (which normally contains form data). + + + + + Server name sent in HTTP responses. + + + Do NOT include version in name, since it makes it + easier for hackers. + + + + + Name of cookie where session id is stored. + + + + + Specified where logging should go. + + + + + + + + Number of connections that can wait to be accepted by the server. + + Default is 10. + + + + Gets or sets maximum number of allowed simultaneous requests. + + + + This property is useful in busy systems. The HTTP server + will start queuing new requests if this limit is hit, instead + of trying to process all incoming requests directly. + + + The default number if allowed simultaneous requests are 10. + + + + + + Gets or sets maximum number of requests queuing to be handled. + + + + The WebServer will start turning requests away if response code + to indicate that the server + is too busy to be able to handle the request. + + + + + + Realms are used during HTTP authentication. + Default realm is same as server name. + + + + + Let's to receive unhandled exceptions from the threads. + + + Exceptions will be thrown during debug mode if this event is not used, + exceptions will be printed to console and suppressed during release mode. + + + + + The request requires user authentication. The response MUST include a + WWW-Authenticate header field (section 14.47) containing a challenge + applicable to the requested resource. + + The client MAY repeat the request with a suitable Authorization header + field (section 14.8). If the request already included Authorization + credentials, then the 401 response indicates that authorization has been + refused for those credentials. If the 401 response contains the same challenge + as the prior response, and the user agent has already attempted authentication + at least once, then the user SHOULD be presented the entity that was given in the response, + since that entity might include relevant diagnostic information. + + HTTP access authentication is explained in rfc2617: + http://www.ietf.org/rfc/rfc2617.txt + + (description is taken from + http://www.submissionchamber.com/help-guides/error-codes.php#sec10.4.2) + + + + + Create a new unauhtorized exception. + + + + + + Create a new unauhtorized exception. + + reason to why the request was unauthorized. + inner exception + + + + Create a new unauhtorized exception. + + reason to why the request was unauthorized. + + + + Lists content type mime types. + + + + + text/plain + + + + + text/haml + + + + + content type for javascript documents = application/javascript + + + + RFC 4329 states that text/javascript have been superseeded by + application/javascript. You might still want to check browser versions + since older ones do not support application/javascript. + + Browser support: http://krijnhoetmer.nl/stuff/javascript/mime-types/ + + + + + text/xml + + + + + A list of content types + + + + + + + Semicolon separated content types. + + + + Returns an enumerator that iterates through a collection. + + + An object that can be used to iterate through the collection. + + + + + Searches for the specified type + + Can also be a part of a type (searching for "xml" would return true for "application/xml"). + true if type was found. + + + + Get this first content type. + + + + + Fetch a content type + + Part of type ("xml" would return "application/xml") + + All content types are in lower case. + + + + Session store using memory for each session. + + + + + Initializes the class setting the expirationtimer to clean the session every minute + + + + + Delegate for the cleanup timer + + + + + Creates a new http session + + + + + + Creates a new http session with a specific id + + Id used to identify the new cookie.. + A object. + + Id should be generated by the store implementation if it's null or . + + + + + Load an existing session. + + + + + + + Save an updated session to the store. + + + + + + We use the flyweight pattern which reuses small objects + instead of creating new each time. + + EmptyLanguageNode (unused) session that should be reused next time Create is called. + + + + Remove expired sessions + + + + + Remove a session + + id of the session. + + + + Load a session from the store + + + null if session is not found. + + + + Number of minutes before a session expires. + Default is 20 minutes. + + + + + Webhelper provides helpers for common tasks in HTML. + + + + + Used to let the website use different javascript libraries. + Default is + + + + + Creates a link that invokes through ajax. + + url to fetch + link title + + optional options in format "key, value, key, value". + Javascript options starts with ':'. + + a link tag + + WebHelper.AjaxRequest("/users/add/", "Add user", "method:", "post", "onclick", "validate('this');"); + + + + + Builds a link that updates an element with the fetched ajax content. + + Url to fetch content from + link title + html element to update with the results of the ajax request. + optional options in format "key, value, key, value" + A link tag. + + + + A link that pop ups a Dialog (overlay div) + + url to contents of dialog + link title + name/value of html attributes. + A "a"-tag that popups a dialog when clicked + + WebHelper.DialogLink("/user/show/1", "show user", "onmouseover", "alert('booh!');"); + + + + + Create/Open a dialog box using ajax + + + + + + + + + Close a javascript dialog window/div. + + javascript for closing a dialog. + + + + + Create a <form> tag. + + name of form + action to invoke on submit + form should be posted as ajax + html code + + WebHelper.FormStart("frmLogin", "/user/login", Request.IsAjax); + + + + + Create a link tag. + + url to go to + link title (text that is displayed) + html attributes, name, value, name, value + html code + + WebHelper.Link("/user/show/1", "Show user", "id", "showUser", "onclick", "return confirm('Are you shure?');"); + + + + + Build a link + + url to go to. + title of link (displayed text) + extra html attributes. + a complete link + + + + Build a link + + url to go to. + title of link (displayed text) + extra html attributes. + a complete link + more options + + + + Obsolete + + Obsolete + Obsolete + Obsolete + Obsolete + Obsolete + Obsolete + + + + Obsolete + + Obsolete + Obsolete + Obsolete + Obsolete + Obsolete + Obsolete + Obsolete + + + + Render errors into a UL with class "errors" + + class used by UL-tag. + items to list + an unordered html list. + + + + Render errors into a UL with class "errors" + + class used by UL-tag. + items to list + an unordered html list. + + + + Render errors into a UL with class "errors" + + + + + + + Generates a list with html attributes. + + StringBuilder that the options should be added to. + attributes set by user. + attributes set by any of the helper classes. + + + + Generates a list with html attributes. + + StringBuilder that the options should be added to. + + + + + Purpose of this class is to create a javascript toolkit independent javascript helper. + + + + + Generates a list with JS options. + + StringBuilder that the options should be added to. + the javascript options. name, value pairs. each string value should be escaped by YOU! + true if we should start with a comma. + + + + Removes any javascript parameters from an array of parameters + + The array of parameters to remove javascript params from + An array of html parameters + + + + javascript action that should be added to the "onsubmit" event in the form tag. + + + All javascript option names should end with colon. + + + JSHelper.AjaxRequest("/user/show/1", "onsuccess:", "$('userInfo').update(result);"); + + + + + + Requests a url through ajax + + url to fetch + optional options in format "key, value, key, value", used in JS request object. + a link tag + All javascript option names should end with colon. + + + JSHelper.AjaxRequest("/user/show/1", "onsuccess:", "$('userInfo').update(result);"); + + + + + + Ajax requests that updates an element with + the fetched content + + Url to fetch content from + element to update + optional options in format "key, value, key, value", used in JS updater object. + A link tag. + All javascript option names should end with colon. + + + JSHelper.AjaxUpdater("/user/show/1", "userInfo", "onsuccess:", "alert('Successful!');"); + + + + + + A link that pop ups a Dialog (overlay div) + + url to contents of dialog + link title + A "a"-tag that popups a dialog when clicked + name/value of html attributes + + WebHelper.DialogLink("/user/show/1", "show user", "onmouseover", "alert('booh!');"); + + + + + Close a javascript dialog window/div. + + javascript for closing a dialog. + + + + + Creates a new modal dialog window + + url to open in window. + window title (may not be supported by all js implementations) + + + + + + + + + + + + + Represents a field in a multipart form + + + + The request could not be understood by the server due to malformed syntax. + The client SHOULD NOT repeat the request without modifications. + + Text taken from: http://www.submissionchamber.com/help-guides/error-codes.php + + + + + Create a new bad request exception. + + reason to why the request was bad. + + + + Create a new bad request exception. + + reason to why the request was bad. + inner exception + + + + Container class for posted files + + + + + Creates a container for a posted file + + The identifier of the post field + The file path + The content type of the file + The name of the file uploaded + If any parameter is null or empty + + + + Creates a container for a posted file + + If any parameter is null or empty + + + Destructor disposing the file + + + + Deletes the temporary file + + True if manual dispose + + + + Disposing interface, cleans up managed resources (the temporary file) and suppresses finalization + + + + + The name/id of the file + + + + + The full file path + + + + + The name of the uploaded file + + + + + The type of file + + + + + Will contain helper functions for javascript. + + + + + Requests a url through ajax + + url to fetch. Url is NOT enclosed in quotes by the implementation. You need to do that yourself. + optional options in format "key, value, key, value", used in JS request object. All keys should end with colon. + a link tag + onclick attribute is used by this method. + + + // plain text + JSHelper.AjaxRequest("'/user/show/1'"); + + // ajax request using this.href + string link = "<a href=\"/user/call/1\" onclick=\"" + JSHelper.AjaxRequest("this.href") + "/<call user</a>"; + + + + + + Ajax requests that updates an element with + the fetched content + + url to fetch. Url is NOT enclosed in quotes by the implementation. You need to do that yourself. + element to update + options in format "key, value, key, value". All keys should end with colon. + A link tag. + + + JSHelper.AjaxUpdater("'/user/show/1'", "user", "onsuccess:", "alert('hello');", "asynchronous:", "true"); + + + + + + Opens contents in a dialog window. + + url to contents of dialog + link title + name, value, name, value, all parameter names should end with colon. + + + + Close a javascript dialog window/div. + + javascript for closing a dialog. + + + + + Contains server side HTTP request information. + + + + + Chars used to split an URL path into multiple parts. + + + + + Assign a form. + + + + + + Creates a new object that is a copy of the current instance. + + + + A new object that is a copy of this instance. + + 2 + + + + Decode body into a form. + + A list with form decoders. + If body contents is not valid for the chosen decoder. + If body is still being transferred. + + + + Cookies + + the cookies + + + + Create a response object. + + A new . + + + + Called during parsing of a . + + Name of the header, should not be URL encoded + Value of the header, should not be URL encoded + If a header is incorrect. + + + + Add bytes to the body + + buffer to read bytes from + where to start read + number of bytes to read + Number of bytes actually read (same as length unless we got all body bytes). + If body is not writable + bytes is null. + offset is out of range. + + + + Clear everything in the request + + + + + Gets or sets a value indicating whether this is secure. + + + + + Path and query (will be merged with the host header) and put in Uri + + + + + + Gets whether the body is complete. + + + + + Gets kind of types accepted by the client. + + + + + Gets or sets body stream. + + + + + Gets or sets kind of connection used for the session. + + + + + Gets or sets number of bytes in the body. + + + + + Gets headers sent by the client. + + + + + Gets or sets version of HTTP protocol that's used. + + + Probably or . + + + + + + Gets or sets requested method. + + + + Will always be in upper case. + + + + + + Gets variables sent in the query string + + + + + Gets or sets requested URI. + + + + + Uri absolute path splitted into parts. + + + // uri is: http://gauffin.com/code/tiny/ + Console.WriteLine(request.UriParts[0]); // result: code + Console.WriteLine(request.UriParts[1]); // result: tiny + + + If you're using controllers than the first part is controller name, + the second part is method name and the third part is Id property. + + + + + + Gets parameter from or . + + + + + Gets form parameters. + + + + + Gets whether the request was made by Ajax (Asynchronous JavaScript) + + + + + Gets cookies that was sent with the request. + + + + + The website module let's you handle multiple websites in the same server. + It uses the "Host" header to check which site you want. + + It's recommended that you do not + add any other modules to HttpServer if you are using the website module. Instead, + add all wanted modules to each website. + + + + + + domain name that should be handled. + + + + + Method that process the url + + Information sent by the browser about the request + Information that is being sent back to the client. + Session used to + + + + Name of site. + + + + + Container to bind resource names to assemblies + + + + + Instantiates an instance of + + The dot seperated uri the resource maps to + The full resource name + The assembly the resource exists in + + + + Retrieves a stream to the resource + + Null if the resource couldn't be located somehow + + + + Retrieves the assembly the resource resides in + + + + + Retrieves the full name/path of the assembly + + + + + Retrieves the extension of the resource + + + + Returns the Uri without extension + + + Retrieves the full path name to the resource file + + + + Creates request parsers when needed. + + + + + Creates request parsers when needed. + + + + + Create a new request parser. + + Used when logging should be enabled. + A new request parser. + + + + Create a new request parser. + + Used when logging should be enabled. + A new request parser. + + + + The "basic" authentication scheme is based on the model that the + client must authenticate itself with a user-ID and a password for + each realm. The realm value should be considered an opaque string + which can only be compared for equality with other realms on that + server. The server will service the request only if it can validate + the user-ID and password for the protection space of the Request-URI. + There are no optional authentication parameters. + + + + + Initializes a new instance of the class. + + Delegate used to provide information used during authentication. + Delegate used to determine if authentication is required (may be null). + + + + Initializes a new instance of the class. + + Delegate used to provide information used during authentication. + + + + Create a response that can be sent in the WWW-Authenticate header. + + Realm that the user should authenticate in + Not used in basic auth + A correct auth request. + + + + An authentication response have been received from the web browser. + Check if it's correct + + Contents from the Authorization header + Realm that should be authenticated + GET/POST/PUT/DELETE etc. + Not used in basic auth + Authentication object that is stored for the request. A user class or something like that. + if authenticationHeader is invalid + If any of the paramters is empty or null. + + + + name used in http request. + + + + + Current state in the parsing. + + + + + Should parse the request line + + + + + Searching for a complete header name + + + + + Searching for colon after header name (ignoring white spaces) + + + + + Searching for start of header value (ignoring white spaces) + + + + + Searching for a complete header value (can span over multiple lines, as long as they are prefixed with one/more whitespaces) + + + + + Adding bytes to body + + + + + This decoder converts XML documents to form items. + Each element becomes a subitem in the form, and each attribute becomes an item. + + + // xml: somethingdata + // result: + // form["hello"].Value = "something" + // form["hello"]["id"].Value = 1 + // form["hello"]["world]["id"].Value = 1 + // form["hello"]["world"].Value = "data" + + + The original xml document is stored in form["__xml__"].Value. + + + + + + + Stream containing the content + Content type (with any additional info like boundry). Content type is always supplied in lower case + Stream encoding + Note: contentType and encoding are not used? + A http form, or null if content could not be parsed. + + + + + Recursive function that will go through an xml element and store it's content + to the form item. + + (parent) Item in form that content should be added to. + Node that should be parsed. + + + + Checks if the decoder can handle the mime type + + Content type (with any additional info like boundry). Content type is always supplied in lower case. + True if the decoder can parse the specified content type + + + + Cookies that should be set. + + + + + Adds a cookie in the collection. + + cookie to add + cookie is null + + + + Copy a request cookie + + + When the cookie should expire + + + + Gets a collection enumerator on the cookie list. + + collection enumerator + + + + Remove all cookies + + + + + Returns an enumerator that iterates through the collection. + + + + A that can be used to iterate through the collection. + + 1 + + + + Gets the count of cookies in the collection. + + + + + Gets the cookie of a given identifier (null if not existing). + + + + + This class is created as a wrapper, since there are two different cookie types in .Net (Cookie and HttpCookie). + The framework might switch class in the future and we dont want to have to replace all instances + + + + + Let's copy all the cookies. + + value from cookie header. + + + + Adds a cookie in the collection. + + cookie to add + cookie is null + + + + Gets a collection enumerator on the cookie list. + + collection enumerator + + + + Remove all cookies. + + + + + Returns an enumerator that iterates through the collection. + + + + A that can be used to iterate through the collection. + + 1 + + + + Remove a cookie from the collection. + + Name of cookie. + + + + Gets the count of cookies in the collection. + + + + + Gets the cookie of a given identifier (null if not existing). + + + + + New implementation of the HTTP listener. + + + Use the Create methods to create a default listener. + + + + + Initializes a new instance of the class. + + IP Address to accept connections on + TCP Port to listen on, default HTTP port is 80. + Factory used to create es. + address is null. + Port must be a positive number. + + + + Initializes a new instance of the class. + + The address. + The port. + The factory. + The certificate. + + + + Initializes a new instance of the class. + + The address. + The port. + The factory. + The certificate. + The protocol. + + + + Creates a new instance with default factories. + + Address that the listener should accept connections on. + Port that listener should accept connections on. + Created HTTP listener. + + + + Creates a new instance with default factories. + + Address that the listener should accept connections on. + Port that listener should accept connections on. + Certificate to use + Created HTTP listener. + + + + Creates a new instance with default factories. + + Address that the listener should accept connections on. + Port that listener should accept connections on. + Certificate to use + which HTTPS protocol to use, default is TLS. + Created HTTP listener. + + + + Can be used to create filtering of new connections. + + Accepted socket + + true if connection can be accepted; otherwise false. + + + + + A client have been accepted, but not handled, by the listener. + + + + + Generic helper functions for HTTP + + + + + Version string for HTTP v1.0 + + + + + Version string for HTTP v1.1 + + + + + An empty URI + + + + + Parses a query string. + + Query string (URI encoded) + A object if successful; otherwise + queryString is null. + If string cannot be parsed. + + + + A reverse proxy are used to act as a bridge between local (protected/hidden) websites + and public clients. + + A typical usage is to allow web servers on non standard ports to still be available + to the public clients, or allow web servers on private ips to be available. + + + + + + + Base url requested from browser + Base url on private web server + + // this will return contents from http://192.168.1.128/view/jonas when client requests http://www.gauffin.com/user/view/jonas + _server.Add(new ReverseProxyModule("http://www.gauffin.com/user/", "http://192.168.1.128/"); + + + + + Method that determines if an url should be handled or not by the module + + Url requested by the client. + true if module should handle the url. + + + + Method that process the url + + Information sent by the browser about the request + Information that is being sent back to the client. + Session used to + + + + Used to inform http server that + + + + + Eventarguments used when an exception is thrown by a module + + the exception + + + + Exception thrown in a module + + + + + PrototypeJS implementation of the javascript functions. + + + + + Requests a url through ajax + + url to fetch. Url is NOT enclosed in quotes by the implementation. You need to do that yourself. + optional options in format "key, value, key, value", used in JS request object. All keys should end with colon. + a link tag + onclick attribute is used by this method. + + + // plain text + JSHelper.AjaxRequest("'/user/show/1'"); + + // ajax request using this.href + string link = "<a href=\"/user/call/1\" onclick=\"" + JSHelper.AjaxRequest("this.href") + "/<call user</a>"; + + + + + + Determins if a list of strings contains a specific value + + options to check in + value to find + true if value was found + case insensitive + + + + Ajax requests that updates an element with + the fetched content + + URL to fetch. URL is NOT enclosed in quotes by the implementation. You need to do that yourself. + element to update + options in format "key, value, key, value". All keys should end with colon. + A link tag. + + + JSHelper.AjaxUpdater("'/user/show/1'", "user", "onsuccess:", "alert('hello');", "asynchronous:", "true"); + + + + + + A link that pop ups a Dialog (overlay div) + + URL to contents of dialog + link title + name, value, name, value + + A "a"-tag that popups a dialog when clicked + + Requires Control.Modal found here: http://livepipe.net/projects/control_modal/ + And the following JavaScript (load it in application.js): + + Event.observe(window, 'load', + function() { + document.getElementsByClassName('modal').each(function(link){ new Control.Modal(link); }); + } + ); + + + + WebHelper.DialogLink("/user/show/1", "show user", "onmouseover", "alert('booh!');"); + + + + + create a modal dialog (usually using DIVs) + + url to fetch + dialog title + javascript/html attributes. javascript options ends with colon ':'. + + + + + Close a javascript dialog window/div. + + javascript for closing a dialog. + + + + + javascript action that should be added to the "onsubmit" event in the form tag. + + remember to encapsulate strings in '' + + All javascript option names should end with colon. + + + JSHelper.AjaxRequest("/user/show/1", "onsuccess:", "$('userInfo').update(result);"); + + + + + + Implements HTTP Digest authentication. It's more secure than Basic auth since password is + encrypted with a "key" from the server. + + + Keep in mind that the password is encrypted with MD5. Use a combination of SSL and digest auth to be secure. + + + + + Initializes a new instance of the class. + + Delegate used to provide information used during authentication. + Delegate used to determine if authentication is required (may be null). + + + + Initializes a new instance of the class. + + Delegate used to provide information used during authentication. + + + + Used by test classes to be able to use hardcoded values + + + + + An authentication response have been received from the web browser. + Check if it's correct + + Contents from the Authorization header + Realm that should be authenticated + GET/POST/PUT/DELETE etc. + First option: true if username/password is correct but not cnonce + + Authentication object that is stored for the request. A user class or something like that. + + if authenticationHeader is invalid + If any of the paramters is empty or null. + + + + Encrypts parameters into a Digest string + + Realm that the user want to log into. + User logging in + Users password. + HTTP method. + Uri/domain that generated the login prompt. + Quality of Protection. + "Number used ONCE" + Hexadecimal request counter. + "Client Number used ONCE" + Digest encrypted string + + + + + + Md5 hex encoded "userName:realm:password", without the quotes. + Md5 hex encoded "method:uri", without the quotes + Quality of Protection + "Number used ONCE" + Hexadecimal request counter. + Client number used once + + + + + Create a response that can be sent in the WWW-Authenticate header. + + Realm that the user should authenticate in + First options specifies if true if username/password is correct but not cnonce. + A correct auth request. + If realm is empty or null. + + + + Decodes authorization header value + + header value + Encoding that the buffer is in + All headers and their values if successful; otherwise null + + NameValueCollection header = DigestAuthentication.Decode("response=\"6629fae49393a05397450978507c4ef1\",\r\nc=00001", Encoding.ASCII); + + Can handle lots of whitespaces and new lines without failing. + + + + Gets the current nonce. + + + + + + Gets the Md5 hash bin hex2. + + To be hashed. + + + + + determines if the nonce is valid or has expired. + + nonce value (check wikipedia for info) + true if the nonce has not expired. + + + + name used in http request. + + + + + Gets or sets whether the token supplied in is a + HA1 generated string. + + + +