a
    ((a                     @   s.  d dl Z 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	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( d dl)m*Z*m+Z+m,Z,m-Z- d dl.m/Z/ d dl0m1Z1m2Z2 d dl3m4Z4m5Z5 d dl6m7Z7 d dl8m9Z9 d dl:m;Z; d dl<m=Z= d dl>m?Z?m@Z@ d dlAmBZB d dlAmCZC d dlAmDZDmEZEmFZFmGZG d dlHmIZI d dlJmKZK d dlLmMZM dddeeNeNeNedddZOddddddddd ee4 eeee ef  eee ef  eNeNeNeNeNed!
d"d#ZPeeeQef eNed$d%d&ZRddee?ddddddddfeee4 eeS eee@ ef ee4 eee ef  eee ef  eNeNeNeNee e	e=ge
eee@f f d'd(d)ZTd3eee e	eMge
eeef f d*d+d,ZUG d-d. d.e7jVZWG d/d0 d0e7jXZYG d1d2 d2e7jZZ[dS )4    N)
AnyCallable	CoroutineDictListOptionalSequenceSetTypeUnion)params)DefaultDefaultPlaceholder)	Dependant)get_body_fieldget_dependantget_parameterless_sub_dependantsolve_dependencies)DictIntStrAny	SetIntStrjsonable_encoder)RequestValidationErrorWebSocketRequestValidationError)STATUS_CODES_WITH_NO_BODYDecoratedCallable)create_cloned_fieldcreate_response_fieldgenerate_operation_id_for_pathget_value_or_default)	BaseModel)ErrorWrapperValidationError)
ModelField	Undefined)routing)run_in_threadpool)HTTPException)Request)JSONResponseResponse)	BaseRoute)Mount)compile_pathget_namerequest_responsewebsocket_session)WS_1008_POLICY_VIOLATION)ASGIApp	WebSocketF)exclude_defaultsexclude_none)resexclude_unsetr5   r6   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_aliasr8   r5   r6   c                    s   g | ]}t | d qS r8   r5   r6   _prepare_response_content).0itemr5   r6   r8    V/Users/bob/PycharmProjects/fastapi/venv/lib/python3.9/site-packages/fastapi/routing.py
<listcomp>R   s   z-_prepare_response_content.<locals>.<listcomp>c              	      s"   i | ]\}}|t | d qS r<   r>   )r@   kvrB   rC   rD   
<dictcomp>\   s   z-_prepare_response_content.<locals>.<dictcomp>)

isinstancer    getattrZ
__config__dictlistitemsdataclassesZis_dataclassZasdict)r7   r8   r5   r6   r:   rC   rB   rD   r?   <   s*    

	
	

r?   T)fieldincludeexcluder;   r8   r5   r6   is_coroutine)
rO   response_contentrP   rQ   r;   r8   r5   r6   rR   r9   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 )Nr=   )response)loc)rP   rQ   r;   r8   r5   r6   )r?   validater&   rI   r!   appendrL   extendr"   type_r   )rO   rS   rP   rQ   r;   r8   r5   r6   rR   errorsvalueZerrors_rC   rC   rD   serialize_responsej   s:    




r\   )	dependantvaluesrR   r9   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&   r]   r^   rR   rC   rC   rD   run_endpoint_function   s    rb   )r]   
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_providerr9   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 )Nr_   )requestr9   c                    s  zd }rr|   I d H }n|  I d H }|rt}| jd}|sT|  I d H }nFtj }||d< |	 dkr|
 }|dks|dr|  I d H }|tkr|}n|}W nt tjy } z(tt|d|jfg|jdW Y d }~n<d }~0  ty" } ztddd	|W Y d }~n
