
    i#                     (   g d Z ddl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ZddlZddlmZ d	d
lmZmZmZ d	dlmZ d	dlmZ ej8                  rddlmZ  ej>                         Z 	 d Z!de"dz  fdZ#d-de"de"dz  fdZ$de%fdZ&d.dZ'ed        Z(de"dejR                  de"fdZ*de%de%dejR                  defdZ+de,d   de,ejZ                  e.z     fdZ/ G d  dej`                        Z1de%dejR                  defd!Z2de%dejR                  defd"Z3de%dejR                  defd#Z4d-de%d$e5e%ejR                  f   dz  dejR                  defd%Z6d-de%d$e5e%ejR                  f   dz  dejR                  defd&Z7d-de%d$e5e%ejR                  f   dz  dejR                  defd'Z8de%dejR                  defd(Z9de%de%dejR                  fd)Z:de%de%dejR                  fd*Z;d+ Z<de%de%dejR                  de=eee>   f   fd,Z?y)/)get_network
initializecheck_network_configurationraise_for_httperror    N)SimpleQueue)
MethodType)default_timer)Iterable)contextmanager)SXNG_Response   )r   r   r   )get_loop)r   )Networkc                      dt         _        y )Nr   )THREADLOCAL
total_time     '/root/searxng/searx/network/__init__.pyreset_time_for_threadr       s
    Kr   returnc                  @    t         j                  j                  d      S )z#returns thread's total time or Noner   )r   __dict__getr   r   r   get_time_for_threadr   $   s    ##L11r   timeout
start_timec                 0    | t         _        |t         _        y N)r   r   r   )r   r   s     r   set_timeout_for_threadr    )   s    !K'Kr   network_namec                 ,    t        |       t        _        y r   )r   r   network)r!   s    r   set_context_network_namer$   .   s    %l3Kr   c                  X    t         j                  j                  d      xs
 t               S )z\If set return thread's network.

    If unset, return value from :py:obj:`get_network`.
    r#   )r   r   r   r   r   r   r   get_context_networkr&   2   s"    
 ##I.?+-?r   c               #   2  K   t               } t        t        d|       }	 | t        t        d      r't               }t        xj                  || z
  z  c_        y y # t        t        d      r't               }t        xj                  || z
  z  c_        w w xY ww)Nr   r   )r	   getattrr   hasattrr   )time_before_requestr   time_after_requests      r   _record_http_timer,   :   s      (/l4GHJO ;-!.""&8;N&NN" .7;-!.""&8;N&NN" .s   BA 8B9BBkwargsc                     d|v r|d   }nt        t        dd       }|||d<   |xs d}|dz  }| r|t               | z
  z  }|S )Nr   x   g?)r(   r   r	   )r   r-   r   s      r   _get_timeoutr0   I   sc    
 F#+y$7 'F9 nG sNG=?Z//Nr   methodurlc                 l   t               5 }t               }t        ||      }t        j                   |j
                  | |fi |t                     }	 |j                  |      cddd       S # t        j                  j                  $ r}t        j                  dd      |d}~ww xY w# 1 sw Y   yxY w)z-same as requests/requests/api.py request(...)NTimeoutrequest)r,   r&   r0   asynciorun_coroutine_threadsafer6   r   result
concurrentfuturesTimeoutErrorhttpxTimeoutException)r1   r2   r-   r   r#   r   futurees           r   r6   r6   `   s    		 
I
%'z6211GOOFC262J
	I==)
I 
I !!.. 	I((DAqH	I
I 
Is*   AB*A--B'
B""B''B**B3request_listRequestc           	         t               5 }t               }t               }g }| D ]q  }t        ||j                        }t        j                   |j                  |j                  |j                  fi |j                  |      }|j                  ||f       s g }|D ]&  \  }}	 |j                  |j                  |             ( |cddd       S # t        j                  j                  $ r) |j                  t        j                   dd             Y yt"        $ r}	|j                  |	       Y d}	~	d}	~	ww xY w# 1 sw Y   yxY w)zIsend multiple HTTP requests in parallel. Wait for all requests to finish.r4   Nr5   )r,   r&   r   r0   r-   r7   r8   r6   r1   r2   appendr9   r:   r;   r<   r=   r>   	Exception)
rA   r   r#   loopfuture_listrequest_descr   r?   	responsesr@   s
             r   multi_requestsrJ   o   s6   		 
%'z( 	2L":|/B/BCG55 3 3\5E5E]I\I\]_cF 01	2 	* 	$OFG$  w!78	$ + " %%22 R  !7!7	4!PQ $  ##$' sC   BD;# CD;AD8D;D8D3.D;3D88D;;Ec                      e Zd ZU dZeed<   eed<   i Zeeef   ed<   edede	j                  fd       Zedede	j                  fd       Zedede	j                  fd       Zedede	j                  fd       Zedede	j                  fd	       Zedede	j                  fd
       Zedede	j                  fd       Zy)rB   z3Request description for the multi_requests functionr1   r2   r-   c                     t        d| |      S )NGETrB   r2   r-   s     r   r   zRequest.get       uc6**r   c                     t        d| |      S )NOPTIONSrN   rO   s     r   optionszRequest.options   s    y#v..r   c                     t        d| |      S )NHEADrN   rO   s     r   headzRequest.head       vsF++r   c                     t        d| |      S )NPOSTrN   rO   s     r   postzRequest.post   rW   r   c                     t        d| |      S )NPUTrN   rO   s     r   putzRequest.put   rP   r   c                     t        d| |      S )NPATCHrN   rO   s     r   patchzRequest.patch   s    wV,,r   c                     t        d| |      S )NDELETErN   rO   s     r   deletezRequest.delete   s    xf--r   N)__name__
