
    7iI                     z   d Z ddl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Z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  eeee	eeeh      Z	 e d Z G d de      ZeeefZd	 Zd
 Zd Z d Z!ddZ"ddZ#e#Z$ddZ%d Z& G d d      Z'ddZ(ejR                  dk(  r G d d      Z* G d de'      Z+yy# e$ r i ZY mw xY w)a  Basic infrastructure for asynchronous socket service clients and servers.

There are only two ways to have a program on a single processor do "more
than one thing at a time".  Multi-threaded programming is the simplest and
most popular way to do it, but there is another very different technique,
that lets you have nearly all the advantages of multi-threading, without
actually using multiple threads. it's really only practical if your program
is largely I/O bound. If your program is CPU bound, then pre-emptive
scheduled threads are probably what you really need. Network servers are
rarely CPU-bound, however.

If your operating system supports the select() system call in its I/O
library (and nearly all do), then you can use it to juggle multiple
communication channels at once; doing other work while your I/O is taking
place in the "background."  Although this strategy can seem strange and
complex, especially at first, it is in many ways easier to understand and
control than multi-threaded programming. The module documented here solves
many of the difficult problems for you, making the task of building
sophisticated high-performance network servers and clients a snap.

NB: this is a fork of asyncore from the stdlib that we've (the waitress
developers) named 'wasyncore' to ensure forward compatibility, as asyncore
in the stdlib will be dropped soon.  It is neither a copy of the 2.7 asyncore
nor the 3.X asyncore; it is a version compatible with either 2.7 or 3.X.
    )	EAGAINEBADFECONNABORTED
ECONNRESETEINTRENOTCONNEPIPE	ESHUTDOWNEWOULDBLOCKN   )	utilitiesc                 v    	 t        j                  |       S # t        t        t        t
        f$ r d| z  cY S w xY w)NzUnknown error %s)osstrerror	TypeError
ValueErrorOverflowError	NameError)errs    E/var/www/html/venv/lib/python3.12/site-packages/waitress/wasyncore.py	_strerrorr   S   s9    ({{3z=)< (!C''(s    88c                       e Zd Zy)ExitNowN)__name__
__module____qualname__     r   r   r   Z   s    r   r   c                 f    	 | j                          y # t        $ r   | j                          Y y xY wN)handle_read_event_reraised_exceptionshandle_errorobjs    r   readr&   a   1         0c                 f    	 | j                          y # t        $ r   | j                          Y y xY wr    )handle_write_eventr"   r#   r$   s    r   writer+   j   s1      r(   c                 f    	 | j                          y # t        $ r   | j                          Y y xY wr    )handle_expt_eventr"   r#   r$   s    r   
_exceptionr.   s   r'   r(   c                 <   	 |t         j                  z  r| j                          |t         j                  z  r| j	                          |t         j
                  z  r| j                          |t         j                  t         j                  z  t         j                  z  z  r| j                          y y # t        $ rE}|j                  d   t        vr| j                          n| j                          Y d }~y Y d }~y d }~wt        $ r   | j                          Y y xY wNr   )selectPOLLINr!   POLLOUTr*   POLLPRIr-   POLLHUPPOLLERRPOLLNVALhandle_closeOSErrorargs_DISCONNECTEDr#   r"   )r%   flagses      r   	readwriter>   |   s    6== !!#6>>!""$6>>!!!#FNNV^^3fooEF G 66!9M)    s   B.B2 2	D;6C;;Dc                    |t         }|rIg }g }g }t        |j                               D ]m  \  }}|j                         }|j	                         }|r|j                  |       |r|j                  s|j                  |       |s|s]|j                  |       o g |cxk(  r|cxk(  r|k(  rn nt        j                  |        y 	 t        j                  ||||       \  }}}|D ]!  }|j                  |      }|t        |       # |D ]!  }|j                  |      }|t        |       # |D ]!  }|j                  |      }|t!        |       # y y # t        $ r!}	|	j                  d   t        k7  r Y d }	~	y d }	~	ww xY wr0   )
socket_maplistitemsreadablewritableappend	acceptingtimesleepr1   r9   r:   r   getr&   r+   r.   )
timeoutmaprwr=   fdr%   is_ris_wr   s
             r   pollrQ      s{   
{
CIIK( 		GB<<>D<<>DCMMt		 a1JJw	mmAq!W5GAq!  	B''"+C{I		  	B''"+C{#J		  	B''"+C{sO		M (  	xx{e#		s   E 	F E;;F c                 n   |t         }| t        | dz        } t        j                         }|rt	        |j                               D ]  \  }}d}|j                         r$|t        j                  t        j                  z  z  }|j                         r|j                  s|t        j                  z  }|sn|j                  ||        	 |j                  |       }|D ]%  \  }}|j!                  |      }|t#        ||       ' y y # t        $ r#}|j                  d   t        k7  r g }Y d }~Sd }~ww xY w)Ni  r   )r@   intr1   rQ   rA   rB   rC   r2   r4   rD   rF   r3   registerr9   r:   r   rI   r>   )rJ   rK   pollsterrN   r%   r<   rL   r   s           r   poll2rV      s   
{gn%{{}H
CIIK( 	-GBE||~77||~cmm'!!"e,	-	g&A  	"IB''"+C{c5!		"%   	xx{e#A	s   D 	D4D//D4c                     |t         }|rt        t        d      rt        }nt        }||r || |       |ry y |r|dkD  r || |       |dz
  }|r|dkD  ry y y y )NrQ   r   r   )r@   hasattrr1   rV   rQ   )rJ   use_pollrK   countpoll_funs        r   loopr\      sh    
{GFF+}Wc"  eaiWc"AIE eaicicr   c                     t        j                         \  } }}g }|st        d      |rr|j                  |j                  j
                  j                  |j                  j
                  j                  t        |j                        f       |j                  }|rr~|d   \  }}}dj                  |D cg c]  }d|z  	 c}      }|||f| ||fS c c}w )Nztraceback does not exist z
