o
    NK&h                     @  s   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
mZmZ d dlmZ d dlmZ dd	d!ddZdddd"ddZd#ddZd$dd ZdS )%    )annotationsN)
ip_address)Path)AnyOptionalUnion)ServerError)HTTPd   backloghoststrportintreturnsocket.socketc                C  s   | |f}zt | }t|} t|jdkrtjntj}W n ty)   t }Y nw |tjtj	d |
| || |d |S )zCreate TCP server socket.
    :param host: IPv4, IPv6 or hostname may be specified
    :param port: TCP port number
    :param backlog: Maximum number of connections to queue
    :return: socket.socket object
          T)r   r   socketversionAF_INET6AF_INET
ValueError
setsockopt
SOL_SOCKETSO_REUSEADDRbindlistenset_inheritable)r   r   r   locationipsock r#   F/var/www/html/venv/lib/python3.10/site-packages/sanic/server/socket.pybind_socket   s   


r%   i  )moder   pathUnion[Path, str]c             	   C  s   t | } | j}| std| zt|  js"td|  W n	 ty,   Y nw | 	| j
 dt  }ttj}z&||  z|| || ||  W W |S    z|  W      z|  W   )zCreate unix socket.
    :param path: filesystem path
    :param backlog: Maximum number of connections to queue
    :return: socket.socket object
    zSocket folder does not exist: zExisting file is not a socket: .)r   parentis_dirFileNotFoundErrorstatS_ISSOCKlstatst_modeFileExistsError	with_namenamesecretstoken_urlsafer   AF_UNIXr   as_posixchmodr   renameunlinkclose)r'   r&   r   foldertmp_pathr"   r#   r#   r$   bind_unix_socket'   s8   




r>   Optional[Union[Path, str]]Nonec              	   C  s   | sdS zJt | } t|  jrLttj*}z	||   W n t	y.   | 
  Y n
w W d   W dS W d   W dS 1 sDw   Y  W dS W dS  tyX   Y dS w )z+Remove dead unix socket during server exit.N)r   r-   r.   r/   r0   r   r6   connectr7   ConnectionRefusedErrorr:   r,   )r'   testsockr#   r#   r$   remove_unix_socketR   s&   &rD   server_settingsdict[str, Any]Optional[socket.SocketType]c              
   C  s   |  dtju r
d S |  d}| d }| d }|r)t| }t||d}|| d< |d u rezt| d | d |d}W n tyS } ztd| d	}d
|_	|d }~ww |
d
 || d< d | d< d | d< |S )Nr   r"   unixr   r   r   r   zSanic server could not start: z.

This may have happened if you are running Sanic in the global scope and not inside of a `if __name__ == "__main__"` block.

See more information: https://sanic.dev/en/guide/deployment/manager.html#how-sanic-server-starts-processes
T)getr	   	VERSION_3r   absoluter>   r%   OSErrorr   quietr   )rE   r"   rH   r   eerrorr#   r#   r$   configure_socketc   s:   



rP   )r   r   r   r   r   r   )r'   r(   r   r   )r'   r?   r   r@   )rE   rF   r   rG   )
__future__r   r4   r   r-   	ipaddressr   pathlibr   typingr   r   r   sanic.exceptionsr   sanic.http.constantsr	   r%   r>   rD   rP   r#   r#   r#   r$   <module>   s    
+