
    hA5                     p   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  e j                         Z	dej                  v r+e	j                   e eej                  d                      ej                  j                  dd      ZeH eeej"                        sG ej$                  ded	       ej                  d=  ej(                  e	       n ej(                  e	       d dlZd dlZd d
lmZ d dlmZ d dlmZmZ d dlmZ d dlmZm Z  d dl!m"Z" ddl#m$Z$ ddl%m&Z&  ejN                  e(      Z) G d d      Z*y)    N)ThreadPoolExecutor)asyncioreactorASGI_THREADS)max_workersztwisted.internet.reactorzSomething has already installed a non-asyncio Twisted reactor. Attempting to uninstall it; you can fix this warning by importing daphne.server early in your codebase or finding the package that imports Twisted and importing it later on.   )
stacklevel)CancelledError)partial)deferreactor)serverFromString)STDLibLogObserverglobalLogBeginner)http   )HTTPFactory)WebSocketFactoryc                       e Zd Z	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 ddZd Zd Zd Zd Zd Zd Z	d	 Z
d
 Zed        Zd Zd Zd Zd Zy)ServerNc                    || _         |xs g | _        g | _        g | _        || _        || _        || _        |	| _        |
| _        || _	        || _
        || _        || _        || _        || _        || _        || _        || _        || _        d| _        || _        || _        | j                  s+t,        j/                  d       t1        j2                  d       y y )NFz6No endpoints. This server will not listen on anything.r   )application	endpoints	listenerslistening_addressessignal_handlersaction_loggerhttp_timeoutping_intervalping_timeoutrequest_buffer_sizeproxy_forwarded_address_headerproxy_forwarded_port_headerproxy_forwarded_proto_headerwebsocket_timeoutwebsocket_connect_timeoutwebsocket_handshake_timeoutapplication_close_timeout	root_path	verbosityabort_startready_callableserver_nameloggererrorsysexit)selfr   r   r   r   r   r    r$   r%   r   r   r(   r!   r"   r#   r)   r&   r'   r+   r,   s                       I/var/www/Befach/backend/env/lib/python3.12/site-packages/daphne/server.py__init__zServer.__init__0   s    , '"b#% .*(*(#6 .L++F(,H)!2)B&+F()B&"" ,&~~LLQRHHQK     c                 4   i | _         t        |       | _        t        | | j                        | _        | j
                  j                  | j                  d| j                         | j                  dk  rt        j                  d gdd       n#t        j                  t        t              g       t        j                  rt         j#                  d       nt         j#                  d	       t%        j&                  d| j(                         t%        j&                  d
| j*                         | j,                  D ]  }t         j#                  d|       t/        t$        t1        |            }|j3                  | j                        }|j5                  | j6                         |j9                  | j:                         | j<                  j?                  |        tA        jB                  t$        jD                         | j                  dk\  r#tA        jF                         jI                  d       t%        jJ                  dd| jL                         | jN                  s=| jP                  r| jQ                          t%        jR                  | jT                         y y )N)serverT)autoPingTimeoutallowNullOriginopenHandshakeTimeoutr   c                      y N )_s    r2   <lambda>zServer.run.<locals>.<lambda>o   s    4r4   F)redirectStandardIOdiscardBufferzHTTP/2 support enabledzEHTTP/2 support not enabled (install the http2 and tls Twisted extras)r   zConfiguring endpoint %s   beforeshutdown)installSignalHandlers)+connectionsr   http_factoryr   r,   
ws_factorysetProtocolOptionsr   r&   r)   r   beginLoggingTor   __name__r   
H2_ENABLEDr-   infor   	callLaterapplication_checkertimeout_checkerr   r   strlistenaddCallbacklisten_success
addErrbacklisten_errorr   appendasyncioset_event_loop_asyncioEventloopget_event_loop	set_debugaddSystemEventTriggerkill_all_applicationsr*   r+   runr   )r1   socket_descriptioneplisteners       r2   r^   z
Server.runa   s   '-*48H8HI** -- !%!A!A 	+ 	

 >>Q,, U$ ,,.?.I-JK ??KK01KKW
 	!T556!T112"&..KK13EF!'3/A+BCByy!2!23H  !4!45 1 12NN!!(+ #1 	w889 >>Q""$..t4%%h
