
    rjm                        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 n# e$ r	 ddlmZ Y nw xY wdd	lmZ ddlZdd
lmZ ddlZddlZ	 ddlZdZn# e$ r dZdZY nw xY wddlZdgZ dZ!dZ"dAdZ#dAdZ$dAdZ%d Z&d Z'd Z(dAdZ)dZ*d Z+ e+            Z,d Z- G d de.          Z/dAdZ0dBdZ1d  Z2d! Z3d" Z4d# Z5d$ Z6d% Z7 e7            Z8dCd&Z9d' Z:d( Z;d) Z< ej=        d*          Z> ej=        d+          Z? ej=        d,          Z@d- ZAd. ZBd/ ZC G d0 d1e.          ZDd2 ZEd3 ZFd4 ZG	 d5 ZHd6 ZId7 ZJd8 ZKd9 ZLd: ZMd; ZNd< ZOdDd=ZPdZQ G d> d?e.          ZRd@ ZSdS )Ez0
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                    |                                  }|r|                     |           t          j                    }	 |}||cxk    rdk    rn n|}|                     |          }|sn5|                    |           |dk    r|t          |          z  }|dk    rna|                     |           t          j        |	                                          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bufs           ^/lsinfo/ai/hellotax_ai/data_center/backend/venv/lib/python3.11/site-packages/baidubce/utils.pyget_md5_from_fpr#   4   s    " GGIIM 

+--C 6%%%%A%%%%%"Mggm$$ 	

3A::c#hhFQ;; GGM$SZZ\\222    c                    |                                  }|r|                     |           t          j                    }	 |}||cxk    rdk    rn n|}|                     |          }|sn5|                    |           |dk    r|t          |          z  }|dk    rna|                     |           |                                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!   s           r"   get_sha256_from_fpr(   X   s    ( GGIIM 
^F 6%%%%A%%%%%"Mggm$$ 	cA::c#hhFQ;; GGMr$   c                 T   |                                  }|r|                     |           d}	 |}||cxk    rdk    rn n|}|                     |          }|sn5t          j        ||          }|dk    r|t          |          z  }|dk    rna|                     |           |dz  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!   s           r"   get_crc32_from_fpr/      s    & GGIIM 

C 6%%%%A%%%%%"Mggm$$ 	jc""A::c#hhFQ;; GGMr$   c                 J    d}d}|r|dz  r|| |         z  }|dz  }|dz  }||S )Nr       )matvecsumidxs       r"   _gf2_matrix_timesr7      sP    
C
C
 7 	3s8OC	q	  
 Jr$   c                 b    d}|dk     r&t          |||                   | |<   |dz  }|dk     $d S d S )Nr       r1   )r7   )squarer3   ns      r"   _gf2_matrix_squarer<      sC    	A
