o
    5@Hh%                     @   s   d dl Z d dlZd dlZd dlZd dlmZm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mZmZmZmZmZm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!Z"G dd deZ#dS )    N)ABCabstractmethod)IOBase)system)PIPE)sleep)IOAnyListMappingOptionalUnioncast)request)URLError)WebDriverException)SubprocessStdAlias)utilsc                   @   s  e Zd ZdZ					d'dee dedee deee	e	f  dee d	dfd
dZ
ed	efddZed	ee fddZed	efddZejded	dfddZd(ddZd(ddZd	efddZd(ddZd(ddZd(ddZd(d d!Zd"ed	dfd#d$Zd	ee fd%d&ZdS ))Servicea  The abstract base class for all service objects.  Services typically
    launch a child program in a new process as an interim process to
    communicate with a browser.

    :param executable: install path of the executable.
    :param port: Port for the service to run on, defaults to 0 where the operating system will decide.
    :param log_output: (Optional) int representation of STDOUT/DEVNULL, any IO instance or String path to file.
    :param env: (Optional) Mapping of environment variables for the new process, defaults to `os.environ`.
    :param driver_path_env_key: (Optional) Environment variable to use to get the path to the driver executable.
    Nr   executable_pathport
log_outputenvdriver_path_env_keyreturnc                 K   s   t |trttt|ddd| _n,|tjkr#ttt	t
tf  d | _n|d u s,|tjkr:ttt	t
tf  tj| _n|| _|pBt | _|di | _| jdd| _|pWtj| _|| _|  pa|| _d S )Nza+zutf-8)encodingpopen_kwcreation_flagsr   )
isinstancestrr   r   openr   
subprocessSTDOUTr   r   intDEVNULLr   	free_portr   popr   r   osenvironr   DRIVER_PATH_ENV_KEYenv_path_path)selfr   r   r   r   r   kwargs r.   a/home/air/sanwanet/gpt-api/venv/lib/python3.10/site-packages/selenium/webdriver/common/service.py__init__1   s   
	
zService.__init__c                 C   s   dt d| j S )zGets the url of the Service.zhttp://	localhost)r   join_host_portr   r,   r.   r.   r/   service_urlK   s   zService.service_urlc                 C   s   t d)z7A List of program arguments (excluding the executable).z2This method needs to be implemented in a sub class)NotImplementedErrorr3   r.   r.   r/   command_line_argsP   s   zService.command_line_argsc                 C   s
   | j pdS )N )r+   r3   r.   r.   r/   pathU   s   
zService.pathvaluec                 C   s   t || _d S N)r   r+   )r,   r9   r.   r.   r/   r8   Y   s   c                 C   sp   | j du r	td| | j  d}	 |   |  rdS ttdd|  d |d7 }|d	kr7td
| j  q)zStarts the Service.

        :Exceptions:
         - WebDriverException : Raised either when it can't start the service
           or when it can't connect to the service
        NService path cannot be None.r   Tg{Gz?g?g      ?   F   zCan not connect to the Service )r+   r   _start_processassert_process_still_runningis_connectabler   min)r,   countr.   r.   r/   start]   s   
zService.startc                 C   s(   | j  }|rtd| j d| dS )z1Check if the underlying process is still running.zService z' unexpectedly exited. Status code was: N)processpollr   r+   )r,   return_coder.   r.   r/   r?   s   s   
z$Service.assert_process_still_runningc                 C   s   t | jS )zfEstablishes a socket connection to determine if the service running
        on the port is accessible.)r   r@   r   r3   r.   r.   r/   r@   y   s   zService.is_connectablec                 C   sT   zt | j d W n
 ty   Y dS w tdD ]}|  s# dS td qdS )zcDispatch an HTTP request to the shutdown endpoint for the service in
        an attempt to stop it.z	/shutdownN   r<   )r   urlopenr4   r   ranger@   r   )r,   _r.   r.   r/   send_remote_shutdown_command~   s   
z$Service.send_remote_shutdown_commandc                 C   s   | j ttjhvr t| j tr| j   nt| j tr t| j  | j	durP| j	
 du rRzz|   W n	 ty<   Y nw W |   dS W |   dS |   w dS dS )zStops the service.N)r   r   r!   r$   r   r   closer#   r'   rD   rE   rK   	TypeError_terminate_processr3   r.   r.   r/   stop   s    zService.stopc              	   C   s   zM| j j| j j| j j}}}|||fD ]}z|  W q ty%   Y qw | j   z
| j d W W dS  tj	yM   t
jddd | j   Y W dS w  ty^   t
jddd Y dS w )a#  Terminate the child process.

        On POSIX this attempts a graceful SIGTERM followed by a SIGKILL,
        on a Windows OS kill is an alias to terminate.  Terminating does
        not raise itself if something has gone wrong but (currently)
        silently ignores errors here.
        <   zTService process refused to terminate gracefully with SIGTERM, escalating to SIGKILL.T)exc_infoz"Error terminating service process.N)rD   stdinstdoutstderrrL   AttributeError	terminatewaitr!   TimeoutExpiredloggererrorkillOSError)r,   rR   rS   rT   streamr.   r.   r/   rN      s0   

zService._terminate_processc                 C   s$   z|    W d S  ty   Y d S w r:   )rO   	Exceptionr3   r.   r.   r/   __del__   s
   zService.__del__r8   c                 C   s4  |g}| |   | jdt dk}zTd}t dkr+t }tjtjB |_	tj
|_tj|f| j|tttttt f  | jtttttt f  | jt| j|d| j| _td| j| jj| j| j W dS  typ     ty } z|jtjkr| jdu rt dt dt!j"#| j d| d}~ww )	zmCreates a subprocess by executing the command provided.

        :param cmd: full command to execute
        	close_fdsWindowsN)r   r`   rS   rT   rR   creationflagsstartupinfozNStarted executable: `%s` in a child process with pid: %s using %s to output %sr;   'z(' executable may have wrong permissions.)$extendr6   r   r&   r   r!   STARTUPINFOCREATE_NEW_CONSOLESTARTF_USESHOWWINDOWdwFlagsSW_HIDEwShowWindowPopenr   r   r   r   r#   r   r	   r   r   r   rD   rY   debugr+   pidrM   r\   errnoEACCESr   r'   r8   basename)r,   r8   cmdclose_file_descriptors
start_infoerrr.   r.   r/   r>      sV   
	

zService._start_processc                 C   s   | j r
t| j d S d S r:   )r)   r'   getenvr3   r.   r.   r/   r*      s   zService.env_path)Nr   NNN)r   N)__name__
__module____qualname____doc__r   r   r#   r   r   r	   r0   propertyr4   r   r
   r6   r8   setterrC   r?   boolr@   rK   rO   rN   r_   r>   r*   r.   r.   r.   r/   r   %   sJ    






,r   )$ro   loggingr'   r!   abcr   r   ior   platformr   r   timer   typingr   r	   r
   r   r   r   r   urllibr   urllib.errorr   selenium.common.exceptionsr   selenium.typesr   selenium.webdriver.commonr   	getLoggerrw   rY   r   r.   r.   r.   r/   <module>   s"   $
