
    bgS                     N   S r SSKrSSKrSSKrSSKrSSKrSSKrSSKJr  SSKJ	r	  SSKJ
r
  SSKJr  SSKJr  SSKJr  \R"                  " S	5      r " S
 S\5      r " S S\R(                  5      r " S S\R,                  5      r " S S\R,                  5      r " S S\5      rg)z
livereload.handlers
~~~~~~~~~~~~~~~~~~~

HTTP and WebSocket handlers for livereload.

:copyright: (c) 2013 by Hsiaoming Yang
:license: BSD, see LICENSE for more details.
    N)web)ioloop)escape)gen_log)WebSocketHandler)
ObjectDict
livereloadc                       \ rS rSrSr\" 5       rSrSrSr	S r
S rS rS r\S 5       r\S	 5       r\SS
 j5       rS rSrg)LiveReloadHandler      Nc                     gNT selfs    5/usr/lib/python3/dist-packages/livereload/handlers.pyallow_draft76LiveReloadHandler.allow_draft76!           c                     gr   r   )r   origins     r   check_originLiveReloadHandler.check_origin$   r   r   c                 l    U [         R                  ;   a   [         R                  R                  U 5        g g N)r   waitersremover   s    r   on_closeLiveReloadHandler.on_close'   s*    $,,,%%,,T2 -r   c                     [        U[        5      (       a  [        R                  " U5      n U R	                  U5        g !   [
        R                  SSS9   g = f)NError sending messageTexc_info)
