o
    ;ήc                      @   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" 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.m/Z/m0Z0m1Z1 d dl2m3Z3 d dl4m5Z5m6Z6 d dl7m8Z8m9Z9 d dl:m;Z; d dl<m=Z= d dl>m?Z? d dl@mAZA d dlBmCZCmDZD d dlEmFZFmGZG d dlEmHZH d dlEmIZImJZJmKZKmLZL d dlMmNZN d dlOmPZPmQZQ d dlRmSZS ddddedeTdeTd eTd!ef
d"d#ZUdddd$dddd$d%d&ee8 d'ed(eee%e$f  d)eee%e$f  d*eTdeTdeTd eTd+eTd!efd,d-ZVd.ed/eeWef d+eTd!efd0d1ZXddeeCdddd$ddddfd.ed2ee8 d3eeY d4eeeD ef d5ee8 d6eee%e$f  d7eee%e$f  d8eTd9eTd:eTd;eTd<ee d!eeAgeeeeDf f fd=d>ZZ	dGd.ed<ee d!eeSgeeeef f fd?d@Z[G dAdB dBe;j\Z]G dCdD dDe;j^Z_G dEdF dFe;j`ZadS )H    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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)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>    6/tmp/pip-target-vg8gfxp4/lib/python/fastapi/routing.py
<listcomp>T   s    z-_prepare_response_content.<locals>.<listcomp>c              	      s"   i | ]\}}|t | d qS rB   rD   )rF   kvrH   rI   rJ   
<dictcomp>^   s    z-_prepare_response_content.<locals>.<dictcomp>)

isinstancer$   getattr
__config__dictlistitemsdataclassesis_dataclassasdict)r=   r>   r;   r<   r@   rI   rH   rJ   rE   >   s*   


	
	
