3
Z_ð]ë’  ã                @   s”  d dl Z d dlZd dlZ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 d dl
mZ d dlZd dlm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dgZdddddddgZddddddd d!d"d#d$d%d&gZd'd„ Zd(d)„ Z e!e j"d*fƒZ#e!e j$e j%fƒZ&G d+d,„ d,e'ƒZ(G d-d.„ d.e)ƒZ*e*ƒ Z+G d/d0„ d0e)ƒZ,G d1d2„ d2e-ƒZ.G d3d4„ d4e-ƒZ/d5d6„ Z0G d7d8„ d8e)ƒZ1G d9d:„ d:e1ƒZ2G d;d<„ d<e)ƒZ3G d=d>„ d>ej4ƒZ5G d?d@„ d@ej6ƒZ7y
ej8Z9W n e:k
�rô   dAdB„ Z9Y nX y4d dl;Z;ej<e;j=fZ>e!e j$e j"e j%e;j?e;j@fƒZAW n2 eBk
�r\   ej<fZ>e!e j$e j"e j%fƒZAY nX dCdD„ ZCdddee5ddddddeedddfdEd„ZDdS )Fé    N)Úgreenio)Úsupport)ÚBaseHTTPServer)Úsocket)Úurllibi   zHTTP/1.1i    i   i   zg%(client_ip)s - - [%(date_time)s] "%(request_line)s" %(status_code)s %(body_length)s %(wall_seconds).6fsK   HTTP/1.0 414 Request URI Too Long
Connection: close
Content-Length: 0

TZidleÚrequestÚcloseÚserverÚformat_date_timeÚMonÚTueÚWedÚThuÚFriÚSatÚSunÚJanÚFebÚMarÚAprÚMayÚJunÚJulÚAugÚSepÚOctÚNovÚDecc       
   	   C   s:   t j| ƒ\	}}}}}}}}}	dt| |t| ||||f S )z6Formats a unix timestamp into an HTTP standard string.z#%s, %02d %3s %4d %02d:%02d:%02d GMT)ÚtimeÚgmtimeÚ_weekdaynameÚ
_monthname)
Ú	timestampÚyearÚmonthÚdayÚhhÚmmÚssÚwdZ_yZ_z© r*   ú1/tmp/pip-build-yz_zf6az/eventlet/eventlet/wsgi.pyr
   -   s    c             C   s*   d}d}t | tƒr"| d }| d }||fS )NÚunixÚ r   é   )Ú
isinstanceÚtuple)ÚaddrÚhostÚportr*   r*   r+   Úaddr_to_host_port5   s    
r4   iE'  c               @   s   e Zd ZdS )ÚChunkReadErrorN)Ú__name__Ú
__module__Ú__qualname__r*   r*   r*   r+   r5   D   s   r5   c               @   s    e Zd Zdd„ Zdd„ ZeZdS )Ú_AlreadyHandledc             C   s   | S )Nr*   )Úselfr*   r*   r+   Ú__iter__K   s    z_AlreadyHandled.__iter__c             C   s   t ‚d S )N)ÚStopIteration)r:   r*   r*   r+   ÚnextN   s    z_AlreadyHandled.nextN)r6   r7   r8   r;   r=   Ú__next__r*   r*   r*   r+   r9   I   s   r9   c               @   st   e Zd Zddd„Zdd„ Zddd„Zdd	d
„Zddd„Zd dd„Zd!dd„Z	dd„ Z
dd„ Zd"dd„Zd$dd„ZdS )%ÚInputNFc             C   sV   || _ || _|d k	rt|ƒ}|| _|| _|| _d| _|| _d| _d | _	d| _
d | _d S )Nr   r.   Féÿÿÿÿ)ÚrfileÚ_sockÚintÚcontent_lengthÚwfileÚ
wfile_lineÚpositionÚchunked_inputÚchunk_lengthÚhundred_continue_headersÚ!is_hundred_continue_response_sentÚheaders_sent)r:   rA   rD   ÚsockrE   rF   rH   r*   r*   r+   Ú__init__Y   s    zInput.__init__c             C   sr   | j r
d S g }|j| jƒ | jd k	rHx"| jD ]}|jtjd| ƒƒ q,W |jdƒ | jj|ƒ | jjƒ  d| _	d S )Nz%s: %s
s   
r.   r@   )
rL   ÚappendrF   rJ   ÚsixÚbrE   Ú
writelinesÚflushrI   )r:   ÚtowriteÚheaderr*   r*   r+   Úsend_hundred_continue_responsex   s    