b&&%c3q622q		Q b&&&&&&r$   c                    |dk    r| S dgdz  }dgdz  }d|d<   d}d}|dk     r|||<   |dz  }|dz  }|dk     t          ||           t          ||           	 t          ||           |dz  rt          ||           } |dz  }|dk    rn2t          ||           |dz  rt          ||           } |dz  }|dk    rnc| |z  } | dz  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   r9   l    q[ r1   Tr*   )r<   r7   )crc1crc2len2oddevenrowr;   s          r"   crc32_combinerD      s.   " qyy #(C38DCF
C	A
b&&A		Q b&& tS!!!sD!!!4%%%!8 	1$T400D
1993%%%!8 	0$S$//D
199 	DLD*r$   c                    t           st          d          |                                 }|r|                     |           d}	 |}||cxk    rdk    rn n|}|                     |          }|sn5t          j        ||          }|dk    r|t          |          z  }|dk    rna|                     |           |dz  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-   s           r"   get_crc32c_from_fprI      s    "  a_```GGIIM 

C 6%%%%A%%%%%"Mggm$$ 	mC%%A::c#hhFQ;; GGMr$   l   B/W^bK c                  v   d t          d          D             } t          d          D ]9}|}t          d          D ]}|dz  r|dz	  t          z  }|dz  }|| d         |<   :t          dd          D ]E}t          d          D ]3}| |dz
           |         }| d         |dz           |dz	  z  | |         |<   4F| S )z*
    Generate slice-by-8 CRC64 tables
    c                     g | ]}d gdz  	S )r      r2   ).0_s     r"   
<listcomp>z*_generate_crc64_tables.<locals>.<listcomp>  s    )))1aS3Y)))r$      rL   r1   r      )range
CRC64_POLY)tableir.   rN   ts        r"   _generate_crc64_tablesrW     s     *)a)))E3ZZ  q 	 	AQw ax:-	a1a[[ < <s 	< 	<AA,q/C(3:.#(;E!HQKK	< Lr$   c                    t          |t                    r|                    d          }t          |          }t          }|  dz  } t          |          }d}|dz   |k    r||         }||dz            }||dz            }||dz            }	||dz            }
||d	z            }||d
z            }||dz            }t          |t                    sxt          |          }t          |          }t          |          }t          |	          }	t          |
          }
t          |          }t          |          }t          |          }| ||dz  z  |dz  z  |	dz  z  |
dz  z  |dz  z  |dz  z  |dz  z  z  } |d         | dz           |d
         | dz	  dz           z  |d	         | dz	  dz           z  |d         | dz	  dz           z  |d         | dz	  dz           z  |d         | dz	  dz           z  |d         | dz	  dz           z  |d         | dz	  dz           z  } |dz  }|dz   |k    ||k     rV||         }t          |t                    st          |          }t          d         | |z  dz           | dz	  z  } |dz  }||k     V|  dz  S )z,
    Fast CRC64 update using slice-by-8
    utf-8l    r   rP   r1                           r9   (   0   8   rQ   )
isinstancer   encode
memoryviewCRC64_TABLEr   intord)r.   datamvrT   r   rU   b0b1b2b3b4b5b6b7bs                  r"   _crc64_updaterv   )  s    $ ${{7##	D		BE$#
#CWWF	A
a%6//UAYAYAYAYAYAYAY"c"" 	CRBs2ww"SWW3r77bRBs2ww"SWW3r77bQwRx Rx Rx	
 Rx Rx Rx		
 !HS4Z !HcQh$&'(!HcRi4'() !HcRi4'() !HcRi4'(	)
 !HcRi4'() !HcRi4'() !HcRi4'() 	 	
QA a%6//B f**qE!S!! 	AA!ncAg-.#(;	Q f** 4$$$r$   c                   &    e Zd ZdZddZd Zd ZdS )	CRC64ECMAz
    To generate CRC64ECMA
    r   c                     || _         d S Nr.   )selfr.   s     r"   __init__zCRC64ECMA.__init__c  s    r$   c                 :    t          | j        |          | _        dS )z2
        Update CRC64 with specified data
        N)rv   r.   )r|   rk   s     r"   r   zCRC64ECMA.updatef  s     !400r$   c                     | j         S )z&
        Get CRC64 ECMA value
        r{   r|   s    r"   valuezCRC64ECMA.valuel  s     xr$   Nr   )__name__
__module____qualname____doc__r}   r   r   r2   r$   r"   rx   rx   ^  sP            1 1 1    r$   rx   c                    |                                  }|r|                     |           t          d          }	 |}||cxk    rdk    rn n|}|                     |          }|sn5|                    |           |dk    r|t          |          z  }|dk    rna|                     |           |                                S )zK
    Get CRC64 from file pointer
    Compatible with get_crc32_from_fp
    r   )r   r   rx   r   r   r   r   r-   s           r"   get_crc64_ecma_from_fpr   r  s     GGIIM 

A,,C 6%%%%A%%%%%"Mggm$$ 	

3A::c#hhFQ;; GGM99;;r$   c                     | dk    rt           j                                         }nt           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_timer     se     A~~#**,,#44Y??,gmW[gngn06 6 6r$   c                    	 |                      d          }|d         } | dk    rdS |                      d          }t          |          dk    rdS |D ]+}t          |          dk     st          |          dk    r dS ,n#  Y dS xY wdS )	z
    Check a string whether is a legal ip address.

    :type s: string
    :param s: None
    =======================
    :return:
        **Boolean**
       :r   s	   localhostT   .r\   FrQ   )splitr   ri   )stmp_listrU   s      r"   is_ipr     s    774==QK4774==x==A5 ! !q66A::Q# 55 ".!uu4s   #B  (B  +B  >B   B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00r$   c                     i }| D ]^\  }}t          |t                    r|                    d          }t          |t                    r|                    d          }|||<   _|S )z
    Transfer a header list to dict

    :type s: list
    :param s: None
    =======================
    :return:
        **dict**
       ")re   r   strip)header_list
header_maparu   s       r"   convert_header2mapr     so     J  1a 	Aa 	A
1r$   c                     t          |          D ]W\  }}|                                                                |                                                                 k    r|c S Xd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vs       r"   safe_get_elementr     sc     )$$  17799??

 2 2 4 444HHH 52r$   c                 L    d}	 | j         dk    s| j         dk    rd}n#  Y nxY w|S )z
    Check whether the response is redirect.

    :type res: HttpResponse
    :param res: None

    :return:
        **Boolean**
    Fi-  i.  T)status)resis_redirects     r"   check_redirectr     sA     K:
c 1 1Ks    !c                      d t          d          D             } t          j        t          j        z   dz   D ]}|| t	          |          <   t          | d         t                    rd | D             } | S )z,"
    :return:
        **ASCII string**
    c                     g | ]}d |z  S )z%%%02Xr2   )rM   rU   s     r"   rO   z-_get_normalized_char_list.<locals>.<listcomp>
  s    
,
,
,A8a<
,
,
,r$   rL   z.~-_r   c                 8    g | ]}|                     d           S )rY   )rf   )rM   r   s     r"   rO   z-_get_normalized_char_list.<locals>.<listcomp>  s$    ...Qqxx  ...r$   )rR   stringascii_lettersdigitsrj   re   r   )retchs     r"   _get_normalized_char_listr     sz    
 -
,s
,
,
,C"V]2V;  CGG#a&# /..#...Jr$   c                 n   g }t          |           D ]}d}d}t          |t                    r%t          |                              d          }|}n|}t          |          }|dk    r|s|                    d           o|                    t          |                    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   rY      /r$   )	r   re   ri   chrrf   rj   append_NORMALIZED_CHAR_LISTjoin)in_strencoding_slashtmpr   sepindexs         r"   normalize_stringr     s     C(00 5 5b# 	b''..))CEECGGE$;;~;JJtJJ,U34444::c??r$   c                    | g}|D ]'}|r#|                     t          |d                     (t          |          dk    r}|d                             d          |d<   |d                             d          |d<   t          dt          |          dz
            D ] }||                             d          ||<   !d                    |          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
    Fr1   r   r   r   )r   r   r   rstriplstriprR   r   r   )base_uripath_componentsr   pathrU   s        r"   
append_urir   4  s     *C 6 6 	6JJ'e44555
3xx!||Qt$$Ab'..&&Bq#c((Q,'' 	( 	(AV\\$''CFF;;sr$   c                     d}t          |           dk     st          |           dk    rdS | d         dk    s| d         dk    rdS d| d	         cxk    rd
k    sn d| d	         cxk    rdk    sn dS | D ]	}||vr dS 
dS )z
    Check bucket name whether is legal.

    :type bucket: string
    :param bucket: None
    =======================
    :return:
        **Boolean**
    z%abcdefghijklmnopqrstuvwxyz0123456789-r[   ?   Fr   -rN   r   r   z09T)r   )bucketalphabetrU   s      r"   check_bucket_validr   L  s     7H
6{{Q#f++**ubzSF2J#--uF1I$$$$$$$$#*A*A*A*Ac*A*A*A*Au  H}}55 4r$   c                 2   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                            |                                           }|                    d          d         }|t          |          v r	||         }n6ddl	}|
                                 |j                            d|z   d          }n	#  d}Y nxY w|sd}t          j        |          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.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.r   r   Nzapplication/octet-stream)dictr
   convert_to_stringosr   basenamer   r   r   	mimetypesinit	types_mapgetr   )	file_namemime_mapr   suffix	mime_typer   s         r"   guess_content_type_by_file_namer   c  sK    vvH-HTNZHV]HV^HV_HVbHV[HV`HV`HVGHVNHV/,Y77	w	 1 122C$Xh'''' (IINN!+//f>XYYI/.			 /.	"9---s   B0C8 8C>z(.)([A-Z][a-z]+)z([a-z])([0-9]{2,})z([a-z0-9])([A-Z])c                     | 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('') -> ''
    eTagetagz\1_\2)_first_cap_regexsub_number_cap_regex_end_cap_regexr   )r   s1s2s      r"   pythonize_namer     s^     v~~v			h	-	-B			x	,	,Bh++11333r$   c                 L   | dS g }t          |           D ]f\  }}|r'|j        t          j                                        k    r8|d}|                    dt          |          t          |          fz             g|                                 d                    |          S )z@

    :param params:
    :param for_signature:
    :return:
    Nr   s   %s=%s   &)r   r   r   AUTHORIZATIONr   r   sortr   )paramsfor_signatureresultr   r   s        r"   get_canonical_querystringr    s     ~rF&!! Q Q1 	Q<+E+K+K+M+M M MyMM(&6q&9&9;KA;N;N%OOPPP
KKMMM;;vr$   c                    g }t          | j                  D ]\  }}|                    d          s|dk    r|t          |t                    r|                    |d|d           Qt          |t                    r|                    |d|d           |                    |d|           dd                    |          z  S )	z#

    :param obj:
    :return:
    __raw_dataz:''z:u':z{%s},)r   __dict__
startswithre   r   r   r   r   )objr   r   r   s       r"   print_objectr    s     C#,'' - -1||D!! 	-a:oo!U## -

111-....As## -

AAA.////

aaa+,,,CHHSMM!!r$   c                   &    e Zd ZdZddZd Zd ZdS )Expandoz
    Expandable class
    Nc                 B    |r| j                             |           d S d S rz   )r  r   )r|   	attr_dicts     r"   r}   zExpando.__init__  s0     	,M  +++++	, 	,r$   c                 >    |                     d          rt          d S )Nr  )r  AttributeError)r|   items     r"   __getattr__zExpando.__getattr__  s!    ??4   	!  tr$   c                      t          |           S rz   )r  r   s    r"   __repr__zExpando.__repr__  s    D!!!r$   rz   )r   r   r   r   r}   r  r  r2   r$   r"   r  r    sP         , , , ,  
" " " " "r$   r  c                     i }t          |           D ]G\  }}t          |t          j                  st          j        |          }t          |          }|||<   Ht          |          S )z!

    :param d:
    :return:
    )r   re   r
   string_typesr   r   r  )dattrr   r   s       r"   dict_to_python_objectr    sk     D!  1!V011 	,(++A1Q4==r$   c                        fd}|S )zG
    decorator of input param check
    :param types:
    :return:
    c                 .      fd} j         |_         |S )Nc                  8   t          |           D ]\  }}j        j        |         v r|"t          dj        j        |         z            t	          |j        j        |                            s>t          dj        j        |         d|dj        j        |                            t          |          D ]Q\  }}|v rH|t          d|z            t	          ||                   st          d|d|d|                   R | i |S )Nzarg "%s" should not be Nonezarg "z"= z does not match )	enumerate__code__co_varnames
ValueErrorre   	TypeErrorr   )argskwdsrU   r   r   ftypess        r"   
_decoratedz/required.<locals>._required.<locals>._decorated  sg   !$ 	L 	L1:)!,55y()F*+**@*C*E F F F%aqz/Ea/H)IJJ L'i)*)?)B)B)B)*).qz/Ea/H)I)I)K L L L "$ ] ]1::y()F)JKKK%aq22 ]'iAAAqqqRWXYRZRZ([\\\1d#d###r$   )r   )r)  r+  r*  s   ` r"   	_requiredzrequired.<locals>._required  s4    	$ 	$ 	$ 	$ 	$ 	$$  j
r$   r2   )r*  r,  s   ` r"   requiredr-    s$        * r$   c           	         d| vrd| z   } 	 t          | t          j        |j                            }n9# t          $ r,}t          d| dt          j        |                    d}~ww xY w|j        t          j        t          j	        j
        j                  k    r(t          j	        j
        }t          j	        j
        j        }np|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 )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   r   	Exceptionr%  r   schemebaidubceprotocolHTTPdefault_portHTTPShostnameport)endpointdefault_protocolparse_resulter2  r7  hosts          r"   parse_host_portr=    sP    H8#*'(8(=>>@ @  * * *jHHH$Q''') * * 	** f5h6G6L6QRRRR$) %2		 78I8O8T U U	U	U$* &32\5HHIII D$ T4s   '3 
A)'A$$A)c                 $   d }|dd         }t           j        }t          j        ||          } ||           }|                    d          }|                    |          }t          j        |d          }	|	                    d          }
|
S )zc

    :param adminpass: adminpass
    :param secretkey: secretkey
    :return: cipheradminpass
    c                 x    | dt          |           dz  z
  t          dt          |           dz  z
            z  z   S )Nr`   )r   r   )r   s    r"   <lambda>z+aes128_encrypt_16char_key.<locals>.<lambda>E  s6    qBQ",BQ"4D0E0EEE r$   r   r`   rY   )encoding	hex_codec)r   MODE_ECBnewrf   encryptcodecsdecode)	adminpass	secretkeypad_itkeymodecryptor	pad_adminbyte_pad_admincryptoradminpassbyte_cipheradminpasscipheradminpasss              r"   aes128_encrypt_16char_keyrS  ;  s     FEF
