U
    @fC                  
   @   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mZm	Z	m
Z
 d dlmZ dddddd	d
dddg
ZdZe je je jhZd e jhZejdd dkree j ejdjZejdkrejZnejejZdd Zdd Z dd Z!ejdd dkr$e j"e jhZ#e j$e j%e j&hZ'n e j"e je j%hZ#e j$e j&e j(hZ'dd Z)zd dlm*Z* W n e+k
rx   e, Z*Y nX G dd dZ-dd Z.dZ/zd dl0m1Z1 W n$ e+k
r   G d d dZ1Y nX d!d Z2dS )"    N)
trampolinenotify_openedIOClosed)	get_errnoGreenSocket_GLOBAL_DEFAULT_TIMEOUTset_nonblockingSOCKET_BLOCKINGSOCKET_CLOSEDCONNECT_ERRCONNECT_SUCCESSshutdown_safeSSLsocket_timeouti      winsocket)r   
   c                 C   s2   |  |}|tkrdS |tkr.t|tj| | S )z
    Attempts to connect to the address, returns the descriptor if it succeeds,
    returns None if it needs to trampoline, and raises any exceptions.
    N)
connect_exr   r   OSErrorerrno	errorcode)
descriptoraddresserr r   O/var/www/html/chatgpt/venv/lib/python3.8/site-packages/eventlet/greenio/base.pysocket_connect"   s    
r   c                 C   s,   |  tjtj}|tkr(t|tj| d S N)
getsockoptr   
SOL_SOCKETSO_ERRORr   r   r   r   )r   r   r   r   r   socket_checkerr/   s    r"   c              
   C   sL   z
|   W S  tk
rF } zt|tjkr4W Y 
dS  W 5 d}~X Y nX dS )z
    Attempts to accept() on the descriptor, returns a client,address tuple
    if it succeeds; returns None if it needs to trampoline, and raises
    any exceptions.
    N)acceptr   r   r   EWOULDBLOCK)r   er   r   r   socket_accept5   s    

r&   c                 C   s   z
| j }W nv tk
r   zddl}W n tk
rB   tdY nX |  }|||j}|tjB }||kr||||j	| Y n
X |d dS )z
    Sets the descriptor to be nonblocking.  Works on many file-like
    objects as well as sockets.  Only sockets can be nonblocking on
    Windows, however.
    r   Nznset_nonblocking() on a file object with no setblocking() method (Windows pipes don't support non-blocking I/O))
setblockingAttributeErrorfcntlImportErrorNotImplementedErrorfilenoZF_GETFLos
O_NONBLOCKZF_SETFL)fdr'   r)   r,   Z
orig_flagsZ	new_flagsr   r   r   r   N   s    

)r   c                   @   s:  e Zd ZdZdZejfddZedd Z	dd Z
d	d
 Zee
eZdd ZdDd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dEd%d&ZdFd'd(ZdGd)d*ZdHd+d,Zd-d. ZdId/d0Zd1d2 ZdJd3d4Z d5d6 Z!d7d8 Z"d9d: Z#d;d< Z$d=d> Z%d?e&j'kr6d@dA Z(dBdC Z)dS )Kr   a  
    Green version of socket.socket class, that is intended to be 100%
    API-compatible.

    It also recognizes the keyword parameter, 'set_nonblocking=True'.
    Pass False to indicate that socket is already in non-blocking mode
    to save syscalls.
    Nc                 O   s   | dd}t|tr4t|f||}t|  n|}z| pHt | _	W n t
k
rl   t | _	Y nX |r| dkrt| || _d| _|j| _|j| _|j| _|j| _|j| _|j| _|j| _|j| _d| _d S )Nr   TF)pop
isinstanceint_original_socketr   r,   
gettimeoutr   getdefaulttimeout_timeoutr(   r   r/   act_non_blockingbindclosegetsocknamer   listen
setsockoptshutdown_closed)selffamilyargskwargsZshould_set_nonblockingr/   r   r   r   __init__   s,    
zGreenSocket.__init__c                 C   s   | S r   r   r@   r   r   r   _sock   s    zGreenSocket._sockc                 C   s   | j jS r   r/   _io_refsrE   r   r   r   _get_io_refs   s    zGreenSocket._get_io_refsc                 C   s   || j _d S r   rG   )r@   valuer   r   r   _set_io_refs   s    zGreenSocket._set_io_refsc                 C   s.   | j d krt|t| j |}t| || |S r   )r/   r(   getattrsetattr)r@   nameattrr   r   r   __getattr__   s
    
