o
    2wi                      @   s   d dl Z d dlZd dlmZmZ d dlmZ d ZdZ	dZ
dZdd ZG d	d
 d
eZG dd deZG dd deZG dd deZG dd deZdS )    N)HTTPParseErrorHTTPResponseParser)Headers         c                 C   s   | d d  S N )datar	   r	   V/home/ubuntu/sommelier/.venv/lib/python3.10/site-packages/geventhttpclient/response.pycopy      r   c                   @      e Zd ZdS )HTTPConnectionClosedN__name__
__module____qualname__r	   r	   r	   r   r          r   c                   @   r   )HTTPProtocolViolationErrorNr   r	   r	   r	   r   r      r   r   c                       s   e Zd Zdef fdd	Zdd Zd+ddZd	d
 ZeeZ	dd Z
dd Z f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d%d& Zd'd( Zd)d* Z  ZS ),HTTPResponseGETc                    sX   t    | | _d| _d| _d| _| | _t| _	d | _
d | _d| _t | _d | _d S )NFr   )super__init__uppermethodheaders_completemessage_begunmessage_complete_headers_indexHEADER_STATE_INIT_header_state_current_header_field_current_header_value_header_position	bytearray_body_bufferstatus_message)selfr   headers_type	__class__r	   r   r      s   


zHTTPResponse.__init__c                 C   s
   | j | S r   r   r(   keyr	   r	   r   __getitem__)      
zHTTPResponse.__getitem__Nc                 C   s   | j ||S r   )r   get)r(   r.   defaultr	   r	   r   r1   ,   s   zHTTPResponse.getc                 C   s
   | j  S r   )r   itemsr(   r	   r	   r   r3   /   r0   zHTTPResponse.itemsc                 C      | j S r   r,   r4   r	   r	   r   info4      zHTTPResponse.infoc                 C   s
   || j v S r   r,   r-   r	   r	   r   __contains__8   r0   zHTTPResponse.__contains__c                    s   | j  p|  pt   S )zreturn if we should close the connection.

        It is not the opposite of should_keep_alive method. It also checks
        that the body as been consumed completely.
        )r   parser_failedr   should_keep_aliver4   r*   r	   r   should_close;   s   zHTTPResponse.should_closec                 C      |   S r   )get_coder4   r	   r	   r   status_codeC      zHTTPResponse.status_codec                 C   s    |  dd }|d urt|S d S )Nzcontent-length)r1   int)r(   lengthr	   r	   r   content_lengthG   s   zHTTPResponse.content_lengthc                 C   r5   r   )rB   r4   r	   r	   r   rA   M   r7   zHTTPResponse.lengthc                 C   r<   r   )get_http_versionr4   r	   r	   r   versionQ   r?   zHTTPResponse.versionc                 C   s
   || _ d S r   )r'   )r(   msgr	   r	   r   
_on_statusU   r0   zHTTPResponse._on_statusc                 C   s    | j rtd| dd| _ d S )Nz#A new response began before end of .T)r   r   r4   r	   r	   r   _on_message_beginX   s   
zHTTPResponse._on_message_beginc                 C   s
   d| _ d S )NT)r   r4   r	   r	   r   _on_message_complete]   r0   z!HTTPResponse._on_message_completec                 C   s&   |    t| _d| _| jdkrdS dS )NTHEADF)_flush_headerHEADER_STATE_DONEr!   r   r   r4   r	   r	   r   _on_headers_complete`   s   
z!HTTPResponse._on_headers_completec                 C   s<   | j tkr|  j|7  _n| j tkr|   || _t| _ d S r   )r!   HEADER_STATE_FIELDr"   HEADER_STATE_VALUErK   r(   stringr	   r	   r   _on_header_fieldi   s   


zHTTPResponse._on_header_fieldc                 C   s*   | j tkr|  j|7  _n|| _t| _ d S r   )r!   rO   r#   rP   r	   r	   r   _on_header_values   s   

zHTTPResponse._on_header_valuec                 C   s>   | j d ur| j| j | j |  jd7  _d | _ d | _d S d S )Nr   )r"   r   addr#   r$   r4   r	   r	   r   rK   {   s   

zHTTPResponse._flush_headerc                 C   s   |  j |7  _ d S r   )r&   )r(   bufr	   r	   r   _on_body   s   zHTTPResponse._on_bodyc                 C   s$   d| j j d| j dt| j dS )N<z status=z	 headers=>)r+   r   r>   dictheadersr4   r	   r	   r   __repr__   s   $zHTTPResponse.__repr__r   )r   r   r   r   r   r/   r1   r3   propertyrZ   r6   r8   r;   r>   rB   rA   rD   rF   rH   rI   rM   rR   rS   rK   rV   r[   __classcell__r	   r	   r*   r   r      s4    




	
r   c                       s   e Zd ZdZedef fdd	Zdd Zdd Zd	d
 ZdddZ	dddZ
dd Zdd Z fddZdd Zdd Z  ZS )HTTPSocketResponsei   r   c                    s(   t  j||d || _|| _|   d S )N)r   r)   )r   r   _sock
block_size_read_headers)r(   sockr`   r   r)   kwr*   r	   r   r      s   zHTTPSocketResponse.__init__c                 C   sd   z-| j d ur|  r"z| j   W n   Y W d | _ d S W d | _ d S W d | _ d S W d | _ d S d | _ w r   )r_   r;   closer4   r	   r	   r   release   s   


