U
    be                     @   s   d 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
Z
eeZdZdZdZdd Zd	d
 Zdd Zdd Zdd ZddddeddfddZdS )z!Implements I/O streams over FTP.
    N)FTPFTP_TLSerror_reply)ftpftps   )zftp://username@host/path/filez&ftp://username:password@host/path/filez+ftp://username:password@host:port/path/filezftps://username@host/path/filez'ftps://username:password@host/path/filez,ftps://username:password@host:port/path/filec                 C   s   | ot j| S N)urllibparseunquote)text r   P/var/www/html/services/stratfitenv/lib/python3.8/site-packages/smart_open/ftp.py_unquote$   s    r   c                 C   sN   t j| }|jtkstt|jt|jt|j	|j
t|jp>tt|jdS )N)schemeuri_pathuserhostportpassword)r	   r
   urlsplitr   SCHEMESAssertionErrordictr   pathusernamehostnameintr   DEFAULT_PORTr   )Zuri_as_stringZ	split_urir   r   r   	parse_uri(   s    r   c                 C   sR   t jt| t| }|d}|d}|dkr6dnd}t||f||d|S )Nr   r   r   TF)secure_connectiontransport_params)
smart_openutilsZcheck_kwargsopenr   pop)urimoder!   Z
parsed_urir   r   Zsecure_connr   r   r   open_uri5   s    

r(   c                    sF   dddg  fdd| D } fdd|   D }|rBtd| |S )	Ntimeoutsource_addressencodingc                    s   g | ]}| kr|qS r   r   ).0kZsupported_keywordsr   r   
<listcomp>J   s      z4convert_transport_params_to_args.<locals>.<listcomp>c                    s   i | ]\}}| kr||qS r   r   )r,   r-   vr.   r   r   
<dictcomp>K   s       z4convert_transport_params_to_args.<locals>.<dictcomp>z.ignoring unsupported ftp keyword arguments: %r)itemsloggerwarning)r!   Zunsupported_keywordskwargsr   r.   r    convert_transport_params_to_argsD   s     r6   c           	   
   C   s   t |}|rtf |}n
tf |}z|| | W n0 tk
rb } ztd |W 5 d }~X Y nX z||| W n0 tk
r } ztd |W 5 d }~X Y nX |r|	  |S )Nz@Unable to connect to FTP server: try checking the host and port!zFUnable to login to FTP server: try checking the username and password!)
r6   r   r   connect	Exceptionr3   errorloginr   Zprot_p)	r   r   r   r   r    r!   r5   r   er   r   r   _connectU   s&    

r<   rbFc                 C   s   |st d|st d|s i }t||||||}dddd}	z|	| \}
}W n" tk
rp   t d|Y nX |	| \}
}|d ||
 d	|  }||}d
d }|j|_||_||_	t
|||_|S )ai  Open a file for reading or writing via FTP/FTPS.

    Parameters
    ----------
    path: str
        The path on the remote server
    mode: str
        Must be "rb" or "wb"
    host: str
        The host to connect to
    user: str
        The username to use for the connection
    password: str
        The password for the specified username
    port: int
        The port to connect to
    secure_connection: bool
        True for FTPS, False for FTP
    transport_params: dict
        Additional parameters for the FTP connection.
        Currently supported parameters: timeout, source_address, encoding.
    z'you must specify the host to connect tozyou must specify the user)ZRETRr=   )ZSTORwb)ZAPPEr>   )r=   r>   abzunsupported mode: zTYPE I c                 S   s    |    | j  | j  d S r   )
orig_closesocketcloseconn)selfr   r   r   
full_close   s    
zopen.<locals>.full_close)
ValueErrorr<   KeyErrorvoidcmdZtransfercmdmakefilerC   rA   rB   rD   types
MethodType)r   r'   r   r   r   r   r    r!   rD   Zmode_to_ftp_cmdsZftp_modeZfile_obj_moderB   ZfobjrF   r   r   r   r$   l   s2     

r$   )__doc__loggingurllib.parser	   Zsmart_open.utilsr"   ftplibr   r   r   rK   	getLogger__name__r3   r   r   ZURI_EXAMPLESr   r   r(   r6   r<   r$   r   r   r   r   <module>	   s,   

