o
    e$                     @   s   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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)HTTPResponseParser)HTTPParseError)Headers         c                 C   s   t jr	| d d  S t| S N)sixPY3str)data r   ID:\Projects\ConvertPro\env\Lib\site-packages\geventhttpclient/response.pycopy   s   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dd Zdd Z	 fddZ
eeZ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                    s\   t t|   | | _d| _d| _d| _| | _t	| _
d | _d | _d| _t | _d | _d S )NFr   )superr   __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   Z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   r2   1   s   zHTTPResponse.getc                 C   
   | j  S r   )r!   	iteritemsr*   r   r   r   r5   4   r1   zHTTPResponse.iteritemsc                 C   r4   r   )r!   itemsr6   r   r   r   r7   7   r1   zHTTPResponse.itemsc                 C      | j S )z Basic cookielib compatibility r-   r6   r   r   r   info:      zHTTPResponse.infoc                    s    | j  p|  ptt|   S )z return 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    Zparser_failedr   r   Zshould_keep_aliver6   r+   r   r   should_close>   s
   zHTTPResponse.should_closec                 C   s
   || j v S r   r-   r.   r   r   r   __contains__J   r1   zHTTPResponse.__contains__c                 C      |   S r   )get_coder6   r   r   r   status_codeM      zHTTPResponse.status_codec                 C   s.   |  dd }|d urtjrt|S t|S d S )Nzcontent-length)r2   r	   r
   intlong)r*   lengthr   r   r   content_lengthQ   s   zHTTPResponse.content_lengthc                 C   r8   r   )rD   r6   r   r   r   rC   Z   r:   zHTTPResponse.lengthc                 C   r=   r   )Zget_http_versionr6   r   r   r   version^   r@   zHTTPResponse.versionc                 C   s
   || _ d S r   )r)   )r*   msgr   r   r   
_on_statusb   r1   zHTTPResponse._on_statusc                 C   s   | j r	td|  d| _ d S )Nz&A new response began before end of %r.T)r   r   r6   r   r   r   _on_message_begine   s
   
zHTTPResponse._on_message_beginc                 C   s
   d| _ d S )NT)r    r6   r   r   r   _on_message_completek   r1   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   r6   r   r   r   _on_headers_completen   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_fieldw   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_value   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&   r6   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j| jt| jdS )Nz+<{klass} status={status} headers={headers}>)klassstatusheaders)formatr,   r   r?   dictrY   r6   r   r   r   __repr__   s
   zHTTPResponse.__repr__r   )r   r   r   r   r   r0   r2   r5   r7   r9   r;   propertyrY   r<   r?   rD   rC   rE   rG   rH   rI   rM   rR   rS   rK   rV   r\   __classcell__r   r   r+   r   r      s6    





	
r   c                       s~   e Zd ZdZed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                    s2   t t| jdd|i| || _|| _|   d S )Nr   r   )r   r_   r   _sock
block_size_read_headers)r*   sockra   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;   closer6   r   r   r   release   s   


zHTTPSocketResponse.releasec                 C      |    d S r   rf   r6   r   r   r   __del__      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`   recvra   feedlenr   r   geventsocketerrorerrno
ECONNRESETr    rf   BaseException)r*   startr   er   r   r   rb      s<   
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    )rm   r(   findr   r    r`   rk   ra   rl   rs   rf   )	r*   sepcursorZ	multibytefoundposrC   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   )	rm   r(   r   r`   r    rk   ra   rl   rf   )r*   rC   readr   r   r   r   r      s4   



zHTTPSocketResponse.readc                 C      | S r   r   r6   r   r   r   __iter__     zHTTPSocketResponse.__iter__c                 C   s   |  | j}t|st |S r   )r   ra   rm   StopIteration)r*   bytesr   r   r   next  s   zHTTPSocketResponse.nextc                    s   t t|   |   d S r   )r   r_   rI   rf   r6   r+   r   r   rI     s   z'HTTPSocketResponse._on_message_completec                 C   r   r   r   r6   r   r   r   	__enter__  r   zHTTPSocketResponse.__enter__c                 G   rg   r   rh   )r*   argsr   r   r   __exit__  rj   zHTTPSocketResponse.__exit__)rv   r   )r   r   r   ZDEFAULT_BLOCK_SIZEr   rf   ri   rb   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t| j|fi | d S r   )_poolr   r   r   )r*   rc   poolrd   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_socketZreturn_socketr6   r   r   r   rf   &  s   



zHTTPSocketPoolResponse.releasec                 C   s    | j d ur| j| j  d S d S r   )r`   r   r   r6   r   r   r   ri   1  s   
zHTTPSocketPoolResponse.__del__)r   r   r   r   rf   ri   r^   r   r   r+   r   r      s    r   )r	   rq   Zgeventhttpclient._parserr   r   Zgeventhttpclient.headerr   Zgevent.socketrn   r"   rN   rO   rL   r   r   r   r   r_   r   r   r   r   r   <module>   s"    } 