
    @;?iN                     J   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	 ddlmZ dd	lmZ ddlZdd
lmZ ddlZdgZdZdZd2dZd3dZ d Z!d Z"d Z#d Z$d Z%d Z& e&       Z'd4dZ(d Z)d Z*d Z+ ejX                  d      Z- ejX                  d      Z. ejX                  d      Z/d Z0d Z1d  Z2 G d! d"e3      Z4d# Z5d$ Z6d% Z7	 d& Z8d' Z9d( Z:d) Z;d* Z<d+ Z=d, Z>d- Z?d5d.Z@dZA G d/ d0e3      ZBd1 ZCy# e$ r	 ddlmZ Y w xY w)6z0
This module provide some tools for bce client.
    )print_function)absolute_import)strbytes)	iteritemsiterkeys
itervalues)compatN)urlparse)AES)http_headerss   .cdn.bcebos.coms
   bcebos.coms   http    c                 |   | j                         }|r| j                  |       t        j                         }	 |}||cxkD  rdkD  rn n|}| j	                  |      }|sn+|j                  |       |dkD  r|t        |      z  }|dk(  rnQ| j                  |       t        j                  |j                               S )a  
    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:
        **file_size, MD(encode by base64)**
    r   )
tellseekhashlibmd5readupdatelenbase64standard_b64encodedigest)fpoffsetlengthbuf_sizeorigin_offsetr   bytes_to_readbufs           d/var/www/html/leadgen/airagagent/ocr_fallback/ocr_env/lib/python3.12/site-packages/baidubce/utils.pyget_md5_from_fpr"   ,   s    " GGIM

++-C
 6%A%"Mggm$

3A:c#hFQ;  GGM$$SZZ\22    c                    | dk(  rt         j                   j                         }nt         j                   j                  |       }d|j                  |j                  |j
                  |j                  |j                  |j                  fz  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)	timestamputctimes     r!   get_canonical_timer0   Q   sm     A~##**,##44Y?,gmmW[[gnngnn06 6 6r#   c                     	 | j                  d      }|d   } | dk(  ry| j                  d      }t        |      dk7  ry|D ]   }t        |      dk  st        |      dkD  s  y 	 y#  Y yxY w)	z
    Check a string whether is a legal ip address.

    :type s: string
    :param s: None
    =======================
    :return:
        **Boolean**
       :r   s	   localhostT   .   F   )splitr   int)stmp_listis      r!   is_ipr;   d   sz    774=QK774=x=A !q6A:Q# !
 s!   A% A% !A%  A% "A% %A)c                 ,    t        j                  |       S )z
    Encode a string to utf-8.

    :type input_string: string
    :param input_string: None
    =======================
    :return:
        **string**
    )r
   convert_to_bytes)input_strings    r!   convert_to_standard_stringr?      s      ""<00r#   c                     i }| D ]L  \  }}t        |t              r|j                  d      }t        |t              r|j                  d      }|||<   N |S )z
    Transfer a header list to dict

    :type s: list
    :param s: None
    =======================
    :return:
        **dict**
       ")
isinstancer   strip)header_list
header_mapabs       r!   convert_header2maprH      s[     J 1aAaA
1 r#   c                     t        |      D ]F  \  }}|j                         j                         | j                         j                         k(  sD|c S  y)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   rC   lower)name	containerkvs       r!   safe_get_elementrP      sJ     )$ 1779??

 2 2 44H r#   c                 \    d}	 | j                   dk(  s| j                   dk(  rd}|S #  Y |S xY w)z
    Check whether the response is redirect.

    :type res: HttpResponse
    :param res: None

    :return:
        **Boolean**
    Fi-  i.  T)status)resis_redirects     r!   check_redirectrU      sB     K::

c 1K s    & +c                      t        d      D  cg c]  } d| z  	 }} t        j                  t        j                  z   dz   D ]  }||t	        |      <    t        |d   t              r|D cg c]  }|j                  d       }}|S c c} w c c}w )z,"
    :return:
        **ASCII string**
       z%%%02Xz.~-_r   utf-8)rangestringascii_lettersdigitsordrB   r   encode)r:   retchr8   s       r!   _get_normalized_char_listra      s    
 "'s
