o
     d                      @   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 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lRmSZSmTZT d dlUmVZV ddddedeWd eWd!eWd"ef
d#d$ZXdddd%dddd%d&d'ee9 d(ed)eee&e%f  d*eee&e%f  d+eWdeWd eWd!eWd,eWd"efd-d.ZYd/ed0eeZef d,eWd"efd1d2Z[ddeeFdddd%ddddfd/ed3ee9 d4ee\ d5eeeG ef d6ee9 d7eee&e%f  d8eee&e%f  d9eWd:eWd;eWd<eWd=ee d"eeDgeeeeGf f fd>d?Z]	dHd/ed=ee d"eeVgeeeef f fd@dAZ^G dBdC dCe>j_Z`G dDdE dEe>jaZbG dFdG dGe>jcZddS )I    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Scope	WebSocketF)exclude_defaultsexclude_noneresexclude_unsetr=   r>   returnc                   s   t | trt| jdd }|r| S | jd dS t | tr) fdd| D S t | tr; fdd|  D S t| rEt	| S | S )Nread_with_orm_modeT)by_aliasr@   r=   r>   c                    s   g | ]
}t | d qS r@   r=   r>   _prepare_response_content).0itemr=   r>   r@    :/usr/local/lib/python3.10/dist-packages/fastapi/routing.py
<listcomp>V   s    z-_prepare_response_content.<locals>.<listcomp>c              	      s"   i | ]\}}|t | d qS rD   rF   )rH   kvrJ   rK   rL   
<dictcomp>`   s    z-_prepare_response_content.<locals>.<dictcomp>)

isinstancer%   getattr
__config__dictlistitemsdataclassesis_dataclassasdict)r?   r@   r=   r>   rB   rK   rJ   rL   rG   @   s*   


	
	
rG   T)fieldincludeexcluderC   r@   r=   r>   is_coroutinerZ   response_contentr[   r\   rC   r]   c        	      	      s   | rPg }	t ||||d}|r| j|i dd\}
}nt| j|i ddI d H \}
}t|tr3|	| n
t|tr=|	| |	rEt|	| j	t
|
||||||dS t
|S )NrE   )response)loc)r[   r\   rC   r@   r=   r>   )rG   validater,   rQ   r&   appendrU   extendr'   type_r   )rZ   r^   r[   r\   rC   r@   r=   r>   r]   errorsvalueerrors_rK   rK   rL   serialize_responsen   s<   




rh   	dependantvaluesc                    sF   | j d us
J d|r| j di |I d H S t| j fi |I d H S )N!dependant.call must be a functionrK   )callr,   ri   rj   r]   rK   rK   rL   run_endpoint_function   s
   rn   
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_providerc                    sz   j d us	J dtj otjtjt|tr!|j n| dt	dt
f 	
fdd}|S )Nrk   requestrA   c                    s6  zjd }rjr#|   I d H }| jd}t|tsJ ||j nG|  I d H }|rjt}| j	d}|s>| 
 I d H }n#tj }||d< | dkra| }|dksZ|dra| 
 I d H }|tkrh|}n|}W n5 t
jy } ztt|d|jfg|jd|d }~w ty     ty } ztdd	d
|d }~ww t| |dI d H }	|	\}
}}}}|rt||dt|
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sd|_|j	j |j	j |S )Nfastapi_astackzcontent-typeapplicationjsonz+jsonbody)r~   i  z#There was an error parsing the body)rp   detail)rz   ri   r~   ry   rm   
backgroundrp   )	rZ   r^   r[   r\   rC   r@   r=   r>   r]       )!formscopegetrQ   r   push_async_callbackcloser~   r)   headersr}   emailmessageMessageget_content_maintypeget_content_subtypeendswithJSONDecodeErrorr   r&   posdocr-   	Exceptionr   rn   r0   r   rp   rh   r$   rawrc   )rz   r~   stack
body_bytes	json_bodycontent_type_valuer   subtypeesolved_resultrj   re   background_taskssub_response_raw_responseresponse_argscurrent_status_codecontentr_   actual_response_classro   ri   ry   is_body_formr]   rr   ru   rt   rw   rx   rv   rs   rp   rK   rL   app   s   



z get_request_handler.<locals>.app)rl   asyncioiscoroutinefunctionrQ   
field_infor   Formr   rf   r.   r0   )ri   ro   rp   rq   rr   rs   rt   ru   rv   rw   rx   ry   r   rK   r   rL   get_request_handler   s   
0Rr   c                    s   dt dd f fdd}|S )N	websocketrA   c                    sn   t |  dI d H }|\}}}}}|r!| jtdI d H  t| jd us*J d jdi |I d H  d S )N)rz   ri   ry   )coderk   rK   )r   r   r8   r   rl   )r   r   rj   re   r   _2_3ri   ry   rK   rL   r     s   zget_websocket_app.<locals>.appr;   )ri   ry   r   rK   r   rL   get_websocket_app  s   r   c                       sd   e Zd Zddddededef dee dee ddf
d	d
Zdede	e
ef f fddZ  ZS )APIWebSocketRouteN)namery   pathendpoint.r   ry   rA   c                C   s`   || _ || _|d u rt|n|| _t|\| _| _| _t| j| jd| _	t
t| j	|d| _d S )Nr   rl   r   )r   r   r5   r   r4   
path_regexpath_formatparam_convertorsr   ri   r7   r   r   )selfr   r   r   ry   rK   rK   rL   __init__'  s   
zAPIWebSocketRoute.__init__r   c                    *   t  |\}}|tjkr| |d< ||fS Nroutesupermatchesr2   NONEr   r   matchchild_scope	__class__rK   rL   r   ;     
zAPIWebSocketRoute.matches)__name__
__module____qualname__strr   r   r
   r   r:   r   r2   r   __classcell__rK   rK   r   rL   r   &  s    

