B
    ÐH/\Ýp  ã               @   s*  d Z ddlm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 e	eeƒ ejd	d
 yddlmZ ddlmZ W n ek
r¸   dZdZY nX ejZejZejZejZejZejZdd„ Zeƒ ZG dd„ dejƒZ ddl!m"Z# G dd„ deƒZej$dd… dkrrej$dd… dkrrej%Z%dekr\e &d¡ dekrve 'd¡ neZ%d&dd„Z(e)ejdƒr dd„ Z*e 'd¡ e)edƒr¾de+dfd d„Z,n@d!Z-d"Z.e/e+dfd#d„Z,ej$dd… d$k rþdekrþe &d¡ e)ed%ƒrej0Z0ed%g7 Zee e Z1dS )'z
Python 3 socket module.
é    )Úabsolute_importN)Ú_socketcommon)Úcopy_globals)ÚPYPY)ÚTimeout)Údup© )Znames_to_ignoreZdunder_names_to_keep)ÚEHOSTUNREACH)ÚECONNREFUSEDéÿÿÿÿc             C   s   t | ƒ}|jr|S | ¡ S )N)Ú
memoryviewÚshapeÚtobytes)ÚdataZmvr   r   ú.lib/python3.7/site-packages/gevent/_socket3.pyÚ_get_memory,   s    r   c               @   s&   e Zd ZdZer"edd„ dd„ ƒZdS )Ú_wrefsocket)Ú__weakref__c             C   s   |   ¡ S )N)Ú
gettimeout)Úsr   r   r   Ú<lambda>D   s    z_wrefsocket.<lambda>c             C   s
   |   |¡S )N)Ú
settimeout)r   Znvr   r   r   r   E   s    N)Ú__name__Ú
__module__Ú__qualname__Ú	__slots__r   ÚpropertyÚtimeoutr   r   r   r   r   7   s   r   )Úwait_on_socketc               @   sZ  e Zd ZdZeZdZdZdZdZ	e
jdd… dk rFeeddfdd„Zn
dld
d„Zdd„ Zdd„ Zeedƒrvedd„ ƒZdd„ Z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d"d#„ Z dmdddd%œd&d'„Z!d(d)„ Z"d*d+„ Z#ej$e%fd,d-„Z&d.d/„ Z'ed0d1„ ƒZ(d2d3„ Z)d4d5„ Z*d6d7„ Z+d8d9„ Z,eej$d:ƒrJd;d<„ Z-eej$d=ƒr`d>d?„ Z.d@dA„ Z/dBdC„ Z0dDdE„ Z1de2fdFdG„Z3dndHdI„Z4dJdK„ Z5eej$dLƒr°dodNdO„Z6dPdQ„ Z7dRdS„ Z8dTdU„ Z9dVdW„ Z:dpdXdY„Z;dqdZd[„Z<d\d]„ Z=drd^d_„Z>ee?d`ƒsee?daƒrVe?j@dbkr,dcdd„ ZAdedf„ ZBndgdd„ ZAdhdf„ ZBdiZCdjeC eA_dkeC eB_[CdS )sÚsocketa{  
    gevent `socket.socket <https://docs.python.org/3/library/socket.html#socket-objects>`_
    for Python 3.

    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   FNé   )é   é   c             C   s$   |   ||||¡| _d | _|  ¡  d S )N)Ú_gevent_sock_classÚ_sockr   Ú_socket__init_common)ÚselfÚfamilyÚtypeÚprotoÚfilenor   r   r   Ú__init__c   s    zsocket.__init__r   c             C   sP   |d kr,|dkrt }|dkr t}|dkr,d}|  ||||¡| _d | _|  ¡  d S )Nr   r   )ÚAF_INETÚSOCK_STREAMr#   r$   r   r%   )r&   r'   r(   r)   r*   r   r   r   r+   j   s    c             C   sV   t j | jd¡ t j | j¡}tƒ | _| jjj}||dƒ| _	||dƒ| _