d }~0 0 t| |d
I d H }|\}	}
}}}|
r\t|
|dnt|	dI d H }t|tr|jd u r||_|S t|	
d	I d H }d|i}d ur̈|d<  |fi |}|jj|jj |jr|j|_|S d S )Nzcontent-typeZapplicationjsonz+jsonbody)rp   i  z#There was an error parsing the body)rd   Zdetail)rn   r]   rp   rm   ra   )	rO   rS   rP   rQ   r;   r8   r5   r6   rR   
backgroundrd   )formrp   r$   headersgetro   emailmessageMessageget_content_maintypeget_content_subtypeendswithJSONDecodeErrorr   r!   posdoc	Exceptionr'   r   rb   rI   r*   rq   r\   rawrX   rd   )rn   rp   Z
body_bytesZ	json_bodyZcontent_type_valuerv   subtypeesolved_resultr^   rZ   Zbackground_tasksZsub_response_Zraw_responseZresponse_dataZresponse_argsrT   Zactual_response_classrc   r]   rm   Zis_body_formrR   rf   ri   rh   rk   rl   rj   rg   rd   rC   rD   app   s~    
0
z get_request_handler.<locals>.app)r`   asyncioiscoroutinefunctionrI   Z
field_infor   ZFormr   r[   r(   r*   )r]   rc   rd   re   rf   rg   rh   ri   rj   rk   rl   rm   r   rC   r   rD   get_request_handler   s    
.Fr   )r]   rm   r9   c                    s   t d d fdd}|S )N)	websocketr9   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)rn   r]   rm   )coder_   )r   closer1   r   r`   )r   r   r^   rZ   r   Z_2Z_3r]   rm   rC   rD   r     s    zget_websocket_app.<locals>.appr3   )r]   rm   r   rC   r   rD   get_websocket_app  s    r   c                   @   s:   e Zd Zdddeedef ee ee ddddZdS )APIWebSocketRouteN)namerm   .)pathendpointr   rm   r9   c                C   s^   || _ || _|d u rt|n|| _t|| jd| _tt| j|d| _t	|\| _
| _| _d S )Nr   r`   r   )r   r   r.   r   r   r]   r0   r   r   r-   
path_regexpath_formatparam_convertors)selfr   r   r   rm   rC   rC   rD   __init__  s    zAPIWebSocketRoute.__init__)__name__
__module____qualname__strr   r   r   r   rC   rC   rC   rD   r     s   
r   c                   @   sJ  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deedef ee	e  ee
 eee  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  dddd	Zeegeeeef f d
ddZdS )APIRouteNSuccessful ResponseTF)response_modelrd   tagsdependenciessummarydescriptionresponse_description	responses
deprecatedr   methodsoperation_idrg   rh   ri   rj   rk   rl   include_in_schemare   rm   	callbacksopenapi_extra.)r   r   r   rd   r   r   r   r   r   r   r   r   r   r   rg   rh   ri   rj   rk   rl   r   re   rm   r   r   r9   c          !      C   s  t |tjrt|}|| _|| _|d u r0t|n|| _t|\| _	| _
| _|d u rXdg}tdd |D | _t| j| j
t|d d| _|| _| jr|tvsJ d| dd| j }t|| jd	| _t| j| _nd | _d | _|| _|pg | _|rt|| _ng | _|| _|p&t| jjp$d
| _| jdd | _|	| _ |
pJi | _!i }| j!" D ]n\}}t |t#sxJ d|$d}|r\|tvsJ d| dd| d| j }t||d	}|||< q\|r|| _%ni | _%|| _&|| _'|| _(|| _)|| _*|| _+|| _,|| _-|| _.|| _/t0|s.J dt1| j
| jd| _2| jd d d D ] } | j2j3dt4| | j
d qPt5| j2| jd| _6|| _7|| _8t9| : | _;|| _<d S )NGETc                 S   s   g | ]}|  qS rC   )upper)r@   methodrC   rC   rD   rE   U      z%APIRoute.__init__.<locals>.<listcomp>r   )r   r   r   zStatus code z must not have a response bodyZ	Response_)r   rY    z%An additional response must be a dictmodelr   zAn endpoint must be a callabler   )dependsr   )r]   r   )=rI   enumIntEnumintr   r   r.   r   r-   r   r   r   setr   r   rL   Z	unique_idr   r   r   rf   r   secure_cloned_response_fieldrd   r   r   r   inspectcleandoc__doc__r   splitr   r   rM   rK   rt   response_fieldsr   r   rg   rh   ri   rj   rk   rl   r   re   callabler   r]   insertr   r   rc   rm   r   r/   get_route_handlerr   r   )!r   r   r   r   rd   r   r   r   r   r   r   r   r   r   r   rg   rh   ri   rj   rk   rl   r   re   rm   r   r   Zresponse_namer   Zadditional_status_coderT   r   rf   r   rC   rC   rD   r   -  s     




zAPIRoute.__init__)r9   c                 C   s8   t | j| j| j| j| j| j| j| j| j	| j
| j| jdS )N)r]   rc   rd   re   rf   rg   rh   ri   rj   rk   rl   rm   )r   r]   rc   rd   re   r   rg   rh   ri   rj   rk   rl   rm   )r   rC   rC   rD   r     s    zAPIRoute.get_route_handler)r   r   r   r   r)   r   r   r   r   r
   r   r   r   r   Dependsr   r   boolr	   r   r   r*   r   r+   r   r(   r   r   rC   rC   rC   rD   r   ,  sl   



vr   c                       sT  e Zd Zdddeeddddddedddddeeee  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dd 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d
eedef eee  ee eee  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  dd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ee  ee eee  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 dddZd/eedef ee ddddZd0eee eegef dddZ dddeedddddd eeee  ee	e
j  ee eeeeef eeef f  eee  ee edd
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deeee  ee eee  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 d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deeee  ee eee  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 d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deeee  ee eee  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 d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deeee  ee eee  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 d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deeee  ee eee  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 d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deeee  ee eee  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 d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deeee  ee eee  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 d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deeee  ee eee  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 dd-d.Z)  Z*S )1	APIRouterr   NT)prefixr   r   default_response_classr   r   routesredirect_slashesdefaultrm   route_class
on_startupon_shutdownr   r   )r   r   r   r   r   r   r   r   r   rm   r   r   r   r   r   r9   c                   s   t  j|||	||d |r>|ds,J d|dr>J d|| _|pJg | _t|pVg p\g | _|| _|| _	|pri | _
|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 '/')superr   
startswithrz   r   r   rL   r   r   r   r   r   rm   r   r   )r   r   r   r   r   r   r   r   r   r   rm   r   r   r   r   r   	__class__rC   rD   r     s0    


zAPIRouter.__init__r   Fr   rd   r   r   r   r   r   r   r   r   r   rg   rh   ri   rj   rk   rl   r   re   r   route_class_overrider   r   .)r   r   r   rd   r   r   r   r   r   r   r   r   r   rg   rh   ri   rj   rk   rl   r   re   r   r   r   r   r9   c          !      C   s   |p| j }|
pi }
i | j|
}t|| j}| j }|rD|| | j }|r\|| | j }|rt|| || j	| ||||||||	||p| j
|||||||||o| j||| j||d} | j|  d S )N)r   r   rd   r   r   r   r   r   r   r   r   r   rg   rh   ri   rj   rk   rl   r   re   r   rm   r   r   )r   r   r   r   r   copyrX   r   r   r   r   r   rm   r   rW   )!r   r   r   r   rd   r   r   r   r   r   r   r   r   r   rg   rh   ri   rj   rk   rl   r   re   r   r   r   r   r   combined_responsesZcurrent_response_classcurrent_tagscurrent_dependenciescurrent_callbacksrouterC   rC   rD   add_api_route  sV    






zAPIRouter.add_api_router   rd   r   r   r   r   r   r   r   r   r   rg   rh   ri   rj   rk   rl   r   re   r   r   r   )r   r   rd   r   r   r   r   r   r   r   r   r   rg   rh   ri   rj   rk   rl   r   re   r   r   r   r9   c                   sF   t t d 	
fdd}|S )Nfuncr9   c                    s>   j 	| 
 d | S )Nr   )r   r   r   r   r   r   r   r   r   r   r   r   re   r   r   ri   rh   rk   rl   rj   rg   r   r   rd   r   r   rC   rD   	decoratorE  s6    z&APIRouter.api_route.<locals>.decoratorr   )r   r   r   rd   r   r   r   r   r   r   r   r   r   rg   rh   ri   rj   rk   rl   r   re   r   r   r   r   rC   r   rD   	api_route*  s    BzAPIRouter.api_route)r   r   r   r9   c                 C   s"   t |||| jd}| j| d S )N)r   r   rm   )r   rm   r   rW   )r   r   r   r   r   rC   rC   rD   add_api_websocket_routed  s    z!APIRouter.add_api_websocket_route)r   r   r9   c                    s   t t d fdd}|S )Nr   c                    s   j |  d | S )Nr   )r   r   r   r   r   rC   rD   r   r  s    z&APIRouter.websocket.<locals>.decoratorr   )r   r   r   r   rC   r   rD   r   o  s    zAPIRouter.websocket)r   r   r   r   r   r   r   r   )
routerr   r   r   r   r   r   r   r   r9   c                C   sn  |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 | j||j |j|j|j|||j|j|j||jpZ|pZ| 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| q<|j.D ]}| -d| qVd S )Nr   r   r   r   r   unknownz6Prefix and path cannot be both empty (path operation: )r   )r   r   r   r   Zstartupshutdown)/r   rz   r   rJ   r~   rI   r   r   r   re   r   rX   r   r   r   r   r   r   r   rd   r   r   r   r   r   r   rg   rh   ri   rj   rk   rl   r   r   typer   r%   RouterL   Z	add_router   r   WebSocketRouteZadd_websocket_router   Zadd_event_handlerr   )r   r   r   r   r   r   r   r   r   r   rr   r   r   r   Zuse_response_classr   r   r   r   handlerrC   rC   rD   include_routerx  s    







zAPIRouter.include_router)r   rd   r   r   r   r   r   r   r   r   rg   rh   ri   rj   rk   rl   r   re   r   r   r   )r   r   rd   r   r   r   r   r   r   r   r   rg   rh   ri   rj   rk   rl   r   re   r   r   r   r9   c                C   s:   | j |||||||||	|
dg||||||||||||dS )Nr   r   r   rd   r   r   r   r   r   r   r   r   r   rg   rh   ri   rj   rk   rl   r   re   r   r   r   r   r   r   r   rd   r   r   r   r   r   r   r   r   rg   rh   ri   rj   rk   rl   r   re   r   r   r   rC   rC   rD   rt     s2    zAPIRouter.getc                C   s:   | j |||||||||	|
dg||||||||||||dS )NPUTr   r   r   rC   rC   rD   put  s2    zAPIRouter.putc                C   s:   | j |||||||||	|
dg||||||||||||dS )NPOSTr   r   r   rC   rC   rD   postG  s2    zAPIRouter.postc                C   s:   | j |||||||||	|
dg||||||||||||dS )NDELETEr   r   r   rC   rC   rD   delete{  s2    zAPIRouter.deletec                C   s:   | j |||||||||	|
dg||||||||||||dS )NOPTIONSr   r   r   rC   rC   rD   options  s2    zAPIRouter.optionsc                C   s:   | j |||||||||	|
dg||||||||||||dS )NHEADr   r   r   rC   rC   rD   head  s2    zAPIRouter.headc                C   s:   | j |||||||||	|
dg||||||||||||dS )NPATCHr   r   r   rC   rC   rD   patch  s2    zAPIRouter.patchc                C   s:   | j |||||||||	|
dg||||||||||||dS )NTRACEr   r   r   rC   rC   rD   traceK  s2    zAPIRouter.trace)N)N)+r   r   r   r   r)   r   r   r   r   r   r   r   r
   r*   r   r   r   r   r+   r%   r   r2   r   r   r	   r   r   r   r   r   r   r   r   r   rt   r   r   r   r   r   r   r   __classcell__rC   rC   r   rD   r     s(  

/




O



;  

k


8


8


8


8


8


8


8


r   )N)\r   rN   email.messageru   r   r   ro   typingr   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   Zfastapi.encodersr   r   r   Zfastapi.exceptionsr   r   Zfastapi.openapi.constantsr   Zfastapi.typesr   Zfastapi.utilsr   r   r   r   Zpydanticr    Zpydantic.error_wrappersr!   r"   Zpydantic.fieldsr#   r$   Z	starletter%   Zstarlette.concurrencyr&   Zstarlette.exceptionsr'   Zstarlette.requestsr(   Zstarlette.responsesr)   r*   Zstarlette.routingr+   r,   r-   r.   r/   r0   Zstarlette.statusr1   Zstarlette.typesr2   Zstarlette.websocketsr4   r   r?   r\   r   rb   r   r   r   r   r   r   r   ZRouterr   rC   rC   rC   rD   <module>   s   00.`  	