o
    2wi)                     @   s   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mZ d dlmZ dZdZd	Zd
ZdZdZdZdZdZdZdZdZdZdZdZdZdZdd Z G dd dZ!G dd dZ"dS )    N)__version__)ConnectionPool)Headers)HTTPConnectionClosedHTTPSocketPoolResponse)URLz
 z: :/httphttpsHostzContent-LengthGETHEADPOSTPUTDELETEPATCHOPTIONSTRACEc                 C   sL   zt | W S  ty%   zt|  jW  Y S  ttfy$   Y Y dS w w )zR
    Get len of string or file

    :param body:
    :return:
    :rtype: int
    N)len	TypeErrorosfstatfilenost_sizeAttributeErrorOSError)body r   T/home/ubuntu/sommelier/.venv/lib/python3.10/site-packages/geventhttpclient/client.py_get_body_length    s   
r!   c                   @   s   e Zd ZdZdZdZedde iZe	dd Z
ddeejejd	d
d	ddd	ddeefddZdd Zd%ddZd&ddZi fddZd'ddZd%ddZd%ddZd%ddZd%dd Zd%d!d"Zd'd#d$ZdS )(
HTTPClientzHTTP/1.1zHTTP/1.0i   z
User-Agentzpython/gevent-http-client-c                 K   sF   t |ts	t|}|jtk}|s|dd  | |jf|j|d|S )Nssl_options)portssl)
isinstancer   schemePROTO_HTTPSpophostr$   )clsurlkw
enable_sslr   r   r    from_url9   s   

zHTTPClient.from_urlNF   c                 C   s  |d u r| }|| _ || _| j }| j}|d ur'|d usJ dd| _|}|}nd| _|	r4|
r2|
 ni }
|
d urr|d urI|d| j }|
d| d| _| jsRd| _|sW| j}ddlm} |||| j | j||
|||||| jd	| _	nd| _| js{d
| _|s| j}t
||| j | j||||| jd	| _	|| _|| _| | _| j| j | j| || _| jrtnt}|rd| nd}| d| j  | d| _d S )Nz4you have to provide proxy_port if you set proxy_hostTFr*   server_hostname  r   )SSLConnectionPool)sizer#   ssl_context_factoryinsecurenetwork_timeoutconnection_timeoutdisable_ipv6	use_proxyP   )r4   r7   r8   r9   r:   r	    z://r
   )r*   r$   r:   copyget
setdefaultr%   geventhttpclient.connectionpoolr3   _connection_poolr   versionheaders_typedefault_headersupdateDEFAULT_HEADERS
block_sizer(   
PROTO_HTTP_base_url_string)selfr*   r$   headersrG   r8   r7   r9   concurrencyr%   r#   r5   r6   
proxy_host
proxy_portrB   rC   connection_hostconnection_portrequested_hostnamer3   r'   port_strr   r   r    __init__B   s~   
zHTTPClient.__init__c                 C   s   | j   d S N)rA   close)rJ   r   r   r    rU      s   zHTTPClient.closer<   c                 C   s  |du ri }|   }|| j || | j| jkrMt|vrM| j}d| jv r;| jd dkr;| jd dkr;d| d }| jdvrI|tt	| j 7 }||t< |r]t
|vr]t|}|r]||t
< |}| jru| j}	|trp|	dd }	|	| }n'|ttfst| }n|tr|| jr|t| jd d }ntd	|t | t | j t }
| D ]\}}|
|t t	| t 7 }
q|
t7 }
|
S )
a(  

        :param method:
        :type method: str or bytes
        :param request_uri:
        :type request_uri: str or bytes
        :param body:
        :type body: str or bytes or file
        :param headers:
        :type headers: dict
        :return:
        :rtype: str or bytes
        Nr	   r   [])r;   r2   r0   zInvalid host in URL)rC   rE   rD   rB   HTTP_11HEADER_HOSTr*   r$   HOST_PORT_SEPstrHEADER_CONTENT_LENGTHr!   r:   rI   