rE   T)fieldincludeexcluderA   r>   r;   r<   is_coroutinerX   response_contentrY   rZ   rA   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 )NrC   )response)loc)rY   rZ   rA   r>   r;   r<   )rE   validater*   rO   r%   appendrS   extendr&   type_r   )rX   r\   rY   rZ   rA   r>   r;   r<   r[   errorsvalueerrors_rI   rI   rJ   serialize_responsel   s<   




rf   	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 functionrI   )callr*   rg   rh   r[   rI   rI   rJ   run_endpoint_function   s
   rl   
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 )Nri   requestr?   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)rn   detail)rx   rg   r|   rw   rk   
backgroundrn   )	rX   r\   rY   rZ   rA   r>   r;   r<   r[       )!formscopegetrO   r   push_async_callbackcloser|   r(   headersr{   emailmessageMessageget_content_maintypeget_content_subtypeendswithJSONDecodeErrorr   r%   posdocr+   	Exceptionr   rl   r.   r~   rn   rf   r#   rawra   )rx   r|   stack
body_bytes	json_bodycontent_type_valuer   subtypeesolved_resultrh   rc   background_taskssub_response_raw_responseresponse_argscurrent_status_codecontentr]   actual_response_classrm   rg   rw   is_body_formr[   rp   rs   rr   ru   rv   rt   rq   rn   rI   rJ   app   s   



z get_request_handler.<locals>.app)rj   asyncioiscoroutinefunctionrO   
field_infor   Formr   rd   r,   r.   )rg   rm   rn   ro   rp   rq   rr   rs   rt   ru   rv   rw   r   rI   r   rJ   get_request_handler   s   
0Rr   c                    s   dt dd f fdd}|S )N	websocketr?   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)rx   rg   rw   )coderi   rI   )r   r   r6   r   rj   )r   r   rh   rc   r   _2_3rg   rw   rI   rJ   r     s   zget_websocket_app.<locals>.appr9   )rg   rw   r   rI   r   rJ   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)namerw   pathendpoint.r   rw   r?   c                C   s`   || _ || _|d u rt|n|| _t|\| _| _| _t| j| jd| _	t
t| j	|d| _d S )Nr   rj   r   )r   r   r3   r   r2   
path_regexpath_formatparam_convertorsr   rg   r5   r   r   )selfr   r   r   rw   rI   rI   rJ   __init__%  s   
zAPIWebSocketRoute.__init__r   c                    *   t  |\}}|tjkr| |d< ||fS Nroutesupermatchesr0   NONEr   r   matchchild_scope	__class__rI   rJ   r   9     
zAPIWebSocketRoute.matches)__name__
__module____qualname__strr   r   r
   r   r8   r   r0   r   __classcell__rI   rI   r   rJ   r   $  s    

&r   c                8       s  e Zd Z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_modelrn   tagsdependenciessummarydescriptionresponse_description	responses
deprecatedr   methodsoperation_idrq   rr   rs   rt   ru   rv   include_in_schemaro   rw   	callbacksopenapi_extragenerate_unique_id_functionr   r   .r   rn   r   r   r   r   r   r   r   r   r   r   rq   rr   rs   rt   ru   rv   r   ro   rw   r   r   r   r?   c          #      C   s  || _ || _|| _|| _|	| _|| _|| _|| _|| _|| _	|| _
|| _|| _|| _|| _|| _|| _|| _|| _|p<g | _|
pAi | _|d u rKt|n|| _t|\| _| _| _|d u r_dg}dd |D | _t|trp|j}n|}| jpx|| | _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| _-| j-.d	d
 / | _-i }| j0 D ]4\}}t|t1sJ d|2d} | rt#|sJ d| dd| d| j }t$|| d}!|!||< q|r|| _3ni | _3t4|s J dt5| j| jd| _6| j)d d d D ]}"| j6j)7d
t8|"| jd q1t9| j6| jd| _:t;| < | _=d S )NGETc                 S   s   h | ]}|  qS rI   )upper)rF   methodrI   rI   rJ   	<setcomp>|  s    z$APIRoute.__init__.<locals>.<setcomp>zStatus code z must not have a response body	Response_)r   rb    r   z%An additional response must be a dictmodelr   zAn endpoint must be a callabler   )dependsr   )rg   r   )>r   r   r   r   r   r   r   rq   rr   rs   rt   ru   rv   r   ro   rw   r   r   r   r   r   r3   r   r2   r   r   r   r   rO   r   rd   	unique_idr   intrn   r#   r    rp   r   secure_cloned_response_fieldrS   r   inspectcleandoc__doc__r   splitstriprT   rR   r   response_fieldscallabler   rg   insertr   r   rm   r4   get_route_handlerr   )#r   r   r   r   rn   r   r   r   r   r   r   r   r   r   r   rq   rr   rs   rt   ru   rv   r   ro   rw   r   r   r   current_generate_unique_idresponse_namer   additional_status_coder]   r   rp   r   rI   rI   rJ   r   A  s   "







zAPIRoute.__init__c                 C   s8   t | j| j| j| j| j| j| j| j| j	| j
| j| jdS )N)rg   rm   rn   ro   rp   rq   rr   rs   rt   ru   rv   rw   )r   rg   rm   rn   ro   r   rq   rr   rs   rt   ru   rv   rw   )r   rI   rI   rJ   r     s   zAPIRoute.get_route_handlerr   c                    r   r   r   r   r   rI   rJ   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   r.   r   r/   r   r,   r   r   r8   r   r0   r   r   rI   rI   r   rJ   r   @  s    
	

!
"~&r   c                8       sZ  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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  d.eeeef  de
eegef ef ddf6d/d0Z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d1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  d.eeeef  deegef deegef f2d2d3Z 	dMdededef d,ee ddfd4d5Z!	dMded,ee deegef fd6d7Z"dddeeddddeed8	d9d 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#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  d.eeeef  deegef deegef f0d=d>Z$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  d.eeeef  deegef deegef f0d?d@Z%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  d.eeeef  deegef deegef f0dAdBZ&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  d.eeeef  deegef deegef f0dCdDZ'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  d.eeeef  deegef deegef f0dEdFZ(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  d.eeeef  deegef deegef f0dGdHZ)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  d.eeeef  deegef deegef f0dIdJZ*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  d.eeeef  deegef deegef f0dKdLZ+  Z,S )N	APIRouterr   NT)prefixr   r   default_response_classr   r   routesredirect_slashesdefaultrw   route_class
on_startupon_shutdownr   r   r   r   r   r   r   r   r   r   r   r   rw   r   r   r   r   r   r   r?   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   rS   r   r   r   r   r   rw   r   r   r   )r   r   r   r   r   r   r   r   r   r   rw   r   r   r   r   r   r   r   rI   rJ   r     s2   



zAPIRouter.__init__r   F)r   rn   r   r   r   r   r   r   r   r   r   rq   rr   rs   rt   ru   rv   r   ro   r   route_class_overrider   r   r   r   r   .r   rn   r   r   r   r   r   rq   rr   rs   rt   ru   rv   ro   r   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   rn   r   r   r   r   r   r   r   r   r   rq   rr   rs   rt   ru   rv   r   ro   r   rw   r   r   r   )r   r   r"   r   r   copyra   r   r   r   r   r   r   rw   r   r`   )#r   r   r   r   rn   r   r   r   r   r   r   r   r   r   rq   rr   rs   rt   ru   rv   r   ro   r   r  r   r   r   r   combined_responsescurrent_response_classcurrent_tagscurrent_dependenciescurrent_callbacksr   r   rI   rI   rJ   add_api_route  s   
"





	

zAPIRouter.add_api_route)r   rn   r   r   r   r   r   r   r   r   r   rq   rr   rs   rt   ru   rv   r   ro   r   r   r   r   c                   sJ   dt dt f 	
fdd}|S )Nfuncr?   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   rn   r   r   r   r   r   r   r   r   r   rq   rr   rs   rt   ru   rv   r   ro   r   r   r   r   )r	  r
  r   r   r   r   r   r   r   r   r   r   r   ro   r   r   rs   rr   ru   rv   rt   rq   r   r   rn   r   r   rI   rJ   	decoratoru  sf   	
