U
    ?e2                     @   s  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
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 dejkZedZereefZn
ee	jfZG d	d
 d
e
jZe Z G dd de!Z"G dd dZ#G dd de#Z$G dd de#Z%G dd de#Z&G dd de#Z'G dd de#Z(G dd de#Z)G dd dZ*G dd dZ+dd  Z,d!d" Z-dS )#    N)BytesIO)Path)request)unquote)
httpConfigzgoogle.appengineZ	xhtml2pdfc                   @   s    e Zd Zg Zdd Zdd ZdS )TmpFilesc                 C   s   | j | d S N)filesappendselffile r   3/tmp/pip-unpacked-wheel-35p66c5k/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	   r
   r   r   r   r   r   r      s   r   c                   @   sV   e Zd ZdZeZdZdefddZdd Zdd	 Zd
d Z	dd Z
dd Zdd ZdS )pisaTempFileaW  
    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 (   c                 C   sp   d| _ || _tt|| jk| _z| j| j  | _W n" tk
rV   | jd  | _Y nX | | | 	d dS )zCreates 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   )
namecapacityintlenstrategy
STRATEGIES	_delegate
IndexErrorwriteseek)r   bufferr   r   r   r   __init__=   s    
zpisaTempFile.__init__c                 C   sZ   | j dkrVz8| jd  }||   || _d| _ td| j W n   d| _Y nX dS )zd
        Switch to next startegy. If an error occured,
        stay with the first strategy
        r      zCreated temporary file %sN)	r   r   r    getvaluer   logwarningr   r   )r   Znew_delegater   r   r   makeTempFileO   s    
zpisaTempFile.makeTempFilec                 C   s   |    | jS )z,
        Get a named temporary file
        )r)   r   r   r   r   r   getFileName_   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)   r   filenor*   r   r   r   r,   g   s    zpisaTempFile.filenoc                 C   sL   | j dkr| j S | j  | jd | j }t|tsH|d}|S )zb
        Get value of file. Work around for second strategy.
        Always returns bytes
        r   utf-8)	r   r   r&   flushr!   read
isinstancebytesencode)r   valuer   r   r   r&   o   s    





zpisaTempFile.getvaluec                 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 )zV
        If capacity != -1 and length of file > capacity it is time to switch
        r   T   r-   N)r   r   r   r!   tellr)   r0   r1   r2   r   r    )r   r3   Z	len_valueZneeds_new_strategyr   r   r   r    ~   s    


zpisaTempFile.writec                 C   s@   zt | j|W S  tk
r:   d| jj|f }t|Y nX d S )Nz!object '%s' has no attribute '%s')getattrr   AttributeError	__class__r   )r   r   er   r   r   __getattr__   s    
zpisaTempFile.__getattr__N)r   r   r   __doc__r   ZCAPACITYr#   r)   r+   r,   r&   r    r:   r   r   r   r   r   .   s   
r   c                   @   s4   e Zd Zdd Zdd Zdd Zdd Zd	d
 ZdS )BaseFilec                 C   s"   || _ || _d | _d | _d | _d S r   pathbasepathmimetypesuffixurir   r>   r?   r   r   r   r#      s
    zBaseFile.__init__c                 C   s   | j S r   )rB   r*   r   r   r   get_uri   s    zBaseFile.get_uric                 C   s   | j S r   )r@   r*   r   r   r   get_mimetype   s    zBaseFile.get_mimetypec                 C   sL   |   }tj| jd}|r6|| |  t| | jd krH|j	| _|S )N)rA   )
get_datatempfileNamedTemporaryFilerA   r    r.   	files_tmpr
   r>   r   )r   datatmp_filer   r   r   get_named_tmp_file   s    


zBaseFile.get_named_tmp_filec                 C   s   |   }|rt|S d S r   )rF   r   )r   rJ   r   r   r   get_BytesIO   s    zBaseFile.get_BytesION)r   r   r   r#   rD   rE   rL   rM   r   r   r   r   r<      s
   r<   c                   @   s0   e Zd ZedejejB Zdd Zdd Z	dS )B64InlineURIz2^data:(?P<mime>[a-z]+/[a-z]+);base64,(?P<data>.*)$c              
   C   s<   z