z$Input.send_hundred_continue_responsec             C   s–   | j d k	r | j r | jƒ  d| _| jd k	rN|d ksB|| j| j krN| j| j }|sVdS y||ƒ}W n tjjk
r~   d}Y nX |  jt|ƒ7  _|S )NTó    )	rE   rK   rV   rD   rG   r   ÚSSLÚZeroReturnErrorÚlen)r:   ÚreaderÚlengthÚreadr*   r*   r+   Ú_do_read”   s    

zInput._do_readc       
      C   sª  | j d k	r | j r | jƒ  d| _�yb|dkr0dS |r@|dk r@d }|rN| jj}n| jj}g }�x$| jdk�r€| j| j }|d k	rŠ||k rŠ|}|dk�r||ƒ}|s®d| _tdƒ‚t	|ƒ}|j
|ƒ |  j|7  _| j| jkrâ|jƒ  |d k	rü||8 }|dkrüP |�r~|d	d … dk�r~P q^y t|jƒ jddƒd dƒ| _W n, tk
�rd }	 zt|	ƒ‚W Y d d }	~	X nX d| _| jdkr^|jƒ  q^W W n tjjk
�rž   Y nX dj|ƒS )
NTr   rW   z1unexpected end of file while parsing chunked datar.   ó   
ó   ;é   r@   )rE   rK   rV   rA   Úreadliner]   rI   rG   ÚIOErrorrZ   rO   rC   ÚsplitÚ
ValueErrorr5   r   rX   rY   Újoin)
r:   rA   r\   Zuse_readliner[   ÚresponseZ
maxreadlenÚdataZdatalenÚerrr*   r*   r+   Ú_chunked_read¥   sT    


 
zInput._chunked_readc             C   s$   | j r| j| j|ƒS | j| jj|ƒS )N)rH   rj   rA   r^   r]   )r:   r\   r*   r*   r+   r]   Û   s    z
Input.readc             C   s*   | j r| j| j|dƒS | j| jj|ƒS d S )NT)rH   rj   rA   r^   rb   )r:   Úsizer*   r*   r+   rb   à   s    zInput.readlinec             C   sd   | j rPg }x@t| jdƒD ]0}|j|ƒ |r|dkr|t|ƒ8 }|dkrP qW |S | j| jj|ƒS d S )NrW   r   )rH   Úiterrb   rO   rZ   r^   rA   Ú	readlines)r:   ZhintÚlinesÚliner*   r*   r+   rm   æ   s    
zInput.readlinesc             C   s   t | jdƒS )NrW   )rl   r]   )r:   r*   r*   r+   r;   ó   s    zInput.__iter__c             C   s   | j S )N)rB   )r:   r*   r*   r+   Ú
get_socketö   s    zInput.get_socketTc             C   s   |rdd„ |D ƒ}|| _ d S )Nc             S   s.   g | ]&\}}d j dd„ |jd ƒD ƒƒ|f‘qS )ú-c             S   s   g | ]}|j ƒ ‘qS r*   )Ú
capitalize)Ú.0Úxr*   r*   r+   ú
<listcomp>  s    zJInput.set_hundred_continue_response_headers.<locals>.<listcomp>.<listcomp>)rf   rd   )rs   ÚkeyÚvaluer*   r*   r+   ru     s   z?Input.set_hundred_continue_response_headers.<locals>.<listcomp>)rJ   )r:   ÚheadersÚcapitalize_response_headersr*   r*   r+   Ú%set_hundred_continue_response_headersù   s    z+Input.set_hundred_continue_response_headersra   é
   c             C   s   x| j |ƒrqW d S )N)r]   )r:   Úbuffer_sizer*   r*   r+   Údiscard  s    zInput.discard)NNF)N)NF)N)N)N)Té @  )r~   )r6   r7   r8   rN   rV   r^   rj   r]   rb   rm   r;   rp   rz   r}   r*   r*   r*   r+   r?   W   s     


6



r?   c               @   s   e Zd ZdS )ÚHeaderLineTooLongN)r6   r7   r8   r*   r*   r*   r+   r   
  s   r   c               @   s   e Zd ZdS )ÚHeadersTooLargeN)r6   r7   r8   r*   r*   r*   r+   r€     s   r€   c             C   s8   t t| dd ƒƒr$t t| dd ƒƒr$| S t| p.tj|ƒS d S )NÚinfoÚdebug)ÚcallableÚgetattrÚLoggerFileWrapperÚsysÚstderr)Úlogr‚   r*   r*   r+   Ú
