B
    H/\@                 @   s  d Z ddlmZ ddlmZ ddlmZ ddlmZ ddl	m
Z
 eee ejej dd ejZejZejZd	d
 ejD ZejZyejZejZW n ek
r   eZdZY n X eedrtG dd deZdd ZG dd deZe ZddlmZ G dd deZeZ ee!dr6e"e!de!j#e!j$dfddZ%ndekrJe&d ee!drbdddZ'ndekrve&d eedrdddZ(e)d ee e Z*dS ) z
Python 2 socket module.
    )absolute_import)_socketcommon)copy_globals)PYPY)Timeout )Znames_to_ignoreZdunder_names_to_keepc             C   s   g | ]}|t jkr|qS r   )r   __py3_imports__).0ir   r   .lib/python3.7/site-packages/gevent/_socket2.py
<listcomp>   s    r   )Zbindconnect
connect_exfilenoZlistengetpeernamegetsockname
getsockoptZ
setsockoptsendallsetblocking
settimeout
gettimeoutshutdown	__enter__c                   s,   e Zd Zdd Zdd Z fddZ  ZS )_fileobjectc             C   s   | S )Nr   )selfr   r   r   r   :   s    z_fileobject.__enter__c             G   s   | j s|   d S )N)closedclose)r   argsr   r   r   __exit__=   s    z_fileobject.__exit__c                s&   | j d k	r| j   tt|   d S )N)_sock_drop_eventssuperr   r   )r   )	__class__r   r   r   A   s    

z_fileobject.close)__name__
__module____qualname__r   r   r   __classcell__r   r   )r"   r   r   8   s   r   c             C   s8   yt | }|jr|S | S  tk
r2   t| S X d S )N)
memoryviewshapetobytes	TypeErrorbuffer)dataZmvr   r   r   _get_memoryG   s    r-   c               @   sH   e Zd Zg Zdd Ze Z Z Z Z Z	Z
er@dd Zdd ZeZdS )_closedsocketc              O   s   t tdd S )NzBad file descriptor)errorZEBADF)r   kwargsr   r   r   _dummyY   s    z_closedsocket._dummyc             C   s   d S )Nr   )r   r   r   r   _drop`   s    z_closedsocket._dropc             C   s   d S )Nr   )r   r   r   r   _reusec   s    z_closedsocket._reuseN)r#   r$   r%   	__slots__r1   sendrecv	recv_intosendtorecvfromrecvfrom_intor   r2   r3   __getattr__r   r   r   r   r.   V   s   r.   )wait_on_socketc               @   s  e Zd ZdZeeddfddZdd Zdd	 Zd
d Z	dd Z
dd Zee
eZeZdd ZefddZefddZedd Zdd Zdd Zdd ZdGd d!Zd"d# Zd$d% Zd&d' Zd(d) Zdefd*d+ZdHd,d-Z d.d/ Z!d0d1 Z"d2d3 Z#d4d5 Z$d6d7 Z%ed8d9 Z&ed:d9 Z'ed;d9 Z(d<d= Z)d>d? Z*d@dA Z+dBZ,dZ-x,e.e/e.e0  D ]Z-e1e,e-e-f  qZW [-[,e2rdCdD Z3dEdF Z4dS )Isocketa{  
    gevent `socket.socket <https://docs.python.org/2/library/socket.html#socket-objects>`_
    for Python 2.

    This object should have the same API as the standard library socket linked to above. Not all
    methods are specifically documented here; when they are they may point out a difference
    to be aware of or may document a method the standard library does not.
    r   Nc             C   s   |d kr"t |||| _t | _nTt|drX|j| _t|dd| _| jdkrht | _n|| _t | _trv| j  | j	d | j
 }t | _| jjj}||d| _||d| _d S )Nr   timeoutFr         )Z_realsocketr   _socketZgetdefaulttimeoutr>   hasattrgetattrr   r3   r   r   Zget_hubhubZloopio_read_event_write_event)r   familytypeprotor   r   rE   r   r   r   __init__y   s$    





zsocket.__init__c             C   s    dt | jtt| |  f S )Nz<%s at %s %s>)rI   r#   hexid_formatinfo)r   r   r   r   __repr__   s    zsocket.__repr__c             C   s   dt | j|  f S )Nz<%s %s>)rI   r#   rN   )r   r   r   r   __str__   s    zsocket.__str__c          
   C   s   y|   }W n* tk