t  ¡ | _d S )NFé   r    )Ú_socketr   Úsetblockingr$   r*   Zget_hubÚhubZloopÚioÚ_read_eventÚ_write_eventÚgetdefaulttimeoutr   )r&   r*   Zio_classr   r   r   Z__init_commonv   s    
zsocket.__init_commonc             C   s   t | j|ƒS )N)Úgetattrr$   )r&   Únamer   r   r   Ú__getattr__   s    zsocket.__getattr__ÚSOCK_NONBLOCKc             C   s"   | j dkr| jjtj @ S | jjS )Ng        )r   r$   r(   r/   r9   )r&   r   r   r   r(   „   s    
zsocket.typec             C   s
   | j dkS )z›
        Returns whether the socket will approximate blocking
        behaviour.

        .. versionadded:: 1.3a2
            Added in Python 3.7.
        g        )r   )r&   r   r   r   Úgetblocking‹   s    zsocket.getblockingc             C   s   | S )Nr   )r&   r   r   r   Ú	__enter__•   s    zsocket.__enter__c             G   s   | j s|  ¡  d S )N)Ú_closedÚclose)r&   Úargsr   r   r   Ú__exit__˜   s    zsocket.__exit__c          
   C   s|   yt j | j¡}W n* tk
r< } zd| }W dd}~X Y nX | d¡rxd| jj| jjt	| ddƒrfdphd|d	d… f }|S )
z.Wrap __repr__() to reveal the real class name.z<socket [%r]>Nz<socket objectz
<%s.%s%s%sr<   Fz
 [closed] Ú r"   )
r/   r   Ú__repr__r$   Ú	ExceptionÚ
startswithÚ	__class__r   r   r6   )r&   r   Úexr   r   r   rA   œ   s    
zsocket.__repr__c             C   s   t dƒ‚d S )NzCannot serialize socket object)Ú	TypeError)r&   r   r   r   Ú__getstate__®   s    zsocket.__getstate__c             C   s   | j jp| jjS )N)r3   Úrefr4   )r&   r   r   r   Ú_get_ref±   s    zsocket._get_refc             C   s   || j _|| j_d S )N)r3   rH   r4   )r&   Úvaluer   r   r   Ú_set_ref´   s    zsocket._set_refc             C   s6   t |  ¡ ƒ}| j| j| j| j|d}| |  ¡ ¡ |S )zjdup() -> socket object

        Return a new socket object connected to the same system resource.
        )r*   )r   r*   rD   r'   r(   r)   r   r   )r&   ÚfdÚsockr   r   r   r   ¼   s    z
socket.dupc             C   s€   xDy|   ¡ \}}P W n  tk
r4   | jdkr0‚ Y nX |  | j¡ qW t| j| j| j|d}t	ƒ dkrx|  
¡ rx| d¡ ||fS )zúaccept() -> (socket object, address info)

        Wait for an incoming connection.  Return a new socket
        representing the connection, and the address of the client.
        For IP sockets, the address info is a pair (hostaddr, port).
        g        )r*   NT)Z_acceptÚBlockingIOErrorr   Ú_waitr3   r   r'   r(   r)   r5   r   r0   )r&   rL   ÚaddrrM   r   r   r   ÚacceptÆ   s    

zsocket.acceptÚr)ÚencodingÚerrorsÚnewlinec            C   s  x|D ]}|dkrt dƒ‚qW d|k}d|kp2| }|s@|s@t‚d|k}	d}
|rX|
d7 }
|rd|
d7 }
t| |
ƒ}|  jd7  _|dkrˆd	}|d
k r–tj}|d
kr®|	sªt dƒ‚|S |rÆ|rÆt |||¡}n&|rØt ||¡}n|sàt‚t ||¡}|	rô|S t 	||||¡}||_
|S )zäReturn an I/O stream connected to the socket

        The arguments are as for io.open() after the filename,
        except the only mode characters supported are 'r', 'w' and 'b'.
        The semantics are similar too.
        >   ÚbÚwrR   z&invalid mode %r (only r, w, b allowed)rW   rR   rV   r@   r.   Nr   r   z!unbuffered streams must be binary)Ú
ValueErrorÚAssertionErrorÚSocketIOÚ_io_refsr2   ÚDEFAULT_BUFFER_SIZEÚBufferedRWPairÚBufferedReaderÚBufferedWriterÚTextIOWrapperÚmode)r&   ra   Ú	bufferingrS   rT   rU   ÚcZwritingZreadingZbinaryZrawmodeÚrawÚbufferÚtextr   r   r   ÚmakefileÞ   sB    	

zsocket.makefilec             C   s*   | j dkr|  j d8  _ | jr&|  ¡  d S )Nr   r.   )r[   r<   r=   )r&   r   r   r   Ú_decref_socketios
  s    
zsocket._decref_socketiosc             C   sH   | j d k	r"| j | j td¡ d | _ | jd k	rD| j | jtd¡ d | _d S )NT)r3   r1   Úcancel_waitÚcancel_wait_exr4   )r&   r   r   r   Ú_drop_events  s    

