o
    #jm                     @   s  d Z ddlmZ ddlmZ ddlmZmZ ddlmZm	Z	m
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ZzddlmZ W n eyY   ddlmZ Y nw dd	lmZ ddlZdd
lmZ ddlZddlZzddlZdZW n ey   dZdZY nw ddlZdgZ dZ!dZ"dfddZ#dfddZ$dfddZ%dd Z&dd Z'dd Z(dfddZ)d Z*d!d" Z+e+ Z,d#d$ Z-G d%d& d&e.Z/dfd'd(Z0dgd)d*Z1d+d, Z2d-d. Z3d/d0 Z4d1d2 Z5d3d4 Z6d5d6 Z7e7 Z8dhd7d8Z9d9d: Z:d;d< Z;d=d> Z<e=d?Z>e=d@Z?e=dAZ@dBdC ZAdDdE ZBdFdG ZCG dHdI dIe.ZDdJdK ZEdLdM ZFdNdO ZG	 dPdQ ZHdRdS ZIdTdU ZJdVdW ZKdXdY ZLdZd[ ZMd\d] ZNd^d_ ZOdid`daZPdZQG dbdc dce.ZRddde ZSdS )jz0
This module provide some tools for bce client.
    )print_function)absolute_import)strbytes)	iteritemsiterkeys
itervalues)compatN)urlparse)AES)http_headersTFs   .cdn.bcebos.coms
   bcebos.coms   http    c                 C   s   |   }|r| | t }	 |}||  krdkr n n|}| |}|s(n|| |dkr7|t|8 }|dkr<nq| | t|	 S )z
    Get MD5 from file by fp.

    :type fp: FileIO
    :param fp: None

    :type offset: long
    :param offset: None

    :type length: long
    :param length: None
    =======================
    :return:
        **MD5(encode by base64)**
    Tr   )
tellseekhashlibmd5readupdatelenbase64standard_b64encodedigest)fpoffsetlengthbuf_sizeorigin_offsetr   bytes_to_readbuf r    O/var/www/html/Deteccion_Ine/venv/lib/python3.10/site-packages/baidubce/utils.pyget_md5_from_fp4   s&   



r"   c                 C   s   |   }|r| | t }	 |}||  krdkr n n|}| |}|s(n|| |dkr7|t|8 }|dkr<nq| | | S )aO  
    Get SHA256 from file by fp.

    :type fp: FileIO
    :param fp: file pointer

    :type offset: long
    :param offset: start position

    :type length: long
    :param length: read length (-1 means read all)

    :type buf_size: int
    :param buf_size: read buffer size

    :return:
        **SHA256 (encode by base64)**
    Tr   )r   r   r   sha256r   r   r   	hexdigest)r   r   r   r   r   r#   r   r   r    r    r!   get_sha256_from_fpX   s&   



r%   c                 C   s   |   }|r| | d}	 |}||  krdkrn n|}| |}|s&nt||}|dkr6|t|8 }|dkr;nq| | |d@ S )aO  
    Get CRC32 from file by fp.

    :type fp: FileIO
    :param fp: file pointer

    :type offset: long
    :param offset: start position

    :type length: long
    :param length: read length (-1 means read all)

    :type buf_size: int
    :param buf_size: read buffer size

    :return:
        **crc32 (unsigned 32bit int)**
    r   T    )r   r   r   zlibcrc32r   r   r   r   r   r   crcr   r   r    r    r!   get_crc32_from_fp   s&   