&r   c                8       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dededef d	ed
e	e
 de	eeeef   de	eej  de	e de	e dede	eee
ef eeef f  de	e de	e de	eee ee f  de	e de	eeef  de	eeef  dedededededeee ef de	e de	ee  de	eeef  d eed gef ef d!df6d"d#Zd!eegeeeef f fd$d%Zd&ed!ee ef f fd'd(Z!  Z"S ))APIRouteNSuccessful ResponseTF)response_modelrp   tagsdependenciessummarydescriptionresponse_description	responses
deprecatedr   methodsoperation_idrs   rt   ru   rv   rw   rx   include_in_schemarq   ry   	callbacksopenapi_extragenerate_unique_id_functionr   r   .r   rp   r   r   r   r   r   r   r   r   r   r   rs   rt   ru   rv   rw   rx   r   rq   ry   r   r   r   rA   c          $      C   s  || _ || _t|trt|}t|trd }n|}|| _|| _|	| _	|| _
|| _|| _|| _|| _|| _|| _|| _|| _|| _|| _|| _|| _|| _|pOg | _|
pTi | _|d u r^t|n|| _t|\| _| _| _|d u rrdg}dd |D | _ t|tr|j!}n|}| jp|| | _"t|t#rt$|}|| _%| jrt&|sJ 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 ]5\}} t| t4sJ d| 5d}!|!r t&|sJ d| dd| d| j" }t'||!d}"|"||< q|r(|| _6ni | _6t7|s4J dt8| j| jd| _9| j,d d d D ]}#| j9j,:d
t;|#| jd qEt<| j9| j"d| _=t>| ? | _@d S )NGETc                 S   s   h | ]}|  qS rK   )upper)rH   methodrK   rK   rL   	<setcomp>  s    z$APIRoute.__init__.<locals>.<setcomp>zStatus code z must not have a response body	Response_)r   rd    r   z%An additional response must be a dictmodelr   zAn endpoint must be a callabler   )dependsr   )ri   r   )Ar   r   rQ   r   r   r*   r0   r   r   r   r   r   rs   rt   ru   rv   rw   rx   r   rq   ry   r   r   r   r   r   r5   r   r4   r   r   r   r   rf   	unique_idr   intrp   r$   r!   rr   r    secure_cloned_response_fieldrU   r   inspectcleandoc__doc__r   splitstriprV   rT   r   response_fieldscallabler   ri   insertr   r   ro   r6   get_route_handlerr   )$r   r   r   r   rp   r   r   r   r   r   r   r   r   r   r   rs   rt   ru   rv   rw   rx   r   rq   ry   r   r   r   return_annotationcurrent_generate_unique_idresponse_namer   additional_status_coder_   r   rr   r   rK   rK   rL   r   C  s   "