__module____qualname____doc__str__annotations__r-   dictstaticmethodtAnyr   rS   rV   rZ   r]   r`   rc   r   r   r   rB   rB      s)   =K	HFDcN+ + + + /S /AEE / / ,# , , , ,# , , , + + + + -3 -!%% - - .C .155 . .r   c                 @    |j                  dd       t        d| fi |S )Nallow_redirectsTr   
setdefaultr6   rO   s     r   r   r      s%    
'.5#(((r   c                 @    |j                  dd       t        d| fi |S )Nro   TrS   rp   rO   s     r   rS   rS      s%    
'.9c,V,,r   c                 @    |j                  dd       t        d| fi |S )Nro   FrV   rp   rO   s     r   rV   rV      s%    
'/63)&))r   datac                      t        d| fd|i|S )NrZ   rt   r5   r2   rt   r-   s      r   rZ   rZ      s    634T4V44r   c                      t        d| fd|i|S )Nr]   rt   r5   rv   s      r   r]   r]      s    5#3D3F33r   c                      t        d| fd|i|S )Nr`   rt   r5   rv   s      r   r`   r`      s    7C5d5f55r   c                     t        d| fi |S )Nrc   r5   rO   s     r   rc   rc      s    8S+F++r   c                 2  K   	  | j                   ||fi | d {   4 d {   }|j                  |       |j                  d      2 3 d {   }t        |      dkD  s|j                  |       *7 Y7 R7 )6 d d d       d {  7   n# 1 d {  7  sw Y   nxY wnK# t        j
                  t        j                  f$ r Y n&t        $ r}|j                  |       Y d }~nd }~ww xY w|j                  d        y # |j                  d        w xY ww)Ni   r   )	streamr]   	aiter_rawlenr=   StreamClosedanyioClosedResourceErrorrE   )r#   queuer1   r2   r-   responsechunkr@   s           r   stream_chunk_to_queuer      s     '>v>> 	% 	%(IIh  (11%8 % %eu:>IIe$ ? 	%%8		% 	% 	% 	% 	%  9 9: 
 	  			! 			$		$s   DB$ A5B$ A7B$ #BA;A9A;B#B5B$ 7B$ 9A;;B<B$ B
B$ B BB B$ #D $#C,D 	C,C'"D 'C,,D /DDDc              +      K   t               }t               }t        j                  t	        ||| |fi |t                     }|j                         }|)t        |t              r|| |j                         }|)|j                          y wr   )
r   r&   r7   r8   r   r   r   
isinstancerE   r9   )r1   r2   r-   r   r#   r?   obj_or_exceptions          r   _stream_generatorr      s     ME!#G--.CGUTZ\_.jci.jltlvwF yy{

&&	2"" 99;	 
&
 MMOs   A:B=Bc                 ~    t        j                  | j                         t                      | j                  D ]  } y r   )r7   r8   acloser   
_generator)self_s     r   _close_response_methodr      s2    $$T[[]HJ?
 __ r   c                     t        | |fi |}t        |      }t        |t              r|||_        t        t        |      |_        ||fS )zReplace httpx.stream.

    Usage:
    response, stream = poolrequests.stream(...)
    for chunk in stream:
        ...

    httpx.Client.stream requires to write the httpx.HTTPTransport version of the
    the httpx.AsyncHTTPTransport declared above.
    )r   nextr   rE   r   r   r   close)r1   r2   r-   	generatorr   s        r   r{   r{      sQ     "&#88I IH(I&#H 6AHNYr   r   )r   r   )@__all__typingrl   r7   	threadingconcurrent.futuresr:   r   r   typesr   timeitr	   collections.abcr
   
contextlibr   r=   r   searx.extended_typesr   r#   r   r   r   clientr   r   TYPE_CHECKINGsearx.network.networkr   localr   r   floatr   r    rh   r$   r&   r,   rm   r0   r6   listResponserE   rJ   
NamedTuplerB   r   rS   rV   rj   rZ   r]   r`   rc   r   r   r   tuplebytesr{   r   r   r   <module>r      s   ^         $ %   . I I  4??-ioo ;2UT\ 2
(E (ut| (
43 4@ O OU AEE e .IC Ic IQUU I} Ii T%..9:T5U 4!.all !.H)S )AEE )m )
- - -- -
*c *QUU *} *
5c 5c155j)D0 5155 5] 54S 4S!%%Z(4/ 4!%% 4M 46s 6$sAEEz*T1 6AEE 6m 6, ,quu , , # QRQVQV 4c  quu 3 S AEE eM8TY?<Z6[ r   