o
    
i!                     @   s   d Z ddlZddlZddlZzddlZW n ey   dZY nw ddlm	Z	m
Z
 ddlmZ eeZdZdZdZdd	 Zd
d ZefddZdd Zdd ZG dd dejZG dd dejZG dd deZdS )zyImplements reading and writing to/from WebHDFS.

The main entry point is the :func:`~smart_open.webhdfs.open` function.

    NT)utils	constantswebhdfs)zwebhdfs://host:port/path/filei   c                 C   s   t t| dS )N)schemeuri)dictSCHEME)
uri_as_str r
   F/home/ubuntu/.local/lib/python3.10/site-packages/smart_open/webhdfs.py	parse_uri'   s   r   c                 C   s   t t|}t| |fi |S N)r   check_kwargsopen)r   modetransport_paramskwargsr
   r
   r   open_uri+   s   r   c                 C   s^   |  tr	t| } |tjkrt| }n|tjkrt| |d}ntd| | 	dd |_
|S )z
    Parameters
    ----------
    http_uri: str
        webhdfs url converted to http REST url
    min_part_size: int, optional
        For writing only.

    )min_part_sizez+webhdfs support for mode %r not implemented/)
startswithr   _convert_to_http_urir   READ_BINARYBufferedInputBaseWRITE_BINARYBufferedOutputBaseNotImplementedErrorsplitname)http_urir   r   fobjr
   r
   r   r   0   s   




r   c                 C   sr   t j| }|j}|jr|d|j7 }|j}|jr+||rdndd t j|j 7 }t j	d|d|j
 |dfS )z
    Convert webhdfs uri to http url and return it as text

    Parameters
    ----------
    webhdfs_url: str
        A URL starting with webhdfs://
    z:{}& z
user.name=httpz/webhdfs/v1)urllibparseurlsplithostnameportformatqueryusernamequote
urlunsplitpath)webhdfs_url	split_urinetlocr+   r
   r
   r   r   H   s   	r   c                 C   s
   t | jS r   )r   r   )
parsed_urir
   r
   r   convert_to_http_uric      
r4   c                   @   sh   e Zd ZdZdd Zdd Zedd Zdd	 Zd
d Z	dd Z
dddZdddZdd Zdd ZdS )r   Nc                 C   sH   || _ ddd}tj| j |dd| _| jjtjkrt| jd| _	d S )NOPENr   )opoffsetT)paramsstream    )
_urirequestsget	_responsestatus_codehttplibOKWebHdfsExceptionfrom_response_buf)selfr   payloadr
   r
   r   __init__j   s   

zBufferedInputBase.__init__c                 C   s   t d | jsd| _dS dS )zFlush and close this stream.zclose: calledN)loggerdebugclosedrE   rF   r
   r
   r   closev   s   

zBufferedInputBase.closec                 C   s
   | j d u S r   )rE   rL   r
   r
   r   rK   |   s   
zBufferedInputBase.closedc                 C      dS )z+Return True if the stream can be read from.Tr
   rL   r
   r
   r   readable      zBufferedInputBase.readablec                 C   rN   )zyIf False, seek(), tell() and truncate() will raise IOError.

        We offer only seek support, and no truncate support.Fr
   rL   r
   r
   r   seekable   s   zBufferedInputBase.seekablec                 C   s   t j)zUnsupported.ioUnsupportedOperationrL   r
   r
   r   detach      zBufferedInputBase.detachc                 C   s   |d u rd| j | jj  | _ }|S |t| j k r,| j |d  | j d | | _ }|S z*| j g}d}||k rU| jjtj}t|dkrFn|t|7 }|| ||k s7W n	 ty_   Y nw d	|| _ | j |d  | j d | | _ }|S )Nr;   r   )
rE   r?   rawreadlenrS   DEFAULT_BUFFER_SIZEappendStopIterationjoin)rF   sizeretvalbuffers
total_readraw_datar
   r
   r   rX      s.    
	 zBufferedInputBase.readr   c                 C   s   | j |dS )zThis is the same as read().)r^   )rX   )rF   r^   r
   r
   r   read1   s   zBufferedInputBase.read1c                 C   s.   |  t|}|sdS ||dt|< t|S )zLRead up to len(b) bytes into b, and return the number of bytes
        read.r   N)rX   rY   )rF   bdatar
   r
   r   readinto   s
   zBufferedInputBase.readintoc                 C   s   d| j | jj  | _ }|S )Nr;   )rE   r?   rW   readline)rF   r_   r
   r
   r   rg      s   zBufferedInputBase.readliner   )r   )__name__