zAPIRoute.__init__c                 C   s8   t | j| j| j| j| j| j| j| j| j	| j
| j| jdS )N)ri   ro   rp   rq   rr   rs   rt   ru   rv   rw   rx   ry   )r   ri   ro   rp   rq   r   rs   rt   ru   rv   rw   rx   ry   )r   rK   rK   rL   r     s   zAPIRoute.get_route_handlerr   c                    r   r   r   r   r   rK   rL   r     r   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   rK   rK   r   rL   r   B  s    
	

!
 "&r   c                8       s  e Zd Zdddeeddddddeddddeeddedee	e
eef   deeej  dee d	eee
eef eeef f  d
ee	e  dee	ej  dedee dee dee deeeg ef   deeeg ef   dee dedeegef ddf" fddZ			dTdedee	e  dee dedeegef f
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ded ed!ef d"ed#ee dee	e
eef   deeej  d$ee d%ee d&ed	eee
eef eeef f  dee dee
ee e	e f  d'ee d(ee
eef  d)ee
eef  d*ed+ed,ed-eded.e
ee ef dee d/eee  d
ee	e  d0eeeef  de
eegef ef ddf6d1d2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d3ded"ed#ee dee	e
eef   deeej  d$ee d%ee d&ed	eee
eef eeef f  dee dee	e  d'ee d(ee
eef  d)ee
eef  d*ed+ed,ed-eded.ee dee d
ee	e  d0eeeef  deegef deegef f2d4d5Z!	dUded ed!ef dee ddfd6d7Z"	dUdedee deegef fd8d9Z#	dUdede
edf deegef fd:d;Z$dddeeddddeed<	d=d dedee	e
eef   deeej  dee d	eee
eef eeef f  d
ee	e  dee dedeegef ddf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@ded"ed#ee dee	e
eef   deeej  d$ee d%ee d&ed	eee
eef eeef f  dee d'ee d(ee
eef  d)ee
eef  d*ed+ed,ed-eded.ee dee d
ee	e  d0eeeef  deegef deegef f0dAdB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@ded"ed#ee dee	e
eef   deeej  d$ee d%ee d&ed	eee
eef eeef f  dee d'ee d(ee
eef  d)ee
eef  d*ed+ed,ed-eded.ee dee d
ee	e  d0eeeef  deegef deegef f0dCdD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@ded"ed#ee dee	e
eef   deeej  d$ee d%ee d&ed	eee
eef eeef f  dee d'ee d(ee
eef  d)ee
eef  d*ed+ed,ed-eded.ee dee d
ee	e  d0eeeef  deegef deegef f0dEdF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@ded"ed#ee dee	e
eef   deeej  d$ee d%ee d&ed	eee
eef eeef f  dee d'ee d(ee
eef  d)ee
eef  d*ed+ed,ed-eded.ee dee d
ee	e  d0eeeef  deegef deegef f0dGdH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@ded"ed#ee dee	e
eef   deeej  d$ee d%ee d&ed	eee
eef eeef f  dee d'ee d(ee
eef  d)ee
eef  d*ed+ed,ed-eded.ee dee d
ee	e  d0eeeef  deegef deegef f0dIdJ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@ded"ed#ee dee	e
eef   deeej  d$ee d%ee d&ed	eee
eef eeef f  dee d'ee d(ee
eef  d)ee
eef  d*ed+ed,ed-eded.ee dee d
ee	e  d0eeeef  deegef deegef f0dKdL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@ded"ed#ee dee	e
eef   deeej  d$ee d%ee d&ed	eee
eef eeef f  dee d'ee d(ee
eef  d)ee
eef  d*ed+ed,ed-eded.ee dee d
ee	e  d0eeeef  deegef deegef f0dMdN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@ded"ed#ee dee	e
eef   deeej  d$ee d%ee d&ed	eee
eef eeef f  dee d'ee d(ee
eef  d)ee
eef  d*ed+ed,ed-eded.ee dee d
ee	e  d0eeeef  deegef deegef f0dOdPZ-dQedeegef fdRdSZ.  Z/S )V	APIRouterr   NT)prefixr   r   default_response_classr   r   routesredirect_slashesdefaultry   route_class
on_startupon_shutdownr   r   r   r   r   r   r   r   r   r   r   r   ry   r   r   r   r   r   r   rA   c                   s   t  j|||	||d |r|dsJ d|drJ d|| _|p%g | _t|p+g p.g | _|| _|| _	|p9i | _
|p>g | _|
| _|| _|| _|| _d S )N)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   ry   r   r   r   )r   r   r   r   r   r   r   r   r   r   ry   r   r   r   r   r   r   r   rK   rL   r     s2   