get_logger  s    r‰   c               @   s4   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ ZdS )Ú
LoggerNullc             C   s   d S )Nr*   )r:   r*   r*   r+   rN     s    zLoggerNull.__init__c             O   s   d S )Nr*   )r:   ÚmsgÚargsÚkwargsr*   r*   r+   Úerror  s    zLoggerNull.errorc             O   s   d S )Nr*   )r:   r‹   rŒ   r�   r*   r*   r+   r�   !  s    zLoggerNull.infoc             O   s   d S )Nr*   )r:   r‹   rŒ   r�   r*   r*   r+   r‚   $  s    zLoggerNull.debugc             G   s   d S )Nr*   )r:   r‹   rŒ   r*   r*   r+   Úwrite'  s    zLoggerNull.writeN)r6   r7   r8   rN   rŽ   r�   r‚   r�   r*   r*   r*   r+   rŠ     s
   rŠ   c               @   s4   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ ZdS )r…   c             C   s   || _ || _d S )N)rˆ   Ú_debug)r:   rˆ   r‚   r*   r*   r+   rN   ,  s    zLoggerFileWrapper.__init__c             O   s   | j |f|žŽ  d S )N)r�   )r:   r‹   rŒ   r�   r*   r*   r+   rŽ   0  s    zLoggerFileWrapper.errorc             O   s   | j |f|žŽ  d S )N)r�   )r:   r‹   rŒ   r�   r*   r*   r+   r�   3  s    zLoggerFileWrapper.infoc             O   s   | j r| j|f|žŽ  d S )N)r�   r�   )r:   r‹   rŒ   r�   r*   r*   r+   r‚   6  s    zLoggerFileWrapper.debugc             G   s$   |d }|r|| }| j j|ƒ d S )NÚ
)rˆ   r�   )r:   r‹   rŒ   r*   r*   r+   r�   :  s    zLoggerFileWrapper.writeN)r6   r7   r8   rN   rŽ   r�   r‚   r�   r*   r*   r*   r+   r…   +  s
   r…   c               @   s   e Zd Zdd„ Zddd„ZdS )	ÚFileObjectForHeadersc             C   s   || _ d| _d S )Nr   )ÚfpÚtotal_header_size)r:   r“   r*   r*   r+   rN   C  s    zFileObjectForHeaders.__init__r.   c             C   sT   |}|dk rt }| jj|ƒ}t|ƒt kr.tƒ ‚|  jt|ƒ7  _| jtkrPtƒ ‚|S )Nr   )ÚMAX_HEADER_LINEr“   rb   rZ   r   r”   ÚMAX_TOTAL_HEADER_SIZEr€   )r:   rk   ÚszÚrvr*   r*   r+   rb   G  s    
zFileObjectForHeaders.readlineNr@   )r@   )r6   r7   r8   rN   rb   r*   r*   r*   r+   r’   A  s   r’   c               @   sl   e Zd ZdZeZdZ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d„ ZdS )ÚHttpProtocolzHTTP/1.1Tra   r{   c          
   C   sD   |d | _ |d | _|| _|| _| jƒ  z| jƒ  W d | jƒ  X d S )Nr.   r   )r   Úclient_addressÚ
conn_stater	   ÚsetupÚhandleÚfinish)r:   r›   r	   r*   r*   r+   rN   ^  s    