zsocket._drop_eventsc             C   sT   |   ¡  | | j¡ y|  | j| j| j¡| _W n tk
rB   Y nX | | j¡ d S )N)rk   r=   r$   r#   r'   r(   r)   ÚOSError)r&   Z_ssrj   r   r   r   Ú_real_close  s    	zsocket._real_closec             C   s   d| _ | jdkr|  ¡  d S )NTr   )r<   r[   rm   )r&   r   r   r   r=   2  s    
zsocket.closec             C   s   | j S )N)r<   )r&   r   r   r   Úclosed8  s    zsocket.closedc             C   s   d| _ | j ¡ S )a  detach() -> file descriptor

        Close the socket object without closing the underlying file descriptor.
        The object cannot be used after this call, but the file descriptor
        can be reused for other purposes.  The file descriptor is returned.
        T)r<   r$   Údetach)r&   r   r   r   ro   <  s    zsocket.detachc          	   C   sæ   | j dkrtj | j|¡S t | j|¡}t | j t dƒ¡¢ xš|  	t
t¡}|r\t|t|ƒƒ‚tj | j|¡}|rx|tkr|P q>|tttfks–|tkr¤tr¤|  | j¡ q>t|tƒrÆ|d dkrÆ|tkrÆt}t|t|ƒƒ‚q>W W d Q R X d S )Ng        z	timed outr   zfe80::1)r   r/   r   Úconnectr$   r   Z_resolve_addrr   Z_start_new_or_dummyZ
getsockoptZ
SOL_SOCKETZSO_ERRORÚerrorÚstrerrorÚ
connect_exZEISCONNÚEWOULDBLOCKZEINPROGRESSZEALREADYZEINVALZ
is_windowsrO   r4   Ú
isinstanceÚtupler	   r
   )r&   ÚaddressÚerrÚresultr   r   r   rp   F  s$    


zsocket.connectc          
   C   sj   y|   |¡pdS  tk
r"   tS  tk
r6   ‚ Y n0 tk
rd } z|jrR|jS ‚ W d d }~X Y nX d S )Nr   )rp   r   ZEAGAINZgaierrorrq   Úerrno)r&   rw   rE   r   r   r   rs   f  s    zsocket.connect_exc          
   G   sh   xbyt jj| jf|žŽ S  tk
rR } z|jd tks@| jdkrB‚ W d d }~X Y nX |  | j	¡ qW d S )Nr   g        )
r/   r   Úrecvr$   rq   r>   rt   r   rO   r3   )r&   r>   rE   r   r   r   r{   w  s    zsocket.recvÚrecvmsgc          
   G   sh   xbyt jj| jf|žŽ S  tk
rR } z|jd tks@| jdkrB‚ W d d }~X Y nX |  | j	¡ qW d S )Nr   g        )
r/   r   r|   r$   rq   r>   rt   r   rO   r3   )r&   r>   rE   r   r   r   r|   „  s    zsocket.recvmsgÚrecvmsg_intoc          
   G   sh   xbyt jj| jf|žŽ S  tk
rR } z|jd tks@| jdkrB‚ W d d }~X Y nX |  | j	¡ qW d S )Nr   g        )
r/   r   r}   r$   rq   r>   rt   r   rO   r3   )r&   r>   rE   r   r   r   r}     s    zsocket.recvmsg_intoc          
   G   sh   xbyt jj| jf|žŽ S  tk
rR } z|jd tks@| jdkrB‚ W d d }~X Y nX |  | j	¡ qW d S )Nr   g        )
r/   r   Úrecvfromr$   rq   r>   rt   r   rO   r3   )r&   r>   rE   r   r   r   r~   ˜  s    zsocket.recvfromc          
   G   sh   xbyt jj| jf|žŽ S  tk
rR } z|jd tks@| jdkrB‚ W d d }~X Y nX |  | j	¡ qW d S )Nr   g        )
r/   r   Úrecvfrom_intor$   rq   r>   rt   r   rO   r3   )r&   r>   rE   r   r   r   r   ¡  s    zsocket.recvfrom_intoc          
   G   sh   xbyt jj| jf|žŽ S  tk
