3
ò\ð]è  ã               @   s–   d dl Z d dlmZ d dlmZ yd dlmZ W n ek
rH   dZY nX d dlZdd„ Z	dd„ Z
d	d
„ ZG dd„ deƒZde	e
eerŠenddœZdS )é    N)Úurlsplit)ÚHTTPResponse)ÚWebSocketProtocolc             C   s>   | j |j|dddgd� y| jƒ  W n tk
r8   Y nX dS )z°This function sets up the engine.io endpoint as a route for the
    application.

    Note that both GET and POST requests must be hooked up on the engine.io
    endpoint.
    ÚGETÚPOSTÚOPTIONS)ÚmethodsN)Z	add_routeÚhandle_requestZenable_websocketÚAttributeError)ZappZengineio_serverZengineio_endpoint© r   úG/tmp/pip-build-mqc4i71p/python-engineio/engineio/async_drivers/sanic.pyÚcreate_route   s    
r   c             C   sú   G dd„ dt ƒ}t| jƒ}|| jƒtjdddddd| j|jp>d| jd	| j d
ddd| dœ}xt| j	j
ƒ D ]f\}}|jƒ }|dkrŠ||d< qfn|dkrœ||d< qfd|jddƒ }||krÄd|| |f }|||< qfW |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)Úselfr   r   r   r   Ú__init__"   s    z4translate_request.<locals>.AwaitablePayload.__init__Nc             Ó   s8   |d kr| j }d| _ n| j d |… }| j |d … | _ |S )Nr   )r   )r   ÚlengthÚrr   r   r   Úread%   s    z0translate_request.<locals>.AwaitablePayload.read)N)Ú__name__Ú
__module__Ú__qualname__r   r   r   r   r   r   ÚAwaitablePayload!   s   r   é   r   TFZsanicÚ zHTTP/z	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sanic.requestzCONTENT-TYPEÚCONTENT_TYPEzCONTENT-LENGTHÚCONTENT_LENGTHzHTTP_%sú-Ú_z%s,%sZHTTP_X_FORWARDED_PROTOÚhttpzwsgi.url_schemeZ	PATH_INFOZSCRIPT_NAME)r   r   )Úobjectr   ÚurlÚbodyÚsysÚstderrÚmethodÚqueryÚversionÚheadersÚitemsÚupperÚreplaceÚgetÚpath)Úrequestr   Z	uri_partsÚenvironZhdr_nameZ	hdr_valueÚkeyZ	path_infor   r   r   Útranslate_request   sH    
r4   c             C   s\   i }d}x6|D ].}|d j ƒ dkr,|d }q|d ||d < qW t||t| jƒ d ƒ|d�S )zTThis function generates an appropriate response object for this async
    mode.
    Nr   zcontent-typer   )Z
body_bytesÚcontent_typeÚstatusr+   )Úlowerr   ÚintÚsplit)r6   r+   r   r2   Zheaders_dictr5   Úhr   r   r   Úmake_response\   s    

r;   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 sanic WebSocket interface that is
    somewhat compatible with eventlet's implementation.
    c             C   s   || _ d | _d S )N)ÚhandlerÚ_sock)r   r=   r   r   r   r   p   s    zWebSocket.__init__c             Ã   s>   |d }|j jƒ }|j|ƒI d H | _|| _| j| ƒI d H  d S )Nzsanic.request)Ú	transportZget_protocolZwebsocket_handshaker>   r2   r=   )r   r2   r1   Úprotocolr   r   r   Ú__call__t   s
    
zWebSocket.__call__c             Ã   s   | j jƒ I d H  d S )N)r>   Úclose)r   r   r   r   rB   |   s    zWebSocket.closec             Ã   s   | j j|ƒI d H  d S )N)r>   Úsend)r   Úmessager   r   r   rC      s    zWebSocket.sendc             Ã   s6   | j jƒ I d H }t|tjƒ r2t|tjƒ r2tƒ ‚|S )N)r>   ÚrecvÚ
isinstanceÚsixÚbinary_typeÚ	text_typeÚIOError)r   Údatar   r   r   Úwait‚   s
    zWebSocket.waitN)	r   r   r   Ú__doc__r   rA   rB   rC   rL   r   r   r   r   r<   k   s   r<   T)Zasyncior   r4   r;   Z	websocket)r&   Úurllib.parser   Zsanic.responser   Zsanic.websocketr   ÚImportErrorrG   r   r4   r;   r#   r<   Z_asyncr   r   r   r   Ú<module>   s    
? 