zGreenSocket.__getattr__Fc                 C   sH   | j rt zt|||||| jdW S  tk
rB   |    Y nX dS )z We need to trampoline via the event hub.
            We catch any signal back from the hub indicating that the operation we
            were waiting on was associated with a filehandle that's since been
            invalidated.
        )readwritetimeouttimeout_excZmark_as_closedN)r?   r   r   _mark_as_closed)r@   r/   rQ   rR   rS   rT   r   r   r   _trampoline   s    
zGreenSocket._trampolinec                 C   s   | j r$| j }t|d   |S | j}td}t|}|d k	rn|\}}t|  t| t| ||fS | j	|d| 
 |d q2d S )Nr   	timed outTrQ   rS   rT   )r8   r/   r#   r   r,   r   r&   r   typerV   r5   )r@   resr/   _timeout_excclientaddrr   r   r   r#      s    
zGreenSocket.acceptc                 C   s
   d| _ dS )z" Mark this socket as being closed TN)r?   rE   r   r   r   rU      s    zGreenSocket._mark_as_closedc                 C   s   t | dd }|d k	r|  d S )Nr:   )rL   )r@   r:   r   r   r   __del__   s    zGreenSocket.__del__c                 C   s   | j r| j|S | j}td}|  d krtt||sz| j|dd W n tk
rf   tt	j
Y nX t| q,nzt |   }t||rd S t |kr||t  }z| j|d||d W n tk
r   tt	j
Y nX t| qd S )NrW   TrR   rR   rS   rT   )r8   r/   connectr   r5   r   rV   r   r   r   EBADFDr"   time)r@   r   r/   r[   endrS   r   r   r   ra      s,    

zGreenSocket.connectc              
   C   sL  | j r| j|S | j}|  d krt||sz| j|dd t| W nF tk
rv } zt| W Y S d }~X Y n t	k
r   t
j Y S X dS nt |   }tt
j}zFt||rW dS t |kr|| j|d|t  |d t| W nJ tk
r( } zt| W Y S d }~X Y n t	k
rB   t
j Y S X dS d S )NTr_   r   r`   )r8   r/   r   r5   r   rV   r"   r   r   r   r   rb   rc   r   rS   EAGAIN)r@   r   r/   exrd   rT   r   r   r   r     s:    

zGreenSocket.connect_exc                 O   s0   | j j||}t| |dd}||   |S )NF)r   )r/   duprY   
settimeoutr5   )r@   rB   kwsocknewsockr   r   r   rg   +  s    zGreenSocket.dupc                 O   s   t j| f||S r   )r4   makefile)r@   rB   rC   r   r   r   rl   1  s    zGreenSocket.makefilec                 O   s   t jdtdd | j||S )Nz>makeGreenFile has been deprecated, please use makefile instead   )
stacklevel)warningswarnDeprecationWarningrl   )r@   rB   ri   r   r   r   makeGreenFile4  s
     zGreenSocket.makeGreenFilec                 C   s    | j | jd|  tdd d S )NTrW   rX   )rV   r/   r5   r   rE   r   r   r   _read_trampoline9  s    zGreenSocket._read_trampolinec              
   G   s   | j r|| S z|d s |   || W S  tk
rr } z,t|tkrHnt|tkr`| W Y S  W 5 d }~X Y nX z|   W q tk
r } z
t W 5 d }~X Y qX qd S Nr   )r8   rs   r   r   r	   r
   r   EOFError)r@   Z	recv_methZ	empty_valrB   r%   r   r   r   
_recv_loop@  s     	
zGreenSocket._recv_loopr   c                 C   s   |  | jjd||S N    )rv   r/   recvr@   bufsizeflagsr   r   r   ry   _  s    zGreenSocket.recvc                 C   s   |  | jjd||S rw   )rv   r/   recvfromrz   r   r   r   r}   b  s    zGreenSocket.recvfromc                 C   s   |  | jjd|||S rt   )rv   r/   	recv_intor@   buffernbytesr|   r   r   r   r~   e  s    zGreenSocket.recv_intoc                 C   s   |  | jjd|||S rt   )rv   r/   recvfrom_intor   r   r   r   r   h  s    zGreenSocket.recvfrom_intoc              
   G   s   | j r||f| S td}z||f| W S  tk