AbD/C<Dgc4  Gy!!I%%w%77N~66 "=)9;GG +1171CCO r$   c                 v    | dS t           D ],}|                                                     |          r dS -dS )zU
    :param host: custom domain
    :return: domain end with cdn endpoint or not
    NFT)DEFAULT_CNAME_LIKE_LISTr   endswith)r<  r   s     r"   is_cname_like_hostrW  X  sL    
 |u)  ::<<  (( 	44	5r$   c                    | |dS |                      d          }|                                                     t          j        |                                                    o!t          |          dk    ot          |           S )zQ
    custom host : xxx.region.bcebos.com
    : return: custom, domain or not
    NFr   r\   )r   r   r  r
   r   r   is_bos_suffixed_host)r<  bucket_name
host_splits      r"   is_custom_hostr\  e  s    
 |{*uD!!J::<<""6#:;;L;L;N;N#O#OPP J*oo*J/CD/I/IJr$   c                     | dS |                      d          r| dd         }n| }|                                                     t                    S )zD
    :param host: bos endpoint
    :return: bos endpoint or not
    NFr   r   )rV  r   DEFAULT_BOS_DOMAIN_SUFFIX)r<  
check_hosts     r"   rY  rY  s  sW    
 |u}}T #2#Y


&&'@AAAr$   c                 T    t          j        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)ipAddr
compile_ips     r"   
check_ipv4rf    s(    
 zijjJF###r$   c                     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)rk   s    r"   _get_data_sizerk    so    tY 4yytU xtV 1v!6!6 1*40004r$   c                     |                                  }|                     dt          j                   |                                  }|                     |t          j                   ||z
  S Nr   )r   r   r   SEEK_ENDSEEK_SET)fileobjcurrentends      r"   rj  rj    sR    llnnGLLBK   
