U
    =g6                     @  s  U d dl mZ d dlZd dlZd dlmZ d dlZd dl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 d dlmZ d dl
mZ d dlmZmZmZmZ d dlmZ d d	lmZ d d
lm Z  erd dlm!Z! d dlm"Z" e#e$Z%de	j&kZ'de(d< e'reefnee
j)fZ*de(d< G dd dej+Z,e, Z-de(d< G dd dZ.G dd dZ/G dd de/Z0G dd de/Z1G dd de/Z2G dd  d e/Z3G d!d" d"e/Z4G d#d$ d$e/Z5G d%d& d&Z6G d'd( d(Z7d(d)d*d+Z8d,d)d-d.Z9dS )/    )annotationsN)abstractmethod)BytesIO)Path)_TemporaryFileWrapper)TYPE_CHECKINGAnyCallableClassVar)request)unquote)
httpConfig)HTTPResponse)SplitResultzgoogle.appengineboolGAEztuple[type, Any]
STRATEGIESc                   @  s6   e Zd ZU g Zded< ddddZddddZd	S )
TmpFilesz,ClassVar[list[_TemporaryFileWrapper[bytes]]]filesNonereturnc                 C  s   | j | d S N)r   appendselffile r   3/tmp/pip-unpacked-wheel-d1lgvatt/xhtml2pdf/files.pyr   %   s    zTmpFiles.appendc                 C  s"   | j D ]}|  q| j   d S r   )r   closeclearr   r   r   r   
cleanFiles(   s    

zTmpFiles.cleanFilesN)__name__
__module____qualname__r   __annotations__r   r!   r   r   r   r   r   "   s   
r   	files_tmpc                   @  s   e Zd ZU dZeZdZded< defddddd	d
ZddddZddddZ	ddddZ
ddddZddddZdddddZdS )pisaTempFileaX  
    A temporary file implementation that uses memory unless
    either capacity is breached or fileno is requested, at which
    point a real temporary file will be created and the relevant
    details returned
    If capacity is -1 the second strategy will never be used.
    Inspired by:
    http://code.activestate.com/recipes/496744/.
    i (  intCAPACITY strr   )buffercapacityr   c                 C  sp   d| _ || _tt|| jk| _z| j| j  | _W n" tk
rV   | jd  | _Y nX | | | 	d dS )z
        Creates a TempFile object containing the specified buffer.
        If capacity is specified, we use a real temporary file once the
        file gets larger than that size.  Otherwise, the data is stored
        in memory.
        Nr   )
namer-   r(   lenstrategyr   	_delegate
IndexErrorwriteseek)r   r,   r-   r   r   r   __init__@   s    
zpisaTempFile.__init__r   c                 C  sb   | j dkr^z8| jd  }||   || _d| _ td| j W n tk
r\   d| _	Y nX dS )zf
        Switch to next strategy. If an error occurred,
        stay with the first strategy.
        r      zCreated temporary file %sN)
r0   r   r3   getvaluer1   logwarningr.   	Exceptionr-   )r   Znew_delegater   r   r   makeTempFileS   s    
zpisaTempFile.makeTempFile
str | Nonec                 C  s   |    | jS )zGet a named temporary file.)r<   r.   r   r   r   r   getFileNameb   s    zpisaTempFile.getFileNamec                 C  s   |    | j S )z
        Forces this buffer to use a temporary file as the underlying.
        object and returns the fileno associated with it.
        )r<   r1   filenor>   r   r   r   r@   g   s    zpisaTempFile.filenobytesc                 C  sL   | j dkr| j S | j  | jd | j }t|tsH|d}|S )zc
        Get value of file. Work around for second strategy.
        Always returns bytes.
        r   utf-8)	r0   r1   r8   flushr4   read
isinstancerA   encode)r   valuer   r   r   r8   o   s    





zpisaTempFile.getvaluezbytes | str)rG   c                 C  sz   | j dkrV| jdkrVt|}|| j kr,d}n| dd |  | | j k}|rV|   t|tsj|d}| j	
| dS )zEIf capacity != -1 and length of file > capacity it is time to switch.r   T   rB   N)r-   r0   r/   r4   tellr<   rE   rA   rF   r1   r3   )r   rG   Z	len_valueZneeds_new_strategyr   r   r   r3   }   s    


zpisaTempFile.writer   )r.   r   c              
   C  sX   zt | j|W S  tk
rR } z&dt| j d| d}t||W 5 d }~X Y nX d S )Nzobject 'z' has no attribute '')getattrr1   AttributeErrortyper"   )r   r.   emsgr   r   r   __getattr__   s
    zpisaTempFile.__getattr__N)r"   r#   r$   __doc__r   r)   r%   r5   r<   r?   r@   r8   r3   rP   r   r   r   r   r'   1   s   

