mò _%ÜGc@sdZdkZdkZdkZdkZdkZdkZdklZdk Z dZ dZ dZ dZ dZdZd Zd Zd Zd Zd ZeZdZdZdZdZdZdZdZdZdZdZdZ dZ!dZ"dfd„ƒYZ#dfd„ƒYZ$dS(sPython Fast CGI implementationN(sStringIOiiiiiiiii i i itrecordcBs>tZd„Zd„Zd„Zd„Zd„Zd„ZRS(NcCs(t|_t|_t|_d|_dS(Nt(tFCGI_VERSION_1tselftversiontFCGI_UNKNOWN_TYPEtrecTypetFCGI_NULL_REQUEST_IDtreqIdtcontent(R((t(/home/holguin2/public_html/spyce/fcgi.pyt__init__>s   c Csñtt|i|dƒƒ}|d|_|d|_|dd>|d|_|dd>|d}|d}|i||ƒ|_ |i||ƒ|i }|it jo<t|dƒd>t|dƒ|_t|dƒ|_n|itjot|dƒ|_nß|itjp|itjoVh|_d}x¬|t|ƒjo,|i||ƒ\} }}||i| |dd >|dd>|d|_|d|_ndS( Niiiiiiiiii(tmaptordRt readExacttsockthdrRRRt contentLengtht paddingLengthR tctFCGI_BEGIN_REQUESTtroletflagsRt unknownTypetFCGI_GET_VALUESt FCGI_PARAMStvaluestpostlent decodePairtnametvaluetFCGI_END_REQUESTtbt appStatustprotocolStatus( RRRRRR!RRRR((R t readRecordCs2    %  1c Csú|i}|itjo=t|id?ƒt|id@ƒt|iƒdd}n |itjot|iƒdd}nà|it jp|it joAd}x¶|i i ƒD]#}||i||i |ƒ}q·Wn|itjon|i}t|d?d@ƒt|d?d@ƒt|d?d@ƒt|d@ƒ}|t|iƒd d}nt|ƒ}|dd d@}||}|i|i|id?|id@|d?|d@|d g}titt|ƒdƒ}|i|||dƒdS( NiiÿitiRiiiiÿÿi(RR RRtchrRRRRRRRtkeystit encodePairR R"tvR#RtcLenteLentpadLenRRRtstringt joinfieldsR Rtsend( RRRR(R-R R+R,R*((R t writeRecord^s( = % F  :cCsId}x<|o4t|ƒ|jo!||i|t|ƒƒ}q W|S(NR(tdatatamountRRtrecv(RRR3R2((R Rss "cCs9t||ƒ}|d}|d@oVtt|||d!ƒ}|d}|d@d>|dd>|dd>|d }nt||ƒ}|d}|d@oVtt|||d!ƒ}|d}|d@d>|dd>|dd>|d }n||||!}||}||||!}||}|||fS( Nii€iiiiiii( R tsRtnameLenR R!tvalueLenRR(RR5RR7R!RRR6((R Rxs $2 $2cCsút|ƒ}|djot|ƒ}nKtd|d?d@Bƒt|d?d@ƒt|d?d@ƒt|d@ƒ}t|ƒ}|djo|t|ƒ}nO|td|d?d@Bƒt|d?d@ƒt|d?d@ƒt|d@ƒ}|||S(Ni€iiÿii(RRtlR&R5R(RRRR8R5((R R)„s  J  N(t__name__t __module__R R$R1RRR)(((R R=s      tFCGIcBsStZdd„Zd„Zd„Zd„Zd„Zd„Zd„Z d„Z RS( NcCs¿yttidƒ|_Wnd|_nX|o ||_nd|_y8tid|_tt i t i |idƒƒ|_Wnd|_nXd|_ |i ƒd|_|iƒdS(Nt FCGI_PORTtFCGI_WEB_SERVER_ADDRSt,i(tinttostenvironRR<tNonetporttFCGI_ALLOWED_ADDRR R.tstriptsplitt firstCallt clearStatetsockettcreateServerSocket(RRC((R R Žs    (    cCsÈ|io<tititiƒ}|iƒ|id|ifƒnvy2tit i i ƒtitiƒ}|i ƒWn@ti j o'\}}|tijodSq»n dSnX||_dS(Ns 127.0.0.1(RR<RItAF_INETt SOCK_STREAMR5tset_reuse_addrtbindtfromfdtsyststdintfilenot getpeernameterrorterrterrmsgterrnotENOTCONN(RRUR5RV((R RJŸs  $ cCs`|ip=|io+tititiƒtit i f}qSdSn |i ƒ}d|_|S(Ni( RRIRGRPRQt spyceUtilt NoCloseOuttstdouttstderrR@RAtresultR4(RR]((R taccept®s  +  cCs+|ip |i odSn|iƒdS(N(RRGRIR0(R((R tfinish¸scCsOd|_d|_h|_tƒ|_tƒ|_tƒ|_tƒ|_ dS(Ni( RtreqIDRBt connectionRAtStringIORQR\R[R2(R((R RH»s      cCs³|iiddƒ|iiddƒ|it|iiƒƒ|it|iiƒƒtƒ}t |_ |i |_ d|_t|_|i|iƒ|iiƒ|iƒdS(Ni(RR\tseekR[t sendStreamt FCGI_STDERRtreadt FCGI_STDOUTRtrR RR`RR"tFCGI_REQUEST_COMPLETER#R1RatcloseRH(RRh((R R0Ãs      cCs‡|pdSntƒ}||_|i|_|}x4|o,|d |d|_ }|i |i ƒq6Wd|_ |i |i ƒdS(Ni R( t streamDataRRht streamTypeRRR`RR2R R1Ra(RRlRkRhR2((R RdÐs   cCs/|iiƒ\|_}d}xÃ|o»tƒ}|i|iƒ|i t gjo|i t jo‰t |_ h}hdt <dt<dt<}x9|iiƒD](}|i|ƒo||||