,,..CLL"+&&&=r$   c                 &    | r | ||           d S d S rz   r2   )progress_callbackconsumed_bytestotal_bytess      r"   _invoke_progress_callbackrw    s-     7.+666667 7r$   c                     |t          |           }|,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)rk  r%  format	__class__r   _BytesAndFileAdapter)rk   rt  sizes      r"   make_progress_adapterr}    sP     |d##|3::4>;RSSTTT&7>>>r$   c                   B    e Zd ZdZddZed             Zd ZeZ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                 >    || _         || _        || _        d| _        d S rm  )rk   rt  r|  r   )r|   rk   rt  r|  s       r"   r}   z_BytesAndFileAdapter.__init__  s#    	!2	r$   c                     | j         S rz   )r|  r   s    r"   r   z_BytesAndFileAdapter.len  s
    yr$   c                     dS )NTr2   r   s    r"   __bool__z_BytesAndFileAdapter.__bool__  s    tr$   c                    | 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                            |          }| xj         |z  c_         t          | j
        t	          | j         | j                  | j                   |S )Nr   r   )r   r|  r
   r   minre   rk   r   r   rw  rt  )r|   amtr    contents       r"   r   z_BytesAndFileAdapter.read  s    ;$)##*2...;#'' I3MMTY%<==Mdi'' 	4iDK,E EFGGinn]33G}$!$"8#dk49:U:UW[W`aaar$   )NNrz   )
