o
    2wi                     @   s   d Z ddlZddlmZ ddlZddlZddlm	Z	m
Z
mZ eejddZG dd de
jZG d	d
 d
ejZG dd dejjZzddlZW n	 eyP   Y n	w G dd deZdd Zedd ZdS )z
Provide HTTPConnection, HTTPSConnection and HTTPResponse implementations ready
to use as drop-in replacements for their counterparts in http.client.
    N)contextmanager)connectionpoolheaderresponse_UNKNOWNUNKNOWNc                       s   e Zd Z fddZ  ZS )HTTPLibHeadersc                    s(   t  |}t|ttfrd|S |S )Nz, )super__getitem__
isinstancelisttuplejoin)selfkeyvalue	__class__ U/home/ubuntu/sommelier/.venv/lib/python3.10/site-packages/geventhttpclient/httplib.pyr
      s   
zHTTPLibHeaders.__getitem__)__name__
__module____qualname__r
   __classcell__r   r   r   r   r      s    r   c                       s  e Zd Zd5 fdd	Zedd Zejdd Zedd	 Zed
d Zedd Z	edd Z
edd Zdd Zdd Zdd Zdd Zdd Zdd Zd6 fdd	Zd d! Zd7d#d$Zd7d%d&Zd'd( Zd6d)d*Zd+d, Zed-d. Zd/d0 Zd1d2 Zd3d4 Z  ZS )8HTTPResponser   Nc                    sB   |d u rdn|  }t j|fd|i| || _t| _t| _d S )NGETmethod)upperr	   __init__urlr   chunked
chunk_left)r   sock
debuglevelr   r   kwr   r   r   r      s
   
zHTTPResponse.__init__c                 C   s"   t | dr| jS t| j| _| jS )N_msg)hasattrr%   r   _headers_indexr   r   r   r   msg"   s   
zHTTPResponse.msgc                 C   s
   || _ d S N)r%   )r   headersr   r   r   r)   )   s   
c                 C   s   | S r*   r   r(   r   r   r   fp.   s   zHTTPResponse.fpc                 C   s   |   }|dkr
dS dS )NzHTTP/1.1   
   )get_http_version)r   vr   r   r   version2   s   zHTTPResponse.versionc                 C      | j S r*   status_coder(   r   r   r   status9      zHTTPResponse.statusc                 C   r2   r*   r3   r(   r   r   r   code=   r6   zHTTPResponse.codec                 C   r2   r*   )r)   r(   r   r   r   reasonA   r6   zHTTPResponse.reasonc                 C   s   | j | j| jfS r*   )r1   r4   r)   r(   r   r   r   _read_statusE      zHTTPResponse._read_statusc                 C   s   d S r*   r   r(   r   r   r   beginH      zHTTPResponse.beginc                 C   s   | j   d S r*   )_body_bufferclearr(   r   r   r   flushK      zHTTPResponse.flushc                 C   s   dS )NTr   r(   r   r   r   readableN   r<   zHTTPResponse.readablec                 C   s   |    d S r*   )releaser(   r   r   r   closeQ      zHTTPResponse.closec                 C   s
   | j d u S r*   )_sockr(   r   r   r   isclosedT      
zHTTPResponse.isclosedc                    s   t  |S r*   )r	   read)r   amtr   r   r   rH   W   rD   zHTTPResponse.readc                 C      t  r*   NotImplementedError)r   br   r   r   readintoZ      zHTTPResponse.readintoc                 C   rJ   r*   rK   r   nr   r   r   read1]   rO   zHTTPResponse.read1c                 C   rJ   r*   rK   rQ   r   r   r   peek`   rO   zHTTPResponse.peekc                 C   rJ   r*   rK   r(   r   r   r   filenoc   rO   zHTTPResponse.filenoc                 C   s   |  | |S r*   )getlower)r   namedefaultr   r   r   	getheaderf   r:   zHTTPResponse.getheaderc                 C   s   t | j S r*   )r   r'   itemsr(   r   r   r   
getheadersi   r@   zHTTPResponse.getheadersc                 C   s   | j o|   S r*   )message_completeshould_keep_aliver(   r   r   r   
will_closel   s   zHTTPResponse.will_closec                 C   s
   |    S r*   )r^   r(   r   r   r   _check_closep   rG   zHTTPResponse._check_closec                 C   r2   r*   )r   r(   r   r   r   geturlu   rO   zHTTPResponse.geturlc                 C   r2   r*   r3   r(   r   r   r   getcodex   rO   zHTTPResponse.getcode)r   NNr*   )rP   )r   r   r   r   propertyr)   setterr,   r1   r5   r7   r8   r9   r;   r?   rA   rC   rF   rH   rN   rS   rT   rU   rZ   r\   r_   r`   ra   rb   r   r   r   r   r   r      sD    