r+   c                 C   s8   d}d}|r|d@ r|| | N }|dL }|d7 }|s|S )Nr      r    )matZvecsumidxr    r    r!   _gf2_matrix_times   s   r0   c                 C   s6   d}|dk rt ||| | |< |d7 }|dk sd S d S )Nr       r,   )r0   )Zsquarer-   nr    r    r!   _gf2_matrix_square   s
   r3   c                 C   s   |dkr| S dgd }dgd }d|d< d}d}|dk r,|||< |dK }|d7 }|dk st || t || 	 t || |d@ rEt|| } |dL }|dkrNnt || |d@ r\t|| } |dL }|dkrenq7| |N } | d@ S )a  
    combine two crc32 values

    This function combines two CRC32 values such that:
    crc32(data1 + data2) == crc32_combine(crc32(data1), crc32(data2), len(data2))

    :param crc1: CRC32 of the first part (as returned by zlib.crc32)
    :param crc2: CRC32 of the second part (as returned by zlib.crc32)
    :param len2: length of the second part in bytes
    :return: combined CRC32 value
    r   r1   l    q[ r,   Tr&   )r3   r0   )Zcrc1Zcrc2Zlen2ZoddZevenrowr2   r    r    r!   crc32_combine   s<   







r5   c                 C   s   t std|  }|r| | d}	 |}||  kr dkr$n n|}| |}|s,nt||}|dkr<|t|8 }|dkrAnq| | |d@ S )a
  
    Get CRC32C from file by fp.

    :type fp: FileIO
    :param fp: file pointer

    :type offset: long
    :param offset: start position

    :type length: long
    :param length: read length

    =======================
    :return:
        **CRC32C(hex)**
    zCcrc32c module is not installed. Install it with: pip install crc32cr   Tr&   )_has_crc32cImportErrorr   r   r   crc32cr   r)   r    r    r!   get_crc32c_from_fp   s*   


r9   l   B/W^bK c                  C   s   dd t dD } t dD ] }|}t dD ]}|d@ r"|d? tA }q|dL }q|| d |< qt ddD ]!}t dD ]}| |d  | }| d |d@  |d? A | | |< q9q3| S )z*
    Generate slice-by-8 CRC64 tables
    c                 S   s   g | ]}d gd qS )r      r    ).0_r    r    r!   
<listcomp>      z*_generate_crc64_tables.<locals>.<listcomp>   r:   r,   r      )range
CRC64_POLY)tableir*   r<   tr    r    r!   _generate_crc64_tables  s   
"rF   c                 C   s2  t |tr
|d}t|}t}|  d@ } t|}d}|d |kr|| }||d  }||d  }||d  }	||d  }
||d	  }||d
  }||d  }t |tstt|}t|}t|}t|	}	t|
}
t|}t|}t|}| ||d> B |d> B |	d> B |
d> B |d> B |d> B |d> B N } |d | d@  |d
 | d? d@  A |d	 | d? d@  A |d | d? d@  A |d | d? d@  A |d | d? d@  A |d | d? d@  A |d | d? d@  A } |d7 }|d |ks!||k r|| }t |tst|}td | |A d@  | d? A } |d7 }||k s|  d@ S )z,
    Fast CRC64 update using slice-by-8
    utf-8l    r   r?   r,                           r1   (   0   8   r@   )
isinstancer   encode
memoryviewCRC64_TABLEr   intord)r*   datamvrC   r   rD   Zb0b1b2Zb3Zb4Zb5Zb6Zb7br    r    r!   _crc64_update)  s|   



  

!

r^   c                   @   s*   e Zd ZdZd
ddZdd Zdd Zd	S )	CRC64ECMAz
    To generate CRC64ECMA
    r   c                 C   s
   || _ d S Nr*   )selfr*   r    r    r!   __init__c  s   
zCRC64ECMA.__init__c                 C   s   t | j|| _dS )z2
        Update CRC64 with specified data
        N)r^   r*   )rb   rY   r    r    r!   r   f  s   zCRC64ECMA.updatec                 C      | j S )z&
        Get CRC64 ECMA value
        ra   rb   r    r    r!   valuel  s   zCRC64ECMA.valueNr   )__name__
__module____qualname____doc__rc   r   rf   r    r    r    r!   r_   ^  s
    
r_   c                 C   s   |   }|r| | td}	 |}||  krdkr n n|}| |}|s(n|| |dkr7|t|8 }|dkr<nq| | | S )zK
    Get CRC64 from file pointer
    Compatible with get_crc32_from_fp
    r   )r   r   r_   r   r   r   rf   r)   r    r    r!   get_crc64_ecma_from_fpr  s&   