r6 } zt|}W d d }~X Y nX y|  }d| }W n tk
rd   d }Y nX y|  }d| }W n tk
r   d }Y nX d| }|d k	r|dt| 7 }|d k	r|dt| 7 }t| dd d k	r|dt| j 7 }|S )Nz%s:%sz	fileno=%sz sock=z peer=r>   z	 timeout=)r   	Exceptionstrr   r   rC   r>   )r   r   exZsocknameZpeernameresultr   r   r   rN      s,    

zsocket._formatinfoc             C   s   | j jp| jjS )N)rF   refrG   )r   r   r   r   _get_ref   s    zsocket._get_refc             C   s   || j _|| j_d S )N)rF   rU   rG   )r   valuer   r   r   _set_ref   s    zsocket._set_refc          
   C   s   xjy| j  \}}P W nD tk
rZ } z&|jd tks@| jdkrB t  W d d }~X Y nX | | j	 qW t
|d}tr|  ||fS )Nr   g        )r   )r   acceptr/   r   EWOULDBLOCKr>   sys	exc_clear_waitrF   r=   r   r2   )r   Zclient_socketaddressrS   Zsockobjr   r   r   rY      s    
zsocket.acceptc             C   sH   | j d k	r"| j| j |d d | _ | jd k	rD| j| j|d d | _d S )NT)rF   rD   cancel_waitrG   )r   cancel_wait_exr   r   r   r       s    

zsocket._drop_eventsc             C   s&   |    | j}| | _tr"|  d S )N)r    r   r   r2   )r   r.   sr   r   r   r      s
    zsocket.closec             C   s   t | jtS )N)
isinstancer   r.   )r   r   r   r   r      s    zsocket.closedc             C   s   | j dkr| j|S t| j|}t| j t d}z|xv| jtt	}|rZt
|t|| j|}|rr|tkrvP q:|tttfks|tkrtr| | j q:t
|t|q:W W d |  X d S )Ng        z	timed out)r>   r   r   r   Z_resolve_addrr   Z_start_new_or_dummyr   Z
SOL_SOCKETZSO_ERRORr/   strerrorr   ZEISCONNrZ   ZEINPROGRESSZEALREADYZEINVALZ
is_windowsr]   rG   r   )r   r^   ZtimererrrT   r   r   r   r      s     
zsocket.connectc          
   C   s`   y|  |pdS  tk
r"   tS  tk
rZ } zt|tkrH|jd S  W d d }~X Y nX d S )Nr   )r   r>   ZEAGAINr/   rI   r   )r   r^   rS   r   r   r   r      s    
zsocket.connect_exc             C   s   t | jdS )zdup() -> socket object

        Return a new socket object connected to the same system resource.
        Note, that the new socket does not inherit the timeout.)r   )r=   r   )r   r   r   r   dup	  s    z
socket.duprc             C   s(   t t| | d||}tr$| j  |S )N)r   )r   rI   r   r   r2   )r   modebufsizeZfobjr   r   r   makefile  s    
zsocket.makefilec          
   G   sh   xby| j j| S  tk
rR } z&|jd tks8| jdkr: t  W d d }~X Y nX | | j	 qW d S )Nr   g        )
r   r6   r/   r   rZ   r>   r[   r\   r]   rF   )r   r   rS   r   r   r   r6   #  s    zsocket.recvc          
   G   sh   xby| j j| S  tk
rR } z&|jd tks8| jdkr: t  W d d }~X Y nX | | j	 qW d S )Nr   g        )
r   r9   r/   r   rZ   r>   r[   r\   r]   rF   )r   r   rS   r   r   r   r9   .  s    zsocket.recvfromc          
   G   sh   xby| j j| S  tk
rR } z&|jd tks8| jdkr: t  W d d }~X Y nX | | j	 qW d S )Nr   g        )
r   r:   r/   r   rZ   r>   r[   r\   r]   rF   )r   r   rS   r   r   r   r:   8  s    zsocket.recvfrom_intoc          
   G   sh   xby| j j| S  tk
rR } z&|jd tks8| jdkr: t  W d d }~X Y nX | | j	 qW d S )Nr   g        )
r   r7   r/   r   rZ   r>   r[   r\   r]   rF   )r   r   rS   r   r   r   r7   B  s    zsocket.recv_intoc             C   s   |t kr| j}y| j||S  tk
r } zx|jd tjksF|dkrH t	  | 
| j y| j||S  tk
r } z|jd tkrdS  W d d }~X Y nX W d d }~X Y nX d S )Nr   g        )timeout_defaultr>   r   r5   r/   r   r   Z
GSENDAGAINr[   r\   r]   rG   rZ   )r   r,   flagsr>   rS   ex2r   r   r   r5   L  s    zsocket.sendc             C   s(   t |tr| }t|}t| ||S )N)rb   Zunicodeencoder-   r   Z_sendall)r   r,   rl   Zdata_memoryr   r   r   r   ]  s    
zsocket.sendallc             G   s   y| j j| S  tk
r } zv|jd tks6| jdkr8 t  | | j	 y| j j| S  tk
r } z|jd tkr|dS  W d d }~X Y nX W d d }~X Y nX d S )Nr   g        )
r   r8   r/   r   rZ   r>   r[   r\   r]   rG   )r   r   rS   rm   r   r   r   r8   e  s    zsocket.sendtoc             C   s   |rd | _ nd| _ d S )Ng        )r>   )r   flagr   r   r   r   t  s    zsocket.setblockingc             C   sT   |d k	rFy
|j }W n tk
r.   tdY nX | }|dk rFtd|| jd< d S )Nza float is requiredg        zTimeout value out of ranger>   )	__float__AttributeErrorr*   
ValueError__dict__)r   Zhowlongfr   r   r   r   z  s    
zsocket.settimeoutc             C   s
   | j d S )Nr>   )rs   )r   r   r   r   r     s    zsocket.gettimeoutc             C   sd   |dkr| j | jt n:|dkr4| j | jt n | j | jt | j | jt | j| d S )Nr   r?   )rD   r_   rF   r`   rG   r   r   )r   Zhowr   r   r   r     s    zsocket.shutdownc             C   s   | j jS )N)r   rH   )r   r   r   r   <lambda>  s    zsocket.<lambda>c             C   s   | j jS )N)r   rI   )r   r   r   r   ru     s    c             C   s   | j jS )N)r   rJ   )r   r   r   r   ru     s    c             C   s
   | j  S )N)r   r   )r   r   r   r   r     s    zsocket.filenoc             C   s
   | j  S )N)r   r   )r   r   r   r   r     s    zsocket.getsocknamec             C   s
   | j  S )N)r   r   )r   r   r   r   r     s    zsocket.getpeernamez2def %s(self, *args): return self._sock.%s(*args)

