mò
ÇñVNc           @   s  d  k  Z  d  k Z d  k Z d  k Z d  k Z d k l Z d  k Z d Z d Z	 d Z
 d Z d Z d Z d Z d Z d Z d Z d	 Z d
 Z d Z d Z d Z e Z e g Z d Z d Z d Z d Z d Z d Z d Z d Z  d Z! d Z" d „  Z" d f  d „  ƒ  YZ# d „  Z$ d „  Z% d „  Z& d a' d „  Z( d  a* d  a+ d f  d „  ƒ  YZ, e, Z- d „  Z. d „  Z/ e0 d j o e/ ƒ  n d  S(   N(   s   StringIOi   i    i   i   i   i   i   i   i   i	   i
   i   s
   fcgi.errorc         C   s.   t  d d ƒ } | i |  d ƒ | i ƒ  d S(   s   Append a string to /tmp/errs   /tmp/errs   a+s   
N(   t   opent   errft   writet   msgt   close(   R   R   (    (    t=   /var/www/vhosts/deepsouthrugby.net/httpdocs/test/fcgi/fcgi.pyt   errorU   s     t   recordc           B   s)   t  Z d  Z d „  Z d „  Z d „  Z RS(   s"   Class representing FastCGI recordsc         C   s(   t  |  _ t |  _ t |  _ d |  _ d  S(   Nt    (   t   FCGI_VERSION_1t   selft   versiont   FCGI_UNKNOWN_TYPEt   recTypet   FCGI_NULL_REQUEST_IDt   reqIdt   content(   R
   (    (    R   t   __init___   s    			c         C   sB  t  t | i d ƒ ƒ } | d | d | d |  _ |  _ } | d d >| d | d d >| d |  _	 }	 d	 |  _ xG t |  i ƒ |	 j  o0 | i |	 t |  i ƒ ƒ }
 |  i |
 |  _ qz W| d j o | i | ƒ } n |  i } |  i t j o< t | d ƒ d >t | d ƒ |  _ t | d ƒ |  _ n	|  i t j o t | d ƒ |  _ nâ |  i t j p |  i t j oS h  |  _ d } x¯ | t | ƒ j  o) t | | ƒ \ } } } | |  i | <qWno |  i t j o^ t  t | d d !ƒ } | d d
 >| d d >| d d >| d |  _ t | d ƒ |  _ n d  S(   Ni   i    i   i   i   i   i   i   R   i   i   (    t   mapt   ordt   sockt   recvt   sR
   R   R   t   paddingLengthR   t   contentLengthR   t   lent   datat   paddingt   ct   FCGI_BEGIN_REQUESTt   rolet   flagsR   t   unknownTypet   FCGI_GET_VALUESt   FCGI_PARAMSt   valuest   post   readPairt   namet   valuet   FCGI_END_REQUESTt   bt	   appStatust   protocolStatus(   R
   R   R   R&   R$   R   R   R)   R'   R   R   R   (    (    R   t
   readRecordf   s6    &0	 	% 	 1c   	      C   s÷  |  i } |  i t j o= t |  i d ?ƒ t |  i d @ƒ t |  i ƒ d d } n|  i t j o t |  i ƒ d d } nÝ |  i t	 j p |  i t
 j o> d } x³ |  i i ƒ  D]  } | t | |  i | ƒ } q· Wn |  i t j on |  i } t | d ?d @ƒ t | d ?d @ƒ t | d ?d @ƒ t | d @ƒ } | t |  i ƒ d	 d } n t | ƒ } | d d
 d @} | | } |  i |  i |  i d ?|  i d @| d ?| d @| d g } t i t t | ƒ d ƒ } | i | | | d ƒ d  S(   Ni   iÿ   i   t    i   R   i   i   i   iÿÿ  i    (   R
   R   R   R   t   chrR   R   R   R    R!   R"   R#   t   keyst   it	   writePairR(   R*   t   vR+   R   t   cLent   eLent   padLenR   R   t   hdrt   stringt
   joinfieldsR   R   t   send(	   R
   R   R6   R0   R5   R   R3   R4   R2   (    (    R   t   writeRecord†   s(    	=  "	F
:(   t   __name__t
   __module__t   __doc__R   R,   R:   (    (    (    R   R   ]   s    		 c         C   s)  t  |  | ƒ } | d } | d @oV t t  |  | | d !ƒ } | d } | d @d >| d d >| d d >| d	 } n t  |  | ƒ } | d } | d @oV t t  |  | | d !ƒ } | d } | d @d >| d d >| d d >| d	 } n |  | | | !|  | | | | | !| | | f S(
   Ni   i€   i   i   i   i    i   i   i   (   R   R   R$   t   nameLenR   R)   t   valueLen(   R   R$   R?   R)   R>   (    (    R   R%   ª   s    $2$2c         C   sú   t  |  ƒ } | d j  o t | ƒ } nK t d | d ?d @Bƒ t | d ?d @ƒ t | d ?d @ƒ t | d @ƒ } t  | ƒ } | d j  o | t | ƒ } nO | t d | d ?d @Bƒ t | d ?d @ƒ t | d ?d @ƒ t | d @ƒ } | |  | S(   Ni€   i   iÿ   i   i   (   R   R&   t   lR.   R   R'   (   R&   R'   R@   R   (    (    R   R1   ¸   s     J Nc         C   sš   |  i t j o† t |  _ h  } h  d t <d t <d t <} x9 |  i	 i
 ƒ  D]( } | i | ƒ o | | | | <qP qP W| |  _	 |  i | ƒ n d  S(   Nt   FCGI_MAX_CONNSt   FCGI_MAX_REQSt   FCGI_MPXS_CONNS(   t   rR   R!   t   FCGI_GET_VALUES_RESULTR2   RA   RB   RC   t   varsR#   R/   R0   t   has_keyR:   t   conn(   RD   RH   RF   R0   R2   (    (    R   t   HandleManTypesÅ   s    	!  	c           C   s   t  S(   N(   t   _isFCGI(    (    (    R   t   isFCGI×   s     t   FCGIc           B   s8   t  Z d „  Z d „  Z d d „ Z d „  Z d „  Z RS(   Nc   	      C   sš  d |  _ t d  j o t ƒ  n t ƒ  pG d |  _ t i t i t i	 t
 i f \ |  _ |  _ |  _ |  _ d  Sn t
 i i d ƒ o2 t i t
 i d d ƒ } t t i | ƒ ƒ } n d  } t i ƒ  \ |  _ } d	 \ } } h  |  _ d |  _ d } | d  j o | | j o t d ‚ n x+| o#t ƒ  } | i  |  i ƒ | i! t" j o t# | |  i ƒ n— | i$ d j o5 t ƒ  } t& | _! | i! | _' | i( |  i ƒ q nR | i$ |  i j o | i! t) j o q n( | i! t) j o |  i d j o q n | i! t) j o^ | i$ |  _ | i* t+ j o
 d } qF| i* t, j o
 d } qF| i* t- j o
 d } qFq | i! t. j oP | i/ d j o | d } qFx­ | i0 i1 ƒ  D] } | i0 | |  i | <q¦Wq | i! t3 j o/ | i/ d j o | d } qF| | i/ } q | i! t4 j o/ | i/ d j o | d } qF| | i/ } q q Wt5 | ƒ |  _ t _ t5 ƒ  |  _ t _	 t5 ƒ  |  _ t _ t5 | ƒ |  _ d  S(
   Ni    i   t   FCGI_WEB_SERVER_ADDRSt   ,R   s   Connection from invalid server!i   i   (   R   R   (6   R
   t   haveFinishedt   _initt   Nonet   _startupRK   t   syst   stdint   stdoutt   stderrt   ost   environt   inpt   outt   errt   envRG   R7   t   splitt
   good_addrsR   t   stript   _sockt   acceptRH   t   addrR   t	   requestIdt	   remainingR   R   RD   R,   R   t   ManagementTypesRI   R   t   r2R   R    R:   R   R   t   FCGI_AUTHORIZERt   FCGI_RESPONDERt   FCGI_FILTERR"   R   R#   R/   R0   t
   FCGI_STDINt	   FCGI_DATAt   StringIO(	   R
   Rb   Rd   R^   R   Rf   R0   RT   RD   (    (    R   R   ä   st    	
	6		 	#  
 
  c         C   s   |  i ƒ  d  S(   N(   R
   t   Finish(   R
   (    (    R   t   __del__4  s    i    c         C   sŠ  |  i p|d |  _ |  i i d d ƒ |  i i d d ƒ t ƒ  } t | _ |  i	 | _
 |  i i ƒ  } | oZ x: | o2 |  i | ƒ \ } } | | _ | i |  i ƒ qp Wd | _ | i |  i ƒ n t | _ |  i i ƒ  } x: | o2 |  i | ƒ \ } } | | _ | i |  i ƒ qâ Wd | _ | i |  i ƒ t ƒ  } t | _ |  i	 | _
 | | _ t | _ | i |  i ƒ |  i i ƒ  n d  S(   Ni   i    R   (   R
   RO   R[   t   seekRZ   R   RD   t   FCGI_STDERRR   Rc   R   t   readR   t   getNextChunkt   chunkR   R:   RH   t   FCGI_STDOUTR(   t   statusR*   t   FCGI_REQUEST_COMPLETER+   R   (   R
   Ru   RD   R   Rs   (    (    R   Rm   7  s<    
			 		 					c         C   sƒ   d } |  i i d ƒ o t i |  i d ƒ } n | d j o t i d |  i d d ƒ Sn# t i d |  i d |  i d d ƒ Sd  S(   Nt   GETt   REQUEST_METHODRX   t   keep_blank_valuesi   t   fp(	   t   methodR
   R\   RG   R7   t   uppert   cgit   FieldStorageRY   (   R
   R{   (    (    R   t   getFieldStorageZ  s    c         C   s   | d  } | d } | | f S(   Ni    (   R   Rs   (   R
   R   Rs   (    (    R   Rr   c  s    

(   R;   R<   R   Rn   Rm   R   Rr   (    (    (    R   RL   ã   s
   	P	#		c          C   s   d a  y2 t i t i i ƒ  t i t i ƒ } | i	 ƒ  Wn< t i
 j
 o- \ }  } |  t i j o d a d  Sqw n X| a d  S(   Ni   i    (   RP   t   sockett   fromfdRS   RT   t   filenot   AF_INETt   SOCK_STREAMR   t   getpeernameR   R[   t   errmsgt   errnot   ENOTCONNRJ   R`   (   R[   R   R†   (    (    R   RR   l  s       c          C   s  d } yà xÙ t ƒ  oÎ t ƒ  } | d } y3 | i ƒ  }  t i |  d i ƒ } d | g } Wn; d g } | i d ƒ | i d | ƒ | i d ƒ n Xt i | d	 ƒ } | i i d
 t | ƒ ƒ | i i | ƒ | i ƒ  q WWn/ d  k } t d d ƒ } | i d | ƒ n Xd  S(   Ni    i   t   sizet   *s6   <HTML><HEAD><TITLE>FCGI TestApp</TITLE></HEAD>
<BODY>
s   <H2>FCGI TestApp</H2><P>s   <b>request count</b> = %d<br>s   </BODY></HTML>
R   sH   Content-length: %s
Content-type: text/html
Cache-Control: no-cache

t	   tracebackt   wt   file(   t   counterRK   t   Acceptt   reqR   t   fsR7   t   atoiR'   R‰   t   doct   appendt   joinRZ   R   R   Rm   R‹   R    t   ft	   print_exc(   R‘   R   R–   R‹   R“   RŽ   R‰   (    (    R   t   _test  s.     
	
		t   __main__(1   RW   RS   R7   R€   R‡   t	   cStringIORl   R}   RB   RA   R	   RC   R   t   FCGI_ABORT_REQUESTR(   R"   Rj   Rt   Rp   Rk   R!   RE   R   t   FCGI_MAXTYPERe   R   t   FCGI_KEEP_CONNRh   Rg   Ri   Rv   t   FCGI_CANT_MPX_CONNt   FCGI_OVERLOADEDt   FCGI_UNKNOWN_ROLER   R   R%   R1   RI   RJ   RK   RQ   RP   R`   RL   R   RR   R˜   R;   (+   Rœ   RC   R˜   RŸ   R1   R!   Rž   R   Rj   Rg   R   RA   R‡   RB   Rh   RR   R›   Re   R}   R(   R7   R   RS   RL   RI   R"   Rp   R   Ri   Rv   R€   R%   RE   R   Rl   R    Rt   RK   R   Rk   R	   R   RW   (    (    R   t   ?"   sH   -			M					†		6