rl   c                 C   s@   | dkr
t j  }nt j | }d|j|j|j|j|j|jf S )z
    Get cannonical time.

    :type timestamp: int
    :param timestamp: None
    =======================
    :return:
        **string of canonical_time**
    r   s   %04d-%02d-%02dT%02d:%02d:%02dZ)	datetimeutcnowutcfromtimestampyearmonthdayhourminutesecond)	timestampZutctimer    r    r!   get_canonical_time  s   
rw   c                 C   sz   z6|  d}|d } | dkrW dS |  d}t|dkrW dS |D ]}t|dk s/t|dkr3 W dS q!W dS    Y dS )	z
    Check a string whether is a legal ip address.

    :type s: string
    :param s: None
    =======================
    :return:
        **Boolean**
       :r   s	   localhostT   .rJ   Fr@   )splitr   rW   )sZtmp_listrD   r    r    r!   is_ip  s    


r|   c                 C   s
   t | S )z
    Encode a string to utf-8.

    :type input_string: string
    :param input_string: None
    =======================
    :return:
        **string**
    )r	   convert_to_bytes)Zinput_stringr    r    r!   convert_to_standard_string  s   
r~   c                 C   sF   i }| D ]\}}t |tr|d}t |tr|d}|||< q|S )z
    Transfer a header list to dict

    :type s: list
    :param s: None
    =======================
    :return:
        **dict**
       ")rS   r   strip)Zheader_listZ
header_mapar]   r    r    r!   convert_header2map  s   





r   c                 C   s6   t |D ]\}}|  |   kr|  S qdS )z
    Get element from dict which the lower of key and name are equal.

    :type name: string
    :param name: None

    :type container: dict
    :param container: None
    =======================
    :return:
        **Value**
     )r   r   lower)name	containerkvr    r    r!   safe_get_element  s
   r   c                 C   s6   d}z| j dks| j dkrd}W |S W |S    Y |S )z
    Check whether the response is redirect.

    :type res: HttpResponse
    :param res: None

    :return:
        **Boolean**
    Fi-  i.  T)status)resis_redirectr    r    r!   check_redirect  s   
r   c                  C   sT   dd t dD } tjtj d D ]}|| t|< qt| d tr(dd | D } | S )z,"
    :return:
        **ASCII string**
    c                 S   s   g | ]}d | qS )z%%%02Xr    )r;   rD   r    r    r!   r=   
  s    z-_get_normalized_char_list.<locals>.<listcomp>r:   z.~-_r   c                 S   s   g | ]}| d qS )rG   )rT   )r;   r{   r    r    r!   r=     r>   )rA   stringascii_lettersdigitsrX   rS   r   )retchr    r    r!   _get_normalized_char_list  s   r   c                 C   st   g }t | D ].}d}d}t|trt|d}|}n|}t|}|dkr-|s-|d q|t|  qd|S )a  
    Encode in_str.
    When encoding_slash is True, don't encode skip_chars, vice versa.

    :type in_str: string
    :param in_str: None

    :type encoding_slash: Bool
    :param encoding_slash: None
    ===============================
    :return:
        **ASCII  string**
    r   r   rG      /    )	r~   rS   rW   chrrT   rX   append_NORMALIZED_CHAR_LISTjoin)Zin_strZencoding_slashtmpr   sepindexr    r    r!   normalize_string  s   

r   c                 G   s   | g}|D ]}|r| t|d qt|dkr?|d d|d< |d d|d< tdt|d D ]}|| d||< q3d|S )z
    Append path_components to the end of base_uri in order, and ignore all empty strings and None

    :param base_uri: None
    :type base_uri: string

    :param path_components: None

    :return: the final url
    :rtype: str
    Fr,   r   r   r   )r   r   r   rstriplstriprA   r   r   )Zbase_uriZpath_componentsr   pathrD   r    r    r!   
