
y X3                 @   s  d  d l  Z  d  d l 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
 m Z d  d l m Z m Z m Z d  d l m Z d  d l j Z y d  d l m Z WnA e k
 ry d d l m Z Wn e k
 r d Z Yn XYn Xd	 Z e j d
  Z e j d  Z e j e  Z Gd d   d e  Z Gd d   d e  j   Z! d d   Z" d d   Z# d d   Z$ d d   Z% Gd d   d e  Z& d S)    N)unquote_to_wsgi_str)	HEADER_RE)InvalidHeaderInvalidHeaderName)string_typesbinary_typereraise)SERVER_SOFTWARE)sendfile   i?z(?:\r\n)?[ \t]+z[\x00-\x1F\x7F]c               @   s+   e  Z d  Z d d d  Z d d   Z d S)FileWrapperi    c             C   s4   | |  _  | |  _ t | d  r0 | j |  _ n  d  S)Nclose)filelikeblksizehasattrr   )selfr   r    r   B/home/ubuntu/projects/ifolica/build/gunicorn/gunicorn/http/wsgi.py__init__(   s    		zFileWrapper.__init__c             C   s)   |  j  j |  j  } | r | St  d  S)N)r   readr   
IndexError)r   keydatar   r   r   __getitem__.   s    zFileWrapper.__getitem__N)__name__
__module____qualname__r   r   r   r   r   r   r   &   s   r   c               @   s(   e  Z d  Z d d   Z d d   Z d S)WSGIErrorsWrapperc             C   s   t  j d  } | j } g  |  _ | j d k rV |  j j t j  | d d   } n  x3 | D]+ } t | d  r] |  j j | j	  q] q] Wd  S)Nzgunicorn.error-r   stream)
logging	getLoggerhandlersstreamserrorlogappendsysstderrr   r   )r   cfgr$   r"   hr   r   r   r   7   s    		zWSGIErrorsWrapper.__init__c             C   s^   xW |  j  D]L } y | j |  Wn( t k
 rK | j | j d   Yn X| j   q
 Wd  S)NzUTF-8)r#   writeUnicodeErrorencodeflush)r   r   r   r   r   r   r*   D   s    zWSGIErrorsWrapper.writeN)r   r   r   r   r*   r   r   r   r   r   5   s   r   c             C   sD   i t  |   d 6d d 6d d 6|  j d k d 6d d 6t d	 6t d
 6S)Nzwsgi.errorsr   r   zwsgi.versionFzwsgi.multithreadzwsgi.multiprocesszwsgi.run_oncezwsgi.file_wrapperr	   )r   r   )r   Zworkersr   r	   )r(   r   r   r   base_environM   s    r.   c             C   sp   t  |  } | j i |  j d 6| d 6|  j d 6|  j d 6|  j d 6d d j d d	   |  j D  d
 6 | S)Nz
wsgi.inputzgunicorn.socketREQUEST_METHODQUERY_STRINGZRAW_URIzHTTP/%s.c             S   s   g  |  ] } t  |   q Sr   )str).0vr   r   r   
<listcomp>a   s   	 z#default_environ.<locals>.<listcomp>ZSERVER_PROTOCOL)r.   updatebodymethodqueryurijoinversion)reqsockr(   envr   r   r   default_environY   s    	



(r@   c             C   sZ   |  j  } | s i  Si | d d 6| d d 6t | d  d 6| d d 6t | d	  d
 6S)NZproxy_protocolZPROXY_PROTOCOLclient_addrREMOTE_ADDRZclient_portREMOTE_PORTZ