,A8a<
,C
,""V]]2V; CG#a&#*-.Qqxx ..J - /s   B*Bc                 &   g }t        |       D ]q  }d}d}t        |t              rt        |      j	                  d      }|}n|}t        |      }|dk(  r|s|j                  d       Z|j                  t        |          s dj                  |      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**
    rJ   rX      /r#   )	r?   rB   r7   chrr^   r]   append_NORMALIZED_CHAR_LISTjoin)in_strencoding_slashtmpr`   sepindexs         r!   normalize_stringrn      s     C(0 5b#b'..)CECGE$;~JJtJJ,U345 ::c?r#   c                 T   | g}|D ]   }|s|j                  t        |d             " t        |      dkD  rb|d   j                  d      |d<   |d   j	                  d      |d<   t        dt        |      dz
        D ]  }||   j                  d      ||<    dj                  |      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
    F   r   rd   rc   )rf   rn   r   rstriplstriprY   rC   rh   )base_uripath_componentsrk   pathr:   s        r!   
append_urirv      s     *C 6JJ'e456 3x!|Qt$Ab'..&Bq#c(Q,' 	(AV\\$'CF	(;;sr#   c                     d}t        |       dk  st        |       dkD  ry| d   dk(  s| d   dk(  ryd| d	   cxk  rd
k  sn d| d	   cxk  rdk  sy y| D ]  }||vs y y)z
    Check bucket name whether is legal.

    :type bucket: string
    :param bucket: None
    =======================
    :return:
        **Boolean**
    z%abcdefghijklmnopqrstuvwxyz0123456789-   ?   Frc   -_rF   r   z09T)r   )bucketalphabetr:   s      r!   check_bucket_validr     s     7H
6{Q#f+*bzSF2J#-F1I$$#*Ac*A +B H} r#   c                    t               }d|d<   d|d<   d|d<   d|d<   d	|d
<   d|d<   d|d<   d|d<   d|d<   d|d<   d|d<   	 t        j                  |       } t        j                  j                  | j                               }|j                  d      d   }|t        |      v r||   }n3ddl	}|j                          |j                  j                  d|z   d      }|sd}t        j                  |      S #  d}Y xY w)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.sheetxlsxzDapplication/vnd.openxmlformats-officedocument.spreadsheetml.templatexltxzEapplication/vnd.openxmlformats-officedocument.presentationml.templatepotxzFapplication/vnd.openxmlformats-officedocument.presentationml.slideshowppsxzIapplication/vnd.openxmlformats-officedocument.presentationml.presentationpptxzBapplication/vnd.openxmlformats-officedocument.presentationml.slidesldxzGapplication/vnd.openxmlformats-officedocument.wordprocessingml.documentdocxzGapplication/vnd.openxmlformats-officedocument.wordprocessingml.templatedotxz.application/vnd.ms-excel.addin.macroEnabled.12xlamz5application/vnd.ms-excel.sheet.binary.macroEnabled.12xlsb.rc   r   Nzapplication/octet-stream)dictr
   convert_to_stringosru   basenamerK   r6   r   	mimetypesinit	types_mapgetr=   )	file_namemime_maprL   suffix	mime_typer   s         r!   guess_content_type_by_file_namer   )  s"    vH-HTNZHV]HV^HV_HVbHV[HV`HV`HVGHVNHV/,,Y7	ww	 12C$Xh'' (INN!++//f>XYI .	""9--/.	s   BC8 8C>z(.)([A-Z][a-z]+)z([a-z])([0-9]{2,})z([a-z0-9])([A-Z])c                     | dk(  ryt         j                  d|       }t        j                  d|      }t        j                  d|      j	                         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('') -> ''
    eTagetagz\1_\2)_first_cap_regexsub_number_cap_regex_end_cap_regexrK   )rL   s1s2s      r!   pythonize_namer   W  sN     v~			h	-B			x	,Bh+1133r#   c                 (   | yg }t        |       D ]_  \  }}|r,|j                  t        j                  j                         k7  s4|d}|j	                  dt        |      t        |      fz         a |j                          dj                  |      S )z@

    :param params:
    :param for_signature:
    :return:
    rJ   s   %s=%s   &)r   rK   r   AUTHORIZATIONrf   rn   sortrh   )paramsfor_signatureresultrN   rO   s        r!   get_canonical_querystringr   i  s     ~F&! Q1<+E+E+K+K+M MyMM(&6q&9;KA;N%OOP	Q
 KKM;;vr#   c                 d   g }t        | j                        D ]  \  }}|j                  d      r|dk7  st        |t              r|j                  |d|d       Ft        |t              r|j                  |d|d       n|j                  |d|        ddj                  |      z  S )	z#

    :param obj:
    :return:
    __raw_dataz:''z:u':z{%s},)r   __dict__
startswithrB   r   rf   r   rh   )objrk   rN   rO   s       r!   print_objectr   |  s     C#,,' -1||D!a:o!U#