zHttpProtocol.__init__c             C   sÔ   | j  }| _ttdd ƒrFy|jtjtjdƒ W n tjk
rD   Y nX y$|jd| j	ƒ| _
|jd| jƒ| _W nd ttfk
rÎ   t|dƒr¸t|dƒr¸tj|d| j	ƒ| _
tj|d| jƒ| _ntdjt|ƒƒƒ‚Y nX d S )NÚTCP_QUICKACKTÚrbÚwbÚsendÚrecvz1eventlet.wsgi doesn't support sockets of type {0})r   Ú
connectionr„   r   Ú
setsockoptÚIPPROTO_TCPrŸ   rŽ   ÚmakefileÚrbufsizerA   ÚwbufsizerE   ÚAttributeErrorÚNotImplementedErrorÚhasattrZ_fileobjectÚformatÚtype)r:   Úconnr*   r*   r+   rœ   i  s    zHttpProtocol.setupc             C   s4   d| _ x(| jƒ  | jd tkr$d| _ | j rP qW d S )NTé   r.   )Úclose_connectionÚhandle_one_requestr›   ÚSTATE_CLOSE)r:   r*   r*   r+   r�   ‚  s    zHttpProtocol.handlec             C   sœ   | j jrd| _dS y| j j| jjƒS  tjjk
r:   Y n^ t	j
k
r– } z@tj|ƒ}|tkr|| jjjdj| jj| jƒƒ n
|tkr†‚ W Y d d }~X nX dS )Nr.   r-   z$({0}) connection reset by peer {1!r})rA   Úclosedr±   rb   r	   Úurl_length_limitr   rX   rY   r   rŽ   r   Ú	get_errnoÚBROKEN_SOCKrˆ   r‚   r­   Úpidrš   ÚBAD_SOCK)r:   ÚeZ
last_errnor*   r*   r+   Ú_read_request_lineŒ  s     
zHttpProtocol._read_request_linec          .   C   s¬  | j jr| j j| _| jƒ | _| js,d| _d S t| jƒ| j jkrT| jj	t
ƒ d| _d S | j}zlyt| jƒ| _| jƒ svd S W nJ tk
rž   | jj	dƒ d| _d S  tk
rÂ   | jj	dƒ d| _d S X W d || _X | jjdƒ}|d k	�r&yt|ƒdk � rút‚W n( tk
�r$   | jj	dƒ d| _d S X | jƒ | _| j j| _zZ| j  jd7  _y| jƒ  W n8 tjk
�r� } ztj|ƒtk�r€‚ W Y d d }~X nX W d | j  jd8  _X d S )Nr.   sK   HTTP/1.0 400 Header Line Too Long
Connection: close
Content-length: 0

sH   HTTP/1.0 400 Headers Too Large
Connection: close
Content-length: 0

zcontent-lengthr   sB   HTTP/1.0 400 Bad Request
Connection: close
Content-length: 0

)r	   Úmax_http_versionÚprotocol_versionr»   Zraw_requestliner±   rZ   rµ   rE   r�   ÚRESPONSE_414rA   r’   Zparse_requestr   r€   rx   ÚgetrC   re   Úget_environÚenvironÚappÚapplicationÚoutstanding_requestsÚhandle_one_responser   rŽ   r   r¶   r·   )r:   Z
orig_rfilerD   rº   r*   r*   r+   r²   Ÿ  s\    





zHttpProtocol.handle_one_requestc          '      s¦  t j ƒ }g ‰g ‰ ˆ ˆjd _ˆj‰d }dg‰dg‰dg‰‡ ‡‡‡‡‡fdd„‰d‡ ‡‡‡‡fdd„	}�zÀ�yJˆjˆj|ƒ}t|tƒs–tt|d	d ƒtƒr d
ˆ_d S ˆ  ræt	|dƒræddd„ ˆd
 D ƒkræˆd
 j
dtttt|ƒƒƒfƒ g }d}d}tˆjjdˆjƒƒ}xr|D ]j}t|ƒdk�r"�qt|tjƒ�r:|jdƒ}|j
|ƒ |t|ƒ7 }||k�rˆdj|ƒƒ g }|}d}�qW |�r’|}ˆdj|ƒƒ ˆ  �sªˆd �r²|�r²ˆdƒ W nn tk
�r"   d
ˆ_tjƒ }	ˆjjj|	ƒ ˆ �sˆjj�rütj|	ƒnd}
|dddt|
ƒfgƒ ˆ|
ƒ Y nX W d t	|dƒ�r<|jƒ  ˆjd }|j�sb|j |j!�p\dk �r|j �rˆjdk�ry|j"ƒ  W n– t#k
�rÐ } z.d
ˆ_ˆjjj$dj%ˆj&ƒ d ˆj'|ƒƒ W Y d d }~X nL t(k
�r } z.d
ˆ_ˆjjj$d j%ˆj&ƒ d ˆj'|ƒƒ W Y d d }~X nX t j ƒ }x,ˆjd D ]\}}}|ˆjf|ž|Ž �q0W ˆjj)�r ˆj&ƒ \}}ˆjjjˆjj*||ˆj+ƒ ˆj'ˆd ˆd || dœ ƒ X d S )!Nz
wsgi.inputFr   éÈ   c                sÊ  g }ˆst dƒ‚�nJˆ �s^ˆ\}}ˆ jdƒ dd„ |D ƒ}|jtjdˆj|f ƒƒ x |D ]}|jtjd| ƒƒ qZW d|krœ|jtjdttjƒ ƒf ƒƒ ˆjjd	d
ƒj	ƒ }d}ˆj
dkrðˆjjrð|dksàˆjdkrð|dk rð|dk}dˆ_
ndˆ_
d|k�r0ˆjdk�r dˆd< |jdƒ nd|k�r0dˆ_
ˆj
�rD|jdƒ n|�rT|jdƒ |jdƒ ˆd �r�|jtjdt| ƒf ƒd |  d ƒ n
|j| ƒ ˆj|ƒ ˆjƒ  ˆd ttt|ƒƒ ˆd< d S )Nzwrite() before start_response()r.   c             S   s   g | ]}|d  j ƒ ‘qS )r   )Úlower)rs   rU   r*   r*   r+   ru   ï  s    zCHttpProtocol.handle_one_response.<locals>.write.<locals>.<listcomp>z%s %s
z%s: %s
Údatez
Date: %s
Ú
Connectionr-   Fr   z
keep-alivezHTTP/1.1r   zcontent-lengthTs   Transfer-Encoding: chunked
s   Connection: close
s   Connection: keep-alive
s   
z%x)ÚAssertionErrorrO   rP   rQ   r½   r
   r   rx   r¿   rÇ   r±   r	   Ú	keepaliveZrequest_versionrZ   rR   rS   ÚsumÚmap)rh   rT   ÚstatusÚresponse_headersZheader_listrU   Zclient_connZsend_keep_alive)rL   Úheaders_setr\   r:   Úuse_chunkedrE   r*   r+   r�   è  sL    