proxy_addrZ
PROXY_ADDRZ
proxy_portZ
PROXY_PORT)Zproxy_protocol_infor2   )r=   infor   r   r   proxy_environf   s    	rE   c             C   sk  t  |  | |  } t |  | |  } d  } | j r9 d n d } t j j d d  }	 | j }
 | r t | t  r d | j	 k r | d | j	 k r i  }
 q n  x|  j
 D]\ } } | d k r | j   d k ru| j d	  qun |
 r| |
 k r| |
 | k rd } nb | d
 k r(| } nM | d k r=| }	 n8 | d k rY| | d <q n | d k ru| | d <q n  d | j d d  } | | k rd | | | f } n  | | | <q W| | d <t | t  r| | d <nD t | t  rt |  | d <n" | d | d <t | d  | d <t | t  r| j d  } t |  d k r| r| d  k	 r| j d  } t |  d k r| d k r| j d  f q| d k r| j d  q| j d  qq| j d  qn  | d | d <t | d  | d <|  j } |	 r4| j |	 d  d } n  t |  | d <|	 | d <| j t |    | | f S)NhttpshttpZSCRIPT_NAME *r   ZEXPECTz100-continues   HTTP/1.1 100 Continue

ZHOSTzCONTENT-TYPECONTENT_TYPEzCONTENT-LENGTHCONTENT_LENGTHZHTTP_r   _z%s,%szwsgi.url_schemerB   r   rC   :P   i  ZSERVER_NAMEZSERVER_PORTZ	PATH_INFO)Responser@   is_sslosenvirongetZsecure_scheme_headers
isinstancer   Zforwarded_allow_ipsheaderslowersendreplacer   r2   splitlenr%   pathr   r6   rE   )r=   r>   clientserverr(   resprR   hostZ
url_schemescript_nameZsecure_headersZhdr_nameZ	hdr_valuer   Z	path_infor   r   r   createu   sv    				


	
ra   c               @   s   e  Z d  Z d d   Z d d   Z d d   Z d d d	  Z d
 d   Z d d   Z d d   Z	 d d   Z
 d d   Z d d   Z d d   Z d d   Z d d   Z d S)rO   c             C   sp   | |  _  | |  _ t |  _ d  |  _ d |  _ d |  _ g  |  _ d |  _ d  |  _	 d |  _
 d |  _ | |  _ d  S)NFr   )r=   r>   r	   r<   statuschunked
must_closerU   headers_sentresponse_lengthsentupgrader(   )r   r=   r>   r(   r   r   r   r      s    											zResponse.__init__c             C   s   d |  _  d  S)NT)rd   )r   r   r   r   force_close   s    zResponse.force_closec             C   st   |  j  s |  j j   r d S|  j d  k	 s4 |  j r8 d S|  j j d k rN d S|  j d k  sl |  j d k rp d Sd S)NTFHEAD      0  )rl   rm   )rd   r=   should_closerf   rc   r8   status_code)r   r   r   r   rn      s    zResponse.should_closeNc             C   s   | rH z5 |  j  r: |  j r: t | d | d | d  n  Wd  d  } Xn |  j  d  k	 rf t d   n  | |  _  y  t |  j  j   d  |  _ Wn t k
 r d  |  _ Yn X|  j |  |  j	   |  _
 |  j S)Nr   r      zResponse headers already set!)rb   re   r   AssertionErrorintrY   ro   
ValueErrorprocess_headers
is_chunkedrc   r*   )r   rb   rU   exc_infor   r   r   start_response   s    #
	 zResponse.start_responsec             C   sm  xf| D]^\ } } t  | t  s5 t d |   n  t j |  rW t d |   n  t j |  ry t d |   n  t |  j	   } | j
   j	   } | d k r t |  |  _ n t j |  rI| d k r | j
   j	   d k rCd |  _ qCq | d k r | j
   j	   d k rC|  j j | j	   | f  qCq q n  |  j j | j	   | f  q Wd  S)Nz%r is not a stringz%rzcontent-length