zAPIRouter.__init__r   r   r   c                    s"   dt dt f fdd}|S )NfuncrA   c                    s   j |  d | S )N)r   r   r   )	add_router  r   r   r   r   r   rK   rL   	decorator  s   z"APIRouter.route.<locals>.decoratorr   )r   r   r   r   r   r	  rK   r  rL   r     s   
zAPIRouter.router   F)r   rp   r   r   r   r   r   r   r   r   r   rs   rt   ru   rv   rw   rx   r   rq   r   route_class_overrider   r   r   r   .r   rp   r   r   r   r   rs   rt   ru   rv   rw   rx   rq   r
  r   c          #      C   s  |p| j }|
pi }
i | j|
}t|| j}| j }|r"|| | j }|r.|| | j } |r:| | t|| j	}!|| j
| fi d|d|d|d|d|d|d|d|	d	|d
|pg| jd|d|d|d|d|d|d|d|d|o| jd|d|d| jd| d|d|!}"| j|" d S d|d|d| jd| d|d|!}"| j|" d S )Nr   r   rp   r   r   r   r   r   r   r   r   r   rs   rt   ru   rv   rw   rx   r   rq   r   ry   r   r   r   )r   r   r#   r   r   copyrc   r   r   r   r   r   r   ry   r   rb   )#r   r   r   r   rp   r   r   r   r   r   r   r   r   r   rs   rt   ru   rv   rw   rx   r   rq   r   r
  r   r   r   r   combined_responsescurrent_response_classcurrent_tagscurrent_dependenciescurrent_callbacksr   r   rK   rK   rL   add_api_route   s   
"





	