|   W S  tk
r6 } ztd W 5 d }~X Y nX d S )NzExtract data form data: in tagextract_data	Exceptionr'   errorr   r9   r   r   r   rF      s    
zB64InlineURI.get_datac                 C   s~   | j | j}|d| _t|d}|dd }t	dd|}t	dd|}|dd	t
|d	  d	  7 }t|S )
NmimerJ   zb''s   \n    s   [^A-Za-z0-9\+\/]+   =   )_rx_dataurimatchr>   groupr@   urllib_unquotestripr2   resubr   base64	b64decode)r   mZb64r   r   r   rP      s    zB64InlineURI.extract_dataN)
r   r   r   r^   compileMDOTALLrY   rF   rP   r   r   r   r   rN      s    
rN   c                   @   s   e Zd Zdd Zdd ZdS )LocalProtocolURIc              
   C   s<   z
|   W S  tk
r6 } ztd W 5 d }~X Y nX d S )Nz.Extract data form local file based on protocolrO   rS   r   r   r   rF      s    
zLocalProtocolURI.get_datac                 C   s\   | j rX| jdrXt| j | jdd  }t|}| dd	dd | _
| S d S )N/r$   Content-Typer   ;r   )r?   r>   
startswithurlparseurljoinr   urlopeninfogetsplitr@   r/   )r   rB   ZurlResponser   r   r   rP      s    
 zLocalProtocolURI.extract_dataN)r   r   r   rF   rP   r   r   r   r   rf      s   rf   c                       s4   e Zd Z fddZdd Zdd Zdd Z  ZS )	NetworkFileUric                    s   t  || d| _d| _d S )N   r   )superr#   attemptsactual_attemptsrC   r8   r   r   r#      s    zNetworkFileUri.__init__c              
   C   sl   d }| j | jkrh|d krh|  jd7  _z|  }W q tk
rd } ztd| j  W 5 d }~X Y qX q|S )Nr$   zExtract data remote trying %d)rt   ru   rP   rQ   r'   rR   )r   rJ   r9   r   r   r   rF      s    $zNetworkFileUri.get_datac           	      C   s   t d| d d\}}t|}|d }|d }||d rJd|d  nd7 }|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 d|j  ||fS )NzSending request for z with httplib)NFr$   r4   rr   ?r   zhttps://GET)   OKrh   ri   r   zcontent-encodinggzipTzReceived non-200 status:  )r'   debugrk   urlsplitrj   httplibHTTPSConnectionr   HTTPConnectionr   getresponsestatusreason	getheaderrp   r@   r/   )	r   rB   rJ   is_gzipZurl_splittedserverr>   connZr1r   r   r   get_httplib   s2    


 zNetworkFileUri.get_httplibc                 C   sh   | j r$| jds$t| j | j}n| j}|| _| |\}}|rTtjdt	|d}t
d| |S )Nhttprb)modefileobjzUri parsed: {})r?   r>   rj   rk   rl   rB   r   r{   GzipFiler   r'   r}   format)r   rB   rJ   r   r   r   r   rP     s    zNetworkFileUri.extract_data)r   r   r   r#   rF   r   rP   __classcell__r   r   rv   r   rq      s   rq   c                   @   s$   e Zd Zdd Zdd Zdd ZdS )LocalFileURIc              
   C   s<   z
|   W S  tk
r6 } ztd W 5 d }~X Y nX d S )NzExtract data form local filerO   rS   r   r   r   rF   "  s    
zLocalFileURI.get_datac                 C   s:   t t|d }|dk	r6t t|d dd }|S )z Guess the mime type r   Nri   )	mimetypes
guess_typestrrp   )r   r   r@   r   r   r   guess_mimetype(  s    zLocalFileURI.guess_mimetypec              	   C   s   d }t d t| j}d }| jd k	r6t| j| }ntd| }| rV| sV|}| r|| _|j| _| 	|| _
| j
r| j
drt|d}| }W 5 Q R X nt|d}| }W 5 Q R X |S )Nz-Unrecognized scheme, assuming local file path.textrr   )r'   r}   r   r>   r?   existsis_filerB   rA   r   r@   rj   openr/   )r   rJ   r>   rB   Zfile_handlerr   r   r   rP   /  s&    