1-.As#

A./

a+,- CHHSM!!r#   c                   $    e Zd ZdZddZd Zd Zy)Expandoz
    Expandable class
    Nc                 @    |r| j                   j                  |       y y N)r   r   )self	attr_dicts     r!   __init__zExpando.__init__  s    MM  + r#   c                 2    |j                  d      rt        y )Nr   )r   AttributeError)r   items     r!   __getattr__zExpando.__getattr__  s    ??4   r#   c                     t        |       S r   )r   r   s    r!   __repr__zExpando.__repr__  s    D!!r#   r   )__name__
__module____qualname____doc__r   r   r    r#   r!   r   r     s    ,
"r#   r   c                     i }t        |       D ]D  \  }}t        |t        j                        st        j                  |      }t        |      }|||<   F t        |      S )z!

    :param d:
    :return:
    )r   rB   r
   string_typesr   r   r   )dattrrN   rO   s       r!   dict_to_python_objectr     s_     D! 1!V001((+A1Q	
 4=r#   c                        fd}|S )zG
    decorator of input param check
    :param types:
    :return:
    c                 8      fd} j                   |_         |S )Nc                  2   t        |       D ]  \  }}j                  j                  |   v s"|%t        dj                  j                  |   z        t	        |j                  j                  |            rpt        dj                  j                  |   d|dj                  j                  |             t        |      D ]@  \  }}|v s|t        d|z        t	        ||         r+t        d|d|d|           | i |S )Nzarg "%s" should not be Nonezarg "z"= z does not match )	enumerate__code__co_varnames
ValueErrorrB   	TypeErrorr   )argskwdsr:   rO   rN   ftypess        r!   
_decoratedz/required.<locals>._required.<locals>._decorated  s2   !$ 	L1::))!,5y()F*+***@*@*C*E F F%aqzz/E/Ea/H)IJ')*)?)?)B)*).qzz/E/Ea/H)I)K L L	L "$ ]1:y()F)JKK%aq2'AqRWXYRZ([\\] d#d##r#   )r   )r   r   r   s   ` r!   	_requiredzrequired.<locals>._required  s    	$$  jj
r#   r   )r   r   s   ` r!   requiredr     s    * r#   c           	      `   d| vrd| z   } 	 t        | t        j                  |j                              }|j                  t        j                  t        j                  j                  j                        k(  r?t        j                  j                  }t        j                  j                  j                  }n|j                  t        j                  t        j                  j                  j                        k(  r?t        j                  j                  }t        j                  j                  j                  }nt        d|j                  z        |j                  }|j                  |j                  }|||fS # t        $ r)}t        d| dt        j                  |            d}~ww xY w)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:z, error:NzUnsupported protocol %s)r   r
   r=   rL   	Exceptionr   r   schemebaidubceprotocolHTTPdefault_portHTTPShostnameport)endpointdefault_protocolparse_resulter   r   hosts          r!   parse_host_portr     s`    H8#*''(8(=(=>@ f55h6G6G6L6L6Q6QRR$$))  %%22			 7 78I8I8O8O8T8T U	U$$**  &&332\5H5HHII  D$  T4!  *H$$Q') * 	**s   )E; ;	F-$F((F-c                    d }|dd }t         j                  }t        j                  ||      } ||       }|j                  d      }|j	                  |      }t        j                  |d      }	|	j                  d      }
|
S )zc

    :param adminpass: adminpass
    :param secretkey: secretkey
    :return: cipheradminpass
    c                 `    | dt        |       dz  z
  t        dt        |       dz  z
        z  z   S )N   )r   re   )r8   s    r!   <lambda>z+aes128_encrypt_16char_key.<locals>.<lambda>  s/    qBQ",BQ"4D0EEE r#   r   r   rX   )encoding	hex_codec)r   MODE_ECBnewr^   encryptcodecsdecode)	adminpass	secretkeypad_itkeymodecryptor	pad_adminbyte_pad_admincryptoradminpassbyte_cipheradminpasscipheradminpasss              r!   aes128_encrypt_16char_keyr    s     FF
Ab/C<<Dggc4 Gy!I%%w%7N~6 "==)9;G +1171CO r#   c                 b    | yt         D ]#  }| j                         j                  |      s# y y)zU
    :param host: custom domain
    :return: domain end with cdn endpoint or not
    FT)DEFAULT_CNAME_LIKE_LISTrK   endswith)r   r   s     r!   is_cname_like_hostr	    s7    
 |) ::<  ( r#   c                     | |y| j                  d      }| j                         j                  t        j                  |j                                     xr t        |      dk(  xr t        |       S )zQ
    custom host : xxx.region.bcebos.com
    : return: custom, domain or not
    Fr3   r4   )r6   rK   r   r
   r=   r   is_bos_suffixed_host)r   bucket_name