zAPIRouter.add_api_route)r   rp   r   r   r   r   r   r   r   r   r   rs   rt   ru   rv   rw   rx   r   rq   r   r   r   r   c                   sJ   dt dt f 	
fdd}|S )Nr  rA   c                    s   j 
| fi ddddddddd	d
d	dddddddddd dd | S )Nr   rp   r   r   r   r   r   r   r   r   r   rs   rt   ru   rv   rw   rx   r   rq   r   r   r   r   )r  r  r   r   r   r   r   r   r   r   r   r   r   rq   r   r   ru   rt   rw   rx   rv   rs   r   r   rp   r   r   rK   rL   r	    sf   	
z&APIRouter.api_route.<locals>.decoratorr   )r   r   r   rp   r   r   r   r   r   r   r   r   r   rs   rt   ru   rv   rw   rx   r   rq   r   r   r   r   r	  rK   r  rL   	api_router  s   FzAPIRouter.api_routec                 C   s(   t | j| ||| jd}| j| d S )N)r   r   ry   )r   r   ry   r   rb   )r   r   r   r   r   rK   rK   rL   add_api_websocket_route  s   z!APIRouter.add_api_websocket_routec                       dt dt f fdd}|S )Nr  rA   c                       j |  d | S Nr   )r  r  r   r   r   rK   rL   r	       z&APIRouter.websocket.<locals>.decoratorr   r   r   r   r	  rK   r  rL   r        zAPIRouter.websocketc                    r  )Nr  rA   c                    r  r  )add_websocket_router  r  rK   rL   r	    r  z,APIRouter.websocket_route.<locals>.decoratorr   r  rK   r  rL   websocket_route  r  zAPIRouter.websocket_route)	r   r   r   r   r   r   r   r   r   routerc       	         C   s  |r| dsJ d|drJ dn|jD ]}t|d}t|dd}|d ur3|s3td| dq|d u r:i }|jD ]}t|tr	i ||j}t|j	|j
|| j
}g }|r`|| |jri||j g }|rr|| |jr{||j g }|r|| |jr||j t|j|j|
| j}| j||j |jfi d	|jd
|jd|d|d|jd|jd|jd|d|jp|p| jd|jd|jd|jd|jd|jd|jd|jd|j d|j!o| j!o|	d|d|j"dt#|d|d|j$d| q=t|t%j&r)t'|jpg }| j(||j |j||j!|j"d  q=t|t)r=| j*||j |j|j"d! q=t|t%j+rQ| j,||j |j|j"d! q=|j-D ]	}| .d"| qU|j/D ]	}| .d#| qbd S )$Nr  r  r  r   r   unknownz6Prefix and path cannot be both empty (path operation: )r   rp   r   r   r   r   r   r   r   r   r   rs   rt   ru   rv   rw   rx   r   rq   r
  r   r   r   )r   r   r   r  startupshutdown)0r  r   r   rR   r   rQ   r   r   r#   rq   r   rc   r   r   r   r   r  r   r   r   rp   r   r   r   r   r   r   rs   rt   ru   rv   rw   rx   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  use_response_classr  r  r  r   r   handlerrK   rK   rL   include_router  s   





	


zAPIRouter.include_router)r   rp   r   r   r   r   r   r   r   r   rs   rt   ru   rv   rw   rx   r   rq   r   r   r   r   c                C      | j di d|d|d|d|d|d|d|d|d	|	d
|
ddgd|d|d|d|d|d|d|d|d|d|d|d|d|S )Nr   r   rp   r   r   r   r   r   r   r   r   r   r   rs   rt   ru   rv   rw   rx   r   rq   r   r   r   r   rK   r  r   r   r   rp   r   r   r   r   r   r   r   r   rs   rt   ru   rv   rw   rx   r   rq   r   r   r   r   rK   rK   rL   r   >  b   
	
zAPIRouter.getc                C   r,  )Nr   r   rp   r   r   r   r   r   r   r   r   PUTr   rs   rt   ru   rv   rw   rx   r   rq   r   r   r   r   rK   r-  r.  rK   rK   rL   putv  r/  zAPIRouter.putc                C   r,  )Nr   r   rp   r   r   r   r   r   r   r   r   POSTr   rs   rt   ru   rv   rw   rx   r   rq   r   r   r   r   rK   r-  r.  rK   rK   rL   post  r/  zAPIRouter.postc                C   r,  )Nr   r   rp   r   r   r   r   r   r   r   r   DELETEr   rs   rt   ru   rv   rw   rx   r   rq   r   r   r   r   rK   r-  r.  rK   rK   rL   delete  r/  zAPIRouter.deletec                C   r,  )Nr   r   rp   r   r   r   r   r   r   r   r   OPTIONSr   rs   rt   ru   rv   rw   rx   r   rq   r   r   r   r   rK   r-  r.  rK   rK   rL   options  r/  zAPIRouter.optionsc                C   r,  )Nr   r   rp   r   r   r   r   r   r   r   r   HEADr   rs   rt   ru   rv   rw   rx   r   rq   r   r   r   r   rK   r-  r.  rK   rK   rL   headV  r/  zAPIRouter.headc                C   r,  )Nr   r   rp   r   r   r   r   r   r   r   r   PATCHr   rs   rt   ru   rv   rw   rx   r   rq   r   r   r   r   rK   r-  r.  rK   rK   rL   patch  r/  zAPIRouter.patchc                C   r,  )Nr   r   rp   r   r   r   r   r   r   r   r   TRACEr   rs   rt   ru   rv   rw   rx   r   rq   r   r   r   r   rK   r-  r.  rK   rK   rL   trace  sb   
	
zAPIRouter.trace
event_typec                    s   dt dt f fdd}|S )Nr  rA   c                    s     |  | S N)r'  r  r>  r   rK   rL   r	    s   z%APIRouter.on_event.<locals>.decoratorr   )r   r>  r	  rK   r@  rL   on_event  s   zAPIRouter.on_event)NNTr?  )0r   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   r1  r3  r5  r7  r9  r;  r=  rA  r   rK   rK   r   rL   r     s   
	
1


	


!
V	



?






	

u	


<	


<	


<	


<	


<	


<	


<	


9r   r?  )er   rW   email.messager   r   r}   
contextlibr   enumr   r   typingr   r   r   r   r	   r
   r   r   r   r   r   fastapir   fastapi.datastructuresr   r   fastapi.dependencies.modelsr   fastapi.dependencies.utilsr   r   r   r   r   fastapi.encodersr   r   r   fastapi.exceptionsr   r   fastapi.typesr   fastapi.utilsr    r!   r"   r#   r$   pydanticr%   pydantic.error_wrappersr&   r'   pydantic.fieldsr(   r)   pydantic.utilsr*   	starletter+   starlette.concurrencyr,   starlette.exceptionsr-   starlette.requestsr.   starlette.responsesr/   r0   starlette.routingr1   r2   r3   r4   r5   r6   r7   starlette.statusr8   starlette.typesr9   r:   starlette.websocketsr<   r   rG   rh   r   rn   r   r   r   r&  r   r%  r   Routerr   rK   rK   rK   rL   <module>   s   4
0	

-

	

l
 