append_uri4  s   
r   c                 C   s   d}t | dk st | dkrdS | d dks| d dkrdS d| d	   kr*d
ks;n d| d	   kr8dks;dS  dS | D ]	}||vrF dS q=dS )z
    Check bucket name whether is legal.

    :type bucket: string
    :param bucket: None
    =======================
    :return:
        **Boolean**
    z%abcdefghijklmnopqrstuvwxyz0123456789-rI   ?   Fr   -r<   r   r   z09T)r   )ZbucketalphabetrD   r    r    r!   check_bucket_validL  s   
0r   c                 C   s   t  }d|d< d|d< d|d< d|d< d	|d
< d|d< d|d< d|d< d|d< d|d< d|d< z2t| } tj|  }|dd }|t|v rO|| }nddl	}|
  |jd| d}W n   d}Y |sld}t|S )z
    Get file type by filename.

    :type file_name: string
    :param file_name: None
    =======================
    :return:
        **Type Value**
    zapplication/javascriptjszAapplication/vnd.openxmlformats-officedocument.spreadsheetml.sheetZxlsxzDapplication/vnd.openxmlformats-officedocument.spreadsheetml.templateZxltxzEapplication/vnd.openxmlformats-officedocument.presentationml.templateZpotxzFapplication/vnd.openxmlformats-officedocument.presentationml.slideshowZppsxzIapplication/vnd.openxmlformats-officedocument.presentationml.presentationZpptxzBapplication/vnd.openxmlformats-officedocument.presentationml.slideZsldxzGapplication/vnd.openxmlformats-officedocument.wordprocessingml.documentZdocxzGapplication/vnd.openxmlformats-officedocument.wordprocessingml.templateZdotxz.application/vnd.ms-excel.addin.macroEnabled.12Zxlamz5application/vnd.ms-excel.sheet.binary.macroEnabled.12Zxlsb.r   r   Nzapplication/octet-stream)dictr	   convert_to_stringosr   basenamer   rz   r   	mimetypesinit	types_mapgetr}   )	file_nameZmime_mapr   suffixZ	mime_typer   r    r    r!   guess_content_type_by_file_namec  s6   



r   z(.)([A-Z][a-z]+)z([a-z])([0-9]{2,})z([a-z0-9])([A-Z])c                 C   s4   | dkrdS t d| }td|}td| S )a  Convert camel case to a "pythonic" name.
    Examples::
        pythonize_name('CamelCase') -> 'camel_case'
        pythonize_name('already_pythonized') -> 'already_pythonized'
        pythonize_name('HTTPRequest') -> 'http_request'
        pythonize_name('HTTPStatus200Ok') -> 'http_status_200_ok'
        pythonize_name('UPPER') -> 'upper'
        pythonize_name('ContentMd5')->'content_md5'
        pythonize_name('') -> ''
    ZeTagetagz\1_\2)_first_cap_regexsub_number_cap_regex_end_cap_regexr   )r   s1s2r    r    r!   pythonize_name  s
   r   c                 C   sn   | du rdS g }t | D ]!\}}|r|jtj kr-|du r d}|dt|t|f  q|  d|S )z@

    :param params:
    :param for_signature:
    :return:
    Nr   s   %s=%s   &)r   r   r   ZAUTHORIZATIONr   r   sortr   )paramsZfor_signatureresultr   r   r    r    r!   get_canonical_querystring  s   
r   c                 C   s   g }t | jD ]4\}}|ds;|dkr;t|tr#|d||f  qt|tr2|d||f  q|d||f  qdd| S )z#

    :param obj:
    :return:
    __raw_dataz%s:'%s'z%s:u'%s'z%s:%sz{%s},)r   __dict__
startswithrS   r   r   r   r   )objr   r   r   r    r    r!   print_object  s   

r   c                   @   s*   e Zd ZdZd	ddZdd Zdd ZdS )
Expandoz
    Expandable class
    Nc                 C   s   |r
