U
    eu                     @   s>  d dl 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mZmZmZmZmZmZmZmZ d dlZd dl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"m#Z#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/m0Z0 d dl1m2Z2m3Z3 d d	l4m5Z5m6Z6 d d
l7m8Z8 d dl9m:Z: d dl;m<Z<m=Z= d dl>m?Z? d dl@mAZAmBZB d dlCmDZD d dlEm0ZF d dlGmHZH d dlImJZJmKZKmLZLmMZM d dlNmOZOmPZP d dlQmRZR d dlSmTZT d dlUmVZVmWZWmXZX dZYdZZeddddZ[dde\ej]e\eee\  e5dddZ^ej]e\e5dd d!Z_ddd"ej]ed#ef e\ee\ eee\  e5d$d%d&Z`eeed#ef  ee\d#f f Zad'dd(e5ebeeea  e5d)d*d+Zce5ee d,d-d.Zded#ef e jed/d0d1Zfee
e\ef ed2d3d4Zged#ef ed/d5d6Zhddd7d8e\ed#ef ee\ eee\  ebe5d9d:d;Zie\ee5eeb d<d=d>Zje\eeebeeeej] ee f d?d@dAZkeebebdBdCdDZlee5ddEdFdGZmed#ef ebd/dHdIZned#ef ebd/dJdKZoed#ef ebd/dLdMZped#ef ee
e\ef edNdOdPZqddddddQeePeTf e5eee
e\ef eJf  eeF eeR ee ee
eed#ef ee\ f ef  eee
e\ef ee eeF eRe
eed#ef ee\ f ef f dR	dSdTZree eee\ef eLeKf ee
e\ef ee f dUdVdWZsee eee
e\ef eJf  ee
e\ef ee
e\ef  f dXdYdZZte5e\ee d[d\d]ZudS )^    N)AsyncExitStackcontextmanager)deepcopy)AnyCallable	CoroutineDict
ForwardRefListMappingOptionalSequenceTupleTypeUnioncast)params)PYDANTIC_V2ErrorWrapper
ModelFieldRequired	Undefined_regenerate_error_with_loccopy_field_infocreate_body_modelevaluate_forwardreffield_annotation_is_scalarget_annotation_from_field_infoget_missing_field_erroris_bytes_fieldis_bytes_sequence_fieldis_scalar_fieldis_scalar_sequence_fieldis_sequence_field.is_uploadfile_or_nonable_uploadfile_annotation!is_uploadfile_sequence_annotationlenient_issubclasssequence_typesserialize_sequence_valuevalue_is_sequence)BackgroundTasks)asynccontextmanagercontextmanager_in_threadpool)	DependantSecurityRequirement)logger)SecurityBase)OAuth2SecurityScopes)OpenIdConnect)create_response_fieldget_path_param_names)	FieldInfo)run_in_threadpool)FormDataHeadersQueryParams
UploadFile)HTTPConnectionRequest)Response)	WebSocket)	Annotatedget_args
get_originzForm data requires "python-multipart" to be installed. 
You can install "python-multipart" with: 

pip install python-multipart
zForm data requires "python-multipart" to be installed. It seems you installed "multipart" instead. 
You can remove "multipart" with: 

pip uninstall multipart

And then install "python-multipart" with: 

pip install python-multipart
)fieldreturnc                 C   s   | j }t|tjrzZddlm} |s(tzddlm} |s>tW n( t	k
rh   t
t ttd Y nX W n( t	k
r   t
t ttd Y nX d S )Nr   )__version__)parse_options_header)
field_info
isinstancer   Form	multipartrE   AssertionErrorZmultipart.multipartrF   ImportErrorr/   error!multipart_incorrect_install_errorRuntimeErrormultipart_not_installed_error)rC   rG   rE   rF    rQ   >/tmp/pip-unpacked-wheel-8a3sx6sf/fastapi/dependencies/utils.pycheck_file_fieldR   s    