r   r   r   r   r}   propertyr   r  __nonzero__r   r2   r$   r"   r{  r{    sw               X   K"     r$   r{  c                 h   |rt          dt          |           t          |          z  z            }d|z  }dd|z
  z  }|dk    r't          d                    |||          d           n&t          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   )rr  z{}%[{}->{}]N)ri   floatprintry  sysstdoutflush)ru  rv  ratestart_progressend_progresss        r"   default_progress_callbackr    s      	3%//%2D2DDEFFtcDj)3;;#**4NNTVWWWWW/((~|LLRTUUUU
	 	r$   )r   r   r   r   )Trz   )Tr   
__future__r   r   builtinsr   r   future.utilsr   r   r	   r1  r
   r   ra  r   r   r   r   r  urllib.parser   rG   Crypto.Cipherr   baidubce.httpr   rF  structrH   rF   r+   rU  r^  HTTP_PROTOCOL_HEADr#   r(   r/   r7   r<   rD   rI   rS   rW   rh   rv   objectrx   r   r   r   r   r   r   r   r   r   r   r   r   r   rb  r   r   r   r   r  r  r  r  r-  r=  rS  rW  r\  rY  rf  rk  rj  rw  r}  _CHUNK_SIZEr{  r  r2   r$   r"   <module>r     s    & % % % % % & & & & & &         8 8 8 8 8 8 8 8 8 8       				 				     



"%%%%%%% " " "!!!!!!!!"        & & & & & &  MMMKK   KFFF -. )  "3 "3 "3 "3H% % % %P$ $ $ $L    3 3 3j% % % %N  
  & %$&&3% 3% 3%j       (   26 6 6 6&  61 1 1$  (  &  &
 
 
 2133    B  0  .&. &. &.R 2:011 BJ344 /004 4 4$  &" " "$" " " " "f " " ""    <%  %  % N  :
 
 
J J JB B B$ $ $
 
 
  7 7 7? ? ? ?& 9 9 9 9 96 9 9 9v    s$   A AA5A< <	BB