connectionrh   TZ	websocket)rT   r   	TypeErrorr   searchr   HEADER_VALUE_REr   r2   striprV   rr   rf   utilZ
is_hoppishrh   rU   r%   )r   rU   namevaluelnamer   r   r   rt   
  s(    "zResponse.process_headersc             C   sV   |  j  d  k	 r d S|  j j d k r) d S|  j j d k r? d S|  j d	 k rR d Sd S)
NFr   r   rj   rl   0  T)r   r   )rl   r   )rf   r=   r<   r8   ro   )r   r   r   r   ru   &  s    zResponse.is_chunkedc             C   s   |  j  r d } n |  j   r' d } n d } d |  j j d |  j j d |  j f d |  j d t j   d	 | g } |  j r | j d
  n  | S)Nrh   r   z
keep-alivezHTTP/%s.%s %s
r   r   zServer: %s
z
Date: %s
zConnection: %s
zTransfer-Encoding: chunked
)	rh   rn   r=   r<   rb   r}   Z	http_daterc   r%   )r   rx   rU   r   r   r   default_headers7  s    			
	zResponse.default_headersc             C   su   |  j  r d  S|  j   } | j d d   |  j D  d d j |  } t j |  j t j | d   d |  _  d  S)Nc             S   s&   g  |  ] \ } } d  | | f  q S)z%s: %s
r   )r3   kr4   r   r   r   r5   O  s   	 z)Response.send_headers.<locals>.<listcomp>z%s
rH   asciiT)	re   r   extendrU   r;   r}   r*   r>   Zto_bytestring)r   tosend
header_strr   r   r   send_headersK  s    	zResponse.send_headersc             C   s   |  j    t | t  s, t d |   n  t |  } | } |  j d  k	 r |  j |  j k rc d  St |  j |  j |  } | | k  r | d  |  } q n  |  j r | d k r d  S|  j | 7_ t	 j
 |  j | |  j  d  S)Nz%r is not a byter   )r   rT   r   ry   rZ   rf   rg   minrc   r}   r*   r>   )r   argZarglenr   r   r   r   r*   U  s    
zResponse.writec             C   s   |  j  j d k	 o t d  k	 S)NF)r(   r
   )r   r   r   r   can_sendfilel  s    zResponse.can_sendfilec       
      C   s  |  j  j s |  j   r d St j | j  s3 d S| j j   } yc t j | d t j	  } |  j
 d  k r t j |  j } | d k r d S| | } n	 |  j
 } Wn t t j f k
 r d SYn X|  j   |  j   rd | } |  j j | j d   n  |  j j   } d } x@ | | k rZt | | t  }	 | t | | | | |	  7} qW|  j   rz|  j j d  n  t j | | t j  d S)NFr   z%X
zutf-8s   
T)r(   rP   r   r}   Z
has_filenor   filenorQ   lseekSEEK_CURrf   fstatst_sizeOSErrorioUnsupportedOperationr   ru   r>   sendallr,   r   BLKSIZEr
   SEEK_SET)
r   respiterr   offsetfilesizenbytes
chunk_sizeZsocknorg   countr   r   r   r
   o  s8    	

!zResponse.sendfilec             C   s4   |  j  |  s0 x | D] } |  j |  q Wn  d  S)N)r
   r*   )r   r   itemr   r   r   
write_file  s    zResponse.write_filec             C   s9   |  j  s |  j   n  |  j r5 t j |  j d  n  d  S)N    )re   r   rc   r}   Zwrite_chunkr>   )r   r   r   r   r     s    		zResponse.close)r   r   r   r   ri   rn   rw   rt   ru   r   r   r*   r   r
   r   r   r   r   r   r   rO      s   
,rO   )'r   r    rQ   rer&   Zgunicorn._compatr   Zgunicorn.http.messager   Zgunicorn.http.errorsr   r   Zgunicorn.sixr   r   r   Zgunicornr	   Zgunicorn.utilr}   r
   ImportErrorZ	_sendfiler   compileZNORMALIZE_SPACEr{   r!   r   logobjectr   	RawIOBaser   r.   r@   rE   ra   rO   r   r   r   r   <module>   s8   _