rS   )security_scopes)
param_namedependspathrT   rD   c                 C   s   |j s
tt||j || |dS )N)rV   
dependencyrW   namerT   )rX   rK   get_sub_dependantrU   rV   rW   rT   rQ   rQ   rR   get_param_sub_dependantg   s    
r\   )rV   rW   rD   c                 C   s"   t | jstdt| | j|dS )Nz;A parameter-less dependency must have a callable dependency)rV   rX   rW   )callablerX   rK   rZ   )rV   rW   rQ   rQ   rR   get_parameterless_sub_dependantx   s    r^   )rY   rT   .)rV   rX   rW   rY   rT   rD   c           	      C   s|   d }|p
g }t | tjr(| j}|| t |trTg }t |ttfrH|}t||d}t	||||| j
d}|rx|j| |S )N)Zsecurity_schemescopes)rW   callrY   rT   	use_cache)rH   r   ZSecurityr_   extendr0   r1   r3   r.   get_dependantra   security_requirementsappend)	rV   rX   rW   rY   rT   Zsecurity_requirementZdependency_scopesZ
use_scopessub_dependantrQ   rQ   rR   rZ      s.    

 rZ   Fskip_repeatsvisited)	dependantrh   ri   rD   c             
   C   s   |d krg }| | j t| j | j | j | j | j | j	 | j
| jd}| jD ]v}|rr|j|krrq^t|||d}|j|j |j|j |j|j |j|j |j|j |j	|j	 q^|S )N)path_paramsquery_paramsheader_paramscookie_paramsbody_paramsZsecurity_schemesra   rW   rg   )re   	cache_keyr-   rk   copyrl   rm   rn   ro   rd   ra   rW   dependenciesget_flat_dependantrb   )rj   rh   ri   flat_dependantrf   Zflat_subrQ   rQ   rR   rs      s8    

  rs   )rj   rD   c                 C   s$   t | dd}|j|j |j |j S )NT)rh   )rs   rk   rl   rm   rn   )rj   rt   rQ   rQ   rR   get_flat_params   s    ru   )r`   rD   c                    s<   t | }t| di   fdd|j D }t |}|S )N__globals__c              	      s,   g | ]$}t j|j|j|jt|j d qS ))rY   kinddefault
annotation)inspect	ParameterrY   rw   rx   get_typed_annotationry   .0paramglobalnsrQ   rR   
<listcomp>   s   
z'get_typed_signature.<locals>.<listcomp>)rz   	signaturegetattr
parametersvalues	Signature)r`   r   Ztyped_paramsZtyped_signaturerQ   r   rR   get_typed_signature   s    

	
r   )ry   r   rD   c                 C   s"   t | trt| } t| ||} | S N)rH   strr	   r   )ry   r   rQ   rQ   rR   r|      s    
r|   c                 C   s6   t | }|j}|t jjkr d S t| di }t||S )Nrv   )rz   r   return_annotationr   emptyr   r|   )r`   r   ry   r   rQ   rQ   rR   get_typed_return_annotation   s    
r   T)rY   rT   ra   )rW   r`   rY   rT   ra   rD   c                 C   s   t | }t|}|j}t||| ||d}| D ]\}	}
|	|k}t|	|
j|
j|d\}}}|d k	rt|	|| |d}|j	
| q0t|	||dr|d ks0td|	q0|d k	stt||dr|j
| q0t||d q0|S )N)r`   rY   rW   rT   ra   )rU   ry   valueis_path_paramr[   rU   type_annotationrj   z0Cannot specify multiple FastAPI annotations for param_fieldr   )rC   rj   )r5   r   r   r-   itemsanalyze_paramry   rx   r\   rr   re   !add_non_field_param_to_dependencyrK   is_body_paramro   add_param_to_fields)rW   r`   rY   rT   ra   Zpath_param_namesZendpoint_signatureZsignature_paramsrj   rU   r   r   r   rV   r   rf   rQ   rQ   rR   rc      sT    rc   )rU   r   rj   rD   c                 C   s|   t |tr| |_dS t |tr(| |_dS t |tr<| |_dS t |trP| |_dS t |t	rd| |_
dS t |trx| |_dS d S )NT)r&   r=   request_param_namer?   websocket_param_namer<   http_connection_param_namer>   response_param_nameStarletteBackgroundTasksbackground_tasks_param_namer2   security_scopes_param_namer   rQ   rQ   rR   r   %  s&    