__module____qualname__rE   rH   rM   propertyrK   rO   rQ   rU   rX   rc   rf   rg   r
   r
   r
   r   r   g   s    
	

	r   c                   @   sL   e Zd ZefddZdd Zdd Zdd Zd	d
 Zdd Z	e
dd ZdS )r   c                 C   s   || _ d| _|| _ddd}tj| j |dd}|jtjks"t	||j
d }tj|ddd	id
}|jtjks<t	|g | _d| _d| _d| _dS )zs
        Parameters
        ----------
        min_part_size: int, optional
            For writing only.

        FCREATET)r7   	overwriter9   allow_redirectslocationr#   content-typeapplication/octet-streamre   headersr   N)r<   _closedr   r=   putr@   rA   TEMPORARY_REDIRECTrC   rD   rt   CREATEDlinespartschunk_bytes
total_size)rF   r   r   rG   init_responseresponser
   r
   r   rH      s   




zBufferedOutputBase.__init__c                 C   rN   )z+Return True if the stream supports writing.Tr
   rL   r
   r
   r   writable   rP   zBufferedOutputBase.writablec                 C   s
   t d)Nzdetach() not supportedrR   rL   r
   r
   r   rU      r5   zBufferedOutputBase.detachc                 C   sh   ddi}t j| j|dd}|jtjkst||jd }t j||ddid}|jtj	ks2t|d S )	Nr7   APPENDFrn   rp   rq   rr   rs   )
r=   postr<   r@   rA   rw   rC   rD   rt   rB   )rF   re   rG   r}   r   r~   r
   r
   r   _upload   s   


zBufferedOutputBase._uploadc                 C   s   | j rtdt|tstd| j| |  jt|7  _|  j	t|7  _	| j| j
kr^d| j}td| jt|| j	d  | | td| j |  jd7  _g d| _| _d	S d	S )
z`
        Write the given bytes (binary string) into the WebHDFS file from constructor.

        zI/O operation on closed filezinput must be a binary stringr;   z+uploading part #%i, %i bytes (total %.3fGB)      Azupload of part #%i finished   r   N)ru   
ValueError
isinstancebytes	TypeErrorry   r[   r{   rY   r|   r   r]   rI   inforz   r   rJ   )rF   rd   buffr
   r
   r   write   s$   

zBufferedOutputBase.writec                 C   sN   d | j}|r"td| jt|| jd  | | td| j d| _	d S )Nr;   z0uploading last part #%i, %i bytes (total %.3fGB)r   z upload of last part #%i finishedT)
r]   ry   rI   r   rz   rY   r|   r   rJ   ru   )rF   r   r
   r
   r   rM   
  s   

zBufferedOutputBase.closec                 C   s   | j S r   )ru   rL   r
   r
   r   rK     rV   zBufferedOutputBase.closedN)rh   ri   rj   MIN_PART_SIZErH   r   rU   r   r   rM   rk   rK   r
   r
   r
   r   r      s    r   c                       s2   e Zd Zd	 fdd	Zdd Zedd Z  ZS )
rC   r#   Nc                    s$   || _ || _tt| t|  d S r   )msgr@   superrC   rH   repr)rF   r   r@   	__class__r
   r   rH     s   zWebHdfsException.__init__c                 C   s   d | jj| j| jS )Nz{}(status_code={}, msg={!r}))r*   r   rh   r@   r   rL   r
   r
   r   __repr__   s   zWebHdfsException.__repr__c                 C   s   | |j |jdS )N)r   r@   )textr@   )clsr~   r
   r
   r   rD   %  s   zWebHdfsException.from_response)r#   N)rh   ri   rj   rH   r   classmethodrD   __classcell__r
   r
   r   r   rC     s
    rC   )__doc__rS   loggingurllib.parser%   r=   ImportErrorMISSING_DEPS
smart_openr   r   http.clientclientrA   	getLoggerrh   rI   r   URI_EXAMPLESr   r   r   r   r   r4   BufferedIOBaser   r   	ExceptionrC   r
   r
   r
   r   <module>   s.   
W\