(

z/HttpProtocol.handle_one_response.<locals>.writec                sf   | j ƒ d ˆd< |r>z"ˆ r4tj|d |d |d ƒ W d d }X ˆjrRdd„ |D ƒ}| |gˆd d …< ˆS )Nr   r.   r°   c             S   s.   g | ]&\}}d j dd„ |jd ƒD ƒƒ|f‘qS )rq   c             S   s   g | ]}|j ƒ ‘qS r*   )rr   )rs   rt   r*   r*   r+   ru   .  s    zWHttpProtocol.handle_one_response.<locals>.start_response.<locals>.<listcomp>.<listcomp>)rf   rd   )rs   rv   rw   r*   r*   r+   ru   .  s   zLHttpProtocol.handle_one_response.<locals>.start_response.<locals>.<listcomp>)rd   rP   Úreraisery   )rÎ   rÏ   Úexc_info)rL   rÐ   r:   Ústatus_coder�   r*   r+   Ústart_response  s    z8HttpProtocol.handle_one_response.<locals>.start_responseÚ_objr.   Ú__len__zContent-Lengthc             S   s   g | ]\}}|‘qS r*   r*   )rs   ÚhZ_vr*   r*   r+   ru   >  s    z4HttpProtocol.handle_one_response.<locals>.<listcomp>z!eventlet.minimum_write_chunk_sizeÚasciirW   z500 Internal Server ErrorúContent-typeú
text/plainzContent-lengthr   zeventlet.inputz5chunked encoding error while discarding request body.z% client={0} request="{1}" error="{2}"z(I/O error while discarding request body.zeventlet.posthooks)Z	client_ipÚclient_portÚ	date_timeZrequest_linerÔ   Úbody_lengthZwall_seconds)N)rÚ   rÛ   zZchunked encoding error while discarding request body. client={0} request="{1}" error="{2}"zMI/O error while discarding request body. client={0} request="{1}" error="{2}"),r   rÁ   rL   rE   rÃ   r/   r9   r„   r±   r¬   rO   ÚstrrÌ   rÍ   rZ   rC   r¿   Úminimum_chunk_sizerP   Ú	text_typeÚencoderf   Ú	ExceptionÚ	tracebackÚ
format_excr	   rˆ   r�   r‚   rQ   r   rH   rG   rD   r}   r5   rŽ   r­   Úget_client_addressZrequestlinerc   Ú
log_outputÚ
log_formatZlog_date_time_string)r:   ÚstartÚresultrÕ   rT   Ztowrite_sizeZjust_written_sizeZminimum_write_chunk_sizerh   ÚtbZerr_bodyZrequest_inputrº   rž   ÚhookrŒ   r�   Zclient_hostrÜ   r*   )rL   rÐ   r\   r:   rÔ   rÑ   rE   r�   r+   rÅ   Ú  s¬    5
 





 & (
z HttpProtocol.handle_one_responsec             C   sD   t | jƒ\}}| jjr<| jjddƒjddƒ}|r<|d | }||fS )NzX-Forwarded-Forr-   ú ú,)r4   rš   r	   Úlog_x_forwarded_forrx   r¿   Úreplace)r:   r2   r3   Zforwardr*   r*   r+   ræ   Œ  s    zHttpProtocol.get_client_addressc             C   sj  | j jƒ }| j|d< d|d< | jjddƒ}|d |d< tjrRtjj	|d ƒ|d< ntjj	|d d	d
�|d< t
|ƒdkr‚|d |d< | jjdƒ}|d krÂy| jj}W n tk
rÀ   | jjƒ }Y nX ||d< | jjdƒ}|râ||d< d|d< | jjƒ }t|ƒ}|d |d< t|d ƒ|d< t| jƒ}|d |d< t|d ƒ|d< d|d< y| jj}W n tk
�rp   | jj}Y nX dd„ |D ƒ}tdd„ |D ƒƒ |d< }	x`|	D ]X\}
}|
jddƒjƒ }
|
d*k�rÆ�q d|
 }||k�rî||  d | 7  < n|||< �q W |jd!dƒjƒ d"k�r| j}d#}nd }d }|jd$dƒjƒ d%k}t| j|| j|||d&� |d'< |d(< g |d)< |S )+NÚREQUEST_METHODr-   ZSCRIPT_NAMEú?r.   r   ZRAW_PATH_INFOZ	PATH_INFOÚlatin1)ÚencodingÚQUERY_STRINGzcontent-typeÚCONTENT_TYPEzcontent-lengthÚCONTENT_LENGTHzHTTP/1.0ZSERVER_PROTOCOLZSERVER_NAMEZSERVER_PORTZREMOTE_ADDRZREMOTE_PORTzCGI/1.1ZGATEWAY_INTERFACEc             S   s   g | ]}|j d dƒ‘qS )ú:r.   )rd   )rs   rØ   r*   r*   r+   ru   ¾  s    z,HttpProtocol.get_environ.<locals>.<listcomp>c             s   s    | ]\}}||j d ƒfV  qdS )z 	
N)Ústrip)rs   ÚkÚvr*   r*   r+   ú	<genexpr>À  s    z+HttpProtocol.get_environ.<locals>.<genexpr>Úheaders_rawrq   Ú_ZHTTP_rî   ZHTTP_EXPECTz100-continues   HTTP/1.1 100 Continue
ZHTTP_TRANSFER_ENCODINGÚchunked)rE   rF   rH   z
wsgi.inputzeventlet.inputzeventlet.posthooks)rö   r÷   )r	   rÀ   ÚcommandÚpathrd   rP   ÚPY2r   ÚparseÚunquoterZ   rx   r¿   r®   rª   Úget_content_typer   Úgetsocknamer4   rß   rš   Ú_headersr0   rð   ÚupperrÇ   rE   r?   rA   r¤   )r:   ÚenvZpqÚctr\   ZsocknameZserver_addrÚclient_addrrx   rý   rú   rû   ZenvkrE   rF   rÿ   r*   r*   r+   rÀ   •  sl    





zHttpProtocol.get_environc             C   s`   yt jj| ƒ W n4 tjk
rD } ztj|ƒtkr4‚ W Y d d }~X nX tj	| j
ƒ | j
jƒ  d S )N)r   ÚBaseHTTPRequestHandlerrž   r   rŽ   r   r¶   r·   r   Úshutdown_safer¤   r   )r:   rº   r*   r*   r+   rž   Ú  s    zHttpProtocol.finishc             C   s   dS )NTr*   )r:   r*   r*   r+   Úhandle_expect_100ä  s    zHttpProtocol.handle_expect_100Ni @  )r6   r7   r8   r½   ÚMINIMUM_CHUNK_SIZErà   ry   r©   rN   rœ   r�   r»   r²   rÅ   ræ   rÀ   rž   r  r*   r*   r*   r+   r™   T  s   
; 3	E
r™   c               @   sH   e Zd Zdddeddddeedddfdd„Zdd„ Zdd„ Zd	d
„ Z	dS )ÚServerNTc             C   sœ   d| _ || _|| _tƒ | _|r*t||ƒ| _|| _|
| _|| _|| _	|| _
tjƒ | _|| _|	| _|| _|| _|| _|| _|| _|| _| js˜tjdtdd� d S )Nr   z×capitalize_response_headers is disabled.
 Please, make sure you know what you are doing.
 HTTP headers names are case-insensitive per RFC standard.
 Most likely, you need to fix HTTP parsing in your client software.é   )Ú