r   )rU   ry   r   r   rD   c                 C   s.  d }d }t }t }|tjjk	r$|}|}t|tkrt|}|d }dd |dd  D }	dd |	D }
|
rr|
d }nd }t|trt	||d}|j
tks|j
tkstd|jj d	| d
|tjjk	r|rtd||_
qt|_
nt|tjr|}t|tjr6|d kstd| |d ks0td| |}n4t|trj|d ksZtd| |}trj||_|d k	r|jd kr||_t|ttttttfr|d kstd||d ks\td|n|d kr\|d kr\|tjjk	r|nt}|rtj|d}nNt|s"t|r2tj||d}n*t |dsNtj!||d}ntj"||d}d }|d k	r$|rt|tjstd|jj d| n*t|tj#rt$|dd d krtj%j&|_'t(||| }|j)st$|dd r| *dd}n|j)p| }||_)t+| ||j
||j
ttfk|d}|||fS )Nr   c                 S   s    g | ]}t |ttjfr|qS rQ   )rH   r6   r   Dependsr~   argrQ   rQ   rR   r   N  s   z!analyze_param.<locals>.<listcomp>   c                 S   s&   g | ]}t |tjtjtjfr|qS rQ   )rH   r   ParamBodyr   r   rQ   rQ   rR   r   S  s   )rG   ry   `z1` default value cannot be set in `Annotated` for z). Set the default value with `=` instead.z*Path parameters cannot have default valueszGCannot specify `Depends` in `Annotated` and default value together for zaCannot specify a FastAPI annotation in `Annotated` and `Depends` as a default value together for zQCannot specify FastAPI annotations in `Annotated` and default value together for z"Cannot specify `Depends` for type z+Cannot specify FastAPI annotation for type )ry   )ry   rx   zCannot use `z` for path param in_Zconvert_underscores_-)rY   type_rx   aliasrequiredrG   ),r   rz   r   r   rB   r@   rA   rH   r6   r   rx   r   r   rK   	__class____name__r   r   r   ry   rX   r&   r=   r?   r<   r>   r   r2   Pathr$   r%   Filer   r   Queryr   r   
ParamTypesqueryr   r   r   replacer4   )rU   ry   r   r   rG   rV   r   Zuse_annotationZannotated_argsZfastapi_annotationsZfastapi_specific_annotationsZfastapi_annotationdefault_valuerC   Zuse_annotation_from_field_infor   rQ   rQ   rR   r   =  s    

 


	r   )r   r   rD   c                 C   sp   |rt | dstddS t | dr(dS t| jtjtjfrHt| rHdS t| jtjshtd| j	 ddS d S )N)rC   z1Path params must be of one of the supported typesFzParam: z) can only be a request body, using Body()T)
r!   rK   rH   rG   r   r   Headerr"   r   rY   r   rQ   rQ   rR   r     s.    
 
 r   )rC   rj   rD   c                 C   s   | j }t|dd }|tjjkr,|j|  n\|tjjkrF|j|  nB|tjj	kr`|j
|  n(|tjjks|td| j |j|  d S )Nr   z>non-body parameters must be in path, query, header or cookie: )rG   r   r   r   rW   rk   re   r   rl   headerrm   cookierK   rY   rn   )rC   rj   rG   Zfield_info_inrQ   rQ   rR   r     s    

r   c                 C   s8   t | rt | S t | r"dS t| dd }t |S )NF__call__)rz   	isroutineiscoroutinefunctionisclassr   r`   Zdunder_callrQ   rQ   rR   is_coroutine_callable  s    