| j | d S d S r`   )r   r   )rb   Z	attr_dictr    r    r!   rc     s   zExpando.__init__c                 C   s   | drtd S )Nr   )r   AttributeError)rb   itemr    r    r!   __getattr__  s   
zExpando.__getattr__c                 C   s   t | S r`   )r   re   r    r    r!   __repr__  s   zExpando.__repr__r`   )rh   ri   rj   rk   rc   r   r   r    r    r    r!   r     s
    
r   c                 C   sD   i }t | D ]\}}t|tjst|}t|}|||< qt|S )z!

    :param d:
    :return:
    )r   rS   r	   string_typesr   r   r   )dattrr   r   r    r    r!   dict_to_python_object  s   

r   c                     s    fdd}|S )zG
    decorator of input param check
    :param types:
    :return:
    c                    s    fdd} j |_ |S )Nc                     s   t | D ]8\}} jj| v r<|d u rtd jj|  t| jj|  s<td jj| | jj|  f qt|D ]$\}}|v re|d u rStd| t|| setd||| f qA | i |S )Nzarg "%s" should not be Nonezarg "%s"= %r does not match %s)	enumerate__code__co_varnames
ValueErrorrS   	TypeErrorr   )argskwdsrD   r   r   )ftypesr    r!   
_decorated  s,   

z/required.<locals>._required.<locals>._decorated)rh   )r   r   r   )r   r!   	_required  s   zrequired.<locals>._requiredr    )r   r   r    r   r!   required  s   r   c              
   C   s   d| vrd|  } zt | t|j}W n ty* } ztd| t|f d}~ww |jttj	j
jkr@tj	j
}tj	j
j}n|jttj	jjkrUtj	j}tj	jj}ntd|j |j}|jdurg|j}|||fS )ac  
    parse protocol, host, port from endpoint in config

    :type: string
    :param endpoint: endpoint in config

    :type: baidubce.protocol.HTTP or baidubce.protocol.HTTPS
    :param default_protocol: if there is no scheme in endpoint,
                              we will use this protocol as default
    :return: tuple of protocol, host, port
    s   //zInvalid endpoint:%s, error:%sNzUnsupported protocol %s)r
   r	   r}   r   	Exceptionr   r   schemebaidubceprotocolHTTPdefault_portZHTTPShostnameport)ZendpointZdefault_protocolZparse_resulter   r   hostr    r    r!   parse_host_port  s0   


r   c                 C   s`   dd }|dd }t j}t ||}|| }|jdd}||}t|d}	|	jdd}
|
S )zc

    :param adminpass: adminpass
    :param secretkey: secretkey
    :return: cipheradminpass
    c                 S   s(   | dt | d  tdt | d    S )NrN   )r   r   )r{   r    r    r!   <lambda>E  s   ( z+aes128_encrypt_16char_key.<locals>.<lambda>r   rN   rG   )encoding	hex_codec)r   ZMODE_ECBnewrT   Zencryptcodecsdecode)Z	adminpassZ	secretkeyZpad_itkeymodeZcryptorZ	pad_adminZbyte_pad_adminZcryptoradminpassZbyte_cipheradminpassZcipheradminpassr    r    r!   aes128_encrypt_16char_key;  s   

r   c                 C   s.   | du rdS t D ]}|  |r dS qdS )zU
    :param host: custom domain
    :return: domain end with cdn endpoint or not
    NFT)DEFAULT_CNAME_LIKE_LISTr   endswith)r   r   r    r    r!   is_cname_like_hostX  s   r   c                 C   sJ   | du s|du r
dS |  d}|  t| o$t|dko$t| S )zQ
    custom host : xxx.region.bcebos.com
    : return: custom, domain or not
    NFry   rJ   )rz   r   r   r	   r}   r   is_bos_suffixed_host)r   Zbucket_nameZ
host_splitr    r    r!   is_custom_hoste  s   

r   c                 C   s6   | du rdS |  dr| dd }n| }|  tS )zD
    :param host: bos endpoint
    :return: bos endpoint or not
    NFr   r   )r   r   DEFAULT_BOS_DOMAIN_SUFFIX)r   Z
