
    Ti                     h    d 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	 ddl
mZmZ ddlZ G d d      Zy)u  
HTTP 客户端工厂和管理器

本模块提供了统一的 HTTP 客户端创建和管理功能，支持 httpx 和 aiohttp 库：
- 自动 SSL 证书验证
- 连接池管理和超时控制
- 同步和异步客户端支持
- 支持代理环境变量 (trust_env=True)

使用指南：
1. httpx 客户端：
   async with HttpClient.create() as client:
       response = await client.get("https://api.example.com/data")

2. aiohttp 客户端：
   async with HttpClient.create_aiohttp() as session:
       async with session.get("https://api.example.com/data") as response:
           data = await response.json()

3. 同步请求：使用 HttpClient.create_sync()
   with HttpClient.create_sync() as client:
       response = client.get("https://api.example.com/data")
    N)OptionalDictAnyAsyncGenerator	Generator)asynccontextmanagercontextmanagerc                      e Zd ZU dZdZeej                     ed<   e	dej                  fd       Z
e	dedeeef   fd       Ze		 ddededeeef   fd	       Ze	e	 dd
ee   dedeej(                  df   fd              Ze	e	 dd
ee   dedeej0                  ddf   fd              Ze	dedej(                  fd       Ze	dedej0                  fd       Ze	e	 ddededed   fd              Ze		 ddededdfd       Zy)
HttpClientu    HTTP 客户端工厂和管理器N_ssl_contextreturnc                 6   | j                   :	 t        j                  t        j                               | _         | j                   S | j                   S # t
        $ r<}t        d|        t        j                         | _         Y d}~| j                   S d}~ww xY w)u   获取缓存的 SSL 上下文N)cafileu2   ⚠️ Failed to create SSL context with certifi: )r   sslcreate_default_contextcertifiwhere	Exceptionprint)clses     K/home/jay/workspace/tools/ai-image-gen/jaaz-app/server/utils/http_client.py_get_ssl_contextzHttpClient._get_ssl_context&   s     #@#&#=#=W]]_#U  s  @J1#NO#&#=#=#?  @s   -A 	B'BBkwargsc                 `    | j                         ddt        j                  ddd      d|}|S )u   获取 httpx 客户端配置,  Tr         )max_keepalive_connectionsmax_connectionskeepalive_expiry)verifytimeoutfollow_redirectslimits)r   httpxLimitsr   r   configs      r   _get_client_configzHttpClient._get_client_config1   sB    
 **, $ll*+SSU	
 
     	trust_envc                     t        j                  | j                         ddd      t        j                  d      |d|}|S )u   获取 aiohttp 客户端配置r   2   r   )r   limitlimit_per_hostkeepalive_timeoutr   )total)	connectorr#   r,   )aiohttpTCPConnectorr   ClientTimeoutr   r,   r   r)   s       r   _get_aiohttp_configzHttpClient._get_aiohttp_configA   sR     !--((*!"#	 ,,37"

 

 r+   urlc                   K    | j                   di |}t        j                  di |}	 | |j                          d{    y7 # |j                          d{  7   w xY ww)u'   创建异步客户端上下文管理器N )r*   r&   AsyncClientacloser   r9   r   r)   clients        r   createzHttpClient.createV   sX      (''1&1"",V,	"L--/!!&--/!!s3   (A)A A)A	A)A&A" A&&A)c              +      K    | j                   di |}t        j                  di |}	 | |j                          y# |j                          w xY ww)u'   创建同步客户端上下文管理器Nr;   )r*   r&   Clientcloser>   s        r   create_synczHttpClient.create_syncc   sJ      (''1&1''	LLLNFLLNs   (AA  A AAc                 P     | j                   di |}t        j                  di |S )u3   直接创建异步客户端（需要手动关闭）r;   )r*   r&   r<   r(   s      r   create_async_clientzHttpClient.create_async_clientp   s-     (''1&1  *6**r+   c                 P     | j                   di |}t        j                  di |S )u3   直接创建同步客户端（需要手动关闭）r;   )r*   r&   rB   r(   s      r   create_sync_clientzHttpClient.create_sync_clientv   s+     (''1&1||%f%%r+   )aiohttp.ClientSessionNc                   K    | j                   dd|i|}t        j                  di |}	 | |j                          d{    y7 # |j                          d{  7   w xY ww)u   创建 aiohttp 客户端上下文管理器

        Args:
            trust_env: 是否信任环境变量代理设置 (HTTP_PROXY, HTTPS_PROXY, etc.)
            **kwargs: 其他 aiohttp.ClientSession 参数
        r,   Nr;   )r8   r4   ClientSessionrC   )r   r,   r   r)   sessions        r   create_aiohttpzHttpClient.create_aiohttp}   s]      )((G9GG''1&1	"M--/!!'--/!!s3   *A+A A+AA+A(!A$"A((A+rI   c                 T     | j                   dd|i|}t        j                  di |S )u   直接创建 aiohttp 客户端（需要手动关闭）

        Args:
            trust_env: 是否信任环境变量代理设置 (HTTP_PROXY, HTTPS_PROXY, etc.)
            **kwargs: 其他 aiohttp.ClientSession 参数
        r,   r;   )r8   r4   rK   r7   s       r   create_aiohttp_clientz HttpClient.create_aiohttp_client   s2     )((G9GG$$.v..r+   )T)N)__name__
__module____qualname____doc__r   r   r   
SSLContext__annotations__classmethodr   r   r   strr*   boolr8   r   r   r&   r<   r@   r	   r   rB   rD   rF   rH   rM   rO   r;   r+   r   r   r   !   s   *-1L(3>>*1      # $sCx.   #/2	c3h ( "&	"3-	"25	"	))4/	0	"  	" "&	3-	25		5<<t+	,	  	 +3 +53D3D + +
 &# &%,, & & #""/2"	5	6"  "  #
/
//2
/	 
/ 
/r+   r   )rS   r   r   r&   typingr   r   r   r   r   
contextlibr   r	   r4   r   r;   r+   r   <module>r[      s-   0    A A : y/ y/r+   