r   c                 C   s$   t | rdS t| dd }t |S NTr   )rz   isasyncgenfunctionr   r   rQ   rQ   rR   is_async_gen_callable  s    
r   c                 C   s$   t | rdS t| dd }t |S r   )rz   isgeneratorfunctionr   r   rQ   rQ   rR   is_gen_callable  s    
r   )r`   stack
sub_valuesrD   c                    sB   t | rtt| f |}nt| r2t| f |}||I d H S r   )r   r,   r   r   r+   enter_async_context)r`   r   r   cmrQ   rQ   rR   solve_generator   s
    r   )bodybackground_tasksresponsedependency_overrides_providerdependency_cache)	requestrj   r   r   r   r   r   async_exit_stackrD   c                    s  i }g }	|d kr$t  }|jd= d |_|p*i }|jD ]l}
ttdtf |
j|
_tttdtf tt	 f |
j
|
_
|
j}|
}|r|jr|
j}t|di ||}|
j}t|||
j|
jd}t| |||||||dI d H }|\}}}}}|| |r|	| q2|
jr|
j
|kr||
j
 }nXt|s2t|rHt|||dI d H }n.t|rd|f |I d H }nt|f|I d H }|
jd k	r|||
j< |
j
|kr2|||
j
< q2t|j| j\}}t|j| j\}}t|j| j\}}t|j| j \}}|| || || || |	|| | | 7 }	|j!rZt"|j!|dI d H \}}|| |	| |j#rl| ||j#< |j$rt%| t&r| ||j$< n|j'rt%| t(r| ||j'< |j)r|d krt* }|||j)< |j+r|||j+< |j,rt-|jd||j,< ||	|||fS )	Nzcontent-length.dependency_overrides)rW   r`   rY   rT   )r   rj   r   r   r   r   r   r   )r`   r   r   )required_paramsreceived_body)r_   ).r>   headersstatus_coderr   r   r   r   r`   r   r   rp   r   r   getrW   rc   rY   rT   solve_dependenciesupdaterb   ra   r   r   r   r   r7   request_params_to_argsrk   rl   rm   rn   cookiesro   request_body_to_argsr   r   rH   r=   r   r?   r   r*   r   r   r2   )r   rj   r   r   r   r   r   r   r   errorsrf   r`   Zuse_sub_dependantZoriginal_callZuse_pathZsolved_resultr   Z
sub_errorsr   Zsub_dependency_cacheZsolvedZpath_valuesZpath_errorsZquery_valuesZquery_errorsheader_valuesZheader_errorsZcookie_valuesZcookie_errorsZbody_valuesZbody_errorsrQ   rQ   rR   r   
  s        

  


    



 







r   )r   received_paramsrD   c                 C   s   i }g }| D ]}t |r:t|ttfr:||jp6|j}n||j}|j}t|t	j
s`td|jj|jf}|d kr|jr|t|d qt|j||j< q|j|||d\}}	t|	tr||	 qt|	trt|	dd}
||
 q|||j< q||fS )Nz"Params must be subclasses of ParamlocrQ   )r   Z
loc_prefix)r"   rH   r:   r9   getlistr   rx   r   rG   r   r   rK   r   r   r   re   r   r   rY   validater   listr   rb   )r   r   r   r   rC   r   rG   r   v_errors_Z
new_errorsrQ   rQ   rR   r     s<    
  

r   )r   r   rD   c                    sd  i }g }| r\| d }|j }t|dd }t| dko8| }|rH|j|i}| D ]}|r\d}n
d|jf}d }	|d k	rt|rt|tr||j}	n8z||j}	W n& t	k
r   |
t| Y qLY nX |	d kst|tjr|	dkst|tjr:t|r:t|	dkr:|jr(|
t| qLt|j||j< qLt|tjrnt|rnt|	trn|	 I d H }	nt|rt|tjrt|	rt|	tstg  tg ttttf f d d fdd	}
t 4 I d H  }|	D ]}||
|j qW 5 Q I d H R X t | d
}	|j!|	||d\}}t|t"r>|#| qL|rP|
| qL|||j< qL||fS )Nr   embedr   )r   r    )fnrD   c                    s   |  I d H }  | d S r   )re   )r   resultresultsrQ   rR   
process_fn  s    z(request_body_to_args.<locals>.process_fn)rC   r   r   )$rG   r   lenr   r#   rH   r8   r   r   AttributeErrorre   r   r   rI   r   r   rx   rY   r   r   r;   readr    r)   r'   rK   r   r   r   anyioZcreate_task_groupZ
start_soonr(   r   r   rb   )r   r   r   r   rC   rG   r   Zfield_alias_omittedr   r   r   tgZ	sub_valuer   r   rQ   r   rR   r     s    






	

"r   )rj   rY   rD   c                 C   sD  t | }|jsd S |jd }|j}t|dd }dd |jD }t|dkrZ|sZt| |S |jD ]}t|jdd q`d| }t|j|d}	td	d
 |jD }