[%s|%s|%s])sysexc_infoAssertionErrorrE   tb_framef_codeco_filenameco_namestr	tb_linenotb_nextjoin)	tvtbtbinfofilefunctionlinexinfos	            r   compact_tracebackrt      s    ||~HAq"F788
""..""**BLL!	
 ZZ  	!":D(D88v6!\A%67D(D!1a-- 7s   5Cc                   J   e Zd ZdZdZdZdZdZdZ e	dh      Z
ej                  Z ee      Zd!dZd ZeZd"dZd"dZej*                  ej,                  fdZd"d	Zd
 Zd Zd Zd Zd Zd Zd#dZd Z d Z!d Z"d$dZ#d Z$d Z%d Z&d Z'd Z(d Z)d Z*d Z+d Z,d Z-d Z.d  Z/y)%
dispatcherFNwarningc                     |t         | _        n|| _        d | _        |r$|j                  d       | j	                  ||       y d | _        y r0   )r@   _map_filenosetblocking
set_socketsocketselfsockrK   s      r   __init__zdispatcher.__init__  sD    ;"DIDI QOOD#&DKr   c                    | j                   j                  dz   | j                   j                  z   g}| j                  r| j                  r|j                  d       n| j                  r|j                  d       | j                  	 |j                  d| j                  z         dj                  dj                  |      t        |             S # t        $ r' |j                  t        | j                               Y Yw xY w)N.	listening	connectedz%s:%dz<{} at {:#x}>r_   )	__class__r   r   rF   addrrE   r   r   reprformatrj   id)r   statuss     r   __repr__zdispatcher.__repr__*  s    ..++c1DNN4O4OOP>>diiMM+&^^MM+&99 /g		12 %%chhv&64AA  /d499o./s   C -C>=C>c                 >    || j                   }| || j                  <   y r    )ry   rz   )r   rK   s     r   add_channelzdispatcher.add_channel9  s    ;))C DLLr   c                 T    | j                   }|| j                  }||v r||= d | _         y r    )rz   ry   )r   rK   rN   s      r   del_channelzdispatcher.del_channel?  s.    \\;))C9Br   c                     ||f| _         t        j                  ||      }|j                  d       | j                  |       y r0   )family_and_typer}   r{   r|   )r   familytyper   s       r   create_socketzdispatcher.create_socketH  s8    %t|}}VT*r   c                 ^    || _         |j                         | _        | j                  |       y r    )r}   filenorz   r   r~   s      r   r|   zdispatcher.set_socketN  s$    {{}r   c                    	 | j                   j                  t         j                  t         j                  | j                   j	                  t         j                  t         j                        dz         y # t
        $ r Y y w xY w)Nr   )r}   
