3
ò\ð]S  ã               @   sz   d dl Z d dlZd dlmZ ddlmZ d dlZd dlZd dl	Z	dd„ Z
dd„ Zd	d
„ ZG dd„ deƒZdeeedœZdS )é    N)Úurlsplité   )Ú
exceptionsc                s   G ‡ fdd„dt jjƒ}|S )Nc                   s|   e Zd Z‡ ‡fdd„Z‡ ‡fdd„Z‡fdd„Z‡fdd„Z‡fd	d
„Zdd„ Zdd„ Z	dd„ Z
‡ fdd„Zdd„ Z‡  ZS )z$get_tornado_handler.<locals>.Handlerc                sP   t ƒ j||Ž tˆjtjƒr:ˆjdkr.d | _qBˆjg| _nˆj| _tjƒ | _	d S )NÚ*)
ÚsuperÚ__init__Ú
isinstanceZcors_allowed_originsÚsixÚstring_typesÚallowed_originsÚasyncioÚQueueÚreceive_queue)ÚselfÚargsÚkwargs)Ú	__class__Úengineio_server© úI/tmp/pip-build-mqc4i71p/python-engineio/engineio/async_drivers/tornado.pyr      s    
z-get_tornado_handler.<locals>.Handler.__init__c             Ÿ   sP   | j jjddƒjƒ dkr<tƒ j||Ž}tj|ƒrL|I d H  nˆj| ƒI d H  d S )NZUpgradeÚ Ú	websocket)ÚrequestÚheadersÚgetÚlowerr   r   ÚiscoroutineÚhandle_request)r   r   r   Úret)r   r   r   r   r      s
    
z(get_tornado_handler.<locals>.Handler.getc             Ÿ   s   t jˆ j| ƒƒ d S )N)r   Zensure_futurer   )r   r   r   )r   r   r   Úopen"   s    z)get_tornado_handler.<locals>.Handler.openc             Ÿ   s   ˆ j | ƒI d H  d S )N)r   )r   r   r   )r   r   r   Úpost&   s    z)get_tornado_handler.<locals>.Handler.postc             Ÿ   s   ˆ j | ƒI d H  d S )N)r   )r   r   r   )r   r   r   Úoptions)   s    z,get_tornado_handler.<locals>.Handler.optionsc             Ó   s   | j j|ƒI d H  d S )N)r   Úput)r   Úmessager   r   r   Ú
on_message,   s    z/get_tornado_handler.<locals>.Handler.on_messagec             Ó   s   | j jƒ I d H S )N)r   r   )r   r   r   r   Úget_next_message/   s    z5get_tornado_handler.<locals>.Handler.get_next_messagec             S   s   | j jd ƒ d S )N)r   Ú
put_nowait)r   r   r   r   Úon_close2   s    z-get_tornado_handler.<locals>.Handler.on_closec                s$   | j d ks|| j krdS tƒ j|ƒS )NT)r   r   Úcheck_origin)r   Úorigin)r   r   r   r(   5   s    z1get_tornado_handler.<locals>.Handler.check_originc             S   s   i S )Nr   )r   r   r   r   Úget_compression_options:   s    z<get_tornado_handler.<locals>.Handler.get_compression_options)Ú__name__Ú
__module__Ú__qualname__r   r   r   r    r!   r$   r%   r'   r(   r*   Ú__classcell__r   )r   )r   r   ÚHandler   s   r/   )Útornador   ZWebSocketHandler)r   r/   r   )r   r   Úget_tornado_handler   s    2r1   c       
      C   s  G dd„ dt ƒ}| jj}t| jjƒ}| jj}| jjrD|d| jj 7 }||ƒtjdddddd| jj| jjpjd	|d
