U
    g                  	   @   s  d dl Z d dlZd dlZd dlZd dlZd dlmZmZ d dl	m
Z
 d dlmZmZ d dlmZ d dlZeedejf eejddf ddd	Zejejed
ZeedZe ZW 5 Q R X G dd de
ZddddZG dd dejZddddZ dS )    N)closingcontextmanager)SimpleHTTPRequestHandler)Callable	Generator)urlopen.)handlerreturnc                 c   sH   t d| }tj|jddid}d|_z|  |V  W 5 |  X d S )N)z	127.0.0.1r   poll_intervalg{Gz?)targetkwargsT)socketserver	TCPServer	threadingThreadserve_foreverdaemonshutdownstart)r   httpdthread r   F/tmp/pip-unpacked-wheel-ib4s2i_e/h11/tests/test_against_stdlib_http.pysocket_server   s     
r   zdata/test-filerbc                   @   s   e Zd ZeedddZdS )SingleMindedRequestHandler)pathr	   c                 C   s   t S )N)test_file_path)selfr   r   r   r   translate_path$   s    z)SingleMindedRequestHandler.translate_pathN)__name__
__module____qualname__strr   r   r   r   r   r   #   s   r   r	   c                  C   s   t t} tt| j}ttj}|	|
tjdddgd |	|
t  t }| }t| |tjkr||d q`t|tjkr|jdkstt|tjkr||j7 }t|tjkr`qq`t|tkstW 5 Q R X W 5 Q R X d S )NGETz/foo)Host	localhostmethodr   headers
      )r   r   r   socketcreate_connectionserver_addressh11
ConnectionZCLIENTsendallsendRequestEndOfMessage	bytearray
next_eventprint	NEED_DATAreceive_datarecvtypeResponsestatus_codeAssertionErrorDatadatabytestest_file_data)r   scrA   eventr   r   r   test_h11_as_client(   s4    
  

rG   c                   @   s   e Zd ZddddZdS )H11RequestHandlerNr$   c              	   C   s   t | j}ttj}d }| }|tjkr@||d qt	|tj
krR|}t	|tjkrqdq|d k	sptt|jd|jddd |jD d}||tjdg d ||tj|dd ||t  W 5 Q R X d S )	Nr+   asciic                 S   s"   i | ]\}}| d | d qS )rI   )decode).0namevaluer   r   r   
<dictcomp>]   s    z,H11RequestHandler.handle.<locals>.<dictcomp>r(   r,   )r>   r*   )rA   )r   requestr0   r1   ZSERVERr7   r9   r:   r;   r<   r4   r5   r?   jsondumpsr)   rJ   r   r*   r2   r3   r=   r@   encode)r   rD   rE   rO   rF   infor   r   r   handleI   s.    



zH11RequestHandler.handle)r    r!   r"   rT   r   r   r   r   rH   H   s   rH   c               
   C   s   t tL} | j\}}d||}tt|}| dks>t| }W 5 Q R X W 5 Q R X t	
|d}t| |d dkst|d dkstd|d	 d
 kstd S )Nzhttp://{}:{}/some-pathr,   rI   r)   r%   r   z
/some-pathurllibr*   z
user-agent)r   rH   r/   formatr   r   getcoder?   readrP   loadsrJ   r8   )r   hostporturlfrA   rS   r   r   r   test_h11_as_serverh   s    

r^   )!rP   os.pathosr-   r   r   
contextlibr   r   Zhttp.serverr   typingr   r   urllib.requestr   r0   BaseRequestHandlerr   r   r   joindirname__file__r   openr]   rX   rC   r   rG   rH   r^   r   r   r   r   <module>   s(     