o
    RDi#                     @  s   d dl m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
 d dlmZ d dlmZ ddlmZ eeZdd
dZdddZG dd dZdS )    )annotationsN)Callable)TracebackType)Self   )
IS_WINDOWSreturnboolc                   C  s.   t dd dkrdS trtd dS dS )N"SNOWFLAKE_AUTH_SOCKET_MSG_DONTWAITfalsetrueFzWConfiguration SNOWFLAKE_AUTH_SOCKET_MSG_DONTWAIT is not available in Windows. Ignoring.T)osgetenvlowerr   loggerwarning r   r   ^/var/www/Datamplify/venv/lib/python3.10/site-packages/snowflake/connector/auth/_http_server.py_use_msg_dont_wait   s   r   %Callable[[socket.socket, int], bytes]c                    s:   t  } | r
td | rdd ndd  d fdd}|S )Nz^Will call socket.recv with MSG_DONTWAIT flag due to SNOWFLAKE_AUTH_SOCKET_MSG_DONTWAIT env varc                 S  s   t j | |t jS N)socketrecvMSG_DONTWAITsockbuf_sizer   r   r   <lambda>,   s    z#_wrap_socket_recv.<locals>.<lambda>c                 S  s   t j | |S r   )r   r   r   r   r   r   r   .   s    r   socket.socketr   intr   bytesc                   s$    | |}t |dkr | |}|S Nr   )len)r   r   rawsocket_recvr   r   socket_recv_checked1   s   

z._wrap_socket_recv.<locals>.socket_recv_checked)r   r   r   r   r   r    )r   r   debug)	dont_waitr&   r   r$   r   _wrap_socket_recv"   s   
r)   c                   @  s   e Zd ZdZdZdZdZdZ		d:d;ddZe	dd Z
ed<ddZed=ddZed>ddZed=ddZd?d d!Zd@d%d&Z		dAdBd+d,ZdCd-d.ZdDd0d1ZdEd8d9ZdS )FAuthHttpServerzBSimple HTTP server to receive callbacks through for auth purposes.   g      >@
   g      4@ @  Nuristrr   r   redirect_uri
str | Noner   Nonec           	      C  sv  t j|}|rt j|nd }ttjtj| _|| _t	dd
 dkr8tr.td n
| jtjtjd |rE| |rE|jpCd}n|jpId}td| jd D ]d}z| j|j|f W  nV tjyy } ztd| d|   d }~w ty } z2|| jkrtd| d|   td	| d
| j d| d|  t| j| j  W Y d }~qRd }~ww z| jd W n ty } ztd|  |     d }~ww | j! d }t jj"|j#|jd t$| |j%|j&|j'|j(d| _)|r5| |r0||jkr0t*d|j d| d t jj"|j#|jd t$| |j%|j&|j'|j(d| _+d S || _+d S | j)| _+d S )N SNOWFLAKE_AUTH_SOCKET_REUSE_PORTFalser   zUConfiguration SNOWFLAKE_AUTH_SOCKET_REUSE_PORT is not available in Windows. Ignoring.   r   z5Failed to bind authorization callback server to port z: zAttempt /z7. Failed to bind authorization callback server to port z-Failed to start listening for auth callback: :)schemenetlocpathparamsqueryfragmentzUpdating redirect port z to match the server port .),urllibparseurlparser   AF_INETSOCK_STREAM_socketr   r   r   r   r   r   r   
setsockopt
SOL_SOCKETSO_REUSEPORT_is_local_uriportrangeDEFAULT_MAX_ATTEMPTSbindhostnamegaierrorerrorOSErrortimesleepPORT_BIND_TIMEOUTPORT_BIND_MAX_ATTEMPTSlisten	ExceptionclosegetsocknameParseResultr8   r/   r:   r;   r<   r=   _urir'   _redirect_uri)	selfr.   r   r0   
parsed_uriparsed_redirectserver_portattemptexr   r   r   __init__E   s   

	
	zAuthHttpServer.__init__c                 C  s
   | j dv S )N)	localhostz	127.0.0.1)rM   )r.   r   r   r   rH         
zAuthHttpServer._is_local_uric                 C  
   | j  S r   )r[   geturlr\   r   r   r   r0      rd   zAuthHttpServer.redirect_uric                 C  re   r   )rZ   rf   rg   r   r   r   url   rd   zAuthHttpServer.urlc                 C     | j jS r   )rZ   rI   rg   r   r   r   rI         zAuthHttpServer.portc                 C  ri   r   )rZ   rM   rg   r   r   r   rM      rj   zAuthHttpServer.hostnameattemptsattempt_timeoutfloat | None(socket.socket | None, int)c                 C  sT   t |D ]!}t| jgg g |d }|r%|d d ur%| j d |f  S qd |fS r!   )rJ   selectrD   accept)r\   rk   rl   r`   read_socketsr   r   r   	_try_poll   s   zAuthHttpServer._try_pollclient_socketr   bytes | Nonec                 C  s   |d ur	| | t }t|D ]P}z	||| jW   S  tyI   ||d k rG|r/t|dnd}tdd|  d| d| d t	| Y q t
jy`   tdd|  d| d Y qw d S )	Nr5   g      ?z+BlockingIOError raised from socket.recv on r6   z attempt.Waiting for z seconds before trying againzsocket.recv timed out on z	 attempt.)
settimeoutr)   rJ   r   BlockingIOErrorminr   r'   rQ   rR   r   timeout)r\   rs   rk   rl   r   r`   cooldownr   r   r   _try_receive_block   s,   

z!AuthHttpServer._try_receive_blockmax_attemptsrx   float | int | None((list[str] | None, socket.socket | None)c                 C  s   |d u r| j }|d u r| j}	 | jstd|r|| nd }| ||\}}|d u r,dS | ||| |}|rA|dd|fS z|t	j
 W n	 tyR   Y nw |  dS )Nz9Operation is not supported, server was already shut down.NNzutf-8z
)rK   DEFAULT_TIMEOUTrD   RuntimeErrorrr   rz   decodesplitshutdownr   	SHUT_RDWRrP   rW   )r\   r{   rx   rl   rs   poll_attempts	raw_blockr   r   r   receive_block   s2   
zAuthHttpServer.receive_blockc                 C  s   | j r| j   d| _ dS dS )ztCloses the underlying socket.
        After having close() being called the server object cannot be reused.
        N)rD   rW   rg   r   r   r   rW      s   

zAuthHttpServer.closer   c                 C  s   | S )zContext manager.r   rg   r   r   r   	__enter__   s   zAuthHttpServer.__enter__exc_typetype[BaseException] | Noneexc_valBaseException | Noneexc_tbTracebackType | Nonec                 C  s   |    dS )z=Context manager with disposing underlying networking objects.N)rW   )r\   r   r   r   r   r   r   __exit__   s   zAuthHttpServer.__exit__)r-   N)r.   r/   r   r   r0   r1   r   r2   )r   r1   )r   r/   )r   r   )rk   r   rl   rm   r   rn   )rs   r   rk   r   rl   rm   r   rt   r~   )r{   r   rx   r|   r   r}   )r   r2   )r   r   )r   r   r   r   r   r   r   r2   )__name__
__module____qualname____doc__rK   r   rT   rS   rb   staticmethodrH   propertyr0   rh   rI   rM   rr   rz   r   rW   r   r   r   r   r   r   r*   <   s6    W


	

r*   )r   r	   )r   r   )
__future__r   loggingr   ro   r   rQ   urllib.parser?   collections.abcr   typesr   typing_extensionsr   compatr   	getLoggerr   r   r   r)   r*   r   r   r   r   <module>   s   