| jj	 dddd| dœ}x^| jj
jƒ D ]N\}}|jƒ }|dkr¸||d< q”n|dkrÊ||d< q”d|jddƒ }|||< q”W |jddƒ|d< |j}	|	|d< d	|d< |S )zˆThis function takes the arguments passed to the request handler and
    uses them to generate a WSGI compatible environ dictionary.
    c               @   s   e Zd Zdd„ Zddd„ZdS )z+translate_request.<locals>.AwaitablePayloadc             S   s   |pd| _ d S )Nó    )Úpayload)r   r3   r   r   r   r   F   s    z4translate_request.<locals>.AwaitablePayload.__init__Nc             Ó   s8   |d kr| j }d| _ n| j d |… }| j |d … | _ |S )Nr2   )r3   )r   ÚlengthÚrr   r   r   ÚreadI   s    z0translate_request.<locals>.AwaitablePayload.read)N)r+   r,   r-   r   r6   r   r   r   r   ÚAwaitablePayloadE   s   r7   ú?é   r   TFZaiohttpr   zHTTP/%sz	127.0.0.1Ú0)z
wsgi.inputzwsgi.errorszwsgi.versionz
wsgi.asynczwsgi.multithreadzwsgi.multiprocesszwsgi.run_onceZSERVER_SOFTWAREÚREQUEST_METHODÚQUERY_STRINGZRAW_URIZSERVER_PROTOCOLZREMOTE_ADDRZREMOTE_PORTZSERVER_NAMEZSERVER_PORTztornado.handlerzCONTENT-TYPEÚCONTENT_TYPEzCONTENT-LENGTHÚCONTENT_LENGTHzHTTP_%sú-Ú_ZHTTP_X_FORWARDED_PROTOÚhttpzwsgi.url_schemeZ	PATH_INFOZSCRIPT_NAME)r9   r   )Úobjectr   Úbodyr   ÚpathÚqueryÚsysÚstderrÚmethodÚversionr   ÚitemsÚupperÚreplacer   )
Úhandlerr7   r3   Z	uri_partsZfull_uriÚenvironZhdr_nameZ	hdr_valueÚkeyZ	path_infor   r   r   Útranslate_requestA   sL    

rP   c             C   sl   |d }y|j t| jƒ d ƒƒ W n tk
r6   dS X x|D ]\}}|j||ƒ q>W |j|ƒ |jƒ  dS )zTThis function generates an appropriate response object for this async
    mode.
    ztornado.handlerr   N)Z
set_statusÚintÚsplitÚRuntimeErrorZ
set_headerÚwriteÚfinish)Ústatusr   r3   rN   Útornado_handlerÚheaderÚvaluer   r   r   Úmake_response‚   s    
rZ   c               @   s8   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zd
d„ ZdS )Ú	WebSocketzƒ
    This wrapper class provides a tornado WebSocket interface that is
    somewhat compatible with eventlet's implementation.
    c             C   s   || _ d | _d S )N)rM   rW   )r   rM   r   r   r   r   ˜   s    zWebSocket.__init__c             Ã   s$   |d | _ || _| j| ƒI d H  d S )Nztornado.handler)rW   rN   rM   )r   rN   r   r   r   Ú__call__œ   s    
zWebSocket.__call__c             Ã   s   | j jƒ  d S )N)rW   Úclose)r   r   r   r   r]   ¡   s    zWebSocket.closec             Ã   s@   y| j j|t|tƒd� W n  tjjk
r:   tjƒ ‚Y nX d S )N)Úbinary)	rW   Zwrite_messager   Úbytesr0   r   ZWebSocketClosedErrorr   ZEngineIOError)r   r#   r   r   r   Úsend¤   s
    zWebSocket.sendc             Ã   s6   | j jƒ I d H }t|tjƒ r2t|tjƒ r2tƒ ‚|S )N)rW   r%   r   r	   Úbinary_typeÚ	text_typeÚIOError)r   Úmsgr   r   r   Úwait«   s
    zWebSocket.waitN)	r+   r,   r-   Ú__doc__r   r\   r]   r`   re   r   r   r   r   r[   “   s   r[   T)r   rP   rZ   r   )r   rF   Úurllib.parser   r   r   Ztornado.webr0   Ztornado.websocketr	   r1   rP   rZ   rB   r[   Z_asyncr   r   r   r   Ú<module>   s   6A!