a
    GN^                     @   s  d dl Z d dlmZmZ d dlmZ d dlmZ d dlZd dlm	Z	 d dl
mZmZ d dlmZ d dlZd dlZd dlZd dlmZ e  Zd	Zd
ZdZdZdZdZeeeeeegZdZG dd deZ ej!dddgidej"de#dddej"de$dddej%ejde#e$ddddZ&ej'd d!d"Z(ej)eej*d#d$d%Z+e#ee,eej- f d&d'd(Z.dd d)d*Z/e0d+kre/  dS ),    N)ExecutorProcessPoolExecutor)datetime)partial)freeze_support)SetTuple)web)versionzX-Protocol-VersionzX-Line-LengthzX-Python-VariantzX-Skip-String-NormalizationzX-Fast-Or-SafezX-DiffzX-Black-Versionc                   @   s   e Zd ZdS )InvalidVariantHeaderN)__name__
__module____qualname__ r   r   %lib/python3.9/site-packages/blackd.pyr   (   s   r   Zhelp_option_namesz-hz--help)Zcontext_settingsz--bind-hostzAddress to bind the server to.Z	localhost)typehelpdefaultz--bind-portzPort to listen oni  )	bind_host	bind_portreturnc                 C   sN   t jt jd t }tj}td| d|  d|  tj|| |dd d d S )N)levelzblackd version z listening on z port T)hostportZhandle_signalsprint)	loggingZbasicConfigINFOmake_appblack__version__outr	   Zrun_app)r   r   appZverr   r   r   main,   s
    r"   )r   c               	   C   sb   t  } t }t| }|| jd}||dt	t
|ddtjg tdR ddi | S )N/ZPOST)executor*zContent-Type)Zallow_headersZexpose_headers)r	   Applicationr   aiohttp_corsZsetupaddZrouterZadd_resourceZ	add_router   handleZResourceOptionsBLACK_HEADERS)r!   r$   Zcorsresourcer   r   r   r   :   s    
	r   )requestr$   r   c              
      s  t ti}z| jtddkr.tjdddW S zt| jtt	j
}W n" tyh   tjddd Y W S 0 t| jv r| jt }zt|\}}W q ty } z.tjddt d|jd	  dW  Y d }~W S d }~0 0 n
d
}t }t| jtd
}d
}	| jtddkrd}	t	j|||| d}
| j I d H }| jd urF| jnd}||}t }t }||tt	j||	|
dI d H }t| jt d
}|rt }d| d}d| d}t }||tt	j!||||I d H }tj| j"|||dW S  t	j#y   tjd|d Y S  t	j$yV } z tjd|t%|dW  Y d }~S d }~0  t&y } z*t'(d tjd|t%|dW  Y d }~S d }~0 0 d S )N1i  z,This server only supports protocol version 1)statustexti  z Invalid line length header valuezInvalid value for z: r   FsafefastT)Ztarget_versionsZis_pyiline_lengthZstring_normalizationutf8)r1   modezIn	z +0000zOut	)content_typecharsetheadersr/      )r.   r7   )r.   r7   r/   z#Exception during handling a requesti  ))BLACK_VERSION_HEADERr   r7   getPROTOCOL_VERSION_HEADERr	   ResponseintLINE_LENGTH_HEADERr   ZDEFAULT_LINE_LENGTH
ValueErrorPYTHON_VARIANT_HEADERparse_python_variant_headerr   argssetbool SKIP_STRING_NORMALIZATION_HEADERFAST_OR_SAFE_HEADERZFileModeZcontentreadr6   decoder   ZutcnowasyncioZget_event_loopZrun_in_executorr   Zformat_file_contentsDIFF_HEADERdiffr5   ZNothingChangedZInvalidInputstr	Exceptionr   	exception)r,   r$   r7   r2   valuepyiversionseZskip_string_normalizationr1   r4   Z	req_bytesr6   Zreq_strZthenZloopZformatted_strZ	only_diffZnowZsrc_nameZdst_namer   r   r   r)   L   s    

 


(
r)   )rO   r   c              
   C   sT  | dkrdt  fS t  }| dD ]"}|drB|tdd  }d|v rZ|d^}}n&|d }t|dkr||dd  gng }zt|}|dvrtd	t|dkrt|d }|d
kr|dkrtdn|d
krdnd}d| | }|dkrttj|std| d|	tj|  W q" t
tfyD   tdY q"0 q"d|fS d S )NrP   T,py.r      )      zmajor version must be 2 or 3rW      z$minor version must be 7 for Python 2rX   ZPYz3.z is not supportedzexpected e.g. '3.7', 'py3.5'F)rC   split
startswithlenr=   r   hasattrr   TargetVersionr(   KeyErrorr?   )rO   rQ   r
   Z	major_strrestmajorminorZversion_strr   r   r   rA      s8    

rA   c                   C   s   t   t  t  d S )N)r   r   Zpatch_clickr"   r   r   r   r   patched_main   s    rc   __main__)1rI   concurrent.futuresr   r   r   	functoolsr   r   Zmultiprocessingr   typingr   r   Zaiohttpr	   r'   r   ZclickZ_black_versionr
   r   EventZ_stop_signalr;   r>   r@   rE   rF   rJ   r*   r9   rM   r   ZcommandoptionrL   r=   Zversion_optionr"   r&   r   ZRequestr<   r)   rD   r^   rA   rc   r   r   r   r   r   <module>   sP   
L#
