o
    .j                     @  s   d dl mZ d dlZd dlZd dlZd dlmZ d dlmZ d dlm	Z	 d dl
mZ ddlmZ d	d
lmZ d	dlmZ ddlmZ G dd dedZG dd deZdS )    )annotationsN)ABCMeta)	b64encode)Any)parse_qs   )	parse_url   )ResolverDescription)ProtocolResolver   )AsyncBaseResolverc                   @  s4   e Zd Ze		ddd	d
Ze		ddddZdS )AsyncResolverFactoryNprotocolr   	specifier
str | Noneimplementationreturnboolc                   s   t dd }d| jdd }|r |d|dd  7 }zt|| d}W n
 ty5   Y dS w t	| fdd	}|sDdS d
S )N.r   -_._.contrib.resolver._asyncFc                   s0   t | tot| to d u r| jd u p | jkS )N)
isinstancetype
issubclassr   r   er    ^/home/thesage/.local/lib/python3.10/site-packages/urllib3/contrib/resolver/_async/factories.py<lambda>'   s
   

z*AsyncResolverFactory.has.<locals>.<lambda>T)
__name__splitvaluereplacelower	importlibimport_moduleImportErrorinspect
getmembers)r   r   r   package_namemodule_exprresolver_moduleimplementationsr    r   r!   has   s$   

zAsyncResolverFactory.haskwargsr   r   c              
     s   t dd }d jdd }|r |d|dd  7 }d u r&dnd d}zt|| d	}W n tyP } zt  | d
| d|d }~ww t	
| fdd}	|	sgt  | d|	 d }
|
di |S )Nr   r   r   r   r    z (w/ specifier "z") r   z#cannot be loaded. Tried to import 'z1'. Did you specify a non-existent implementation?c                   sD   t | to!t| to!d u r| jd u p| jko!t| do!| j kS )Nr   )r   r   r   r   r   hasattrr   r   r   r   r    r!   r"   Q   s   

z*AsyncResolverFactory.new.<locals>.<lambda>zrcannot be loaded. No compatible implementation available. Make sure your implementation inherit from BaseResolver.r   r    )r#   r$   r%   r&   r'   r(   r)   r*   NotImplementedErrorr+   r,   pop)r   r   r   r2   r-   r.   spe_msgr/   r   r0   implementation_targetr    r5   r!   new6   s6   
zAsyncResolverFactory.new)NN)r   r   r   r   r   r   r   r   )
r   r   r   r   r   r   r2   r   r   r   )r#   
__module____qualname__staticmethodr1   r:   r    r    r    r!   r      s    #r   )	metaclassc                   @  s(   e Zd ZdZdddZeddd	Zd
S )AsyncResolverDescriptionz1Describe how a BaseResolver must be instantiated.r   r   c                 C  sV   i | j }| jr| j|d< | jr| j|d< | jr| j|d< tj| j| j| jfi |S )Nserverportpatterns)	r2   r@   rA   host_patternsr   r:   r   r   r   )selfr2   r    r    r!   r:   l   s   



zAsyncResolverDescription.newurlstrc                 C  s  t | }|j}|d u rtdd }d }d|v r#t| dd\}}t|}i }|jr1|j|d< |jrot	 |d< d|jv re|jd\}}|
d}|
d}dt| d|    |d d	< n
d
|j |d d	< |jr]t|j}	|	D ]}
|	|
 sqz|
 }t|	|
 trt|	|
 dkr|
dkrtdg }|	|
 D ]}d|v r||d q|| q||v rt|| tr|| | n|||  |||< qz|||< qz|	|
 d  
d}|
dkr|}qzd|v r|d}||v rt|| tr|| | n|||  qz|||< qzd }|dv r*|dkr'dnd}n'| r4t|}n|ddkrQ|ddkrQ|dd rQt|}|d u rX|n|||< qzg }d|v rzt|d trs|d dn|d }|d= t||||j|jg|R i |S )Nz#Given DNS url is missing a protocol+r   pathheaders:z'"zBasic AuthorizationzBearer r   z,Only one implementation can be passed to URL,r   r3   )falsetruerN   TFr    hosts)r   scheme
ValueErrortupler'   r$   r   rH   authdictstripr   encodedecodequeryr   r   listlenextendappendisdigitintcountindexr&   floatrF   r?   hostrA   )rE   
parsed_urlschemar   r   r   r2   usernamepassword
parameters	parameterparameter_insensiblevaluesr   r%   list_of_valuesvalue_convertedrC   r    r    r!   from_url}   s   












z!AsyncResolverDescription.from_urlN)r   r   )rE   rF   r   r?   )r#   r;   r<   __doc__r:   r=   rn   r    r    r    r!   r?   i   s
    
r?   )
__future__r   r(   r+   typingabcr   base64r   r   urllib.parser   utilr   	factoriesr
   	protocolsr   r   r   r?   r    r    r    r!   <module>   s    X