rR } z|jd tks@| jdkrB‚ W d d }~X Y nX |  | j	¡ qW d S )Nr   g        )
r/   r   Ú	recv_intor$   rq   r>   rt   r   rO   r3   )r&   r>   rE   r   r   r   r€   ª  s    zsocket.recv_intoc             C   s¸   |t kr| j}ytj | j||¡S  tk
r² } zt|jd tj	ksJ|dkrL‚ |  
| j¡ yt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        )Útimeout_defaultr   r/   r   Úsendr$   rq   r>   r   Z
GSENDAGAINrO   r4   rt   )r&   r   Úflagsr   rE   Úex2r   r   r   r‚   ³  s    zsocket.sendc             C   s   t |ƒ}t | ||¡S )N)r   r   Z_sendall)r&   r   rƒ   Zdata_memoryr   r   r   ÚsendallÃ  s    zsocket.sendallc             G   s®   yt jj| jf|žŽ S  tk
r¨ } zv|jd tks>| jdkr@‚ |  | j	¡ yt jj| jf|žŽ 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/   r   Úsendtor$   rq   r>   rt   r   rO   r4   )r&   r>   rE   r„   r   r   r   r†   Ì  s    zsocket.sendtoÚsendmsgr   c             C   sÄ   yt j | j||||¡S  tk
r¾ } zŠ|tt ddƒ@ r:‚ |jd tksR| jdkrT‚ |  	| j
¡ yt 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 )NZMSG_DONTWAITr   g        )r/   r   r‡   r$   rq   r6   r>   rt   r   rO   r4   )r&   ZbuffersZancdatarƒ   rw   rE   r„   r   r   r   r‡   Ü  s    zsocket.sendmsgc             C   s   |rd | _ nd| _ d S )Ng        )r   )r&   Úflagr   r   r   r0   ï  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__ÚAttributeErrorrF   rX   Ú__dict__)r&   ZhowlongÚfr   r   r   r   ú  s    
zsocket.settimeoutc             C   s
   | j d S )Nr   )r‹   )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.   )r1   ri   r3   rj   r4   r$   Úshutdown)r&   Zhowr   r   r   r     s    zsocket.shutdownc             C   s   t  ¡ ‚d S )N)Ú
__socket__Z_GiveupOnSendfile)r&   ÚfileÚoffsetÚcountr   r   r   Ú_sendfile_use_sendfile  s    zsocket._sendfile_use_sendfilec       
   
   C   s   |   |||¡ |  ¡ dkr"tdƒ‚|r0| |¡ |r>t|dƒnd}d}|j}| j}z†x€|rrt|| |ƒ}|dkrrP t||ƒƒ}|s„P xLy||ƒ}	W n tk
r¨   w†Y q†X ||	7 }|	t	|ƒk rÌ||	d … }q†P q†W qVW |S |dkrút
|dƒrú| || ¡ X d S )Nr   z&non-blocking sockets are not supportedi    Úseek)Ú_check_sendfile_paramsr   rX   r“   ÚminÚreadr‚   r   rN   ÚlenÚhasattr)
r&   r   r   r‘   Z	blocksizeZ
total_sentZ	file_readZ	sock_sendr   Zsentr   r   r   Ú_sendfile_use_send  s<    

zsocket._sendfile_use_sendc             C   sd   dt |ddƒkrtdƒ‚| jt@ s*tdƒ‚|d k	r`t|tƒsJtd |¡ƒ‚|dkr`td |¡ƒ‚d S )NrV   ra   z$file should be opened in binary modez+only SOCK_STREAM type sockets are supportedz+count must be a positive integer (got {!r})r   )r6   rX   r(   r-   ru   ÚintrF   Úformat)r&   r   r   r‘   r   r   r   r”   =  s    

zsocket._check_sendfile_paramsc             C   s   |   |||¡S )aá  sendfile(file[, offset[, count]]) -> sent

        Send a file until EOF is reached by using high-performance
        os.sendfile() and return the total number of bytes which
        were sent.
        *file* must be a regular file object opened in binary mode.
        If os.sendfile() is not available (e.g. Windows) or file is
        not a regular file socket.send() will be used instead.
        *offset* tells from where to start reading the file.
        If specified, *count* is the total number of bytes to transmit
        as opposed to sending the file until EOF is reached.
        File position is updated on return or also in case of error in
        which case file.tell() can be used to figure out the number of
        bytes which were sent.
        The socket must be of SOCK_STREAM type.
        Non-blocking sockets are not supported.

        .. versionadded:: 1.1rc4
           Added in Python 3.5, but available under all Python 3 versions in
           gevent.
        )r™   )r&   r   r   r‘   r   r   r   ÚsendfileJ  s    zsocket.sendfileÚget_inheritableÚget_handle_inheritableÚntc             C   s   t  |  ¡ ¡S )N)Úosrž   r*   )r&   r   r   r   r   f  s    zsocket.get_inheritablec             C   s   t  |  ¡ |¡ d S )N)r    Zset_handle_inheritabler*   )r&   Úinheritabler   r   r   Úset_inheritablei  s    zsocket.set_inheritablec             C   s   t  |  ¡ ¡S )N)r    r   r*   )r&   r   r   r   r   l  s    c             C   s   t  |  ¡ |¡ d S )N)r    r¢   r*   )r&   r¡   r   r   r   r¢   o  s    z.