r'   c                   @  sv   e Zd ZddddddZeddd	d
ZddddZddddZddddZddddZ	ddddZ
dS )BaseFiler+   r=   r   pathbasepathr   c                 C  s"   || _ || _d | _d | _d | _d S r   rT   rU   mimetypesuffixurir   rT   rU   r   r   r   r5      s
    zBaseFile.__init__bytes | Noner   c                 C  s   t d S r   )NotImplementedErrorr>   r   r   r   extract_data   s    zBaseFile.extract_datac              
   C  sR   z
|   W S  tk
rL } z$tdt|j|t| j| j W 5 d }~X Y nX d S )Nz(%s: %s while extracting data from %s: %r)r]   r;   r9   errorrM   r"   rY   )r   rN   r   r   r   get_data   s    
zBaseFile.get_datastr | Path | Nonec                 C  s   | j S r   )rY   r>   r   r   r   get_uri   s    zBaseFile.get_uric                 C  s   | j S r   )rW   r>   r   r   r   get_mimetype   s    zBaseFile.get_mimetypez_TemporaryFileWrapper[bytes]c                 C  sL   |   }tj| jd}|r6|| |  t| | jd krH|j	| _|S )N)rX   )
r_   tempfileNamedTemporaryFilerX   r3   rC   r&   r   rT   r.   )r   datatmp_filer   r   r   get_named_tmp_file   s    


zBaseFile.get_named_tmp_filezBytesIO | Nonec                 C  s   |   }|rt|S d S r   )r_   r   )r   re   r   r   r   get_BytesIO   s    zBaseFile.get_BytesION)r"   r#   r$   r5   r   r]   r_   ra   rb   rg   rh   r   r   r   r   rR      s   rR   c                   @  s$   e Zd ZU ded< ddddZdS )B64InlineURIlistmime_paramsr[   r   c                 C  s   | j d}| j dr.d| j ks.t|dkr:d}t||d }|d tdd  d}|d |dd   | _| _t|d}t	
|S )	Nzbase64,data:rH   z$Base64-encoded data URI is malformedr6   r   ;rB   )rT   split
startswithr/   RuntimeErrorrW   rk   urllib_unquoterF   base64	b64decode)r   partsrO   re   mimeZb64r   r   r   r]      s    