host_splits      r!   is_custom_hostr  +  sm    
 |{*D!J::<""6#:#:;;L;L;N#OP J*o*J/CD/IJr#   c                     | y| j                  d      r| dd }n| }|j                         j                  t              S )zD
    :param host: bos endpoint
    :return: bos endpoint or not
    NFrd   rc   )r  rK   DEFAULT_BOS_DOMAIN_SUFFIX)r   
check_hosts     r!   r  r  9  sC    
 |}}T#2Y

&&'@AAr#   c                 N    t        j                  d      }|j                  |       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)ipAddr
compile_ips     r!   
check_ipv4r  H  s$    
 zzijJF##r#   c                     t        | d      rt        |       S t        | d      r| j                  S t        | d      rt        | d      rt        |       S y )N__len__r   r   r   )hasattrr   file_object_remaining_bytes)datas    r!   _get_data_sizer  P  sJ    tY4ytUxxtVv!6*400r#   c                     | j                         }| j                  dt        j                         | j                         }| j                  |t        j                         ||z
  S Nr   )r   r   r   SEEK_ENDSEEK_SET)fileobjcurrentends      r!   r  r  \  sF    llnGLLBKK 
,,.CLL"++&=r#   c                     | r
 | ||       y y r   r   )progress_callbackconsumed_bytestotal_bytess      r!   _invoke_progress_callbackr*  e  s    .+6 r#   c                     |t        |       }|.t        dj                  | 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
    z{0} is not a file object)r  r   format	__class__r   _BytesAndFileAdapter)r  r'  sizes      r!   make_progress_adapterr0  i  sI     |d#|3::4>>;R;RSTT&7>>r#   c                   :    e Zd ZdZddZed        Zd ZeZddZ	y)	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                 <    || _         || _        || _        d| _        y r   )r  r'  r/  r   )r   r  r'  r/  s       r!   r   z_BytesAndFileAdapter.__init__  s    	!2	r#   c                     | j                   S r   )r/  r   s    r!   r   z_BytesAndFileAdapter.len  s    yyr#   c                      y)NTr   r   s    r!   __bool__z_BytesAndFileAdapter.__bool__  s    r#   c                 J   | j                   | j                  k\  rt        j                  d      S ||dk  r| j                  | j                   z
  }n#t	        || j                  | j                   z
        }t        | j                  t              r'| j                  | j                   | j                   |z    }n| j                  j                  |      }| xj                   |z  c_         t        | j                  t	        | j                   | j                        | j                         |S )NrJ   r   )r   r/  r
   r=   minrB   r  r   r   r*  r'  )r   amtr   contents       r!   r   z_BytesAndFileAdapter.read  s    ;;$))#**2..;#' II3MTYY%<=Mdii'iiDKK,EFGiinn]3G}$!$"8"8#dkk499:UW[W`W`ar#   )NNr   )
r   r   r   r   r   propertyr   r5  __nonzero__r   r   r#   r!   r.  r.  ~  s1       K"r#   r.  c                 *   |rt        dt        |       t        |      z  z        }d|z  }dd|z
  z  }|dk(  rt        dj                  |||      d       nt        dj                  |||      d       t        j
                  j                          yy)	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{}%[{}->{}]
rJ   )r%  z{}%[{}->{}]N)r7   floatprintr,  sysstdoutflush)r(  r)  ratestart_progressend_progresss        r!   default_progress_callbackrG    s     3%/%2DDEFtcDj)3;#**4NTVW/((~|LRTU

 r#   )r   rc   r   )r   )Tr   )Dr   
__future__r   r   builtinsr   r   future.utilsr   r   r	   r   r
   r   r  r%   r   r   rZ   rA  urllib.parser   ImportErrorCrypto.Cipherr   baidubce.httpr   r   r  r  HTTP_PROTOCOL_HEADr"   r0   r;   r?   rH   rP   rU   ra   rg   rn   rv   r   r   r  r   r   r   r   r   r   objectr   r   r   r   r  r	  r  r  r  r  r  r*  r0  _CHUNK_SIZEr.  rG  r   r#   r!   <module>rR     sl   & &  8 8  	 	     
"%   & -. )  "3J6&61$(&&
 23 B0.&.R 2::01 BJJ34 /04$&"$"f ""<% N:
JB$
7?& 96 9vs  "!"s   D D"!D"