a
    dj                     @   sZ  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 d dlm	Z	m
Z
 d dlmZmZmZmZmZmZmZmZmZmZmZ d dlmZ d dlmZmZ d dlmZ d dlmZm Z m!Z!m"Z"m#Z# d d	l$m%Z%m&Z&m'Z' d d
l(m)Z)m*Z* d dl+m,Z, d dl-m.Z.m/Z/m0Z0m1Z1m2Z2 d dl3m4Z4 d dl5m6Z6m7Z7 d dl8m9Z9m:Z: d dl;m<Z< d dl=m>Z> d dl?m@Z@ d dlAmBZB d dlCmDZD d dlEmFZFmGZG d dlHmIZImJZJ d dlHmKZK d dlHmLZLmMZMmNZNmOZO d dlPmQZQ d dlRmSZSmTZTmUZU d dlVmWZW dddeeXeXeXeddd ZYdddd!dddd!d"ee9 eeee&e%f  eee&e%f  eXeXeXeXeXed#
d$d%ZZeee[ef eXed&d'd(Z\ddeeFdddd!ddddfeee9 ee] eeeG ef ee9 eee&e%f  eee&e%f  eXeXeXeXee eeDgeeeeGf f d)d*d+Z^d5eee eeWgeeeef f d,d-d.Z_G d/d0 d0e>j`ZaG d1d2 d2e>jbZcG d3d4 d4e>jdZedS )6    N)AsyncExitStack)EnumIntEnum)AnyCallable	CoroutineDictListOptionalSequenceSetTupleTypeUnion)params)DefaultDefaultPlaceholder)	Dependant)get_body_fieldget_dependantget_parameterless_sub_dependantget_typed_return_annotationsolve_dependencies)DictIntStrAny	SetIntStrjsonable_encoder)RequestValidationErrorWebSocketRequestValidationErrorDecoratedCallable)create_cloned_fieldcreate_response_fieldgenerate_unique_idget_value_or_defaultis_body_allowed_for_status_code)	BaseModel)ErrorWrapperValidationError)
ModelField	Undefined)lenient_issubclass)routing)run_in_threadpool)HTTPException)Request)JSONResponseResponse)	BaseRouteMatch)Mount)compile_pathget_namerequest_responsewebsocket_session)WS_1008_POLICY_VIOLATION)ASGIAppLifespanScope	WebSocketF)exclude_defaultsexclude_none)resexclude_unsetr>   r?   returnc                   s   t | tr2t| jdd }|r | S | jd dS t | trR fdd| D S t | trv fdd|  D S t| rt	| S | S )Nread_with_orm_modeT)by_aliasrA   r>   r?   c                    s   g | ]}t | d qS rA   r>   r?   _prepare_response_content).0itemr>   r?   rA    X/var/www/html/stable-diffusion-webui/venv/lib/python3.9/site-packages/fastapi/routing.py
<listcomp>V   s   z-_prepare_response_content.<locals>.<listcomp>c              	      s"   i | ]\}}|t | d qS rE   rG   )rI   kvrK   rL   rM   
<dictcomp>`   s   z-_prepare_response_content.<locals>.<dictcomp>)

isinstancer%   getattrZ
__config__dictlistitemsdataclassesZis_dataclassZasdict)r@   rA   r>   r?   rC   rL   rK   rM   rH   @   s*    

	
	

rH   T)fieldincludeexcluderD   rA   r>   r?   is_coroutine)
rX   response_contentrY   rZ   rD   rA   r>   r?   r[   rB   c        	      	      s   | rg }	t ||||d}|r2| j|i dd\}
}nt| j|i ddI d H \}
}t|trd|	| nt|trx|	| |	rt|	| j	t
|
||||||dS t
|S d S )NrF   )response)loc)rY   rZ   rD   rA   r>   r?   )rH   validater,   rR   r&   appendrU   extendr'   type_r   )rX   r\   rY   rZ   rD   rA   r>   r?   r[   errorsvalueZerrors_rL   rL   rM   serialize_responsen   s:    




re   )	dependantvaluesr[   rB   c                    sH   | j d usJ d|r,| j f i |I d H S t| j fi |I d H S d S )N!dependant.call must be a function)callr,   rf   rg   r[   rL   rL   rM   run_endpoint_function   s    rk   )rf   
body_fieldstatus_coderesponse_classresponse_fieldresponse_model_includeresponse_model_excluderesponse_model_by_aliasresponse_model_exclude_unsetresponse_model_exclude_defaultsresponse_model_exclude_nonedependency_overrides_providerrB   c                    sx   j d usJ dtj o.tjtjt|trB|j n| t	t
d 	
fdd}|S )Nrh   )requestrB   c                    sh  zd }r҈rD|   I d H }| jd}t|ts6J ||j n|  I d H }|rt}| j	d}|sz| 
 I d H }nFtj }||d< | dkr| }|dks|dr| 
 I d H }|tkr|}n|}W n t
jy } z*tt|d|jfg|jd|W Y d }~nPd }~0  ty.    Y n4 ty` } ztdd	d
|W Y d }~n
d }~0 0 t| |dI d H }	|	\}
}}}}|rt||dnt|
dI d H }t|tr|jd u r||_|S d|i}rn|j}|d ur||d< |jr|j|d< t|	
d	I d H } |fi |}t|jsNd|_|j	j |j	j |S d S )NZfastapi_astackzcontent-typeZapplicationjsonz+jsonbody)ry   i  z#There was an error parsing the body)rm   Zdetail)rw   rf   ry   rv   rj   
backgroundrm   )	rX   r\   rY   rZ   rD   rA   r>   r?   r[       )!formscopegetrR   r   push_async_callbackclosery   r)   headersrx   emailmessageMessageget_content_maintypeget_content_subtypeendswithJSONDecodeErrorr   r&   posdocr-   	Exceptionr   rk   r0   rz   rm   re   r$   rawra   )rw   ry   stackZ
body_bytesZ	json_bodyZcontent_type_valuer   subtypeesolved_resultrg   rc   Zbackground_tasksZsub_response_Zraw_responseZresponse_argsZcurrent_status_codecontentr]   Zactual_response_classrl   rf   rv   Zis_body_formr[   ro   rr   rq   rt   ru   rs   rp   rm   rL   rM   app   s    


z get_request_handler.<locals>.app)ri   asyncioiscoroutinefunctionrR   Z
field_infor   ZFormr   rd   r.   r0   )rf   rl   rm   rn   ro   rp   rq   rr   rs   rt   ru   rv   r   rL   r   rM   get_request_handler   s    
.Rr   )rf   rv   rB   c                    s   t d d fdd}|S )N)	websocketrB   c                    sl   t |  dI d H }|\}}}}}|r@| jtdI d H  t| jd usRJ d jf i |I d H  d S )N)rw   rf   rv   )coderh   )r   r   r8   r   ri   )r   r   rg   rc   r   Z_2Z_3rf   rv   rL   rM   r     s    zget_websocket_app.<locals>.appr<   )rf   rv   r   rL   r   rM   get_websocket_app  s    r   c                       sZ   e Zd Zdddeedef ee ee ddddZee	e
ef d fdd	Z  ZS )
APIWebSocketRouteN)namerv   .)pathendpointr   rv   rB   c                C   s`   || _ || _|d u rt|n|| _t|\| _| _| _t| j| jd| _	t
t| j	|d| _d S )Nr   ri   r   )r   r   r5   r   r4   
path_regexpath_formatparam_convertorsr   rf   r7   r   r   )selfr   r   r   rv   rL   rL   rM   __init__'  s    zAPIWebSocketRoute.__init__r}   rB   c                    s*   t  |\}}|tjkr"| |d< ||fS Nroutesupermatchesr2   NONEr   r}   matchZchild_scope	__class__rL   rM   r   ;  s    
zAPIWebSocketRoute.matches)__name__
__module____qualname__strr   r   r
   r   r;   r   r2   r   __classcell__rL   rL   r   rM   r   &  s   
r   c                       s  e Zd Zedddddddddddddddddddeedddeedeedef ee	e
 e	eeeef   e	eej  e	e e	e ee	eee
ef eeef f  e	e e	e e	eee ee f  e	e e	eeef  e	eeef  eeeeeeee ef e	e e	ee  e	eeef  eed gef ef dddd	Zeegeeeef f d
ddZeee ef d fddZ!  Z"S )APIRouteNSuccessful ResponseTF)response_modelrm   tagsdependenciessummarydescriptionresponse_description	responses
deprecatedr   methodsoperation_idrp   rq   rr   rs   rt   ru   include_in_schemarn   rv   	callbacksopenapi_extragenerate_unique_id_function.)r   r   r   rm   r   r   r   r   r   r   r   r   r   r   rp   rq   rr   rs   rt   ru   r   rn   rv   r   r   r   rB   c          $      C   s  || _ || _t|tr2t|}t|tr.d }n|}|| _|| _|	| _	|| _
|| _|| _|| _|| _|| _|| _|| _|| _|| _|| _|| _|| _|| _|pg | _|
pi | _|d u rt|n|| _t|\| _| _| _|d u rdg}dd |D | _ t|tr|j!}n|}| jp|| | _"t|t#r2t$|}|| _%| jrt&|sZJ d| dd| j" }t'|| jd| _(t)| j(| _*nd | _(d | _*|rt+|| _,ng | _,|pt-.| jj/pd| _0| j01d	d
 2 | _0i }| j3 D ]n\}} t| t4sJ d| 5d}!|!rt&|s,J d| dd| d| j" }t'||!d}"|"||< q|rd|| _6ni | _6t7|s|J dt8| j| jd| _9| j,d d d D ] }#| j9j,:d
t;|#| jd qt<| j9| j"d| _=t>| ? | _@d S )NGETc                 S   s   h | ]}|  qS rL   )upper)rI   methodrL   rL   rM   	<setcomp>  r{   z$APIRoute.__init__.<locals>.<setcomp>zStatus code z must not have a response bodyZ	Response_)r   rb    r   z%An additional response must be a dictmodelr   zAn endpoint must be a callabler   )dependsr   )rf   r   )Ar   r   rR   r   r   r*   r0   r   r   r   r   r   rp   rq   rr   rs   rt   ru   r   rn   rv   r   r   r   r   r   r5   r   r4   r   r   r   r   rd   Z	unique_idr   intrm   r$   r!   ro   r    secure_cloned_response_fieldrU   r   inspectcleandoc__doc__r   splitstriprV   rT   r~   response_fieldscallabler   rf   insertr   r   rl   r6   get_route_handlerr   )$r   r   r   r   rm   r   r   r   r   r   r   r   r   r   r   rp   rq   rr   rs   rt   ru   r   rn   rv   r   r   r   return_annotationcurrent_generate_unique_idZresponse_namer   Zadditional_status_coder]   r   ro   r   rL   rL   rM   r   C  s    "







zAPIRoute.__init__)rB   c                 C   s8   t | j| j| j| j| j| j| j| j| j	| j
| j| jdS )N)rf   rl   rm   rn   ro   rp   rq   rr   rs   rt   ru   rv   )r   rf   rl   rm   rn   r   rp   rq   rr   rs   rt   ru   rv   )r   rL   rL   rM   r     s    zAPIRoute.get_route_handlerr   c                    s*   t  |\}}|tjkr"| |d< ||fS r   r   r   r   rL   rM   r     s    
zAPIRoute.matches)#r   r   r   r   r/   r"   r   r   r   r
   r   r	   r   r   r   r   Dependsr   boolr   r   r   r   r0   r   r1   r   r.   r   r   r;   r   r2   r   r   rL   rL   r   rM   r   B  sx   

 "r   c                       s  e Zd Zdddeeddddddedddddeedeee	e
eef   eeej  ee eee
eef eeef f  ee	e  ee	ej  eee ee ee eeeg ef   eeeg ef   ee ee eeegef dd fddZd7eee	e  ee eeegef dd	d
Zeddddddddddddddddddeeddddeedeedef eee ee	e
eef   eeej  ee ee eeee
eef eeef f  ee ee
ee e	e f  ee ee
eef  ee
eef  eeeeee
ee e f ee eee  ee	e  eeeef  e
eegef e f ddddZ!eddddddddddddddddddeedddeedeeee ee	e
eef   eeej  ee ee eeee
eef eeef f  ee ee	e  ee ee
eef  ee
eef  eeeeeee ee ee	e  eeeef  eegef eegef dddZ"d8eedef ee ddddZ#d9eee eegef dddZ$d:ee
edf eegef dddZ%dddeeddddeed	d eee	e
eef   eeej  ee eee
eef eeef f  ee	e  ee eeegef ddd d!Z&edddddddddddddddddeedddeed"eeee ee	e
eef   eeej  ee ee eeee
eef eeef f  ee ee ee
eef  ee
eef  eeeeeee ee ee	e  eeeef  eegef eegef d#d$d%Z'edddddddddddddddddeedddeed"eeee ee	e
eef   eeej  ee ee eeee
eef eeef f  ee ee ee
eef  ee
eef  eeeeeee ee ee	e  eeeef  eegef eegef d#d&d'Z(edddddddddddddddddeedddeed"eeee ee	e
eef   eeej  ee ee eeee
eef eeef f  ee ee ee
eef  ee
eef  eeeeeee ee ee	e  eeeef  eegef eegef d#d(d)Z)edddddddddddddddddeedddeed"eeee ee	e
eef   eeej  ee ee eeee
eef eeef f  ee ee ee
eef  ee
eef  eeeeeee ee ee	e  eeeef  eegef eegef d#d*d+Z*edddddddddddddddddeedddeed"eeee ee	e
eef   eeej  ee ee eeee
eef eeef f  ee ee ee
eef  ee
eef  eeeeeee ee ee	e  eeeef  eegef eegef d#d,d-Z+edddddddddddddddddeedddeed"eeee ee	e
eef   eeej  ee ee eeee
eef eeef f  ee ee ee
eef  ee
eef  eeeeeee ee ee	e  eeeef  eegef eegef d#d.d/Z,edddddddddddddddddeedddeed"eeee ee	e
eef   eeej  ee ee eeee
eef eeef f  ee ee ee
eef  ee
eef  eeeeeee ee ee	e  eeeef  eegef eegef d#d0d1Z-edddddddddddddddddeedddeed"eeee ee	e
eef   eeej  ee ee eeee
eef eeef f  ee ee ee
eef  ee
eef  eeeeeee ee ee	e  eeeef  eegef eegef d#d2d3Z.eeegef d4d5d6Z/  Z0S );	APIRouterr   NT)prefixr   r   default_response_classr   r   routesredirect_slashesdefaultrv   route_class
on_startupon_shutdownlifespanr   r   r   )r   r   r   r   r   r   r   r   r   rv   r   r   r   r   r   r   r   rB   c                   s   t  j|||	|||d |r@|ds.J d|dr@J d|| _|pLg | _t|pXg p^g | _|| _|| _	|pti | _
|p~g | _|
| _|| _|| _|| _d S )N)r   r   r   r   r   r   /!A path prefix must start with '/'FA path prefix must not end with '/', as the routes will start with '/')r   r   
startswithr   r   r   rU   r   r   r   r   r   rv   r   r   r   )r   r   r   r   r   r   r   r   r   r   rv   r   r   r   r   r   r   r   r   rL   rM   r     s4    


zAPIRouter.__init__)r   r   r   r   rB   c                    s    t t d fdd}|S )NfuncrB   c                    s   j |  d | S )N)r   r   r   )	add_router   r   r   r   r   r   rL   rM   	decorator  s    z"APIRouter.route.<locals>.decoratorr   )r   r   r   r   r   r   rL   r   rM   r     s    
zAPIRouter.router   Fr   rm   r   r   r   r   r   r   r   r   r   rp   rq   rr   rs   rt   ru   r   rn   r   route_class_overrider   r   r   .)r   r   r   rm   r   r   r   r   r   r   r   r   r   rp   rq   rr   rs   rt   ru   r   rn   r   r   r   r   r   rB   c          #      C   s   |p| j }|
pi }
i | j|
}t|| j}| j }|rD|| | j }|r\|| | j } |rt| | t|| j	}!|| j
| ||||||||	||p| j|||||||||o| j||| j| ||!d}"| j|" d S )N)r   r   rm   r   r   r   r   r   r   r   r   r   rp   rq   rr   rs   rt   ru   r   rn   r   rv   r   r   r   )r   r   r#   r   r   copyra   r   r   r   r   r   r   rv   r   r`   )#r   r   r   r   rm   r   r   r   r   r   r   r   r   r   rp   rq   rr   rs   rt   ru   r   rn   r   r   r   r   r   r   combined_responsesZcurrent_response_classcurrent_tagscurrent_dependenciescurrent_callbacksr   r   rL   rL   rM   add_api_route"  s^    "