check_hostr    r    r!   r   s  s   
r   c                 C   s   t d}|| S )z>
    :param ipAddr: ip address
    :return: true or false
    sL   ((2(5[0-5]|[0-4]\d))|[0-1]?\d{1,2})(.((2(5[0-5]|[0-4]\d))|[0-1]?\d{1,2})){3})recompilematch)ipAddrZ
compile_ipr    r    r!   
check_ipv4  s   

r   c                 C   sB   t | dr	t| S t | dr| jS t | drt | drt| S d S )N__len__r   r   r   )hasattrr   file_object_remaining_bytes)rY   r    r    r!   _get_data_size  s   

r  c                 C   s4   |   }| dtj |   }| |tj || S Nr   )r   r   r   SEEK_ENDSEEK_SET)fileobjcurrentendr    r    r!   r    s
   r  c                 C   s   | r	| || d S d S r`   r    )progress_callbackconsumed_bytestotal_bytesr    r    r!   _invoke_progress_callback  s   r  c                 C   s6   |du rt | }|du rtd| jjt| ||S )aH  return a adapter,when reading 'data', that is, calling read or iterating 
    over it Call the progress callback function

    :param data: bytes,file object or iterable
    :param progress_callback: callback function, ref:`_default_progress_callback`
    :param size: size of `data`

    :return: callback function adapter
    Nz{0} is not a file object)r  r   format	__class__rh   _BytesAndFileAdapter)rY   r	  sizer    r    r!   make_progress_adapter  s
   r  c                   @   s<   e Zd ZdZdddZedd Zdd ZeZdd	d
Z	dS )r  a.  With this adapter, you can add progress monitoring to 'data'.

    :param data: bytes or file object
    :param progress_callback: user-provided callback function. like callback(bytes_read, total_bytes)
        bytes_read is readed bytes;total_bytes is total bytes
    :param int size : data size 
    Nc                 C   s   || _ || _|| _d| _d S r  )rY   r	  r  r   )rb   rY   r	  r  r    r    r!   rc     s   
z_BytesAndFileAdapter.__init__c                 C   rd   r`   )r  re   r    r    r!   r     s   z_BytesAndFileAdapter.lenc                 C   s   dS )NTr    re   r    r    r!   __bool__  s   z_BytesAndFileAdapter.__bool__c                 C   s   | j | jkrtdS |d u s|dk r| j| j  }n	t|| j| j  }t| jtr5| j| j | j |  }n| j|}|  j |7  _ t	| j
t| j | j| j |S )Nr   r   )r   r  r	   r}   minrS   rY   r   r   r  r	  )rb   amtr   contentr    r    r!   r     s   
z_BytesAndFileAdapter.read)NNr`   )
rh   ri   rj   rk   rc   propertyr   r  __nonzero__r   r    r    r    r!   r    s    

r  c                 C   sx   |r:t dt| t|  }d| }dd|  }|dkr(td|||dd ntd|||dd tj  dS dS )	zProgress bar callback function that calculates the percentage of current completion
    
    :param consumed_bytes: Amount of data that has been uploaded/downloaded
    :param total_bytes: According to the total amount
    d   *r   z{}%[{}->{}]
r   )r  z{}%[{}->{}]N)rW   floatprintr  sysstdoutflush)r
  r  ZrateZstart_progressZend_progressr    r    r!   default_progress_callback  s   r  )r   r   r   rg   )Tr`   )Trk   
__future__r   r   builtinsr   r   Zfuture.utilsr   r   r   r   r	   r   r   rm   r   r   r   r  urllib.parser
   r7   ZCrypto.Cipherr   Zbaidubce.httpr   r   structr8   r6   r'   r   r   ZHTTP_PROTOCOL_HEADr"   r%   r+   r0   r3   r5   r9   rB   rF   rV   r^   objectr_   rl   rw   r|   r~   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r  r  _CHUNK_SIZEr  r  r    r    r    r!   <module>   s   

$
(&

5'5


!
)

'	
;