c             C   s   | j   d S )N)r   r3   )r   r   r   r   r3     s    zsocket._reusec             C   s   | j   d S )N)r   r2   )r   r   r   r   r2     s    zsocket._drop)rf   rg   )r   )5r#   r$   r%   __doc__AF_INETSOCK_STREAMrK   rO   rP   rN   rV   rX   propertyrU   _wait_on_socketr]   rY   r`   r    r.   r   r   r   r   re   rj   r6   r9   r:   r7   rk   r5   r   r8   r   r   r   r   rH   rI   rJ   r   r   r   Z_s_mset_socketmethodslocalsexecr   r3   r2   r   r   r   r   r=   m   sT   
	






r=   
socketpairZAF_UNIXc             C   s>   t | ||\}}t|dt|df}tr:|  |  |S )N)r   )rA   r   r=   r   r2   )rH   rI   rJ   ZoneZtworT   r   r   r   r     s    fromfdc             C   s*   t | |||}t|d}tr&|  |S )N)r   )rA   r   r=   r   r2   )fdrH   rI   rJ   ra   rT   r   r   r   r     s
    
sslNc             C   s.   ddl m} t|dd p t|d}|| ||S )Nr   )r   Zwrap_socketZsslwrap_simple)geventr   rC   )ZsockZkeyfileZcertfileZ_sslmodZwrapr   r   r   r     s    )r   )NN)+rv   Z
__future__r   r   r   Zgevent._utilr   Zgevent._compatr   Zgevent.timeoutr   globalsr   Z__extensions__Z
__socket__Z_implementsZ__implements__Z__imports__Z__dns__r   r}   rq   objectrB   AssertionErrorr-   r.   rk   Zgevent._hub_primitivesr<   rz   r=   Z
SocketTyperA   rC   rw   rx   r   remover   r   append__all__r   r   r   r   <module>   sT   



  E