zAPIRouter.add_api_router   rm   r   r   r   r   r   r   r   r   r   rp   rq   rr   rs   rt   ru   r   rn   r   r   r   r   )r   r   rm   r   r   r   r   r   r   r   r   r   rp   rq   rr   rs   rt   ru   r   rn   r   r   r   r   rB   c                   sH   t t d 	
fdd}|S )Nr   c                    s@   j 
| 	 d | S )Nr   )r   r   r   r   r   r   r   r   r   r   r   r   r   rn   r   r   rr   rq   rt   ru   rs   rp   r   r   rm   r   r   rL   rM   r     s8    z&APIRouter.api_route.<locals>.decoratorr   )r   r   r   rm   r   r   r   r   r   r   r   r   r   rp   rq   rr   rs   rt   ru   r   rn   r   r   r   r   r   rL   r   rM   	api_routet  s    DzAPIRouter.api_route)r   r   r   rB   c                 C   s(   t | j| ||| jd}| j| d S )N)r   r   rv   )r   r   rv   r   r`   )r   r   r   r   r   rL   rL   rM   add_api_websocket_route  s    z!APIRouter.add_api_websocket_route)r   r   rB   c                    s   t t d fdd}|S )Nr   c                    s   j |  d | S Nr   )r   r   r   r   r   rL   rM   r     s    z&APIRouter.websocket.<locals>.decoratorr   r   r   r   r   rL   r   rM   r     s    zAPIRouter.websocketc                    s   t t d fdd}|S )Nr   c                    s   j |  d | S r   )add_websocket_router   r   rL   rM   r     s    z,APIRouter.websocket_route.<locals>.decoratorr   r  rL   r   rM   websocket_route  s    zAPIRouter.websocket_route)	r   r   r   r   r   r   r   r   r   )routerr   r   r   r   r   r   r   r   r   rB   c       	         C   s  |r*| dsJ d|drhJ dn>|jD ]6}t|d}t|dd}|d ur0|s0td| dq0|d u rti }|jD ]}t|tri ||j}t|j	|j
|| j
}g }|r|| |jr||j g }|r|| |jr||j g }|r
|| |jr||j t|j|j|
| j}| j||j |j|j|j|||j|j|j||jpn|pn| j|j|j|j|j|j|j|j|j |j!o| j!o|	||j"t#|||j$|d	 qzt|t%j&rt'|jpg }| j(||j |j||j!|j"d
 qzt|t)r$| j*||j |j|j"d qzt|t%j+rz| j,||j |j|j"d qz|j-D ]}| .d| qR|j/D ]}| .d| qld S )Nr   r   r   r   r   unknownz6Prefix and path cannot be both empty (path operation: )r   )r   r   r   r   Zstartupshutdown)0r   r   r   rS   r   rR   r   r   r#   rn   r   ra   r   r   r   r   r   r   r   r   rm   r   r   r   r   r   r   rp   rq   rr   rs   rt   ru   r   r   typer   r+   RouterU   r   r   r   WebSocketRouter  r   add_event_handlerr   )r   r  r   r   r   r   r   r   r   r   r   rr   r   r   r   Zuse_response_classr   r   r   r   r   handlerrL   rL   rM   include_router  s    







zAPIRouter.include_router)r   rm   r   r   r   r   r   r   r   r   rp   rq   rr   rs   rt   ru   r   rn   r   r   r   r   )r   r   rm   r   r   r   r   r   r   r   r   rp   rq   rr   rs   rt   ru   r   rn   r   r   r   r   rB   c                C   s<   | j |||||||||	|
dg|||||||||||||dS )Nr   r   r   rm   r   r   r   r   r   r   r   r   r   rp   rq   rr   rs   rt   ru   r   rn   r   r   r   r   r   r   r   r   rm   r   r   r   r   r   r   r   r   rp   rq   rr   rs   rt   ru   r   rn   r   r   r   r   rL   rL   rM   r~   @  s4    zAPIRouter.getc                C   s<   | j |||||||||	|
dg|||||||||||||dS )NPUTr  r  r  rL   rL   rM   putx  s4    zAPIRouter.putc                C   s<   | j |||||||||	|
dg|||||||||||||dS )NPOSTr  r  r  rL   rL   rM   post  s4    zAPIRouter.postc                C   s<   | j |||||||||	|
dg|||||||||||||dS )NDELETEr  r  r  rL   rL   rM   delete  s4    zAPIRouter.deletec                C   s<   | j |||||||||	|
dg|||||||||||||dS )NOPTIONSr  r  r  rL   rL   rM   options   s4    zAPIRouter.optionsc                C   s<   | j |||||||||	|
dg|||||||||||||dS )NHEADr  r  r  rL   rL   rM   headX  s4    zAPIRouter.headc                C   s<   | j |||||||||	|
dg|||||||||||||dS )NPATCHr  r  r  rL   rL   rM   patch  s4    zAPIRouter.patchc                C   s<   | j |||||||||	|
dg|||||||||||||dS )NTRACEr  r  r  rL   rL   rM   trace  s4    zAPIRouter.trace)
event_typerB   c                    s   t t d fdd}|S )Nr   c                    s     |  | S )N)r  r   r   r   rL   rM   r     s    z%APIRouter.on_event.<locals>.decoratorr   )r   r   r   rL   r!  rM   on_event   s    zAPIRouter.on_event)NNT)N)N)N)1r   r   r   r   r/   r   r"   r   r
   r	   r   r   r   r   r   r   r0   r   r   r   r1   r+   r   r9   r   r:   r   r   r   r   r   r   r   r   r   r   r   r  r  r~   r  r  r  r  r  r  r  r"  r   rL   rL   r   rM   r     s  
3   



V

?  
 
u
<
<
<
<
<
<
<
9r   )N)fr   rW   email.messager   r   rx   
contextlibr   enumr   r   typingr   r   r   r   r	   r
   r   r   r   r   r   Zfastapir   Zfastapi.datastructuresr   r   Zfastapi.dependencies.modelsr   Zfastapi.dependencies.utilsr   r   r   r   r   Zfastapi.encodersr   r   r   Zfastapi.exceptionsr   r   Zfastapi.typesr   Zfastapi.utilsr    r!   r"   r#   r$   Zpydanticr%   Zpydantic.error_wrappersr&   r'   Zpydantic.fieldsr(   r)   Zpydantic.utilsr*   Z	starletter+   Zstarlette.concurrencyr,   Zstarlette.exceptionsr-   Zstarlette.requestsr.   Zstarlette.responsesr/   r0   Zstarlette.routingr1   r2   r3   r4   r5   r6   r7   Zstarlette.statusr8   Zstarlette.typesr9   r:   r;   Zstarlette.websocketsr=   r   rH   re   r   rk   r   r   r   r
  r   r	  r   ZRouterr   rL   rL   rL   rM   <module>   s   40.l  