r   c                       s<   e Zd ZeZdZdZdd Z fddZ fddZ	  Z
S )HTTPConnectionNc                 C   s4   t j| j| jf| j| j| _| jr| 	  d S d S r*   )
geventsocketcreate_connectionhostporttimeoutsource_addressr"   _tunnel_host_tunnelr(   r   r   r   connect   s   zHTTPConnection.connectc                    s4   | j s| jd ur| j| _ t  }| j | _d | _ |S r*   )r"   _hidden_socketr	   getresponse)r   respr   r   r   rq      s   
zHTTPConnection.getresponsec                    s&   | j s| jd ur| j| _ t   d S r*   )r"   rp   r	   rC   r(   r   r   r   rC      s   zHTTPConnection.close)r   r   r   r   response_classrl   rp   ro   rq   rC   r   r   r   r   r   re   |   s    re   c                       s4   e Zd ZdZ					d fdd	Zdd Z  ZS )HTTPSConnectioni  Nc           	         s   t  j||fi | |d us|d us|d ur"dd l}|dtd || _|p)tj| _|d u rMtj	t
jj| j|d}| jdkrE|dg |jd urMd|_|| _d S )Nr   zTkey_file, cert_file and check_hostname are deprecated, use a custom context instead.   )check_hostnamer-   zhttp/1.1T)r	   r   warningswarnDeprecationWarningkey_filer   	_CA_CERTS	cert_fileinit_ssl_contextrf   sslcreate_default_context	_http_vsnset_alpn_protocolspost_handshake_auth_context)	r   ri   rj   rz   r|   contextrv   r$   rw   r   r   r   r      s*   



zHTTPSConnection.__init__c                 C   sL   t j| j| jf| j| j}| jr|| _| 	  t j
j|| j| jd| _dS )z(Connect to a host on a given (SSL) port.)r   server_hostnameN)rf   rg   rh   ri   rj   rk   rl   rm   r"   rn   r~   	SSLSocketr   )r   r"   r   r   r   ro      s   
zHTTPSConnection.connect)NNNNN)r   r   r   default_portr   ro   r   r   r   r   r   rt      s    $rt   c                   C   s4   t tj_ ttj_zttj_W d S  ty   Y d S w r*   )re   httpclientr   rt   	NameErrorr   r   r   r   patch   s   r   c                  c   s    t jj} t jj}zt jj}W n	 ty   Y nw z6tt j_tt j_ztt j_W n	 ty1   Y nw dV  W | t j_|t j_z|t j_W dS  tyO   Y dS w | t j_|t j_z|t j_W w  tyg   Y w w )zTemporarily patch http.client.N)r   r   re   r   rt   r   )http_client_HTTPConnectionhttp_client_HTTPResponsehttp_client_HTTPSConnectionr   r   r   patched   s>   r   )__doc__http.clientr   
contextlibr   gevent.socketrf   
gevent.sslgeventhttpclientr   r   r   getattrr   r   Headersr   HTTPSocketResponser   re   ImportErrorrt   r   r   r   r   r   r   <module>   s&    	b%5	