zLocalFileURI.extract_dataN)r   r   r   rF   r   rP   r   r   r   r   r   !  s   r   c                   @   s   e Zd Zdd ZdS )BytesFileUric                 C   s   | j S r   )r>   r*   r   r   r   rF   J  s    zBytesFileUri.get_dataN)r   r   r   rF   r   r   r   r   r   I  s   r   c                       s,   e Zd Zdd Z fddZdd Z  ZS )LocalTmpFilec                 C   s"   || _ d | _|| _d | _d | _d S r   r=   rC   r   r   r   r#   P  s
    zLocalTmpFile.__init__c                    s    t   }| jd kr|j| _|S r   )rs   rL   r>   r   )r   rK   rv   r   r   rL   W  s    

zLocalTmpFile.get_named_tmp_filec              
   C   s:   | j d krd S t| j d}| W  5 Q R  S Q R X d S )Nr   )r>   r   r/   )r   archr   r   r   rF   ]  s    
zLocalTmpFile.get_data)r   r   r   r#   rL   rF   r   r   r   rv   r   r   N  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rBt| |}nr|r^t| js^t|}n
t| }t	d
||jf |jdkrt| |}n |jdkrt| |}n
t| |}|S )Nzdata:zURLParts: {}r   )r   https)r   r0   r1   r   rj   rN   rk   schemer'   r}   r   rf   rq   r   )rB   r?   instanceZurlPartsr   r   r   get_managere  s"    






zFileNetworkManager.get_manager)N)r   r   r   staticmethodr   r   r   r   r   r   d  s   r   c                   @   sV   e Zd ZdddZdd Zdd Zdd	 Zd
d Zdd Zdd Z	dd Z
dd ZdS )pisaFileObjectNc                 C   sZ   || _ d }|d k	r|||}|d k	r0d | _|}n|| _td|| tj|| jd| _d S )NzFileObject %r, Basepath: %r)r?   )rB   r?   r'   r}   r   r   r   )r   rB   r?   callbackZbasepathretr   r   r   r#     s    
zpisaFileObject.__init__c                 C   s
   | j  S r   r   rF   r*   r   r   r   getFileContent  s    zpisaFileObject.getFileContentc                 C   s   | j  }|r|jS d S r   )r   rL   r   )r   fr   r   r   getNamedFile  s    
zpisaFileObject.getNamedFilec                 C   s
   | j  S r   r   r*   r   r   r   getData  s    zpisaFileObject.getDatac                 C   s   t r| j S | j S r   )GAEr   rM   rL   r*   r   r   r   getFile  s    
zpisaFileObject.getFilec                 C   s
   | j  S r   )r   rE   r*   r   r   r   getMimeType  s    zpisaFileObject.getMimeTypec                 C   s   |   d kS r   )r   r*   r   r   r   notFound  s    zpisaFileObject.notFoundc                 C   s
   | j  S r   )r   rD   r*   r   r   r   
getAbsPath  s    zpisaFileObject.getAbsPathc                 C   s
   | j  S r   )r   rM   r*   r   r   r   
getBytesIO  s    zpisaFileObject.getBytesIO)NN)r   r   r   r#   r   r   r   r   r   r   r   r   r   r   r   r   r   ~  s   
r   c                  O   s
   t | |S r   )r   )akwr   r   r   r     s    r   c                   C   s   t   d S r   )rI   r   r   r   r   r   r     s    r   ).r`   r{   http.clientclientr   loggingr   r^   sysrG   	threadingurllib.parseparserk   ior   pathlibr   urllibr   r   r\   Zxhtml2pdf.config.httpconfigr   modulesr   	getLoggerr'   r   rH   localr   rI   objectr   r<   rN   rf   rq   r   r   r   r   r   r   r   r   r   r   r   <module>   sJ   

o 7(/