|	dd}|
sd |d< tdd
 |jD rt	j
}nPtdd
 |jD rt	j}n4t	j}dd |jD }tt|dkr |d |d< td|	|
d|f |d}t| |S )Nr   r   c                 S   s   h | ]
}|j qS rQ   )rY   r}   rQ   rQ   rR   	<setcomp>  s     z!get_body_field.<locals>.<setcomp>r   TZBody_)fields
model_namec                 s   s   | ]}|j rd V  qdS )TN)r   r~   frQ   rQ   rR   	<genexpr>  s      z!get_body_field.<locals>.<genexpr>r   )ry   r   rx   c                 s   s   | ]}t |jtjV  qd S r   )rH   rG   r   r   r   rQ   rQ   rR   r     s     c                 s   s   | ]}t |jtjV  qd S r   )rH   rG   r   rI   r   rQ   rQ   rR   r     s     c                 S   s"   g | ]}t |jtjr|jjqS rQ   )rH   rG   r   r   
media_typer   rQ   rQ   rR   r   !  s   z"get_body_field.<locals>.<listcomp>r   )rY   r   r   r   rG   )rs   ro   rG   r   r   rS   setattrr   anyr   r   rI   r   setr4   )rj   rY   rt   Zfirst_paramrG   r   Zbody_param_names_setr   r   Z	BodyModelr   ZBodyFieldInfo_kwargsZBodyFieldInfoZbody_param_media_typesZfinal_fieldrQ   rQ   rR   get_body_field  sT    

 r   )vrz   
contextlibr   r   rq   r   typingr   r   r   r   r	   r
   r   r   r   r   r   r   r   r   Zfastapir   Zfastapi._compatr   r   r   r   r   r   r   r   r   r   r   r   r   r    r!   r"   r#   r$   r%   r&   r'   r(   r)   Zfastapi.backgroundr*   Zfastapi.concurrencyr+   r,   Zfastapi.dependencies.modelsr-   r.   Zfastapi.loggerr/   Zfastapi.security.baser0   Zfastapi.security.oauth2r1   r2   Z$fastapi.security.open_id_connect_urlr3   Zfastapi.utilsr4   r5   Zpydantic.fieldsr6   Zstarlette.backgroundr   Zstarlette.concurrencyr7   Zstarlette.datastructuresr8   r9   r:   r;   Zstarlette.requestsr<   r=   Zstarlette.responsesr>   Zstarlette.websocketsr?   Ztyping_extensionsr@   rA   rB   rP   rN   rS   r   r   r\   r^   rZ   ZCacheKeyboolrs   ru   r   r   r|   r   rc   r   r   r   r   r   r   r   r   r   r   r   r   rQ   rQ   rQ   rR   <module>   s   <d



  
#


5   
	
  

"
 $R