o
    eu+                     @   s   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	m
Z
 d dlmZ d dl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e"Z#G dd de"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   GD:\Projects\ConvertPro\env\Lib\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 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kwZ
enable_sslr   r   r    from_url=   s   

zHTTPClient.from_urlNF   c                 C   sf  |d u ri }|| _ || _| j }| j}|d ur&|d usJ dd| _|}|}nd| _|	r3|
r1|
 ni }
|
d urq|d urH|d| j }|
d| d| _| jsQd| _|sV| j}ddlm} |||| j | j||
|||||| jd	| _	nd| _| jszd
| _|s| j}t
||| j | j||||| jd	| _	|| _|| _| | _| j| j | j| || _t|  | _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   )r3   r6   r7   r8   r9   )r*   r$   r9   copyget
setdefaultr%   geventhttpclient.connectionpoolr2   _connection_poolr   versionheaders_typedefault_headersupdateDEFAULT_HEADERS
block_sizestrget_base_url_base_url_string)selfr*   r$   headersrE   r7   r6   r8   concurrencyr%   r#   r4   r5   Z
proxy_hostZ
proxy_portr@   rA   Zconnection_hostZconnection_portZrequested_hostnamer2   r   r   r    __init__F   sv   


	zHTTPClient.__init__c                 C   s*   t  }| j|_| j|_| jrtpt|_|S N)r   r*   r$   r%   r(   
PROTO_HTTPr'   )rI   r,   r   r   r    rG      s
   zHTTPClient.get_base_urlc                 C   s   | j   d S rM   )r?   close)rI   r   r   r    rO      s   zHTTPClient.close c                 C   sV  |du ri }|   }|| j || | j| jkr4t|vr4| j}| jdvr0|tt	| j 7 }||t< |rDt
|vrDt|}|rD||t
< |}| jr\| j}	|trW|	dd }	|	| }n'|ttfsht| }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: basestring
        :param request_uri:
        :type request_uri: basestring
        :param body:
        :type body: basestring or file
        :param headers:
        :type headers: dict
        :return:
        :rtype: basestring
        N)r:   r1   r/   zInvalid host in URL)rA   rC   rB   r@   HTTP_11HEADER_HOSTr*   r$   HOST_PORT_SEPrF   HEADER_CONTENT_LENGTHr!   r9   rH   
startswithSLASHrN   r   
ValueError
WHITESPACECRLFitemsFIELD_VALUE_SEP)rI   methodrequest_urir   rJ   Zheader_fields	host_portbody_lengthrequest_urlbase_urlrequestfieldvaluer   r   r    _build_request   s>   





zHTTPClient._build_request    c              
   C   s|  t |tjr|d}| j| |||d}| jjd }	 | j }z9| }|rUt |tj	r7|
||  n#|
| tjrE|| n	 |d}	|	sNn|
|	 qFn|
| W n0 tjjy }
 z"| j| |
jtjksw|
jtjkr|dkr|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   rJ   r/   Ti   r   N)rE   r]   rA   )r&   six	text_typeencoderf   upperr?   r3   Z
get_socketbinary_typesendallPY3sendfilereadgeventsocketerrorZrelease_socketerrno
ECONNRESETEPIPEr   rE   rA   r   Z_sent_request)rI   r]   r^   r   rJ   rc   Zattempts_leftsock_requestchunkeresponser   r   r    rc      s\   






 
zHTTPClient.requestc                 C      | j t||dS N)rJ   )rc   
METHOD_GETrI   r^   rJ   r   r   r    r<   	     zHTTPClient.getc                 C   r}   r~   )rc   METHOD_HEADr   r   r   r    head  r   zHTTPClient.headc                 C      | j t|||dS Nrh   )rc   METHOD_POSTrI   r^   r   rJ   r   r   r    post     zHTTPClient.postc                 C   r   r   )rc   
METHOD_PUTr   r   r   r    put  r   zHTTPClient.putc                 C   r   r   )rc   METHOD_DELETEr   r   r   r    delete  r   zHTTPClient.deletec                 C   r   r   )rc   METHOD_PATCHr   r   r   r    patch  r   zHTTPClient.patchc                 C   r   r   )rc   METHOD_TRACEr   r   r   r    trace  r   zHTTPClient.tracec                 C   r}   r~   )rc   METHOD_OPTIONSr   r   r   r    options  r   zHTTPClient.options)rP   N)rg   NrM   )__name__
__module____qualname__rR   ZHTTP_10Z
BLOCK_SIZEr   r   rD   classmethodr.   r   ZDEFAULT_CONNECTION_TIMEOUTZDEFAULT_NETWORK_TIMEOUTrL   rG   rO   rf   rc   r<   r   r   r   r   r   r   r   r   r   r   r    r"   3   s@    

H

4:





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:port c                 K   s   t  | _|| _d S rM   )dictclientsclient_args)rI   kwargsr   r   r    rL   '  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 rM   )	r&   r   r*   r$   r   KeyErrorr"   r.   r   )rI   r,   Z
client_keyclientr   r   r    
get_client+  s   

zHTTPClientPool.get_clientc                 C   s   | j  D ]}|  qd S rM   )r   valuesrO   )rI   r   r   r   r    rO   6  s   
zHTTPClientPool.closeN)r   r   r   __doc__rL   r   rO   r   r   r   r    r   "  s
    r   )%ru   r   Zgevent.socketrr   ri   Zgeventhttpclientr   r>   r   Zgeventhttpclient.headerr   Zgeventhttpclient.responser   r   Zgeventhttpclient.urlr   rZ   rY   r\   rT   rW   rN   r(   rS   rU   r   r   r   r   r   r   r   r   r!   objectr"   r   r   r   r   r    <module>   s>     p