
    Dhla                        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 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 d dlZd dlmZ  ej@                  e!      Z" G d dejF                  jH                        Z% G d de      Z& G d	 d
e&e      Z' G d de      Z( G d de&e      Z) G d de      Z* G d de      Z+ G d de      Z,y)    N)InvalidIMDSEndpointErrorMetadataRetrievalError) DEFAULT_METADATA_SERVICE_TIMEOUTMETADATA_BASE_URLRETRYABLE_HTTP_ERRORS	ArnParserBadIMDSRequestErrorClientErrorContainerMetadataFetcherHTTPClientErrorIMDSFetcherIMDSRegionProviderInstanceMetadataFetcherInstanceMetadataRegionFetcherReadTimeoutErrorS3RegionRedirectorS3RegionRedirectorv2get_environ_proxiesosresolve_imds_endpoint_mode)asynccontextmanagerc                   .     e Zd Z fdZed        Z xZS )_RefCountedSessionc                 @    t        |   |i | d| _        d | _        y )Nr   )super__init___RefCountedSession__ref_count_RefCountedSession__lock)selfargskwargs	__class__s      s/var/www/fastuser/data/www/generator.snapmosaic.io/flask_app/venv/lib/python3.12/site-packages/aiobotocore/utils.pyr   z_RefCountedSession.__init__'   s$    $)&)    c           	       K   | j                   st        j                         | _         | j                   4 d {    | xj                  dz  c_        	 | j                  dk(  r| j	                          d {    d d d       d {    	 |  | j                   4 d {    | j                  dk(  r| j                  d d d        d {    | xj                  dz  c_        d d d       d {    y 7 7 # t
        $ r | xj                  dz  c_         w xY w7 # 1 d {  7  sw Y   xY w7 7 j7 G# 1 d {  7  sw Y   y xY w# | j                   4 d {  7   | j                  dk(  r| j                  d d d        d {  7   | xj                  dz  c_        d d d       d {  7   w # 1 d {  7  sw Y   w xY wxY ww)N   )r   asyncioLockr   
__aenter__BaseException	__aexit__)r   s    r#   acquirez_RefCountedSession.acquire,   s    {{!,,.DK ;; 	 	!##q(//+++	 		&J{{ & &##q(..tT:::  A% 	& & &	
 ,    A% 	 	 	 	&:& & & &t{{ & &##q(..tT:::  A% 	& & & & &s  6GC5GD"C95C76C9:GDGE G D3!G$&D9
D5D9$G/D70G7C99 DDGD0$D'%D0,G5D97G9E?E EGGE"
 G$&F7
F
F7%G0F31G7G	=G >G	GG)__name__
__module____qualname__r   r   r,   __classcell__)r"   s   @r#   r   r   &   s    
 & &r$   r   c                   L    e Zd ZededdddfdZd Zd
dZd Zd Z	d Z
	 dd	Zy)AioIMDSFetcherr&   Nc                    || _         || _        |i }| j                  ||      | _        || _        |t
        j                  j                         }|j                  dd      j                         | _
        | j                  dk(  | _
        || _        |xs* t        | j                   t        | j                              | _        y )NAWS_EC2_METADATA_DISABLEDfalsetrue)timeoutproxies)_timeout_num_attempts_select_base_url	_base_url_configr   environcopygetlower	_disabled_user_agentr   r   _session)r   r7   num_attemptsbase_urlenv
user_agentconfigsessions           r#   r   zAioIMDSFetcher.__init__G   s      )>F..x@;**//#C!<gFLLN61% 
#5MM'7$
r$   c           
      D  K   | j                          | j                  | j                        }d| j                  i}| j	                  |       t
        j                  j                  d||      }| j                  j                         4 d {   }t        | j                        D ]  }	 |j                  |j                                d {   }|j                  dk(  r'|j                   d {   c cd d d       d {    S |j                  dv r d d d       d {    y |j                  dv rt!        |       d d d       d {    y 7 7 7 g7 W7 9# t"        $ r Y  d d d       d {  7   y t$        $ r#}t&        j)                  d||d	       Y d }~d }~wt*        $ rY}|j,                  j/                  d
      }|rt1        |dd       dk(  st3        t1        |dd             dk(  rt5        ||       d }~ww xY w7 # 1 d {  7  sw Y   y xY ww)Nz$x-aws-ec2-metadata-token-ttl-secondsPUTmethodurlheaders   )i  i  i  )i  OCaught retryable HTTP exception while making metadata service request to %s: %sTexc_infoerrorerrno   os_errorzDomain name not found)endpointrU   )_assert_enabled_construct_url_TOKEN_PATH
_TOKEN_TTL_add_user_agentbotocore
awsrequest
AWSRequestrD   r,   ranger:   sendpreparestatus_codetextr	   r   r   loggerdebugr   r!   r@   getattrstrr   )	r   rO   rP   requestrJ   iresponseerU   s	            r#   _fetch_metadata_tokenz$AioIMDSFetcher._fetch_metadata_tokenc   s!    !!$"2"232DOO
 	W%%%00c7 1 
 ==((* 	 	g4--. %,\\'//2C%DDH++s2%-]]22	 	 	 "--@#	 	 	 "--71':: 8	 	@ A	  E2	 	 (  	 	 	 - LL4!% !   ' 
HHLL1E#E7D9Q>wuj$?@23 71MM
)	 	 	 	@ s	  BH EH H+"EE"E0E1E4H6H EH EHH "E#H (EHH H	H EEH H 	H'H)H 4E75H ;HF!H!H-AHHH	H HHHH c           	         K   | j                          || j                  }| j                  |      }i }|||d<   | j                  |       | j                  j                         4 d {   }t        | j                        D ]  }	 t        j                  j                  d||      }|j                  |j                                d {   }	 ||	      }
t        j                  |
      r
|
 d {   }
|
s|	c cd d d       d {    S  d d d       d {    | j%                         7 7 f7 A7 -# t        $ r#}t         j#                  d||d       Y d }~d }~ww xY w7 K# 1 d {  7  sw Y   | j%                         xY ww)Nzx-aws-ec2-metadata-tokenGETrM   rR   TrS   )rZ   _default_retryr[   r^   rD   r,   rb   r:   r_   r`   ra   rc   rd   inspectisawaitabler   rg   rh   _RETRIES_EXCEEDED_ERROR_CLS)r   url_path
retry_functokenrO   rP   rJ   rl   rk   rm   should_retryrn   s               r#   _get_requestzAioIMDSFetcher._get_request   s    ,,J!!(+27G./W%==((* 	 	g4--. &11<<$#w = G &-\\'//2C%DDH#-h#7L**<8-9'9''	 	 	 (	 	* ..00+	  E (:	 - LL4!% !  	 	 	 	* ..00s   A(F*D1+F.E*AD9D3&D93D54D9;E*=F	D7
FE*FE(F3D95D97F9	E%E E* E%%E*(F*F0E31F8Fc                 z   K   | j                  |       d {   xs | j                  |       d {   S 7 7 wN_is_non_ok_response	_is_emptyr   rm   s     r#   rr   zAioIMDSFetcher._default_retry   >     --
 
 ,>>(++	, 
+   ;7;9;;c                 h   K   |j                   dk7  r| j                  |dd       d {    yy7 w)NrQ   znon-200Tlog_bodyF)re   _log_imds_responser   s     r#   r~   z"AioIMDSFetcher._is_non_ok_response   s;     3&))(I)MMM Ns   '202c                 v   K   |j                    d {   s| j                  |dd       d {    yy7 "7 w)Nzno bodyTr   F)contentr   r   s     r#   r   zAioIMDSFetcher._is_empty   s?     %%%%))(I)MMM &Ms   959799c                    K   d}||j                   |j                  g}|r(|dz  }|j                  |j                   d {          t	        j
                  |g|  y 7 w)NzHMetadata service returned %s response with status code of %s for url: %sz, content body: %s)re   rO   appendr   rg   rh   )r   rm   reason_to_logr   	statementlogger_argss         r#   r   z!AioIMDSFetcher._log_imds_response   sc     1 	 %h&:&:HLLI--IX%5%556Y--  6s   =A!A  A!r|   )F)r-   r.   r/   r   r   r   ro   rz   rr   r~   r   r    r$   r#   r2   r2   F   sC     1"
8,\1B,
 16.r$   r2   c                   4    e Zd Zd ZddZddZd Zd Zd Zy)	AioInstanceMetadataFetcherc                 .  K   	 | j                          d {   }| j                  |       d {   }| j                  ||       d {   }| j                  |      r'||d   |d   |d   |d   d}| j	                  |       |S d|v rd|v rt
        j                  d|       i S 7 7 x7 `# | j                  $ r$ t
        j                  d	| j                         Y i S t        $ r+}t
        j                  d
|j                         Y d }~i S d }~ww xY ww)NAccessKeyIdSecretAccessKeyToken
Expiration)	role_name
access_key
secret_keyrx   expiry_timeCodeMessagez7Error response received when retrievingcredentials: %s.\Max number of attempts exceeded (%s) when attempting to retrieve data from metadata service.zBad IMDS request: %s)ro   _get_iam_role_get_credentials_contains_all_credential_fields_evaluate_expirationrg   rh   ru   r:   r	   rk   )r   rx   r   credentialsrn   s        r#   retrieve_iam_role_credentialsz8AioInstanceMetadataFetcher.retrieve_iam_role_credentials   s(    	<4466E"0077I $ 5 5i GGK33K@!*"-m"<"-.?"@(1#.|#< ))+6""[(Y+-ELL+#
 	) 77G& // 	LLE"" 	 # 	<LL/;;		<sx   DB- B'B- B)B- 
B+;B- DB- &D'B- )B- +B- -/DDD' DDDDNc                    K   | j                  | j                  | j                  |       d {   j                   d {   S 7 7 wNrv   rw   rx   )rz   	_URL_PATH_needs_retry_for_role_namerf   )r   rx   s     r#   r   z(AioInstanceMetadataFetcher._get_iam_role   sM     ##:: $  
 $ 	s!   ,A	AA	 AA	A	c                    K   | j                  | j                  |z   | j                  |       d {   }t        j                  |j
                   d {         S 7 +7 
wr   )rz   r   _needs_retry_for_credentialsjsonloadsrf   )r   r   rx   rs       r#   r   z+AioInstanceMetadataFetcher._get_credentials   sZ     ##^^i/88 $ 
 

 zz,''

 's!   /A!A"A!A	A!A!c                    K   	 t        j                  |j                   d {          y7 	# t        $ r | j	                  |d       d {  7   Y yw xY ww)NFzinvalid jsonT)r   r   rf   
ValueErrorr   r   s     r#   _is_invalid_jsonz+AioInstanceMetadataFetcher._is_invalid_json  sM     	JJX]]*+ + 	))(NCCC	s=   A. ,. A. AAAAAAc                 z   K   | j                  |       d {   xs | j                  |       d {   S 7 7 wr|   r}   r   s     r#   r   z5AioInstanceMetadataFetcher._needs_retry_for_role_name  r   r   c                    K   | j                  |       d {   xs4 | j                  |       d {   xs | j                  |       d {   S 7 :7 !7 wr|   )r~   r   r   r   s     r#   r   z7AioInstanceMetadataFetcher._needs_retry_for_credentials  sQ     **844 5^^H--5**844	
4-4s1   AAAAAAAAAr|   )	r-   r.   r/   r   r   r   r   r   r   r   r$   r#   r   r      s!    B(,

r$   r   c                       e Zd Zd Zd Zd Zy)AioIMDSRegionProviderc                 B   K   | j                          d{   }|S 7 w)z#Provide the region value from IMDS.N)_get_instance_metadata_region)r   instance_regions     r#   providezAioIMDSRegionProvider.provide  s#      $ B B DD Es   c                 b   K   | j                         }|j                          d {   }|S 7 wr|   )_get_fetcherretrieve_region)r   fetcherregions      r#   r   z3AioIMDSRegionProvider._get_instance_metadata_region  s/     ##%..00 1s   $/-/c                 8   | j                   j                  d      }| j                   j                  d      }| j                   j                  d      t        | j                         d}t        ||| j                  | j                   j                         |      }|S )Nmetadata_service_timeoutmetadata_service_num_attemptsec2_metadata_service_endpoint)r   "ec2_metadata_service_endpoint_mode)r7   rE   rG   rH   rI   )rD   get_config_variabler    AioInstanceMetadataRegionFetcher_environrH   )r   metadata_timeoutmetadata_num_attemptsimds_configr   s        r#   _create_fetcherz%AioIMDSRegionProvider._create_fetcher$  s    ==<<&
 !% A A+!
 .2]]-N-N/. 3M3	
 3$.}}//1
 r$   N)r-   r.   r/   r   r   r   r   r$   r#   r   r     s    

r$   r   c                       e Zd Zd Zd Zy)r   c                    K   	 | j                          d {   }|S 7 # | j                  $ r# t        j                  d| j                         Y y w xY ww)Nr   )_get_regionru   rg   rh   r:   )r   r   s     r#   r   z0AioInstanceMetadataRegionFetcher.retrieve_region@  sZ     	++--FM .// 	LLE""
 	s1   A    A  /AAAAc                    K   | j                          d {   }| j                  | j                  | j                  |       d {   }|j                   d {   }|d d }|S 7 O7 !7 w)Nr   )ro   rz   r   rr   rf   )r   rx   rm   availability_zoner   s        r#   r   z,AioInstanceMetadataRegionFetcher._get_regionL  su     0022**^^** + 
 

 #+--/"3B' 3

 0s3   A,A&/A,A(A,A*A,(A,*A,N)r-   r.   r/   r   r   r   r$   r#   r   r   =  s    
	r$   r   c                       e Zd Zd Zd Zy)AioS3RegionRedirectorv2c           	      $  K   |y|j                  di       j                  di       }t        j                  |j                  d            rt        j	                  d       y|j                  d      rt        j	                  d       y|d   j                  d	i       }|j                  d
      }|d   j                  di       }|dv xr |j
                  dk(  }	|dv xr% |j
                  dk(  xr d|j                  di       v }
|dk(  xr d|v }|d   duxr |d   j                  dv }|dk(  }t        |	|||
|g      sy|d   d   d   }|d   j                  d      }| j                  ||       d{   }|t        j	                  d|d|d       yt        j	                  d|d|d|d       || j                  |<   | j                  j                  }|j                  ||d   d   d   |d          d{   }| j                  |d   |j                        |d<   d|d   d   d<   |j                  j                  d       }|=|j!                  |      }|\  }}||d   d!<   i |d   j                  d"i       ||d   d"<   y7 7 w)#a  
        An S3 request sent to the wrong region will return an error that
        contains the endpoint the request should be sent to. This handler
        will add the redirect information to the signing context and then
        redirect the request.
        Ncontexts3_redirectbucketzBS3 request was previously for an Accesspoint ARN, not redirecting.
redirected6S3 request was previously redirected, not redirecting.r&   Errorr   ResponseMetadata301400
HeadObject
HeadBucketx-amz-bucket-regionHTTPHeadersAuthorizationHeaderMalformedRegionr   i-  i.  i3  PermanentRedirectclient_region S3 client configured for region  but the bucket S is not in that region and the proper region could not be automatically determined. is in region b; Please configure the proper region to avoid multiple unnecessary redirects and signing attempts.params)operation_model	call_argsrequest_contextrO   TauthSchemes	auth_typesigning)r@   r   is_arnrg   rh   namere   anyget_bucket_region_cache_client_ruleset_resolverconstruct_endpointset_request_urlrO   
propertiesauth_schemes_to_signing_ctx)r   request_dictrm   	operationr!   redirect_ctxrU   
error_coderesponse_metadatais_special_head_objectis_special_head_bucketis_wrong_signing_regionis_redirect_statusis_permanent_redirectr   r   
new_regionep_resolverep_infoauth_schemes	auth_infor   signing_contexts                          r#   redirect_from_errorz+AioS3RegionRedirectorv2.redirect_from_errorY  s%      #''	26::="ML,,X67LL L)LLH ,YYv&
$QKOO,>C .(KY^^|-K 	 .( 8,.8% $$]B78 	 88NX=N 	  &a[4 ):

+:) !+.A A&'%&"
 i(7A$Y/33OD11&(CC
LL 0=fF
  fj2	
 )F ll44#66%"9-m<XF(3 7 
 

 #22
U @DY.|<))--m<##??MI)2&I3<L#K02y)--i<2!2L#I. W D.
s&   E1J3J4B
J>J?BJJc                 X  K   |d   }|d   d   }d|v r|d   S |j                  di       j                  dd      }||S 	 | j                  j                  |       d{   }|d   d   }|j                  dd      }|S 7  # t        $ r}|j                  d   d   }Y d}~6d}~ww xY ww)	a-  
        There are multiple potential sources for the new region to redirect to,
        but they aren't all universally available for use. This will try to
        find region from response elements, but will fall back to calling
        HEAD on the bucket if all else fails.
        :param bucket: The bucket to find the region for. This is necessary if
            the region is not available in the error response.
        :param response: A response representing a service request that failed
            due to incorrect region configuration.
        r&   r   r   r   r   r   NBucketr@   r   head_bucketr
   rm   r   r   rm   service_responseresponse_headersr   rP   rn   s           r#   r   z)AioS3RegionRedirectorv2.get_bucket_region  s      $A;+,>?N $44#$9:: "%%gr266xFM	D!\\55V5DDH12=AG 2D9 E 	Djj!34]CG	DA   =B* B B  B ,B* B 	B'B"B*"B''B*Nr-   r.   r/   r  r   r   r$   r#   r   r   X  s    pdr$   r   c                       e Zd Zd Zd Zy)AioS3RegionRedirectorc           	        K   |y | j                  |j                  di             rt        j                  d       y |j                  di       j                  d      rt        j                  d       y |d   j                  di       }|j                  d      }|d   j                  di       }|d	v xr |j                  d
k(  }|d	v xr% |j                  dk(  xr d|j                  di       v }	|dk(  xr d|v }
|d   d uxr |d   j
                  dv }|dk(  }t        ||
||	|g      sy |d   d   d   }|d   j                  d      }| j                  ||       d {   }|t        j                  d|d|d       y t        j                  d|d|d|d       | j                  j                  d|      }|d   }|||d}||d   d<   || j                  |<   | j                  ||d          d|d   d<   y7 w)Nr   z=S3 request was previously to an accesspoint, not redirecting.s3_redirectedr   r&   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   s3endpoint_url)r   r   rY   T)_is_s3_accesspointr@   rg   rh   r   re   r   r   _endpoint_resolverresolver   r   )r   r   rm   r   r!   rU   r   r   r  r  r  r  r  r   r   r  rY   r  s                     r#   r  z)AioS3RegionRedirector.redirect_from_error  sy      ""<#3#3Ir#BCLLO Ir*..?LLH ,YYv&
$QKOO,>C .(KY^^|-K 	 .( 8,.8% $$]B78 	 88NX=N 	  &a[4 ):

+:) !+.A A&'%&"
 i(3H=$Y/33OD11&(CC
LL 0=fF
  fj2	
 **224DN+ ! 

 .=Y	*-F\<	+BC37Y0 A Ds   EG?G=BG?c                 X  K   |d   }|d   d   }d|v r|d   S |j                  di       j                  dd       }||S 	 | j                  j                  |       d {   }|d   d   }|j                  dd       }|S 7  # t        $ r}|j                  d   d   }Y d }~6d }~ww xY ww)Nr&   r   r   r   r   r   r  r  r  s           r#   r   z'AioS3RegionRedirector.get_bucket_regionH  s     #A;+,>?N $44#$9:: "%%gr266xFM	D!\\55V5DDH12=AG 2D9 E 	Djj!34]CG	Dr  Nr  r   r$   r#   r  r    s    Yvr$   r  c                   H    e Zd Zdej                  fdZddZd ZddZd Z	y)AioContainerMetadataFetcherNc                 P    |t        | j                        }|| _        || _        y )N)r7   )r   TIMEOUT_SECONDSrD   _sleep)r   rJ   sleeps      r#   r   z$AioContainerMetadataFetcher.__init__`  s'     ?(1E1EFGr$   c                 d   K   | j                  |       | j                  ||       d {   S 7 wr|   )_validate_allowed_url_retrieve_credentials)r   full_urlrP   s      r#   retrieve_full_uriz-AioContainerMetadataFetcher.retrieve_full_urih  s-     ""8,//'BBBBs   '0.0c                 b   K   | j                  |      }| j                  |       d{   S 7 w)zRetrieve JSON metadata from ECS metadata.

        :type relative_uri: str
        :param relative_uri: A relative URI, e.g "/foo/bar?id=123"

        :return: The parsed JSON response.

        N)r*  r)  )r   relative_urir*  s      r#   retrieve_uriz(AioContainerMetadataFetcher.retrieve_uril  s-      ==.//9999s   &/-/c                 ^  K   ddi}||j                  |       d}	 	 | j                  ||| j                         d {   S 7 # t        $ r[}t        j                  d|d       | j                  | j                         d {  7   |dz  }|| j                  k\  r Y d }~nd }~ww xY ww)NAcceptzapplication/jsonr   TzAReceived error when attempting to retrieve container metadata: %srS   r&   )	update_get_responser$  r   rg   rh   r%  
SLEEP_TIMERETRY_ATTEMPTS)r   r*  extra_headersrP   attemptsrn   s         r#   r)  z1AioContainerMetadataFetcher._retrieve_credentialsx  s     /0$NN=)!//gt';';    * 
-!	   kk$//222At222 3
 sJ   B- A AA B-A 	B)6B$BB$B-$B))B-c                   K   	 | j                   j                         4 d {   }t        j                  j                  } |d||      }|j                  |j                                d {   }|j                   d {   j                  d      }|j                  dk7  rt        d|j                  d|      	 t        j                  |      cd d d       d {    S 7 7 {7 i7 # t        $ r& d}	t        j                  d	|	|       t        |	      w xY w# 1 d {  7  sw Y   y xY w# t         $ r}
d
|
z  }	t        |	      d }
~
ww xY ww)Nrq   rM   zutf-8rQ   zReceived non 200 response (z) from ECS metadata: )	error_msgz8Unable to parse JSON returned from ECS metadata servicesz%s:%sz;Received error when attempting to retrieve ECS metadata: %s)rD   r,   r_   r`   ra   rc   rd   r   decodere   r   r   r   r   rg   rh   r   )r   r*  rP   r7   rJ   ra   rk   rm   response_textr8  rn   s              r#   r2  z)AioContainerMetadataFetcher._get_response  sW    	>}},,. F F'%00;;
$ h ")goo.?!@@'/'7'7!7 ? ? H''3.0 $//#@ F::m4!F F F
 A!7F" " F ZILL)]C09EEF#F F F, % 	>#%&'  )9==	>s   ED7 C(D7 AD".C*/D"C,>D"C0D7 "C.#D7 'E(D7 *D",D".D7 0/DD""D4(D+)D40D7 3E4D7 7	E EEEr|   )
r-   r.   r/   r'   r&  r   r+  r.  r)  r2  r   r$   r#   r"  r"  _  s%    '--C
:,>r$   r"  )-r'   rs   r   loggingbotocore.awsrequestr_   botocore.exceptionsr   r   botocore.utilsr   r   r   r   r	   r
   r   r   r   r   r   r   r   r   r   r   r   r   aiobotocore.httpsessionaiobotocoreaiobotocore._helpersr   	getLoggerr-   rg   httpsessionAIOHTTPSessionr   r2   r   r   r   r   r  r"  r   r$   r#   <module>rE     s            *  4			8	$&00?? &@H.[ H.VE
1H E
P!. !H16Q2 Qhp. pfL>": L>r$   