stacklevel)rÄ   r   ÚaddressrŠ   rˆ   r‰   rÂ   rË   rÁ   r¼   ÚprotocolÚosÚgetpidr¸   rà   rï   rç   rè   rµ   r‚   Úsocket_timeoutry   ÚwarningsÚwarnÚDeprecationWarning)r:   r   r  rÂ   rˆ   rÁ   r¼   r  rà   rï   rË   rç   rè   rµ   r‚   r  ry   r*   r*   r+   rN   ê  s0    
zServer.__init__c             C   sJ   t jddddddœ}t| jdƒr0d|d	< d
|d< | jd k	rF|j| jƒ |S )Nr.   r   TFÚhttp)zwsgi.errorszwsgi.versionzwsgi.multithreadzwsgi.multiprocesszwsgi.run_oncezwsgi.url_schemeÚdo_handshakeÚhttpszwsgi.url_schemeÚonÚHTTPS)r.   r   )r†   r‡   r¬   r   rÁ   Úupdate)r:   Údr*   r*   r+   rÀ     s    
zServer.get_environc             C   sv   t | jƒ}| jd k	r| j|_| j|_y|j|| ƒ W n< tjk
rp   |d jƒ  | jj	dj
| j|d ƒƒ Y nX d S )Nr.   z({0}) timed out {1!r}r   )Únewr  rà   ry   rN   r   Útimeoutr   rˆ   r‚   r­   r¸   )r:   r›   Úprotor*   r*   r+   Úprocess_request)  s    