D<V<VW""##%KKd.B.BC  r4   c                 b   t        |d      r|j                         }t        |d      rt        |d      ry| j                  j                  |j                  |j
                  f       t        j                  d|j                         j                  |j                         j
                         yyyy)z_
        Called when a listen succeeds so we can store port details (if there are any)
        getHosthostportzListening on TCP address %s:%sN)hasattrrc   r   rV   rd   re   r-   rL   )r1   re   rd   s      r2   rS   zServer.listen_success   s     4#<<>DtV$v)>((//DII0FG4LLN''LLN'' *?$ $r4   c                 l    t         j                  d|j                                | j                          y )NzListen failure: %s)r-   criticalgetErrorMessagestop)r1   failures     r2   rU   zServer.listen_error   s#    ,g.E.E.GH		r4   c                 \    t         j                  rt        j                          yd| _        y)z)
        Force-stops the server.
        TN)r   runningrj   r*   )r1   s    r2   rj   zServer.stop   s     ??LLN#Dr4   c                     || j                   v rt        d|z        dt        j                         i| j                   |<   y)z:
        Adds a protocol as a current connection.
        z)Protocol %r was added to main list twice!	connectedN)rE   RuntimeErrortimer1   protocols     r2   protocol_connectedzServer.protocol_connected   s>     t'''JXUVV&1499;%?"r4   c                 p    d| j                   |   vr%t        j                         | j                   |   d<   y y )Ndisconnected)rE   rq   rr   s     r2   protocol_disconnectedzServer.protocol_disconnected   s7    
 !1!1(!;;9=DX&~6 <r4   c                 p   d| j                   |   vsJ t        j                         }|j                  dddi       | j	                  ||j
                  t        | j                  |            }|| j                   vryt        j                  |t        j                               | j                   |   d<   |S )a  
        Creates a new application instance that fronts a Protocol instance
        for one of our supported protocols. Pass it the protocol,
        and it will work out the type, supply appropriate callables, and
        return you the application's input queue
        application_instanceasgiversionz3.0)scopereceivesendN)loop)
rE   rW   Queue
setdefaultr   getr
   handle_replyensure_futurerZ   )r1   rs   r|   input_queuery   s        r2   create_applicationzServer.create_application   s     &T-=-=h-GGGGmmo)U!34#//OO**H5  0  
 4+++=D=R=R '')>
"#9: r4   c                    K   || j                   vs| j                   |   j                  dd      ry	 | j                  |       |j                  |       y# t        $ r |j	                  ddd        w xY ww)zP
        Coroutine that jumps the reply message from asyncio to Twisted
        rv   Ni  s   Server ErrorzServer Error)rE   r   check_headers_type
ValueErrorbasic_errorr   )r1   rs   messages      r2   r   zServer.handle_reply   s     
 4+++t/?/?/I/M/MD0
 	##G, 	g&  	  o~F	s   /A6A A6A33A6c           	         | d   dk(  sy | j                  dg       D ]m  \  }}t        |t              s$t        dj	                  |t        |                  t        |t              rKt        dj	                  |t        |                   y )Ntypezhttp.response.startheadersz5Header name '{}' expected to be `bytes`, but got `{}`z6Header value '{}' expected to be `bytes`, but got `{}`)r   
isinstancebytesr   formatr   )r   kvs      r2   r   zServer.check_headers_type   s    v"77KK	2.DAqa' KRR47 
 a' LSS47  /r4   c                 &   t        | j                  j                               D ]+  \  }}|j                  dd      }|j                  dd      }|rft	        j                         |z
  | j
                  kD  rB|r@|j                         s0t        j                  d|t        |             |j                          |r|j                         rr	 |j                         }|rMt        |t              r| j                          n,t        j                  d||       |s|j!                  |       	 | j                  |   d= d}|r|s| j                  |= . t'        j(                  d| j*                         y# t"        t$        j"                  f$ r Y fw xY w)z
        Goes through the set of current application Futures and cleans up
        any that are done/prints exceptions for any that errored.
        rv   Nry   zTApplication instance %r for connection %s took too long to shut down and was killed.z Exception inside application: %s)exc_infor   )listrE   itemsr   rq   r'   doner-   warningreprcancel	exceptionr   KeyboardInterruptrj   r.   handle_exceptionr	   rW   r   rM   rN   )r1   rs   detailsrv   ry   r   s         r2   rN   zServer.application_checker  sm   
 "&d&6&6&<&<&>!?Hg";;~t<L#*;;/Et#L  IIK,.1O1OO'0D0I0I0KNNn,X
 )//1#(<(A(A(CE 4 > > @I
 !%i1BC IIK"LL B ))2 ) 
 $0 ( 9 9) D$$X./EF'+$'L$$X.Q "@R 	!T556+ '(>(>? s   
E44FFc                 v   g }| j                   j                         D ]9  }|d   }|j                         r|j                          |j	                  |       ; t
        j                  dt        |             t        j                  j                  t        j                  |       }|j                  d        |S )zG
        Kills all application coroutines before reactor exit.
        ry   z'Killed %i pending application instancesc                      y r;   r<   )xs    r2   r>   z.Server.kill_all_applications.<locals>.<lambda>E  s    4r4   )rE   valuesr   r   rV   r-   rL   lenr   Deferred
fromFuturerW   gatherrT   )r1   wait_forr   ry   wait_deferreds        r2   r]   zServer.kill_all_applications7  s    
 ''..0G#*+A#B ',,.$++- 45	 1
 	=s8}M11'..(2KL  0r4   c                     t        | j                  j                               D ]  }|j                           t	        j
                  d| j                         y)z~
        Called periodically to enforce timeout rules on all connections.
        Also checks pings at the same time.
        r   N)r   rE   keyscheck_timeoutsr   rM   rO   rr   s     r2   rO   zServer.timeout_checkerH  sD    
 T--2245H##% 6!T112r4   c                 D    | j                   r| j                  |||       yy)zN
        Dispatches to any registered action logger, if there is one.
        N)r   )r1   rs   actionr   s       r2   
log_actionzServer.log_actionQ  s$     x9 r4   )NTNNi    iQ    r       NNNr      
   Ndaphne)rJ   
__module____qualname__r3   r^   rS   rU   rj   rt   rw   r   r   staticmethodr   rN   r]   rO   r   r<   r4   r2   r   r   /   s      "$'+$(%)$%"$)/b5Dn$@E4'$  &.7`"3:r4   r   )+rW   osr/   warningsconcurrent.futuresr   twisted.internetr   new_event_looptwisted_loopenvironset_default_executorintmodulesr   current_reactorr   AsyncioSelectorReactorwarnUserWarninginstallloggingrq   r	   	functoolsr
   r   r   twisted.internet.endpointsr   twisted.loggerr   r   twisted.webr   http_protocolr   ws_protocolr   	getLoggerrJ   r-   r   r<   r4   r2   <module>r      s    	 
  1 + &w%%'RZZ%%s2::n+E'FG ++//"<dCo~'L'LMT 	
 KK23|,N<(   -  + 7 ?  & )			8	$g: g:r4   