zB64InlineURI.extract_dataN)r"   r#   r$   r%   r]   r   r   r   r   ri      s   
ri   c                   @  s   e Zd ZddddZdS )LocalProtocolURIr[   r   c                 C  s`   | j r\| jdr\t| j | jdd  | _t| j}| 	dd
dd | _| S d S )N/r6   Content-Typer*   rm   r   )rU   rT   ro   urlparseurljoinrY   r   urlopeninfogetrn   rW   rD   )r   ZurlResponser   r   r   r]      s    zLocalProtocolURI.extract_dataNr"   r#   r$   r]   r   r   r   r   rv      s   rv   c                      sP   e Zd Zdddd fddZddd	d
ZddddZddddZ  ZS )NetworkFileUrir+   r=   r   rS   c                   s   t  || d| _d| _d S )N   r   )superr5   attemptsactual_attemptsrZ   	__class__r   r   r5      s    zNetworkFileUri.__init__r[   r   c                 C  s   d }| j | jkr||d kr||  jd7  _z|  }W q tk
rx } z(tdt|j|t| j| j| j W 5 d }~X Y qX q|S )Nr6   z6%s: %s while extracting data from %s: %r on attempt %d)	r   r   r]   r;   r9   r^   rM   r"   rY   )r   re   rN   r   r   r   r_      s    zNetworkFileUri.get_dataztuple[bytes | None, bool]c           	      C  s   t d| d }d}t|}|d }|d }||d rFd|d  nd7 }d }|drjtj|ft}n
t|}|	d	| |
 }|j|jfd
kr|dddd | _| }|ddkrd}nt d|j|j ||fS )Nz#Sending request for %r with httplibFr6   rH   r   ?r*   zhttps://GET)   OKrx   rm   r   zcontent-encodinggzipTzReceived non-200 status: %d %s)r9   debugry   urlsplitro   httplibHTTPSConnectionr   HTTPConnectionr   getresponsestatusreason	getheaderrn   rW   rD   )	r   rY   re   is_gzipZurl_splittedserverrT   connZr1r   r   r   get_httplib  s(    


zNetworkFileUri.get_httplibc                 C  sl   | j r$| jds$t| j | j}n| j}|| _| |\}}|r\|r\tjdt	|d
 }td| |S )Nhttprb)modefileobjzUri parsed: %r)rU   rT   ro   ry   rz   rY   r   r   GzipFiler   rD   r9   r   )r   rY   re   r   r   r   r   r]     s    zNetworkFileUri.extract_data)r"   r#   r$   r5   r_   r   r]   __classcell__r   r   r   r   r      s   r   c                   @  s,   e Zd ZeddddZddddZdS )	LocalFileURIr=   r   c                 C  s,   t t| d }|dk	r(|dd }|S )zGuess the mime type.r   Nrm   )	mimetypes
guess_typer+   rn   )r.   rW   r   r   r   guess_mimetype(  s    zLocalFileURI.guess_mimetyper[   c              	   C  s   d }t d t| j}d }| jd k	r4t| j| nt | }| rR| sR|}| r|| _|j| _| 	|| _
| j
r| j
drt|dd}| d}W 5 Q R X nt|d}| }W 5 Q R X |S )Nz-Unrecognized scheme, assuming local file pathtextrB   )encodingr   )r9   r   r   rT   rU   existsis_filerY   rX   r   rW   ro   openrD   rF   )r   re   rT   rY   Zfile_handlerr   r   r   r]   0  s"    

"zLocalFileURI.extract_dataN)r"   r#   r$   staticmethodr   r]   r   r   r   r   r   '  s   r   c                   @  s   e Zd ZddddZdS )BytesFileUrir[   r   c                 C  s   | j | _| j dS )NrB   )rT   rY   rF   r>   r   r   r   r]   F  s    zBytesFileUri.extract_dataNr~   r   r   r   r   r   E  s   r   c                      s8   e Zd ZddddZ fddZdddd	Z  ZS )
LocalTmpFiler   r   c                 C  s"   || _ d | _|| _d | _d | _d S r   rV   rZ   r   r   r   r5   L  s
    zLocalTmpFile.__init__c                   s    t   }| jd kr|j| _|S r   )r   rg   rT   r.   )r   rf   r   r   r   rg   S  s    

zLocalTmpFile.get_named_tmp_filer[   c              
   C  sB   | j d krd S | j | _t| j d}| W  5 Q R  S Q R X d S )Nr   )rT   rY   r   rD   )r   archr   r   r   r]   Y  s
    
zLocalTmpFile.extract_data)r"   r#   r$   r5   rg   r]   r   r   r   r   r   r   K  s   r   c                   @  s   e Zd ZedddZdS )FileNetworkManagerNc                 C  s   | d krt | |S t| tr(t| |}n| dr>t| |}nl|rZt| jsZt|}n
t| }t	d||j |jdkrt
| |}n |jdkrt| |}n
t| |}|S )Nrl   zURLParts: %r, %rr   >   httpsr   )r   rE   rA   r   ro   ri   ry   schemer9   r   rv   r   r   )rY   rU   instanceZurlPartsr   r   r   get_managerb  s     






zFileNetworkManager.get_manager)N)r"   r#   r$   r   r   r   r   r   r   r   a  s   r   c                   @  s   e Zd ZddddddddZd	d
ddZdd
ddZd	d
ddZdd
ddZdd
ddZdd
ddZ	dd Z
dd ZdS )pisaFileObjectNr`   r=   zCallable | Noner   )rY   rU   callbackr   c                 C  sT   || _ || _|r*||| }r*|| _ d | _td| j | j tj| j | jd| _d S )NzFileObject %r, Basepath: %r)rU   )rY   rU   r9   r   r   r   r   )r   rY   rU   r   newr   r   r   r5   {  s     zpisaFileObject.__init__r[   r   c                 C  s
   | j  S r   r   r_   r>   r   r   r   getFileContent  s    zpisaFileObject.getFileContentc                 C  s   | j  }|r|jS d S r   )r   rg   r.   )r   fr   r   r   getNamedFile  s    
zpisaFileObject.getNamedFilec                 C  s
   | j  S r   r   r>   r   r   r   getData  s    zpisaFileObject.getDataz&BytesIO | _TemporaryFileWrapper | Nonec                 C  s   t r| j S | j S r   )r   r   rh   rg   r>   r   r   r   getFile  s    
zpisaFileObject.getFilec                 C  s
   | j  S r   )r   rb   r>   r   r   r   getMimeType  s    zpisaFileObject.getMimeTyper   c                 C  s   |   d kS r   )r   r>   r   r   r   notFound  s    zpisaFileObject.notFoundc                 C  s
   | j  S r   )r   ra   r>   r   r   r   
getAbsPath  s    zpisaFileObject.getAbsPathc                 C  s
   | j  S r   )r   rh   r>   r   r   r   
getBytesIO  s    zpisaFileObject.getBytesIO)NN)r"   r#   r$   r5   r   r   r   r   r   r   r   r   r   r   r   r   r   z  s     r   r   c                  O  s
   t | |S r   )r   )akwr   r   r   r     s    r   r   c                   C  s   t   d S r   )r&   r!   r   r   r   r   r!     s    r!   ):
__future__r   rr   r   http.clientclientr   loggingr   sysrc   	threadingurllib.parseparsery   abcr   ior   pathlibr   r   typingr   r   r	   r
   urllibr   r   rq   Zxhtml2pdf.config.httpconfigr   r   r   	getLoggerr"   r9   modulesr   r%   rd   r   localr   r&   r'   rR   ri   rv   r   r   r   r   r   r   r   r!   r   r   r   r   <module>   sN    

e2
>/