3
b,                 @   s
  d dl mZmZ d dlZd dlZd dljZd dlmZm	Z	m
Z
mZmZmZmZmZmZmZ d dlmZ ddlmZ ddd	gZdddZdd Zdd ZdddZd ddZdd Zd!ddZG dd deZd"ddZeej _!eej"_#eej"_$eej"_%eej"_&eej"_'dS )#    )absolute_importprint_functionN)
_CS_REQ_SENT_CS_REQ_STARTEDCONTINUEUnknownProtocolCannotSendHeader
NO_CONTENTNOT_MODIFIEDEXPECTATION_FAILEDHTTPMessageHTTPException)StringIO   )encode_to_s3PATCHPOSTPUTdatac             C   sn   y
| j dS  tk
rh } zBt|j|j|j|jd|j | |j|j |f }d|_|W Y dd}~X nX dS )z<Call data.encode("latin-1") but show a better error message.zlatin-1z`%s (%.20r) is not valid Latin-1. Use %s.encode('utf-8') if you want to send it encoded in UTF-8.N)encodeUnicodeEncodeErrorencodingobjectstartendtitle	__cause__)r   nameerrexc r    S/oak/stanford/groups/akundaje/marinovg/programs/s3cmd-master/S3/Custom_httplib3x.py_encode   s    
r"   c             C   s  | j dk	rdS | j \}}}| | _| _|j | _|dkrBd| _n|jdrTd| _nt|t	j
| j | _ | _| jdkrx| j D ]}td|d	d
 qW | j jd}|r|j dkrd| _d| _nd| _| j | _d| _| j jd}|o| j r2yt|| _W n tk
r   d| _Y nX | jdk r8d| _nd| _|tkst|tkstd|  ko`dk n  st| jdkrzd| _| j r| j r| jdkrd| _dS )z Re-implemented httplib begin function
    to not loop over "100 CONTINUE" status replies
    but to report it to higher level so it can be processed.
    NHTTP/1.0HTTP/0.9
   zHTTP/1.   r   zheader: )r   ztransfer-encodingchunkedTFzcontent-lengthd      HEAD)r#   r$   )headers_read_statuscodestatusstripreasonversion
startswithr   httplibparse_headersfpmsg
debuglevelprintgetlowerr(   
chunk_left_check_close
will_closelengthint
ValueErrorr	   r
   _method)selfr2   r/   r1   hdrtr_encr?   r    r    r!   httpresponse_patched_begin*   sL    






rF   c             C   sd   | dkr|j  tkrdS dS t| dr*dS yt| }|jS  tk
rL   Y nX t| tr`t| S dS )zG## REIMPLEMENTED because new in last httplib but needed by send_requestNr   read)	upper_METHODS_EXPECTING_BODYhasattr
memoryviewnbytes	TypeError
isinstancestrlen)bodymethodmvr    r    r!   )httpconnection_patched_get_content_lengthp   s    

rT   Fc             C   s  t jdd |D }i }d|kr(d|d< d|kr8d|d< d}x0|j D ]$\}	}
d	|	j krFd
|
j krFd}qFW | j||f| d|krd|krd}t||}|d kr|d k	r| jdkrtd|  d}| jdd q| jdt	| nd}x(|j D ]\}	}
| jt
|	t
|
 qW t|t	r*t|d}|s@| j||d nX|sNtd| j  | j }|j  t| _|jtkrt n|jtkr| j|| d S )Nc             S   s   g | ]}|j  qS r    )r;   ).0kr    r    r!   
<listcomp>   s    z7httpconnection_patched_send_request.<locals>.<listcomp>hostr   	skip_hostzaccept-encodingskip_accept_encodingFexpectz100-continueTzcontent-lengthztransfer-encodingr   zUnable to determine size of %rzTransfer-Encodingr(   zContent-LengthrQ   )encode_chunkedz.A body is required when expecting 100-continue)dictfromkeysitemsr;   
putrequestrT   r8   r9   	putheaderrO   r   rN   r"   
endheadersr   getresponserG   r   _HTTPConnection__stater/   r   ExpectationFailedr   wrapper_send_body)rC   rR   urlrQ   r,   r\   header_namesskipsZexpect_continuerD   valuecontent_lengthrespr    r    r!   #httpconnection_patched_send_request   sN    


rm   c             C   s*   | j tkrt| _ nt | j||d dS )zDREIMPLEMENTED because new argument encode_chunked added after py 3.4)r\   N)rd   r   r   r   _send_output)rC   message_bodyr\   r    r    r!   !httpconnection_patched_endheaders   s    
rp   c             c   sd   d}| j dkrtd | j|}|r6| j dkr6td x(|j|}|sHP |rV|jd}|V  q8W dS )zGREIMPLEMENTED because needed by send_output and added after py 3.4
    i    r   zsendIng a read()ablezencoding file using iso-8859-1z
iso-8859-1N)r8   r9   
_is_textIOrG   r   )rC   readable	blocksizer   	datablockr    r    r!   $httpconnection_patched_read_readable   s    



ru   c             C   sF   | j jd dj| j }| j dd= | j| |dk	rB| j|| dS )zUREIMPLEMENTED because needed by endheaders and parameter
    encode_chunked was added    s   
N)rv   rv   )_bufferextendjoinsendrf   )rC   ro   r\   r7   r    r    r!   "httpconnection_patched_send_output   s    	
r{   c               @   s   e Zd ZdS )re   N)__name__
__module____qualname__r    r    r    r!   re     s   re   c             C   s   t |dr| j|}nZyt| W nF tk
rh   yt|}W n$ tk
rb   tdt| Y nX Y nX |f}xX|D ]P}|s| jdkrvtd qv|r| jdkrdj	t
|jd| d }| j| qvW |r| jdkr| jd	 d S )
NrG   zAmessage_body should be a bytes-like object or an iterable, got %rr   zZero length chunk ignoredr&   z{:X}
asciis   
s   0

)rJ   _read_readablerK   rM   itertyper8   r9   	_http_vsnformatrP   r   rz   )rC   ro   r\   chunkschunkr    r    r!   (httpconnection_patched_wrapper_send_body  s*    


r   )r   )F)NF)NF)F)(
__future__r   r   ossyshttp.clientclientr4   r   r   r   r   r   r	   r
   r   r   r   ior   	BaseUtilsr   rI   r"   rF   rT   rm   rp   ru   r{   re   r   HTTPResponsebeginHTTPConnectionrb   Z_send_readablern   _send_requestrf   r    r    r    r!   <module>   s.   
0

F!
D
 

,