isinstancedictr   json_encodewrite_messageloggererror)r   messages     r   send_messageLiveReloadHandler.send_message+   sL    gt$$((1G	Aw'	ALL04L@s	   ? Ac                     U R                   (       a  g U R                  R                  (       dC  [        R	                  S5        U R                  R                  [        R                  " 5       5        [        R                  " 5       U l         [        R	                  S5        U R                  R                  U R                  5      (       dE  [        R	                  S5        [        R                  " U R                  S5      R                  5         g g )NzWatch current working directoryzStart watching changeszStart detecting changesi   )_last_reload_timewatcher_tasksr*   infowatchosgetcwdtimestart
poll_tasksr   PeriodicCallback)clss    r   start_tasksLiveReloadHandler.start_tasks4   s      {{!!KK9:KKbiik* $		,-{{  00KK12##CNNC8>>@ 1r   c                    U R                   R                  5       u  pU(       a  US:X  d  U R                  (       d  g [        R                  nU(       a  [        SU-
  S5      nUS:X  a  Sn[        R                  " 5       U R                  -
  U:  a  [        R                  SU5        g U(       a:  [        R                  R                  5       nUR                  X R                  5        g U R                  5         g )Nforeverr      __livereload__r   z
Ignore: %s)r1   examiner   r   DEFAULT_RELOAD_TIMEmaxr7   r0   r*   r3   r   IOLoopcurrent
call_laterreload_waiters)r;   filepathdelayreload_timeloops        r   r9   LiveReloadHandler.poll_tasksC   s    ++--/5I-S[[';;a%i+K''K99;...< KKh/==((*DOOE#5#56 r   c                    [         R                  S[        U R                  5      U R                  R
                  5        Uc  U R                  R
                  =(       d    SnSUU R                  SS.n[        R                  " 5       U l        U R                  R                  5        H  n UR                  U5        M     g !   [         R                  SSS9  U R                  R                  U5         MN  = f)NzReload %s waiters: %s*reloadT)commandpathliveCSSliveImgr#   r$   )r*   r3   lenr   r1   rI   live_cssr7   r0   copyr)   r+   r   )r;   rR   msgwaiters       r   rH    LiveReloadHandler.reload_waitersZ   s    #KK  	
 <;;''.3D  ||	
 !%		kk&&(F+$$S) )+4tD""6*s   *C  1C4c                 D   [        [        R                  " U5      5      nUR                  S:X  a  SS/SS.nU R	                  U5        UR                  S:X  aI  SU;   aB  [
        R                  SUR                  -  5        [        R                  R                  U 5        ggg)	zcHandshake with livereload.js

1. client send 'hello'
2. server reply 'hello'
3. client send 'info'
helloz*http://livereload.com/protocols/official-7zlivereload-tornado)rQ   	protocols
serverNamer3   urlzBrowser Connected: %sN)r   r   json_decoderQ   r-   r*   r3   r_   r   r   add)r   r,   	handshakes      r   
on_messageLiveReloadHandler.on_messaget   s     V//89??g%"@ 3I i(??f$')9KK/'++=>%%))$/ *:$r   r   r   )__name__
__module____qualname____firstlineno__rC   setr   r1   rV   r0   r   r   r    r-   classmethodr<   r9   rH   rc   __static_attributes__r   r   r   r   r      sw    eGGH3A A A ! !, + +20r   r   c                   H    \ rS rSr0 r\S 5       r\S 5       r\S 5       rSr	g)MtimeStaticFileHandler   c                     [         R                  " U5      n[        R                  R                  U[        R                     5      nU$ )zReturns the time that ``abspath`` was last modified.

May be overridden in subclasses.  Should return a `~datetime.datetime`
object or None.
)r5   statdatetimeutcfromtimestampST_MTIME)r;   abspathstat_resultmodifieds       r   get_content_modified_time0MtimeStaticFileHandler.get_content_modified_time   s9     ggg&$$55&(r   c                    U R                  U5      n[        R                  " 5       n[        U R	                  U5      S5      nUR                  UR                  5       5        [        U[        5      (       a!  UR                  U5        UR                  5       $ U H  nUR                  U5        M     UR                  5       $ )zReturns a version string for the resource at the given path.

This class method may be overridden by subclasses.  The
default implementation is a hash of the file's contents.

.. versionadded:: 3.1
z%Y-%m-%d %H:%M:%S)
get_contenthashlibmd5formatrw   updateencoder&   bytes	hexdigest)r;   rt   datahasher
mtime_datachunks         r   get_content_version*MtimeStaticFileHandler.get_content_version   s     w'C99'BDWX
j'')*dE""MM$ !! e$ !!r   c                 v  ^  U 4S jnT R                      T R                  nT R                  nX;  a  U" U5      u  pVXSU'   XdU'   OIUR                  U5      nUR                  U5      nUT R	                  U5      :w  a  U" U5      u  pVXSU'   XdU'   U(       a  UsS S S 5        $  S S S 5        g ! , (       d  f       g = f)Nc                    >  TR                  U 5      nTR                  U 5      nX!4$ ! [         a    [        R                  " SU 5         gf = f)NzCould not open static file %r)NN)r   rw   	Exceptionr   r+   )abs_pathhshmtmr;   s      r   _load_versionAMtimeStaticFileHandler._get_cached_version.<locals>._load_version   sP    "--h733H=x "=xH!"s   $( !AA)_lock_static_hashes_static_mtimesgetrw   )r;   r   r   hashesmtimesr   r   s   `      r   _get_cached_version*MtimeStaticFileHandler._get_cached_version   s    	" YY''F''F%(2#&x #&x jj*jj*#77AA,X6HC'*8$'*8$) Y& ' * + Y* s   BB**
B8r   N)
re   rf   rg   rh   r   rj   rw   r   r   rk   r   r   r   rm   rm      sA    N	 	 " ",    r   rm   c                       \ rS rSrS rSrg)LiveReloadJSHandler   c                 r   U R                  SS5        [        R                  R                  [        R                  R	                  [
        5      5      n[        R                  R                  US5      n[        US5       nU R                  UR                  5       5        S S S 5        g ! , (       d  f       g = f)NzContent-Typezapplication/javascriptzvendors/livereload.jsrb)

set_headerr5   rR   rt   dirname__file__joinopenwriteread)r   rootjs_filefs       r   r   LiveReloadJSHandler.get   so    (@Awwrwwx89'',,t%<='4 AJJqvvx  !  s   ? B((
B6r   Nre   rf   rg   rh   r   rk   r   r   r   r   r      s    !r   r   c                       \ rS rSrS rSrg)ForceReloadHandler   c                     U R                  SS S9=(       d    Sn[        R                  U5        U R                  S5        g )NrR   )defaultrO   ok)get_argumentr   rH   r   )r   rR   s     r   r   ForceReloadHandler.get   s6       6=#((.

4r   r   Nr   r   r   r   r   r      s    r   r   c                       \ rS rSrS rSrg)StaticFileHandler   c                     g)NFr   r   s    r   should_return_304#StaticFileHandler.should_return_304   s    r   r   N)re   rf   rg   rh   r   rk   r   r   r   r   r      s    r   r   )__doc__rq   r{   r5   rp   r7   loggingtornador   r   r   tornado.logr   tornado.websocketr   tornado.utilr   	getLoggerr*   r   r   rm   RequestHandlerr   r   r   r   r   <module>r      s      	        . #			<	(n0( n0bGS22 GT!#,, !++ . r   