rj } z t|}|tjksX|tkrZ W 5 d }~X Y nX z| j| jd| 	 |d W q t
k
r   ttjdY qX qd S )NrW   Tr`   z#Connection closed by another thread)r8   r   r   r   r   ENOTCONNr	   rV   r/   r5   r   
ECONNRESET)r@   Zsend_methoddatarB   r[   r%   Zenor   r   r   
_send_loopk  s    
zGreenSocket._send_loopc                 C   s   |  | jj||S r   )r   r/   send)r@   r   r|   r   r   r   r   ~  s    zGreenSocket.sendc                 G   s   | j | jj|f| S r   )r   r/   sendto)r@   r   rB   r   r   r   r     s    zGreenSocket.sendtoc                 C   s:   |  ||}t|}||k r6||  ||d  |7 }qd S r   )r   len)r@   r   r|   tailZlen_datar   r   r   sendall  s    zGreenSocket.sendallc                 C   s"   |rd| _ d | _nd| _ d| _d S )NFT        )r8   r7   )r@   flagr   r   r   r'     s
    zGreenSocket.setblockingc                 C   s   |d ks|t kr| d d S z
|j}W n tk
rD   tdY nX | }|dk r\td|dkrrd| _d| _nd| _|| _d S )NTza float is requiredr   zTimeout value out of rangeF)r   r'   	__float__r(   	TypeError
ValueErrorr8   r7   )r@   Zhowlongfr   r   r   rh     s    

zGreenSocket.settimeoutc                 C   s   | j S r   )r7   rE   r   r   r   r5     s    zGreenSocket.gettimeoutc                 C   s   | S r   r   rE   r   r   r   	__enter__  s    zGreenSocket.__enter__c                 G   s   |    d S r   )r:   )r@   rB   r   r   r   __exit__  s    zGreenSocket.__exit__Z__pypy__c                 C   s   t | jd| j  d S NrF   )rL   r/   _reuserE   r   r   r   r     s    zGreenSocket._reusec                 C   s   t | jd| j  d S r   )rL   r/   _droprE   r   r   r   r     s    zGreenSocket._drop)FFNN)r   )r   )r   r   )r   r   )r   )r   )*__name__
__module____qualname____doc__r/   r   AF_INETrD   propertyrF   rI   rK   rH   rP   rV   r#   rU   r^   ra   r   rg   rl   rr   rs   rv   ry   r}   r~   r   r   r   r   r   r'   rh   r5   r   r   sysbuiltin_module_namesr   r   r   r   r   r   r   w   sH   
'


 





c                  O   s   t dd S )NzI/O operation on closed file)r   )rB   rC   r   r   r   _operation_on_closed_file  s    r   a  
    GreenPipe is a cooperative replacement for file class.
    It will cooperate on pipes. It will block on regular file.
    Differences from file class:
    - mode is r/w property. Should re r/o
    - encoding property not implemented
    - write/writelines will not raise TypeError exception when non-string data is written
      it will write str(data) instead
    - Universal new lines are not supported and newlines property not implementeded
    - file argument can be descriptor, file name or file object.
    )r   c                   @   sL   e Zd ZG dd deZG dd deZG dd deZG dd deZd	S )
r   c                   @   s   e Zd ZdS )zSSL.WantWriteErrorNr   r   r   r   r   r   r   WantWriteError  s   r   c                   @   s   e Zd ZdS )zSSL.WantReadErrorNr   r   r   r   r   WantReadError  s   r   c                   @   s   e Zd ZdS )zSSL.ZeroReturnErrorNr   r   r   r   r   ZeroReturnError  s   r   c                   @   s   e Zd ZdS )zSSL.SysCallErrorNr   r   r   r   r   SysCallError  s   r   N)r   r   r   	Exceptionr   r   r   r   r   r   r   r   r     s   c              
   C   sv   z4z|  tjW W S  tk
r0   |    Y W S X W n< tk
rp } zt|tjtjtj	fkr` W 5 d}~X Y nX dS )a  Shuts down the socket. This is a convenience method for
    code that wants to gracefully handle regular sockets, SSL.Connection
    sockets from PyOpenSSL and ssl.SSLSocket objects from Python 2.7 interchangeably.
    Both types of ssl socket require a shutdown() before close,
    but they have different arity on their shutdown method.

    Regular sockets don't need a shutdown before close, but it doesn't hurt.
    N)
r>   r   	SHUT_RDWRr   r   r   r   r   EBADFENOTSOCK)rj   r%   r   r   r   r     s    	)3r   r-   r   r   rc   ro   ZeventletZeventlet.hubsr   r   r   Zeventlet.supportr   __all__BUFFER_SIZEZEINPROGRESSZEALREADYr$   r   ZEISCONNr   platformaddZ	WSAEINVALZpatcheroriginalr4   version_inforS   r   Zwrap_is_timeoutr   r"   r&   re   r	   r   r   	ESHUTDOWNr
   EPIPEr   r   r*   objectr   r   Zgreenpipe_docZOpenSSLr   r   r   r   r   r   <module>   sf         

#  @