setsockopt
SOL_SOCKETSO_REUSEADDR
getsockoptr9   r   s    r   set_reuse_addrzdispatcher.set_reuse_addrS  se    	KK""!!##&&v'8'8&:M:MNQRR
  		s   A2A5 5	B Bc                      yNTr   r   s    r   rC   zdispatcher.readabled      r   c                      yr   r   r   s    r   rD   zdispatcher.writableg  r   r   c                 z    d| _         t        j                  dk(  r|dkD  rd}| j                  j	                  |      S )NTnt   )rF   r   namer}   listen)r   nums     r   r   zdispatcher.listenn  s4    77d?sQwC{{!!#&&r   c                 F    || _         | j                  j                  |      S r    )r   r}   bind)r   r   s     r   r   zdispatcher.bindt  s    	{{%%r   c                     	 | j                   j                         \  }}||fS # t        $ r Y y t        $ r+}|j                  d   t
        t        t        fv rY d }~y  d }~ww xY wr0   )r}   acceptr   r9   r:   r   r   r   )r   connr   whys       r   r   zdispatcher.acceptx  sc    
	++-JD$ :  	 	xx{{L&AA		s   # 	A!A! AAA!c                     	 | j                   j                  |      }|S # t        $ rM}|j                  d   t        k(  rY d }~y|j                  d   t
        v r|r| j                          Y d }~y d }~ww xY wr0   )r}   sendr9   r:   r   r;   r8   )r   datado_closeresultr   s        r   r   zdispatcher.send  sh    	[[%%d+FM 	xx{k)!-%%'	s     	A5A0'A0/A00A5c                     	 | j                   j                  |      }|s| j                          y|S # t        $ r0}|j                  d   t
        v r| j                          Y d }~y d }~ww xY w)Nr   r   )r}   recvr8   r9   r:   r;   )r   buffer_sizer   r   s       r   r   zdispatcher.recv  sf    	;;##K0D !!# 	xx{m+!!#	s   -2 2 	A+%A&%A&&A+c                    d| _         d| _        d| _        | j                          | j                  #	 | j                  j                          d | _        y y # t        $ r&}|j                  d   t        t        fvr Y d }~3d }~ww xY w)NFr   )
r   rF   
connectingr   r}   closer9   r:   r   r   )r   r   s     r   r   zdispatcher.close  s    ;;"!!#
 DK #  88A;x&77 8s   A 	BB  Bc                 X    | j                   j                  t        j                  |       y r    )loggerlogloggingDEBUG)r   messages     r   r   zdispatcher.log  s    w/r   c                     t         j                  t         j                  t         j                  d}| j                  j                  |j                  |t         j                        |       y )N)rs   rw   error)r   INFOWARNERRORr   r   rI   )r   r   r   severitys       r   log_infozdispatcher.log_info  sA    LL||]]

 	T7<<8'Br   c                     | j                   r| j                          y | j                  s-| j                  r| j	                          | j                          y | j                          y r    )rF   handle_acceptr   r   handle_connect_eventhandle_readr   s    r   r!   zdispatcher.handle_read_event  sI    >>  ))+r   c                     | j                   j                  t         j                  t         j                        }|dk7  rt	        |t        |            | j                          d| _        d| _        y )Nr   TF)	r}   r   r   SO_ERRORr9   r   handle_connectr   r   r   r   s     r   r   zdispatcher.handle_connect_event  sT    kk$$V%6%6H!8#y~..r   c                     | j                   ry | j                  s| j                  r| j                          | j	                          y r    )rF   r   r   r   handle_writer   s    r   r*   zdispatcher.handle_write_event  s4    >> ~~))+r   c                     | j                   8| j                   j                  t         j                  t         j                        nd}|dk7  r| j	                          y | j                          y )Nr   r   )r}   r   r   r   r8   handle_exptr   s     r   r-   zdispatcher.handle_expt_event  sY     {{& KK""6#4#4fooF 	
 !8 r   c                     | j                         \  }}}}	 t        |       }| j                  d|d|d|d|d	d       | j	                          y #  dt        |       z  }Y BxY w)Nz)<__repr__(self) failed for object at %0x>z-uncaptured python exception, closing channel z (:r_   )r   )rt   r   r   r   r8   )r   nilrk   rl   rn   	self_reprs         r   r#   zdispatcher.handle_error  sk     224Q6	OT