.. versionadded:: 1.1rc4 Added in Python 3.4z&Get the inheritable flag of the socketz&Set the inheritable flag of the socket)r   r   r   N)rR   N)r   )r   r   N)r   N)r   N)r   N)Dr   r   r   Ú__doc__r   r#   r[   r<   r3   r4   ÚsysÚversion_infor,   r-   r+   r%   r8   r˜   r/   r   r(   r:   r;   r?   rA   rG   rI   rK   rH   Ú_wait_on_socketrO   r   rQ   rg   rh   rk   r   rj   rm   r=   rn   ro   rp   rs   r{   r|   r}   r~   r   r€   r   r‚   r…   r†   r‡   r0   r   r   r   r’   r™   r”   rœ   r    r7   r   r¢   Z_addedr   r   r   r   r   I   s‚   
	



+
 						
	


$



r   r    )r!   é   r!   )r!   r§   r    Ú
SocketTypec             C   s   t | ƒ}t||||ƒS )z¾ fromfd(fd, family, type[, proto]) -> socket object

    Create a socket object from a duplicate of the given file
    descriptor.  The remaining arguments are the same as for socket().
    )r   r   )rL   r'   r(   r)   Znfdr   r   r   Úfromfd‹  s    r©   Zsharec             C   s   t ddd| ƒS )z‰ fromshare(info) -> socket object

        Create a socket object from a the bytes object returned by
        socket.share(pid).
        r   )r   )Úinfor   r   r   Ú	fromshare–  s    r«   Ú
socketpairc             C   sh   | dkr*yt } W n tk
r(   t} Y nX t | ||¡\}}t| ||| ¡ ƒ}t| ||| ¡ ƒ}||fS )aû  socketpair([family[, type[, proto]]]) -> (socket object, socket object)

        Create a pair of socket objects from the sockets returned by the platform
        socketpair() function.
        The arguments are the same as for socket() except the default family is
        AF_UNIX if defined on the platform; otherwise, the default is AF_INET.

        .. versionchanged:: 1.2
           All Python 3 versions on Windows supply this function (natively
           supplied by Python 3.5 and above).
        N)ZAF_UNIXÚ	NameErrorr,   r/   r¬   r   ro   )r'   r(   r)   ÚarV   r   r   r   r¬   ¢  s    
z	127.0.0.1z::1c       
   	   C   s  | t krt}n| tkrt}ntdƒ‚|tkr4tdƒ‚|dkrDtdƒ‚t| ||ƒ}z¤| |df¡ | d¡ | 	¡ d d… \}}t| ||ƒ}yP| 
d¡ y| ||f¡ W n ttfk
rÀ   Y nX | 
d¡ | ¡ \}}	W n   | ¡  ‚ Y nX W d | ¡  X ||fS )	Nz?Only AF_INET and AF_INET6 socket address families are supportedz)Only SOCK_STREAM socket type is supportedr   zOnly protocol zero is supportedé€   r    FT)r,   Ú
_LOCALHOSTZAF_INET6Ú_LOCALHOST_V6rX   r-   r   ZbindZlistenZgetsocknamer0   rp   rN   ÚInterruptedErrorrQ   r=   )
r'   r(   r)   ZhostZlsockrP   ZportZcsockZssockÚ_r   r   r   r¬   Â  s8    



)r!   é   r=   )r   )2r£   Z
__future__r   r2   r    r¤   Zgeventr   Zgevent._utilr   Zgevent._compatr   Zgevent.timeoutr   r/   r   ÚglobalsZ__extensions__rz   r	   r
   ÚImportErrorrŽ   Z_implementsZ__implements__Z__imports__Z__dns__rZ   r   Úobjectr   r   r   Zgevent._hub_primitivesr   r¦   r¥   r¨   ÚremoveÚappendr©   r˜   r«   r-   r¬   r°   r±   r,   r=   Ú__all__r   r   r   r   Ú<module>   sr   
    2(






%