z&APIRouter.api_route.<locals>.decoratorr   )r   r   r   rn   r   r   r   r   r   r   r   r   r   rq   rr   rs   rt   ru   rv   r   ro   r   r   r   r   r  rI   r  rJ   	api_routeW  s   FzAPIRouter.api_routec                 C   s(   t | j| ||| jd}| j| d S )N)r   r   rw   )r   r   rw   r   r`   )r   r   r   r   r   rI   rI   rJ   add_api_websocket_route  s   z!APIRouter.add_api_websocket_routec                    s   dt dt f fdd}|S )Nr
  r?   c                    s   j |  d | S )Nr   )r  r  r   r   r   rI   rJ   r    s   z&APIRouter.websocket.<locals>.decoratorr   )r   r   r   r  rI   r  rJ   r     s   zAPIRouter.websocket)	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   rn   r   r   r   r   r   r   r   r   r   rq   rr   rs   rt   ru   rv   r   ro   r  r   r   r   )r   r   r   r  startupshutdown)0r  r   r   rP   r   rO   r   r   r"   ro   r   ra   r   r   r   r   r	  r   r   r   rn   r   r   r   r   r   r   rq   rr   rs   rt   ru   rv   r   r   typer   r)   RouterS   	add_router   r  WebSocketRouteadd_websocket_router   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   handlerrI   rI   rJ   include_router  s   





	


zAPIRouter.include_router)r   rn   r   r   r   r   r   r   r   r   rq   rr   rs   rt   ru   rv   r   ro   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   rn   r   r   r   r   r   r   r   r   r   r   rq   rr   rs   rt   ru   rv   r   ro   r   r   r   r   rI   r  r   r   r   rn   r   r   r   r   r   r   r   r   rq   rr   rs   rt   ru   rv   r   ro   r   r   r   r   rI   rI   rJ   r     b   
	
zAPIRouter.getc                C   r!  )Nr   r   rn   r   r   r   r   r   r   r   r   PUTr   rq   rr   rs   rt   ru   rv   r   ro   r   r   r   r   rI   r"  r#  rI   rI   rJ   putR  r$  zAPIRouter.putc                C   r!  )Nr   r   rn   r   r   r   r   r   r   r   r   POSTr   rq   rr   rs   rt   ru   rv   r   ro   r   r   r   r   rI   r"  r#  rI   rI   rJ   post  r$  zAPIRouter.postc                C   r!  )Nr   r   rn   r   r   r   r   r   r   r   r   DELETEr   rq   rr   rs   rt   ru   rv   r   ro   r   r   r   r   rI   r"  r#  rI   rI   rJ   delete  r$  zAPIRouter.deletec                C   r!  )Nr   r   rn   r   r   r   r   r   r   r   r   OPTIONSr   rq   rr   rs   rt   ru   rv   r   ro   r   r   r   r   rI   r"  r#  rI   rI   rJ   options  r$  zAPIRouter.optionsc                C   r!  )Nr   r   rn   r   r   r   r   r   r   r   r   HEADr   rq   rr   rs   rt   ru   rv   r   ro   r   r   r   r   rI   r"  r#  rI   rI   rJ   head2  r$  zAPIRouter.headc                C   r!  )Nr   r   rn   r   r   r   r   r   r   r   r   PATCHr   rq   rr   rs   rt   ru   rv   r   ro   r   r   r   r   rI   r"  r#  rI   rI   rJ   patchj  r$  zAPIRouter.patchc                C   r!  )Nr   r   rn   r   r   r   r   r   r   r   r   TRACEr   rq   rr   rs   rt   ru   rv   r   ro   r   r   r   r   rI   r"  r#  rI   rI   rJ   trace  sb   
	
zAPIRouter.traceN)-r   r   r   r   r-   r   r!   r   r
   r	   r   r   r   r   r   r   r.   r   r   r   r/   r)   r   r7   r   r   r   r   r   r   r	  r   r  r  r   r   r   r&  r(  r*  r,  r.  r0  r2  r   rI   rI   r   rJ   r     s   
	
3
	


!
V	



?



	

u	


<	


<	


<	


<	


<	


<	


<	

r   r3  )br   rU   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   fastapi.encodersr   r   r   fastapi.exceptionsr   r   fastapi.typesr   fastapi.utilsr   r    r!   r"   r#   pydanticr$   pydantic.error_wrappersr%   r&   pydantic.fieldsr'   r(   	starletter)   starlette.concurrencyr*   starlette.exceptionsr+   starlette.requestsr,   starlette.responsesr-   r.   starlette.routingr/   r0   r1   r2   r3   r4   r5   starlette.statusr6   starlette.typesr7   r8   starlette.websocketsr:   r   rE   rf   r   rl   r   r   r   r  r   r  r   Routerr   rI   rI   rI   rJ   <module>   s   4
0	

-

	

l
 