zServer.process_requestc             C   s   t dƒ‚d S )Nz`eventlet.wsgi.server.log_message was deprecated and deleted.
Please use server.log.info instead.)rª   )r:   Úmessager*   r*   r+   Úlog_message9  s    zServer.log_message)
r6   r7   r8   r™   ÚDEFAULT_LOG_FORMATÚMAX_REQUEST_LINErN   rÀ   r%  r'  r*   r*   r*   r+   r  è  s    r  c             C   s
   | j | ƒS )N)Ú__new__)Úclsr*   r*   r+   Ú<lambda>B  s    r,  c             C   sx   d}t | dƒrd}| jƒ }| jtjkr2dj|Ž }n:| jtjkrRdj|d d… Ž }n| jtjkrd|}nt|ƒ}|d | S )Nr  r  r  z	//{0}:{1}z//[{0}]:{1}r°   rø   )	r¬   r  Úfamilyr   ÚAF_INETr­   ÚAF_INET6ÚAF_UNIXÚrepr)rM   ÚschemeÚnameZ	hier_partr*   r*   r+   Úsocket_reprO  s    
r4  c                s0  t | | jƒ |||||||	|||||||d�}|dk	rNtjdtdd� |j|ƒ |dkrZt}|
dk	rh|
}n
tj|ƒ}t	|dƒo„t	|dƒsŽt
dƒ‚i ‰ ‡ fd	d
„}zâ|jjdj|jt| ƒƒƒ xÂt�r|yZ| jƒ \}}|j|jƒ |jjdj|j|ƒƒ ||tg ˆ |< }|j|j|ƒj||ƒ W q¼ tk
�rR } ztj|ƒtk�rB‚ W Y dd}~X q¼ ttfk
�rx   |jjdƒ P Y q¼X q¼W W dx<tj ˆ ƒD ].}|d }t!|d< |tk�rŽt"j#|d ƒ �qŽW |j$ƒ  |jjdj|jtƒƒ y| j%ƒ  W n> t&j'k
�r( } ztj|ƒt(k�rt)j*ƒ  W Y dd}~X nX X dS )a˜  Start up a WSGI server handling requests from the supplied server
    socket.  This function loops forever.  The *sock* object will be
    closed after server exits, but the underlying file descriptor will
    remain open, so if you have a dup() of *sock*, it will remain usable.

    .. warning::

        At the moment :func:`server` will always wait for active connections to finish before
        exiting, even if there's an exception raised inside it
        (*all* exceptions are handled the same way, including :class:`greenlet.GreenletExit`
        and those inheriting from `BaseException`).

        While this may not be an issue normally, when it comes to long running HTTP connections
        (like :mod:`eventlet.websocket`) it will become problematic and calling
        :meth:`~eventlet.greenthread.GreenThread.wait` on a thread that runs the server may hang,
        even after using :meth:`~eventlet.greenthread.GreenThread.kill`, as long
        as there are active connections.

    :param sock: Server socket, must be already bound to a port and listening.
    :param site: WSGI application function.
    :param log: logging.Logger instance or file-like object that logs should be written to.
                If a Logger instance is supplied, messages are sent to the INFO log level.
                If not specified, sys.stderr is used.
    :param environ: Additional parameters that go into the environ dictionary of every request.
    :param max_size: Maximum number of client connections opened at any time by this server.
                Default is 1024.
    :param max_http_version: Set to "HTTP/1.0" to make the server pretend it only supports HTTP 1.0.
                This can help with applications or clients that don't behave properly using HTTP 1.1.
    :param protocol: Protocol class.  Deprecated.
    :param server_event: Used to collect the Server object.  Deprecated.
    :param minimum_chunk_size: Minimum size in bytes for http chunks.  This can be used to improve
                performance of applications which yield many small strings, though
                using it technically violates the WSGI spec. This can be overridden
                on a per request basis by setting environ['eventlet.minimum_write_chunk_size'].
    :param log_x_forwarded_for: If True (the default), logs the contents of the x-forwarded-for
                header in addition to the actual client ip address in the 'client_ip' field of the
                log line.
    :param custom_pool: A custom GreenPool instance which is used to spawn client green threads.
                If this is supplied, max_size is ignored.
    :param keepalive: If set to False, disables keepalives on the server; all connections will be
                closed after serving one request.
    :param log_output: A Boolean indicating if the server will log data or not.
    :param log_format: A python format string that is used as the template to generate log lines.
                The following values can be formatted into it: client_ip, date_time, request_line,
                status_code, body_length, wall_seconds.  The default is a good example of how to
                use it.
    :param url_length_limit: A maximum allowed length of the request url. If exceeded, 414 error
                is returned.
    :param debug: True if the server should send exception tracebacks to the clients on 500 errors.
                If False, the server will respond with empty bodies.
    :param socket_timeout: Timeout for client connections' socket operations. Default None means
                wait forever.
    :param capitalize_response_headers: Normalize response headers' names to Foo-Bar.
                Default is True.
    )rÁ   r¼   r  rà   rï   rË   rç   rè   rµ   r‚   r  ry   NzPeventlet.wsgi.Server() server_event kwarg is deprecated and will be removed soonr°   )r  ÚspawnÚwaitallzfeventlet.wsgi.Server pool must provide methods: `spawn`, `waitall`.
If unsure, use eventlet.GreenPool.c                s6   ˆ j |d d ƒ t|d< tj|d ƒ |d jƒ  d S )Nr   r°   r.   )Úpopr³   r   r  r   )rþ   r¯   )Úconnectionsr*   r+   Ú_clean_connectionÍ  s    z!server.<locals>._clean_connectionz({0}) wsgi starting up on {1}z({0}) accepted {1!r}zwsgi exitingr.   z#({0}) wsgi exited, is_accepting={1})+r  r  r  r  r  r¢   Ú!DEFAULT_MAX_SIMULTANEOUS_REQUESTSÚeventletZ	GreenPoolr¬   rª   rˆ   r�   r­   r¸   r4  Úis_acceptingÚacceptÚ
settimeoutr  r‚   Ú
STATE_IDLEr5  r%  ÚlinkÚACCEPT_EXCEPTIONSr   r¶   ÚACCEPT_ERRNOÚKeyboardInterruptÚ
SystemExitrP   Ú
itervaluesr³   r   r  r6  r   r   rŽ   r·   rä   Ú	print_exc)rM   Úsiterˆ   rÁ   Úmax_sizer¼   r  Zserver_eventrà   rï   Zcustom_poolrË   rç   rè   rµ   r‚   r  ry   ZservÚpoolr9  Zclient_socketr  r¤   rº   ÚcsZ
prev_stater*   )r8  r+   r	   a  st    H



)EÚerrnor  r†   r   rä   Útypesr  r;  r   r   Zeventlet.greenr   r   rP   Z	six.movesr   r:  ZDEFAULT_MAX_HTTP_VERSIONr)  r•   r–   r  r(  r¾   r<  r?  ZSTATE_REQUESTr³   Ú__all__r    r!   r
   r4   ÚsetÚEBADFr¹   ÚEPIPEÚ
ECONNRESETr·   re   r5   Úobjectr9   ZALREADY_HANDLEDr?   rã   r   r€   r‰   rŠ   r…   r’   r  r™   Z
HTTPServerr  ZInstanceTyper"  rª   ÚsslrŽ   ÚSSLErrorrA  ÚSSL_ERROR_EOFÚSSL_ERROR_SSLrB  ÚImportErrorr4  r	   r*   r*   r*   r+   Ú<module>   sž    4   W
