
oTc           @   s  d  d l  Z  d  d l Z d  d l Z d  d l Z e j d  Z d  d l Z d  d l Z y d  d l Z	 Wn e
 k
 r d  d l	 Z	 n Xe Z e e j e  j e  Z d  d l Z d  d l Z d  d l Z d  d l m Z d  d l m Z d  d l m Z d  d l Z y$ d  d l m Z d  d l m Z Wn e
 k
 rEe Z n Xd  d l Z d   Z e d	 d
  Z  e d d d d d d d d d d d d d d d d d  Z! e! j" d  e d d d  Z# d  d! d" d# d$ d% d& d' d( d) d* d+ d, d- d. d/ d0 d1 d2 d3 d4 d5 d6 g Z$ d7 e% f d8     YZ& d9 e' f d:     YZ( d; e% f d<     YZ) d= e% f d>     YZ* d? e' f d@     YZ+ dA e' f dB     YZ, e rdC e j f dD     YZ- n dC e j f dE     YZ- dF e- f dG     YZ. dH e% f dI     YZ/ e Z0 dJ e j1 f dK     YZ2 dL e% f dM     YZ3 dN f  dO     YZ4 y d  d l5 Z5 WnQ e
 k
 ry d  dP l6 m7 Z7 m8 Z8 Wn e
 k
 rdQ   Z9 n
 XdR   Z9 n
 XdS   Z9 dT e% f dU     YZ: d S(V   iNs   (?i)%2F(   t
   format_exc(   t   unquote(   t   urlparse(   t   SSL(   t   cryptoc          G   sM   t  t  } g  |  D]! } | | k r t t |  ^ q } t j |  j   S(   N(   t   dirt   errnot   getattrt   dictt   fromkeyst   keys(   t   errnamest   errno_namest   kt   nums(    (    s0   /var/www/SABnzbd/cherrypy/wsgiserver/__init__.pyt   plat_specific_errorsp   s    .t   EINTRt   WSAEINTRt   EPIPEt   EBADFt   WSAEBADFt   ENOTSOCKt   WSAENOTSOCKt	   ETIMEDOUTt   WSAETIMEDOUTt   ECONNREFUSEDt   WSAECONNREFUSEDt
   ECONNRESETt   WSAECONNRESETt   ECONNABORTEDt   WSAECONNABORTEDt	   ENETRESETt   WSAENETRESETt	   EHOSTDOWNt   EHOSTUNREACHs	   timed outt   EAGAINt   EWOULDBLOCKt   WSAEWOULDBLOCKt   ACCEPTs   ACCEPT-CHARSETs   ACCEPT-ENCODINGs   ACCEPT-LANGUAGEs   ACCEPT-RANGESt   ALLOWs   CACHE-CONTROLt
   CONNECTIONs   CONTENT-ENCODINGs   CONTENT-LANGUAGEt   EXPECTs   IF-MATCHs   IF-NONE-MATCHt   PRAGMAs   PROXY-AUTHENTICATEt   TEt   TRAILERs   TRANSFER-ENCODINGt   UPGRADEt   VARYt   VIAt   WARNINGs   WWW-AUTHENTICATEt   WSGIPathInfoDispatcherc           B   s   e  Z d    Z d   Z RS(   c         C   sm   y | j    } Wn t k
 r# n X| j   | j   g  | D]! \ } } | j d  | f ^ q? |  _ d  S(   Nt   /(   t   itemst   AttributeErrort   sortt   reverset   rstript   apps(   t   selfR8   t   pt   a(    (    s0   /var/www/SABnzbd/cherrypy/wsgiserver/__init__.pyt   __init__   s    

c         C   s   | d p d } xu |  j  D]j \ } } | j | d  sE | | k r | j   } | d | | d <| t |  | d <| | |  Sq W| d d
 d g  d	 g S(   Nt	   PATH_INFOR2   t   SCRIPT_NAMEs   404 Not Founds   Content-Types
   text/plains   Content-Lengtht   0t    (   s   Content-Types
   text/plain(   s   Content-LengthR?   (   R8   t
   startswitht   copyt   len(   R9   t   environt   start_responset   pathR:   t   app(    (    s0   /var/www/SABnzbd/cherrypy/wsgiserver/__init__.pyt   __call__   s    	
(   t   __name__t
   __module__R<   RH   (    (    (    s0   /var/www/SABnzbd/cherrypy/wsgiserver/__init__.pyR1      s   	t   MaxSizeExceededc           B   s   e  Z RS(    (   RI   RJ   (    (    (    s0   /var/www/SABnzbd/cherrypy/wsgiserver/__init__.pyRK      s   t   SizeCheckWrapperc           B   sY   e  Z d    Z d   Z d	 d  Z d	 d  Z d d  Z d   Z d   Z	 d   Z
 RS(
   c         C   s   | |  _  | |  _ d |  _ d  S(   Ni    (   t   rfilet   maxlent
   bytes_read(   R9   RM   RN   (    (    s0   /var/www/SABnzbd/cherrypy/wsgiserver/__init__.pyR<      s    		c         C   s+   |  j  r' |  j |  j  k r' t    n  d  S(   N(   RN   RO   RK   (   R9   (    (    s0   /var/www/SABnzbd/cherrypy/wsgiserver/__init__.pyt   _check_length   s    c         C   s5   |  j  j |  } |  j t |  7_ |  j   | S(   N(   RM   t   readRO   RC   RP   (   R9   t   sizet   data(    (    s0   /var/www/SABnzbd/cherrypy/wsgiserver/__init__.pyRQ      s    
c         C   s   | d  k	 rA |  j j |  } |  j t |  7_ |  j   | Sg  } xw t r |  j j d  } |  j t |  7_ |  j   | j |  t |  d k  s | d d k rJ d j |  SqJ Wd  S(   Ni   is   
R@   (	   t   NoneRM   t   readlineRO   RC   RP   t   Truet   appendt   join(   R9   RR   RS   t   res(    (    s0   /var/www/SABnzbd/cherrypy/wsgiserver/__init__.pyRU      s    
	
"i    c         C   sr   d } g  } |  j    } xS | rm | j |  | t |  7} d | k  oU | k n r^ Pn  |  j    } q W| S(   Ni    (   RU   RW   RC   (   R9   t   sizehintt   totalt   linest   line(    (    s0   /var/www/SABnzbd/cherrypy/wsgiserver/__init__.pyt	   readlines   s    	c         C   s   |  j  j   d  S(   N(   RM   t   close(   R9   (    (    s0   /var/www/SABnzbd/cherrypy/wsgiserver/__init__.pyR_      s    c         C   s   |  S(   N(    (   R9   (    (    s0   /var/www/SABnzbd/cherrypy/wsgiserver/__init__.pyt   __iter__   s    c         C   s2   |  j  j   } |  j t |  7_ |  j   | S(   N(   RM   t   nextRO   RC   RP   (   R9   RS   (    (    s0   /var/www/SABnzbd/cherrypy/wsgiserver/__init__.pyRa      s    
N(   RI   RJ   R<   RP   RT   RQ   RU   R^   R_   R`   Ra   (    (    (    s0   /var/www/SABnzbd/cherrypy/wsgiserver/__init__.pyRL      s   				t   HTTPRequestc           B   s}   e  Z d  Z d  Z d   Z d   Z d   Z d   Z d   Z d   Z	 d   Z
 d d	  Z d d
  Z d   Z d   Z RS(   i    c         C   sz   | d |  _  | |  _ | j   |  _ | |  _ t |  _ t |  _ t |  _ d |  _	 g  |  _
 t |  _ t |  _ t |  _ d  S(   Ns
   wsgi.inputR@   (   RM   t   wfileRB   RD   t   wsgi_appt   Falset   readyt   started_requestt   started_responset   statust
   outheaderst   sent_headerst   close_connectiont   chunked_write(   R9   Rc   RD   Rd   (    (    s0   /var/www/SABnzbd/cherrypy/wsgiserver/__init__.pyR<   !  s    									c         C   sO   |  j  |  j _ d |  j _ y |  j   Wn t k
 rJ |  j d  d  SXd  S(   Ni    s   413 Request Entity Too Large(   t   max_request_header_sizeRM   RN   RO   t   _parse_requestRK   t   simple_response(   R9   (    (    s0   /var/www/SABnzbd/cherrypy/wsgiserver/__init__.pyt   parse_request0  s    c         C   s  |  j  j   } t |  _ | s+ t |  _ d  S| d k r\ |  j  j   } | s\ t |  _ d  Sn  | j d  s |  j d d  d  S|  j } y% | j	   j
 d d  \ } } } Wn" t k
 r |  j d d  d  SX| | d <| | d <t |  \ } } } } }	 }
 |
 r|  j d	 d
  d  S| r1| | d <n  | rH| d | } n  d | d <g  t j
 |  D] } t |  ^ qb} d j |  } | | d <|	 | d <t | d  t | d  f } | d } t | d  t | d  f } | d | d k r|  j d  d  S| | d <d t | |  |  _ y |  j   Wn+ t k
 rg} |  j d	 | j d  d  SX|  j } | rt | j d d   | k r|  j d  d  S|  j d k r| j d d  d k r t |  _ q n$ | j d d  d k r t |  _ n  d  } |  j d k rj| j d  } | rjg  | j
 d   D]$ } | j	   r:| j	   j   ^ q:} qjn  t |  _ | rxC | D]8 } | d! k rt |  _ q|  j d"  t |  _ d  SqWn  | j d# d  d$ k r|  j d%  n  t |  _ d  S(&   Ns   
i  s   HTTP requires CRLF terminatorst    i   s   Malformed Request-Linet   REQUEST_URIt   REQUEST_METHODs   400 Bad Requests!   Illegal #fragment in Request-URI.s   wsgi.url_schemet   ;R@   R>   s   %2FR=   t   QUERY_STRINGi   i   t   ACTUAL_SERVER_PROTOCOLi    s   505 HTTP Version Not Supportedt   SERVER_PROTOCOLs
   HTTP/%s.%st   CONTENT_LENGTHs   413 Request Entity Too Larges   HTTP/1.1t   HTTP_CONNECTIONR_   s
   Keep-Alivet   HTTP_TRANSFER_ENCODINGt   ,t   chunkeds   501 Unimplementedt   HTTP_EXPECTs   100-continueid   (   RM   RU   RV   Rg   Re   Rf   t   endswithRp   RD   t   stript   splitt
   ValueErrorR   t   quoted_slashR   RX   t   intt   mint   response_protocolt   read_headerst   argst   max_request_body_sizet   getRl   RT   t   lowert   chunked_read(   R9   t   request_lineRD   t   methodRF   t   req_protocolt   schemet   locationt   paramst   qst   fragt   xt   atomst   rpt   server_protocolt   spt   ext   mrbst   tet   enc(    (    s0   /var/www/SABnzbd/cherrypy/wsgiserver/__init__.pyRo   ;  s    				%

	
(

 
 
	$@		c   	      C   st  |  j  } xt r|  j j   } | s6 t d   n  | d k rF Pn  | j d  sd t d   n  | d d k r | j   } nM | j d d  \ } } | j   j   | j   } } d | j	 d	 d
  } | t
 k r| j |  } | rd j | | f  } qn  | | | <q W| j d d   } | d  k	 rE| | d <n  | j d d   } | d  k	 rp| | d <n  d  S(   Ns   Illegal end of headers.s   
s   HTTP requires CRLF terminatorsi    s    	t   :i   t   HTTP_t   -t   _s   , t   HTTP_CONTENT_TYPEt   CONTENT_TYPEt   HTTP_CONTENT_LENGTHRy   (   RD   RV   RM   RU   R   R   R   R   t   uppert   replacet   comma_separated_headersR   RX   t   popRT   (	   R9   RD   R]   t   vR   t   envnamet   existingt   ctt   cl(    (    s0   /var/www/SABnzbd/cherrypy/wsgiserver/__init__.pyR     s2    		c         C   s  d } t  j    } x t r |  j j   j   j d d  } t | j d  d  } | d k rd Pn  | | 7} | j |  j j	 |   |  j j	 d  } | d k r |  j
 d d |  d  Sq W|  j   | j d  | |  j d	 <t |  p d
 |  j d <t S(   Ni    Ru   i   i   i   s   
s   400 Bad Requests5   Bad chunked transfer coding (expected '\r\n', got %r)s
   wsgi.inputR@   Ry   (   t   StringIORV   RM   RU   R   R   R   R   t   writeRQ   Rp   R   t   seekRD   t   str(   R9   R   RS   R]   t
   chunk_sizet   crlf(    (    s0   /var/www/SABnzbd/cherrypy/wsgiserver/__init__.pyt   decode_chunked  s(    	!
	
c         C   s   |  j  r |  j |  j _ nK t |  j j d d   } |  j rZ t | |  j  |  j _ n | |  j _ d |  j _ y |  j	   Wn+ t
 k
 r |  j s |  j d  n  d  SXd  S(   NRy   i    s   413 Request Entity Too Large(   R   R   RM   RN   R   RD   R   R   RO   t   _respondRK   Rk   Rp   (   R9   R   (    (    s0   /var/www/SABnzbd/cherrypy/wsgiserver/__init__.pyt   respond  s    			c         C   s   |  j  r% |  j   s% t |  _ d  Sn  |  j |  j |  j  } z+ x$ | D] } | rG |  j |  qG qG WWd  t | d  r | j	   n  X|  j
 r |  j r t |  _ |  j   n  |  j r |  j j d  n  d  S(   NR_   s   0

(   R   R   RV   Rl   Rd   RD   RE   R   t   hasattrR_   Rf   Rk   t   send_headersRm   Rc   t   sendall(   R9   t   responset   chunk(    (    s0   /var/www/SABnzbd/cherrypy/wsgiserver/__init__.pyR   /  s     				R@   c         C   s  t  |  } | d  d k rF d |  j d | f d | d d g } n* d |  j d | f d t |  d g } | d  d	 k r |  j d
 k r t |  _ | j d  n  | j d  | r | j |  n  y |  j j d j	 |   Wn/ t
 j k
 r} | j d t k r  qn Xd  S(   Ni   t   301s   %s %s
Rw   s   Location: %s
s   Content-Length: 0
s   Content-Type: text/plain
s   Content-Length: %s
t   413s   HTTP/1.1s   Connection: close
s   
R@   i    (   R   RD   RC   R   RV   Rl   RW   Rc   R   RX   t   sockett   errorR   t   socket_errors_to_ignore(   R9   Ri   t   msgt   bufR   (    (    s0   /var/www/SABnzbd/cherrypy/wsgiserver/__init__.pyRp   J  s(    		c         C   sz   |  j  r | r t d   n  |  j rQ z | d | d | d  Wd  d  } Xn  t |  _  | |  _ |  j j |  |  j S(   Ns:   WSGI start_response called a second time with no exc_info.i    i   i   (	   Rh   t   AssertionErrorRk   RT   RV   Ri   Rj   t   extendR   (   R9   Ri   t   headerst   exc_info(    (    s0   /var/www/SABnzbd/cherrypy/wsgiserver/__init__.pyRE   j  s    	
		c         C   s   |  j  s t d   n  |  j s7 t |  _ |  j   n  |  j r | r t t |   d d | d g } |  j j	 d j
 |   n |  j j	 |  d  S(   Ns(   WSGI write called before start_response.i   s   
R@   (   Rh   R   Rk   RV   R   Rm   t   hexRC   Rc   R   RX   (   R9   R   R   (    (    s0   /var/www/SABnzbd/cherrypy/wsgiserver/__init__.pyR     s    			"c   	      C   s  g  |  j  D] \ } } | j   ^ q
 } t |  j d   } | d k rS t |  _ nq d | k r | d k  s | d k rz q |  j d k r |  j d	 d
 k r t |  _ |  j  j	 d  q t |  _ n  d | k r|  j d k r |  j r|  j  j	 d   qq|  j s|  j  j	 d!  qn  |  j ri|  j
 ri|  j j |  j j } | d k ri|  j j |  qin  d | k r|  j  j	 d t j   f  n  d | k r|  j  j	 d |  j d f  n  |  j d d |  j d g } y6 | g  |  j  D] \ } } | d | d ^ q7} WnP t k
 rdt | t  s@t d   n  t | t  s^t d   qe  n X| j	 d  |  j j d j |   d  S("   Ni   i  s   content-lengthi   i   i   i0  s   HTTP/1.1Rt   t   HEADs   Transfer-EncodingR}   t
   connectiont
   ConnectionR_   s
   Keep-Alivei    t   datet   Datet   servert   Servert   SERVER_SOFTWARERw   Rr   s   
s   : s,   WSGI response header key %r is not a string.s.   WSGI response header value %r is not a string.R@   (   i   i   i0  (   s   Transfer-EncodingR}   (   R   R_   (   R   s
   Keep-Alive(   Rj   R   R   Ri   RV   Rl   R   RD   Rm   RW   R   RM   RN   RO   RQ   t   rfc822t
   formatdatet	   TypeErrort
   isinstanceR   Rc   R   RX   (	   R9   t   keyt   valuet   hkeysRi   RR   R   R   R   (    (    s0   /var/www/SABnzbd/cherrypy/wsgiserver/__init__.pyR     sJ    (			 6N(   RI   RJ   Rn   R   R<   Rq   Ro   R   R   R   R   Rp   RT   RE   R   R   (    (    (    s0   /var/www/SABnzbd/cherrypy/wsgiserver/__init__.pyRb      s   #				%			 	t
   NoSSLErrorc           B   s   e  Z RS(    (   RI   RJ   (    (    (    s0   /var/www/SABnzbd/cherrypy/wsgiserver/__init__.pyR     s   t   FatalSSLAlertc           B   s   e  Z RS(    (   RI   RJ   (    (    (    s0   /var/www/SABnzbd/cherrypy/wsgiserver/__init__.pyR     s   t   CP_fileobjectc           B   sD   e  Z d    Z d   Z d   Z d   Z d d  Z d d  Z RS(   c         C   s`   xY | r[ y |  j  |  } | | } Wq t j k
 rW } | j d t k rX   qX q Xq Wd  S(   Ni    (   t   sendR   R   R   t   socket_errors_nonblocking(   R9   RS   t
   bytes_sentt   e(    (    s0   /var/www/SABnzbd/cherrypy/wsgiserver/__init__.pyR     s    	c         C   s   |  j  j |  S(   N(   t   _sockR   (   R9   RS   (    (    s0   /var/www/SABnzbd/cherrypy/wsgiserver/__init__.pyR     s    c         C   s8   |  j  r4 d j |  j   } g  |  _  |  j |  n  d  S(   NR@   (   t   _wbufRX   R   (   R9   t   buffer(    (    s0   /var/www/SABnzbd/cherrypy/wsgiserver/__init__.pyt   flush  s    		c         C   sj   xc t  re y |  j j |  SWq t j k
 ra } | j d t k rb | j d t k rb   qb q Xq Wd  S(   Ni    (   RV   R   t   recvR   R   R   R   t   socket_error_eintr(   R9   RR   R   (    (    s0   /var/www/SABnzbd/cherrypy/wsgiserver/__init__.pyR     s    	ic   	      C   s  t  |  j |  j  } |  j } | j d d  | d k  r t j   |  _ x0 t r{ |  j |  } | sk Pn  | j |  qL W| j	   S| j
   } | | k r | j d  | j |  } t j   |  _ |  j j | j    | St j   |  _ x t r~| | } |  j |  } | sPn  t |  } | | k rA| rA| S| | k ra| j |  ~ Pn  | j |  | | 7} ~ q W| j	   Sd  S(   Ni    i   (   t   maxt	   _rbufsizet   default_bufsizet   _rbufR   R   RV   R   R   t   getvaluet   tellRQ   RC   (	   R9   RR   t   rbufsizeR   RS   t   buf_lent   rvt   leftt   n(    (    s0   /var/www/SABnzbd/cherrypy/wsgiserver/__init__.pyRQ     sF    		
	

c         C   sp  |  j  } | j d d  | j   d k r | j d  | j |  } | j d  sh t |  | k r t j   |  _  |  j  j | j    | S~ n  | d k  r|  j	 d k r/| j d  | j   g } t j   |  _  d  } |  j } x3 | d k r!| d  } | sPn  | j |  q Wd j |  S| j d d  t j   |  _  x t r|  j |  j	  } | ssPn  | j d  } | d k r| d 7} | j | |   |  j  j | |  ~ Pn  | j |  qQW| j   S| j d d  | j   } | | k rL| j d  | j |  }	 t j   |  _  |  j  j | j    |	 St j   |  _  xt ra|  j |  j	  } | sPn  | | }
 | j d d |
  } | d k r| d 7} |  j  j | |  | r| j | |   Pq| |  Sn  t |  } | | k r| r| S| |
 k rG| j | |
   |  j  j | |
  Pn  | j |  | | 7} q^W| j   Sd  S(   Ni    i   s   
i   R@   (   R   R   R   RU   R   RC   R   R   RQ   R   RT   R   RW   RX   RV   t   findR   (   R9   RR   R   t   blinet   buffersRS   R   t   nlR   R   R   R   (    (    s0   /var/www/SABnzbd/cherrypy/wsgiserver/__init__.pyRU   @  s    	!		

	

(   RI   RJ   R   R   R   R   RQ   RU   (    (    (    s0   /var/www/SABnzbd/cherrypy/wsgiserver/__init__.pyR     s   	
				<c           B   sD   e  Z d    Z d   Z d   Z d   Z d d  Z d d  Z RS(   c         C   s`   xY | r[ y |  j  |  } | | } Wq t j k
 rW } | j d t k rX   qX q Xq Wd  S(   Ni    (   R   R   R   R   R   (   R9   RS   R   R   (    (    s0   /var/www/SABnzbd/cherrypy/wsgiserver/__init__.pyR     s    	c         C   s   |  j  j |  S(   N(   R   R   (   R9   RS   (    (    s0   /var/www/SABnzbd/cherrypy/wsgiserver/__init__.pyR     s    c         C   s8   |  j  r4 d j |  j   } g  |  _  |  j |  n  d  S(   NR@   (   R   RX   R   (   R9   R   (    (    s0   /var/www/SABnzbd/cherrypy/wsgiserver/__init__.pyR     s    		c         C   sj   xc t  re y |  j j |  SWq t j k
 ra } | j d t k rb | j d t k rb   qb q Xq Wd  S(   Ni    (   RV   R   R   R   R   R   R   R   (   R9   RR   R   (    (    s0   /var/www/SABnzbd/cherrypy/wsgiserver/__init__.pyR     s    	ic         C   s  | d k  r |  j  g } d |  _  |  j d k r< |  j } n	 |  j } x0 t rw |  j |  } | sg Pn  | j |  qH Wd j |  S|  j  } t |  } | | k r | | |  _  | |  Sg  } | r | j |  n  d |  _  x t ro| | } t |  j |  } |  j |  } | sPn  | j |  t |  } | | k rb| | |  _  | |  | d <Pn  | | 7} q Wd j |  Sd  S(   Ni    R@   i   i(	   R   R   R   RV   R   RW   RX   RC   R   (   R9   RR   R   t	   recv_sizeRS   R   R   R   (    (    s0   /var/www/SABnzbd/cherrypy/wsgiserver/__init__.pyRQ     sF    						
c         C   s  |  j  } | d k  rV|  j d k rp g  } x6 | d k rb |  j d  } | sR Pn  | j |  q- Wd j |  S| j d  } | d k r | d 7} | | |  _  | |  Sg  } | r | j |  n  d |  _  xw t rH|  j |  j  } | s Pn  | j |  | j d  } | d k r | d 7} | | |  _  | |  | d <Pq q Wd j |  S| j d d |  } | d k r| d 7} | | |  _  | |  St |  } | | k r| | |  _  | |  Sg  } | r| j |  n  d |  _  x t r|  j |  j  } | sPn  | j |  | | } | j d d |  } | d k rn| d 7} | | |  _  | |  | d <Pn  t |  } | | k r| | |  _  | |  | d <Pn  | | 7} qWd j |  Sd  S(   Ni    i   s   
R@   i(   R   R   R   RW   RX   R   RV   RC   (   R9   RR   RS   R   R   R   R   R   (    (    s0   /var/www/SABnzbd/cherrypy/wsgiserver/__init__.pyRU     s~    	
		

		

(   RI   RJ   R   R   R   R   RQ   RU   (    (    (    s0   /var/www/SABnzbd/cherrypy/wsgiserver/__init__.pyR     s   	
				*t   SSL_fileobjectc           B   s8   e  Z d  Z d Z d   Z d   Z d   Z d   Z RS(   i   g{Gz?c   	      O   s  t  j    } xt ry | | |   SWn8t j k
 rL t  j |  j  nt j k
 ro t  j |  j  n t j k
 r } | r | j d k r d S| j d } | r | t	 k r d St
 j |   n t j k
 rW} | r | j d	 k r d Sd  } y | j d d d } Wn t k
 r,n X| d k rEt    n  t | j    n
   n Xt  j    | |  j k r t
 j d   q q Wd  S(
   Nis   Unexpected EOFR@   i    i   s   http requests	   timed out(   is   Unexpected EOF(   is   Unexpected EOF(   t   timeRV   R   t   WantReadErrort   sleept	   ssl_retryt   WantWriteErrort   SysCallErrorR   R   R   R   t   ErrorRT   t
   IndexErrorR   R   t   ssl_timeoutt   timeout(	   R9   t	   is_readert   callR   t   kwargst   startR   t   errnumt   thirdarg(    (    s0   /var/www/SABnzbd/cherrypy/wsgiserver/__init__.pyt
   _safe_call-  s<    	c         O   sp   g  } t  t |   j } xQ t rk |  j t | | |  } | j |  |  j j   } | s d j |  Sq Wd  S(   NR@   (	   t   superR   R   RV   R  RW   R   t   pendingRX   (   R9   R   R  R   t   rRS   R:   (    (    s0   /var/www/SABnzbd/cherrypy/wsgiserver/__init__.pyR   [  s    	c         O   s"   |  j  t t t |   j | |  S(   N(   R  Re   R  R   R   (   R9   R   R  (    (    s0   /var/www/SABnzbd/cherrypy/wsgiserver/__init__.pyR   e  s    c         O   s"   |  j  t t t |   j | |  S(   N(   R  Re   R  R   R   (   R9   R   R  (    (    s0   /var/www/SABnzbd/cherrypy/wsgiserver/__init__.pyR   h  s    (   RI   RJ   R   R   R  R   R   R   (    (    (    s0   /var/www/SABnzbd/cherrypy/wsgiserver/__init__.pyR   '  s   	.	
	t   HTTPConnectionc           B   sh   e  Z d  Z e Z i d d 6d d 6e d 6e d 6e d 6e j d	 6Z	 d
   Z
 d   Z e Z d   Z RS(   ii   i    s   wsgi.versiont   https   wsgi.url_schemes   wsgi.multithreads   wsgi.multiprocesss   wsgi.run_onces   wsgi.errorsc         C   s   | |  _  | |  _ |  j j   |  _ |  j j |  t r t | t j  r | j   } t	 | d |  j
  |  _ | |  j _ t	 | d d  |  _ | |  j _ n- t | d |  j
  |  _ t | d d  |  _ t |  j d  |  j d <d  S(   Nt   rbt   wbii    s
   wsgi.input(   R   Rd   RD   RB   t   updateR   R   t   ConnectionTypet
   gettimeoutR   R   RM   R   Rc   R   RL   (   R9   t   sockRd   RD   R   (    (    s0   /var/www/SABnzbd/cherrypy/wsgiserver/__init__.pyR<     s    		c         C   s  t  } yi xb t rm d  } |  j |  j |  j |  j  } | j   | j sM d  St } | j	   | j
 r d  Sq WWnut j k
 r} | j d } | d k r | s | r| j r| r | j r | j d  q qn5 | t k r| r| j r| j d t    qn  d  St t f k
 r+  n t k
 r>} d  St k
 r| r| j rt |  j j d d  | _ t r| j d t  n | j d d	  t |  _ qn9 t k
 r} | r| j r| j d t    qn Xd  S(
   Ni    s	   timed outs   408 Request Timeouts   500 Internal Server ErrorR  is   301 Moved Permanentlys   400 Bad RequestsU   The client sent a plain HTTP request, but this server only speaks HTTPS on this port.(   Re   RV   RT   t   RequestHandlerClassRc   RD   Rd   Rq   Rf   R   Rl   R   R   R   Rg   Rk   Rp   R   R    t   KeyboardInterruptt
   SystemExitR   R   R   R   t   REDIRECT_URLt   lingert	   Exception(   R9   t   request_seent   reqR   R  (    (    s0   /var/www/SABnzbd/cherrypy/wsgiserver/__init__.pyt   communicate  sN    	
	
			c         C   s:   |  j  j   |  j s6 |  j j j   |  j j   n  d  S(   N(   RM   R_   R  R   R   (   R9   (    (    s0   /var/www/SABnzbd/cherrypy/wsgiserver/__init__.pyR_     s
    	(   i   i    (   RI   RJ   R   Rb   R  RV   Re   t   syst   stderrRD   R<   R  R  R_   (    (    (    s0   /var/www/SABnzbd/cherrypy/wsgiserver/__init__.pyR	  l  s   
		=t   WorkerThreadc           B   s    e  Z d Z d    Z d   Z RS(   c         C   s&   t  |  _ | |  _ t j j |   d  S(   N(   Re   Rf   R   t	   threadingt   ThreadR<   (   R9   R   (    (    s0   /var/www/SABnzbd/cherrypy/wsgiserver/__init__.pyR<      s    		c         C   s   yj t  |  _ xZ t  rh |  j j j   } | t k r7 d  S| |  _ z | j   Wd  | j   d  |  _ Xq WWn% t
 t f k
 r } | |  j _ n Xd  S(   N(   RV   Rf   R   t   requestsR   t   _SHUTDOWNREQUESTt   connR  R_   RT   R  R  t	   interrupt(   R9   R!  t   exc(    (    s0   /var/www/SABnzbd/cherrypy/wsgiserver/__init__.pyt   run  s    			
N(   RI   RJ   RT   R!  R<   R$  (    (    (    s0   /var/www/SABnzbd/cherrypy/wsgiserver/__init__.pyR    s   	t
   ThreadPoolc           B   se   e  Z d  d d  Z d   Z d   Z e e d e j Z d   Z d   Z	 d   Z
 d	 d
  Z RS(   i
   ic         C   sF   | |  _  | |  _ | |  _ g  |  _ t j   |  _ |  j j |  _ d  S(   N(   R   R   R   t   _threadst   Queuet   _queueR   (   R9   R   R   R   (    (    s0   /var/www/SABnzbd/cherrypy/wsgiserver/__init__.pyR<     s    				c         C   s   x0 t  |  j  D] } |  j j t |  j   q Wx2 |  j D]' } | j d | j    | j   q= Wx. |  j D]# } x | j	 s t
 j d  q{ Wqr Wd  S(   Ns   CP WSGIServer g?(   t   xrangeR   R&  RW   R  R   t   setNamet   getNameR  Rf   R   R   (   R9   t   it   worker(    (    s0   /var/www/SABnzbd/cherrypy/wsgiserver/__init__.pyR  &  s    c         C   s/   t  g  |  j D] } | j d  k r | ^ q  S(   N(   RC   R&  R!  RT   (   R9   t   t(    (    s0   /var/www/SABnzbd/cherrypy/wsgiserver/__init__.pyt	   _get_idle1  s    t   docc         C   s$   |  j  j |  | t k r  d  Sd  S(   N(   R(  t   putR   (   R9   t   obj(    (    s0   /var/www/SABnzbd/cherrypy/wsgiserver/__init__.pyR1  6  s    c         C   s   x t  |  D]q } |  j d k r> t |  j  |  j k r> Pn  t |  j  } | j d | j    |  j j |  | j	   q Wd  S(   Ni    s   CP WSGIServer (
   R)  R   RC   R&  R  R   R*  R+  RW   R  (   R9   t   amountR,  R-  (    (    s0   /var/www/SABnzbd/cherrypy/wsgiserver/__init__.pyt   grow;  s    'c         C   s   x: |  j  D]/ } | j   s
 |  j  j |  | d 8} q
 q
 W| d k r x@ t t | t |  j   |  j   D] } |  j j t  qo Wn  d  S(   Ni   i    (	   R&  t   isAlivet   removeR)  R   RC   R(  R1  R   (   R9   R3  R.  R,  (    (    s0   /var/www/SABnzbd/cherrypy/wsgiserver/__init__.pyt   shrinkE  s    ,i   c         C   s6  x! |  j  D] } |  j j t  q
 Wt j   } x |  j  r1|  j  j   } | | k	 r3 | j   r3 y | d  k s~ | d k  r | j	   n | j	 |  | j   r| j
 } | r| j j rt r t | j t j  r | j j   q| j j t j  n  | j	   n  Wq.t t f k
 r*} q.Xq3 q3 Wd  S(   Ni    (   R&  R(  R1  R   R  t   currentThreadR   R5  RT   RX   R!  RM   t   closedR   R   R   R  t   shutdownt   SHUT_RDR   R  (   R9   R   R-  t   currentt   ct   exc1(    (    s0   /var/www/SABnzbd/cherrypy/wsgiserver/__init__.pyt   stopV  s(    	(   RI   RJ   R<   R  R/  t   propertyt   __doc__t   idleR1  R4  R7  R?  (    (    (    s0   /var/www/SABnzbd/cherrypy/wsgiserver/__init__.pyR%    s   				
	t   SSLConnectionc        !   B   s4   e  Z d    Z x  d$ D] Z d" e e f d# Uq WRS(%   c         G   s%   t  j |   |  _ t j   |  _ d  S(   N(   R   R   t	   _ssl_connR  t   RLockt   _lock(   R9   R   (    (    s0   /var/www/SABnzbd/cherrypy/wsgiserver/__init__.pyR<     s    t   get_contextR  R   R   R   RQ   t   renegotiatet   bindt   listent   connectt   acceptt   setblockingt   filenoR:  R_   t   get_cipher_listt   getpeernamet   getsocknamet
   getsockoptt
   setsockoptt   makefilet   get_app_datat   set_app_datat   state_stringt   sock_shutdownt   get_peer_certificatet	   want_readt
   want_writet   set_connect_statet   set_accept_statet
   connect_exR   t
   settimeouts   def %s(self, *args):
        self._lock.acquire()
        try:
            return self._ssl_conn.%s(*args)
        finally:
            self._lock.release()
N(!   RG  R  R   R   R   RQ   RH  RI  RJ  RK  RL  RM  RN  R:  R_   RO  RP  RQ  RR  RS  RT  RU  RV  RW  RX  RY  RZ  R[  R\  R]  R^  R   R_  (   RI   RJ   R<   t   f(    (    (    s0   /var/www/SABnzbd/cherrypy/wsgiserver/__init__.pyRC  y  s   	      
(   t   windllt   WinErrorc         C   s   d  S(   N(    (   R  (    (    s0   /var/www/SABnzbd/cherrypy/wsgiserver/__init__.pyt   prevent_socket_inheritance  s    c         C   s.   t  j j |  j   d d  s* t    n  d  S(   Ni   i    (   Ra  t   kernel32t   SetHandleInformationRN  Rb  (   R  (    (    s0   /var/www/SABnzbd/cherrypy/wsgiserver/__init__.pyRc    s    c         C   sB   |  j    } t j | t j  } t j | t j | t j B d  S(   N(   RN  t   fcntlt   F_GETFDt   F_SETFDt
   FD_CLOEXEC(   R  t   fdt	   old_flags(    (    s0   /var/www/SABnzbd/cherrypy/wsgiserver/__init__.pyRc    s    t   CherryPyWSGIServerc           B   s  e  Z d  Z d Z d Z e Z d Z e	 Z
 e Z i  Z d Z d Z d Z d Z d d d d d d d  Z d   Z d   Z e e e  Z d	   Z d
   Z d   Z e e e d d Z d   Z d d  Z d   Z d   Z d   Z e e e d d Z  d   Z! d   Z" RS(   s   HTTP/1.1s	   127.0.0.1s   CherryPy/3.2.0i
   ii   c	   	      C   s   t  |  d | p d d | |  _ |  j j   |  _ t |  rK | |  _ n t j d t  t	 |  |  _ | |  _
 | s t j   } n  | |  _ | |  _ | |  _ | |  _ d  S(   NR   i   R   s   The ability to pass multiple apps is deprecated and will be removed in 3.2. You should explicitly include a WSGIPathInfoDispatcher instead.(   R%  R  RD   RB   t   callableRd   t   warningst   warnt   DeprecationWarningR1   t	   bind_addrR   t   gethostnamet   server_namet   request_queue_sizeR   t   shutdown_timeout(	   R9   Rq  Rd   t
   numthreadsRs  R   Rt  R   Ru  (    (    s0   /var/www/SABnzbd/cherrypy/wsgiserver/__init__.pyR<     s    !					c         C   s
   |  j  j S(   N(   R  R   (   R9   (    (    s0   /var/www/SABnzbd/cherrypy/wsgiserver/__init__.pyt   _get_numthreads  s    c         C   s   | |  j  _ d  S(   N(   R  R   (   R9   R   (    (    s0   /var/www/SABnzbd/cherrypy/wsgiserver/__init__.pyt   _set_numthreads  s    c         C   s   d |  j  |  j j |  j f S(   Ns	   %s.%s(%r)(   RJ   t	   __class__RI   Rq  (   R9   (    (    s0   /var/www/SABnzbd/cherrypy/wsgiserver/__init__.pyt   __str__  s    c         C   s   |  j  S(   N(   t
   _bind_addr(   R9   (    (    s0   /var/www/SABnzbd/cherrypy/wsgiserver/__init__.pyt   _get_bind_addr!  s    c         C   s;   t  | t  r. | d d k r. t d   n  | |  _ d  S(   Ni    R@   sz   Host values of '' or None are not allowed. Use '0.0.0.0' (IPv4) or '::' (IPv6) instead to listen on all active interfaces.(   R@   N(   R   t   tupleRT   R   R{  (   R9   R   (    (    s0   /var/www/SABnzbd/cherrypy/wsgiserver/__init__.pyt   _set_bind_addr#  s    R0  s  The interface on which to listen for connections.

        For TCP sockets, a (host, port) tuple. Host values may be any IPv4
        or IPv6 address, or any valid hostname. The string 'localhost' is a
        synonym for '127.0.0.1' (or '::1', if your hosts file prefers IPv6).
        The string '0.0.0.0' is a special IPv4 entry meaning "any active
        interface" (INADDR_ANY), and '::' is the similar IN6ADDR_ANY for
        IPv6. The empty string or None are not allowed.

        For UNIX sockets, supply the filename as a string.c         C   s.  d  |  _ t |  j t  r~ y t j |  j  Wn n Xy t j |  j d  Wn n Xt j	 t j
 d d |  j f g } nr |  j \ } } y+ t j | | t j t j
 d t j  } Wn5 t j k
 r t j t j
 d d |  j f g } n Xd  |  _ d } xy | D]q } | \ } } } }	 }
 y |  j | | |  Wn; t j k
 ru} |  j rf|  j j   n  d  |  _ qn XPqW|  j st j |  n  |  j j d  |  j j |  j  |  j j   t |  _ x[ |  j r)|  j   |  j rx  |  j t k rt j d  qW|  j r&|  j  q&qqWd  S(   Ni  i    R@   s   No socket could be createdi   g?(   RT   t
   _interruptR   Rq  t
   basestringt   ost   unlinkt   chmodR   t   AF_UNIXt   SOCK_STREAMt   getaddrinfot	   AF_UNSPECt
   AI_PASSIVEt   gaierrort   AF_INETRI  R   R_   R_  RJ  Rt  R  R  RV   Rf   t   tickR"  R   R   (   R9   t   infot   hostt   portR   RY   t   aft   socktypet   protot	   canonnamet   sa(    (    s0   /var/www/SABnzbd/cherrypy/wsgiserver/__init__.pyR  ?  sT    	    $%					
		i    c         C   s  t  j  | | |  |  _  t |  j   |  j  j t  j t  j d  |  j ri |  j  j t  j t  j d  n  |  j d  k r|  j
 r|  j rt d  k r t d   n  t j t j  |  _ |  j j |  j  |  j r |  j j |  j  n  |  j j |  j
  n  |  j d  k	 r6t |  j |  j   |  _  |  j   n  t |  j t  r|  j d d k r| t  j k ry  |  j  j t  j t  j d  Wqt t  j f k
 rqXn  |  j  j |  j  d  S(   Ni   s(   You must install pyOpenSSL to use HTTPS.i    s   ::(   R   Rc  RS  t
   SOL_SOCKETt   SO_REUSEADDRt   nodelayt   IPPROTO_TCPt   TCP_NODELAYt   ssl_contextRT   t   ssl_certificatet   ssl_private_keyR   t   ImportErrort   Contextt   SSLv23_METHODt   use_privatekey_filet   ssl_certificate_chaint   load_verify_locationst   use_certificate_fileRC  t   populate_ssl_environR   Rq  R  t   AF_INET6t   IPPROTO_IPV6t   IPV6_V6ONLYR4   R   RI  (   R9   t   familyt   typeR  (    (    s0   /var/www/SABnzbd/cherrypy/wsgiserver/__init__.pyRI    s0    		" c         C   s  y$|  j  j   \ } } t |  |  j s/ d  St | d  rQ | j |  j  n  |  j j   } | j	 d  d  k r d |  j | d <n  |  j | d <|  j | d <t |  j t  r d | d <n9 t |  j d  | d <| d	 | d
 <t | d  | d <|  j | |  j |  } |  j j |  Wnr t  j k
 r;d  St  j k
 r} | j d	 t k rdd  S| j d	 t k r{d  S| j d	 t k rd  S  n Xd  S(   NR_  R   s   %s WSGI ServerRw   t   SERVER_NAMER@   t   SERVER_PORTi   i    t   REMOTE_ADDRt   REMOTE_PORT(   R   RL  Rc  Rf   R   R_  R   RD   RB   R   RT   t   versiont   protocolRs  R   Rq  R  R   t   ConnectionClassRd   R  R1  R   R   R   R   R   (   R9   t   st   addrRD   R!  R   (    (    s0   /var/www/SABnzbd/cherrypy/wsgiserver/__init__.pyR    s:    
	c         C   s   |  j  S(   N(   R  (   R9   (    (    s0   /var/www/SABnzbd/cherrypy/wsgiserver/__init__.pyt   _get_interrupt  s    c         C   s    t  |  _ |  j   | |  _ d  S(   N(   RV   R  R?  (   R9   R"  (    (    s0   /var/www/SABnzbd/cherrypy/wsgiserver/__init__.pyt   _set_interrupt  s    	
s:   Set this to an Exception instance to interrupt the server.c         C   sr  t  |  _ t |  d d   } | r[t |  j t  s3y | j   d  \ } } Wn/ t j	 k
 r~ } | j
 d d k r0  q0q3Xx t j | | t j t j  D] } | \ } } } }	 }
 d  } yC t j | | |  } | j d  | j | | f  | j   Wq t j	 k
 r+| r,| j   q,q Xq Wn  t | d  rO| j   n  d  |  _ n  |  j j |  j  d  S(   NR   i   i   s   Bad file descriptorg      ?R_   (   Re   Rf   R   RT   R   Rq  R  RQ  R   R   R   R  R  R  R_  RK  R_   R   R  R?  Ru  (   R9   R  R  R  R   RY   R  R  R  R  R  R  (    (    s0   /var/www/SABnzbd/cherrypy/wsgiserver/__init__.pyR?    s2    	
c   
      C   sj  i d d 6d d 6} |  j  rVt |  j  d  j   } t j t j |  } | j i | j   d 6| j   d 6 x d | j	   f d	 | j
   f g D] \ } } t |  d
 d !} d | } | | | <x | rN| j d  } | |  | | d } } | j d  } | |  | | d } }	 |	 r | r d | |	 f } | | | <q q Wq Wn  |  j j |  d  S(   Nt   httpss   wsgi.url_schemet   ont   HTTPSR  t   SSL_SERVER_M_VERSIONt   SSL_SERVER_M_SERIALt   It   Si   is   SSL_SERVER_%s_DNt   =i   R2   s   SSL_SERVER_%s_DN_%s(   R  t   openRQ   R   t   load_certificatet   FILETYPE_PEMR  t   get_versiont   get_serial_numbert
   get_issuert   get_subjectR   t   rfindRD   (
   R9   t   ssl_environt   certt   prefixt   dnt   dnstrt   wsgikeyt   posR   R   (    (    s0   /var/www/SABnzbd/cherrypy/wsgiserver/__init__.pyR    s.    
		

	N(#   RI   RJ   R  R{  R  Re   Rf   RT   R  RV   R  R	  R  RD   R  R  R  R  R<   Rw  Rx  R@  Rv  Rz  R|  R~  Rq  R  RI  R  R  R  R"  R?  R  (    (    (    s0   /var/www/SABnzbd/cherrypy/wsgiserver/__init__.pyRl    s>   >					
		@%	8				&(;   t   base64R  R'  t   ret   compileR   R   R   t	   cStringIOR   R  RT   R  R   t   _fileobjectR   R  t   _fileobject_uses_str_typeR  R  R   t	   tracebackR    t   urllibR   R   Rn  t   OpenSSLR   R   R   R   R   R   RW   R   R   t   objectR1   R  RK   RL   Rb   R   R   R   R   R	  R   R  R  R%  RC  Rf  t   ctypesRa  Rb  Rc  Rl  (    (    (    s0   /var/www/SABnzbd/cherrypy/wsgiserver/__init__.pyt   <module>P   s   
			#? E'b	