zHTTPSocketResponse.releasec                 C      |    d S r   re   r4   r	   r	   r   __del__   r   zHTTPSocketResponse.__del__c              
   C   s   zRd}| j sFz!| j| j}| | t|s$| j s$|r tdtdd}W n tj	j
yB } z|jtjkr=|r=td d }~ww | j r| jrP|   W d S W d S  ty^   |    w )NTzconnection closed.z+connection closed before end of the headersF)r   r_   recvr`   feedlenr   r   geventsocketerrorerrno
ECONNRESETr   re   BaseException)r(   startr
   er	   r	   r   ra      s4   
z HTTPSocketResponse._read_headers   
c           	      C   s   d}t |dk}	 | j|dd |}|dkrId}|r-|}| j||}|dk r-|}d}|rH|t | }t| jd | }| jd |= d}|S nd}| jrPdS z| j| j}| | W n t	yj   | 
   w q	)Nr   r   TF    )rk   r&   findr   r   r_   ri   r`   rj   rq   re   )	r(   sepcursor	multibytefoundposrA   liner
   r	   r	   r   readline   s<   zHTTPSocketResponse.readlineNc                 C   s
  |d urt | j|kr| jd| }| jd|= t|S | jd u r.t| j}| jd d = |S z,| jsY|d u s=t | j|k rY| j|pD| j}| | | jsY|d u s=t | j|k s=W n   |    |d urxt| jd| }| jd|= |S t| j}| jd d = |S )Nr   )	rk   r&   r   r_   r   ri   r`   rj   re   )r(   rA   readr
   r	   r	   r   r~      s0   



zHTTPSocketResponse.readc                 C      | S r   r	   r4   r	   r	   r   __iter__      zHTTPSocketResponse.__iter__c                 C   s   |  | j}t|st |S r   )r~   r`   rk   StopIteration)r(   bytesr	   r	   r   __next__   s   zHTTPSocketResponse.__next__c                    s   t    |   d S r   )r   rI   re   r4   r*   r	   r   rI      s   
z'HTTPSocketResponse._on_message_completec                 C   r   r   r	   r4   r	   r	   r   	__enter__  r   zHTTPSocketResponse.__enter__c                 G   rf   r   rg   )r(   argsr	   r	   r   __exit__  r   zHTTPSocketResponse.__exit__)rt   r   )r   r   r   DEFAULT_BLOCK_SIZEr   r   re   rh   ra   r}   r~   r   r   rI   r   r   r]   r	   r	   r*   r   r^      s    


r^   c                       s,   e Zd Z fddZdd Zdd Z  ZS )HTTPSocketPoolResponsec                    s   || _ t j|fi | d S r   )_poolr   r   )r(   rb   poolrc   r*   r	   r   r     s   zHTTPSocketPoolResponse.__init__c                 C   sv   z3| j d ur"|  r| j| j  n| j| j  W d | _ d | _d S W d | _ d | _d S W d | _ d | _d S d | _ d | _w r   )r_   r;   r   release_socketreturn_socketr4   r	   r	   r   re     s   



zHTTPSocketPoolResponse.releasec                 C   s    | j d ur| j| j  d S d S r   )r_   r   r   r4   r	   r	   r   rh     s   
zHTTPSocketPoolResponse.__del__)r   r   r   r   re   rh   r]   r	   r	   r*   r   r   
  s    r   )ro   gevent.socketrl   geventhttpclient._parserr   r   geventhttpclient.headerr   r    rN   rO   rL   r   r   r   r   r^   r   r	   r	   r	   r   <module>   s    o 