U
    ʼb.                     @   s^  d dl T d dlmZmZ g Zd ZeD ]Zeee e< q(edd eD 7 Ze	e
eeeeieeeeeieeeieeeieeeiei ei ei iee
eeeeee	feieeeeeeefeeefeieeeeeieeeieeeieeeiei ei iiZeefe	eieefeeiee
feeieefeeieefe	eie
efe	eieefe	eiiZG dd deZdS )	   )*)LocalProtocolErrormake_sentinelzCLIENT SERVER IDLE SEND_RESPONSE SEND_BODY DONE MUST_CLOSE CLOSED MIGHT_SWITCH_PROTOCOL SWITCHED_PROTOCOL ERROR _SWITCH_UPGRADE _SWITCH_CONNECTc                 C   s   g | ]}| d s|qS )_)
startswith).0s r	   ./tmp/pip-unpacked-wheel-rko__zic/h11/_state.py
<listcomp>   s     
 r   c                   @   sN   e Zd Zdd Zdd Zdd Zdd Zdd
dZdd Zdd Z	dd Z
d	S )ConnectionStatec                 C   s    d| _ t | _tttti| _d S )NT)
keep_alivesetpending_switch_proposalsCLIENTIDLESERVERstatesselfr	   r	   r
   __init__   s    zConnectionState.__init__c                 C   s   t | j|< |   d S N)ERRORr   !_fire_state_triggered_transitions)r   roler	   r	   r
   process_error   s    
zConnectionState.process_errorc                 C   s   d| _ |   d S )NF)r   r   r   r	   r	   r
   process_keep_alive_disabled   s    z+ConnectionState.process_keep_alive_disabledc                 C   s   | j | |   d S r   )r   addr   )r   Zswitch_eventr	   r	   r
   process_client_switch_proposal   s    z.ConnectionState.process_client_switch_proposalNc                 C   s   |d k	r4|t kst|| jkr,td|||f}|d krL|tkrLt | _| || |tkr||t	kslt| t tt	f | 
  d S )Nz3Received server {} event without a pending proposal)r   AssertionErrorr   r   formatResponser   !_fire_event_triggered_transitionsRequestr   r   )r   r   
event_typeZserver_switch_eventr	   r	   r
   process_event   s     
zConnectionState.process_eventc              
   C   s\   | j | }zt| | | }W n. tk
rL   td|j|| j | Y nX || j |< d S )Nz4can't handle event type {} when role={} and state={})r   EVENT_TRIGGERED_TRANSITIONSKeyErrorr   r    __name__)r   r   r$   stateZ	new_stater	   r	   r
   r"      s    
  
z1ConnectionState._fire_event_triggered_transitionsc                 C   s   t | j}| jr(| jt tkr(t| jt< | jsF| jt tkrFt| jt< | jsrttfD ]}| j| tkrTt| j|< qT| jt | jt f}t	
|i }| j| | j|kr d S q d S r   )dictr   r   r   DONEMIGHT_SWITCH_PROTOCOLr   r   
MUST_CLOSESTATE_TRIGGERED_TRANSITIONSgetupdate)r   Zstart_statesr   Zjoint_statechangesr	   r	   r
   r      s     



z1ConnectionState._fire_state_triggered_transitionsc                 C   s@   | j ttttikrtd| js$t| jr.ttttti| _ d S )Nznot in a reusable state)	r   r   r+   r   r   r   r   r   r   r   r	   r	   r
   start_next_cycle(  s
    

z ConnectionState.start_next_cycle)N)r(   
__module____qualname__r   r   r   r   r%   r"   r   r2   r	   r	   r	   r
   r      s   

(r   N) Z_eventsZ_utilr   r   __all__splitZ	sentinelstokenglobalsr   r   r#   Z	SEND_BODYZConnectionClosedZCLOSEDDataZEndOfMessager+   r-   r,   ZSWITCHED_PROTOCOLr   r   r!   ZSEND_RESPONSEZInformationalResponseZ_SWITCH_UPGRADEZ_SWITCH_CONNECTr&   r.   objectr   r	   r	   r	   r
   <module>r   s                           <       