startswithSLASHrH   r   
ValueError
WHITESPACECRLFitemsFIELD_VALUE_SEP)rJ   methodrequest_urir   rK   header_fields	host_portbody_lengthrequest_urlbase_urlrequestfieldvaluer   r   r    _build_request   sB   
&




zHTTPClient._build_request    c              
   C   sR  t |tr
|d}| j| |||d}| jjd }	 | j }z%| }|r@t |tr5|	||  n|	| |
| n|	| W n0 tjjyv }	 z"| j| |	jtjksb|	jtjkrp|dkrp|d8 }W Y d}	~	q|	d}	~	ww zt|| j| j| | jd}
W n ty }	 z|dkr|d8 }W Y d}	~	q|	d}	~	ww ||
_|
S )z

        :param method:
        :param request_uri:
        :param body: byte or file
        :param headers:
        :return:
        zutf-8r   rK   r0   r   N)rG   re   rC   )r&   r\   encodero   upperrA   r4   
get_socketbytessendallsendfilegeventsocketerrorrelease_socketerrno
ECONNRESETEPIPEr   rG   rC   r   _sent_request)rJ   re   rf   r   rK   rl   attempts_leftsock_requesteresponser   r   r    rl      sP   






 
zHTTPClient.requestc                 C      | j t||dS N)rK   )rl   
METHOD_GETrJ   rf   rK   r   r   r    r>        zHTTPClient.getc                 C   r   r   )rl   METHOD_HEADr   r   r   r    head  r   zHTTPClient.headc                 C      | j t|||dS Nrq   )rl   METHOD_POSTrJ   rf   r   rK   r   r   r    post     zHTTPClient.postc                 C   r   r   )rl   
METHOD_PUTr   r   r   r    put  r   zHTTPClient.putc                 C   r   r   )rl   METHOD_DELETEr   r   r   r    delete  r   zHTTPClient.deletec                 C   r   r   )rl   METHOD_PATCHr   r   r   r    patch  r   zHTTPClient.patchc                 C   r   r   )rl   METHOD_TRACEr   r   r   r    trace   r   zHTTPClient.tracec                 C   r   r   )rl   METHOD_OPTIONSr   r   r   r    options#  r   zHTTPClient.options)r<   N)rp   NrT   )__name__
__module____qualname__rY   HTTP_10
BLOCK_SIZEr   r   rF   classmethodr/   r   DEFAULT_CONNECTION_TIMEOUTDEFAULT_NETWORK_TIMEOUTrS   rU   ro   rl   r>   r   r   r   r   r   r   r   r   r   r   r    r"   1   sD    

X

77





r"   c                   @   s(   e Zd ZdZdd Zdd Zdd ZdS )	HTTPClientPoolz=Factory for maintaining a bunch of clients, one per host:portc                 K   s   i | _ || _d S rT   )clientsclient_args)rJ   r-   r   r   r    rS   ,  s   
zHTTPClientPool.__init__c                 C   s`   t |ts	t|}|j|jf}z| j| W S  ty/   tj|fi | j}|| j|< | Y S w rT   )	r&   r   r*   r$   r   KeyErrorr"   r/   r   )rJ   r,   
client_keyclientr   r   r    
get_client0  s   

zHTTPClientPool.get_clientc                 C   s&   | j  D ]}|  q| j   d S rT   )r   valuesrU   clear)rJ   r   r   r   r    rU   ;  s   
zHTTPClientPool.closeN)r   r   r   __doc__rS   r   rU   r   r   r   r    r   '  s
    r   )#r|   r   gevent.socketrx   geventhttpclientr   r@   r   geventhttpclient.headerr   geventhttpclient.responser   r   geventhttpclient.urlr   rb   ra   rd   r[   r_   rH   r(   rZ   r]   r   r   r   r   r   r   r   r   r!   r"   r   r   r   r   r    <module>   s:     w