U
    be!!                     @   s   d Z ddlZddlZddlZzddlZW n ek
r@   dZY nX 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	constantsZwebhdfs)zwebhdfs://host:port/path/filei   c                 C   s   t t| dS )N)schemeuri)dictSCHEME)Z
uri_as_str r   T/var/www/html/services/stratfitenv/lib/python3.8/site-packages/smart_open/webhdfs.py	parse_uri'   s    r
   c                 C   s   t t|}t| |f|S N)r   Zcheck_kwargsopen)r   modeZ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   ZREAD_BINARYBufferedInputBaseZWRITE_BINARYBufferedOutputBaseNotImplementedErrorsplitname)Zhttp_urir   r   Zfobjr   r   r	   r   0   s    




r   c                 C   sr   t j| }|j}|jr(|d|j7 }|j}|jrV||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)Zwebhdfs_urlZ	split_urinetlocr#   r   r   r	   r   H   s    	r   c                 C   s
   t | jS r   )r   r   )Z
parsed_urir   r   r	   convert_to_http_uric   s    r)   c                   @   sX   e Zd Zdd Z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   c                 C   sH   || _ ddd}tj| j |dd| _| jjtjkr>t| jd| _	d S )NZOPENr   )opoffsetT)paramsstream    )
_urirequestsget	_responsestatus_codehttplibOKWebHdfsExceptionfrom_response_buf)selfr   payloadr   r   r	   __init__h   s    
zBufferedInputBase.__init__c                 C   s   t d dS )zFlush and close this stream.zclose: calledN)loggerdebugr9   r   r   r	   closet   s    zBufferedInputBase.closec                 C   s   dS )z+Return True if the stream can be read from.Tr   r>   r   r   r	   readablex   s    zBufferedInputBase.readablec                 C   s   dS )zyIf False, seek(), tell() and truncate() will raise IOError.

        We offer only seek support, and no truncate support.Fr   r>   r   r   r	   seekable|   s    zBufferedInputBase.seekablec                 C   s
   t jdS )zUnsupported.NioUnsupportedOperationr>   r   r   r	   detach   s    zBufferedInputBase.detachNc                 C   s   |d kr&d| j | jj   | _ }|S |t| j k rX| j |d  | j d |  | _ }|S zN| j g}d}||k r| jjtj}t|dkrq|t|7 }|| qfW n tk
r   Y nX d	|| _ | j |d  | j d |  | _ }|S )Nr.   r   )
r8   r2   rawreadlenrC   DEFAULT_BUFFER_SIZEappendStopIterationjoin)r9   sizeretvalbuffersZ
total_readraw_datar   r   r	   rG      s(      zBufferedInputBase.readr   c                 C   s   | j |dS )zThis is the same as read().)rM   )rG   )r9   rM   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)rG   rH   )r9   bdatar   r   r	   readinto   s
    zBufferedInputBase.readintoc                 C   s   d| j | jj   | _ }|S )Nr.   )r8   r2   rF   readline)r9   rN   r   r   r	   rU      s    zBufferedInputBase.readline)N)r   )__name__
__module____qualname__r;   r?   r@   rA   rE   rG   rQ   rT   rU   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sDt	||j
d }tj|ddd	id
}|jtjksxt	|g | _d| _d| _d| _d| _dS )zs
        Parameters
        ----------
        min_part_size: int, optional
            For writing only.

        FZCREATET)r*   	overwriter,   allow_redirectslocationr   content-typeapplication/octet-streamrS   headersr   N)r/   _closedr   r0   putr3   r4   TEMPORARY_REDIRECTr6   r7   r`   CREATEDlinespartschunk_bytes
total_sizerF   )r9   r   r   r:   init_responseresponser   r   r	   r;      s     



zBufferedOutputBase.__init__c                 C   s   dS )z+Return True if the stream supports writing.Tr   r>   r   r   r	   writable   s    zBufferedOutputBase.writablec                 C   s   t dd S )Nzdetach() not supportedrB   r>   r   r   r	   rE      s    zBufferedOutputBase.detachc                 C   sh   ddi}t j| j|dd}|jtjks0t||jd }t j||ddid}|jtj	ksdt|d S )	Nr*   APPENDFrZ   r\   r]   r^   r_   )
r0   postr/   r3   r4   rc   r6   r7   r`   r5   )r9   rS   r:   ri   r   rj   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rd| j}td| jt|| j	d  | | td| j |  jd7  _g d | _| _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)ra   
ValueError
isinstancebytes	TypeErrorre   rJ   rg   rH   rh   r   rL   r<   inforf   rn   r=   )r9   rR   buffr   r   r	   write   s&    
  
zBufferedOutputBase.writec                 C   sN   d | j}|rDtd| jt|| jd  | | td| j d| _	d S )Nr.   z0uploading last part #%i, %i bytes (total %.3fGB)ro   z upload of last part #%i finishedT)
rL   re   r<   ru   rf   rH   rh   rn   r=   ra   )r9   rv   r   r   r	   r?     s      
zBufferedOutputBase.closec                 C   s   | j S r   )ra   r>   r   r   r	   closed  s    zBufferedOutputBase.closedN)rV   rW   rX   MIN_PART_SIZEr;   rk   rE   rn   rw   r?   propertyrx   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 )
r6   r   Nc                    s$   || _ || _tt| t|  d S r   )msgr3   superr6   r;   repr)r9   r{   r3   	__class__r   r	   r;     s    zWebHdfsException.__init__c                 C   s   d | jj| j| jS )Nz{}(status_code={}, msg={!r}))r"   r   rV   r3   r{   r>   r   r   r	   __repr__  s
      zWebHdfsException.__repr__c                 C   s   | |j |jdS )N)r{   r3   )textr3   )clsrj   r   r   r	   r7   "  s    zWebHdfsException.from_response)r   N)rV   rW   rX   r;   r   classmethodr7   __classcell__r   r   r~   r	   r6     s   r6   )__doc__rC   loggingurllib.parser   r0   ImportErrorZMISSING_DEPSZ
smart_openr   r   http.clientclientr4   	getLoggerrV   r<   r   ZURI_EXAMPLESry   r
   r   r   r   r)   BufferedIOBaser   r   	Exceptionr6   r   r   r   r	   <module>	   s*   

Oa