I 	!Q(	

 		OCbhNIs   A A$c                 (    | j                  dd       y )Nz!unhandled incoming priority eventrw   r   r   s    r   r   zdispatcher.handle_expt  s    99Er   c                 (    | j                  dd       y )Nzunhandled read eventrw   r   r   s    r   r   zdispatcher.handle_read  s    ,i8r   c                 (    | j                  dd       y )Nzunhandled write eventrw   r   r   s    r   r   zdispatcher.handle_write  s    -y9r   c                 (    | j                  dd       y )Nzunhandled connect eventrw   r   r   s    r   r   zdispatcher.handle_connect  s    /;r   c                 H    | j                         }| | j                  |  y y r    )r   handle_accepted)r   pairs     r   r   zdispatcher.handle_accept  s(    {{} D  $' r   c                 H    |j                          | j                  dd       y )Nzunhandled accepted eventrw   )r   r   )r   r   r   s      r   r   zdispatcher.handle_accepted  s    

0)<r   c                 H    | j                  dd       | j                          y )Nzunhandled close eventrw   )r   r   r   s    r   r8   zdispatcher.handle_close  s    -y9

r   )NNr    )T)rs   )0r   r   r   debugr   rF   r   closingr   	frozensetignore_log_typesr   r   staticmethodrt   r   r   __str__r   r   r}   AF_INETSOCK_STREAMr   r|   r   rC   rD   r   r   r   r   r   r   r   r   r!   r   r*   r-   r#   r   r   r   r   r   r   r8   r   r   r   rv   rv     s    EIIJGD )-F$%67 B G! $*>>8J8J 
	"'&$$0C
 	& F9:<(
=r   rv   c                    | t         } t        | j                               D ]  }	 |j                           | j                          y # t        $ r$}|j
                  d   t        k(  rn|s Y d }~Od }~wt        $ r   |s Y bxY wr0   )	r@   rA   valuesr   r9   r:   r   r"   clear)rK   
ignore_allrr   s      r   	close_allr     s    
{#**, 	GGI IIK  	vvayE!# 		 s   A			BA11Bposixc                   @    e Zd Zd Zd Zd Zd Zd	dZeZeZ	d Z
d Zy)
file_wrapperc                 8    t        j                  |      | _        y r    )r   duprN   r   rN   s     r   r   zfile_wrapper.__init__F  s    ffRjDGr   c                 |    | j                   dk\  rt        j                  d| z  t               | j	                          y )Nr   zunclosed file %r)rN   warningswarnResourceWarningr   r   s    r   __del__zfile_wrapper.__del__I  s*    ww!|047IJJLr   c                 B    t        j                  | j                  g| S r    )r   r&   rN   r   r:   s     r   r   zfile_wrapper.recvN  s    77477*T**r   c                 B    t        j                  | j                  g| S r    )r   r+   rN   r   s     r   r   zfile_wrapper.sendQ  s    88DGG+d++r   Nc                 j    |t         j                  k(  r|t         j                  k(  r|syt        d      )Nr   z-Only asyncore specific behaviour implemented.)r}   r   r   NotImplementedError)r   leveloptnamebuflens       r   r   zfile_wrapper.getsockoptT  s1    )))g.HQW%B r   c                 t    | j                   dk  ry | j                   }d| _         t        j                  |       y )Nr   r^   )rN   r   r   r   s     r   r   zfile_wrapper.close^  s+    ww{BDGHHRLr   c                     | j                   S r    )rN   r   s    r   r   zfile_wrapper.filenoe  s    77Nr   r    )r   r   r   r   r   r   r   r   r&   r+   r   r   r   r   r   r   r   A  s1    
	!	
	+	,	 		r   r   c                       e Zd ZddZd Zy)file_dispatcherNc                     t         j                  | d |       d| _        	 |j                         }| j                  |       t        j                  |d       y # t        $ r Y 3w xY w)NTF)rv   r   r   r   AttributeErrorset_filer   set_blocking)r   rN   rK   s      r   r   zfile_dispatcher.__init__i  s[    dC0!DNYY[ MM"OOB&	 " s   A 	A$#A$c                     t        |      | _        | j                  j                         | _        | j	                          y r    )r   r}   r   rz   r   r   s     r   r  zfile_dispatcher.set_filet  s.    &r*DK;;--/DLr   r    )r   r   r   r   r  r   r   r   r  r  h  s    		'	r   r  )g        N)g      >@FNN)NF),__doc__errnor   r   r   r   r   r   r	   r
   r   r   r   r1   r}   r`   rG   r    r   r   r;   r@   r   r   	Exceptionr   KeyboardInterrupt
SystemExitr"   r&   r+   r.   r>   rQ   rV   poll3r\   rt   rv   r   r   r   r  r   r   r   <module>r     s   84
 
 
  	   
   :xL%QVWX
(	i 	  !2J? *-`"B 	&..M M`@ 77g% %N* S a  Js   
B0 0B:9B: