
    T9j                         d Z ddlZddlZddlZdZ G d dej                  j                        Z ej                  e       ej                  j                  de      j                          y)zStatic file server: CORS, HTTP Range (video seeking/streaming), smart caching.
HTML and directory indexes stay no-cache (Gamma/video-slides embeds always fresh);
other assets (mp4, images, etc.) are cached for 1 day. Backward compatible.
    Nz/opt/static-assetsc                   8     e Zd Z fdZd Z fdZ fdZ xZS )Handlerc                    | j                  dd       | j                  dd       | j                  dd       | j                  j                  dd      d	   }|j                  d
      s"|j                  d      s|j                  d      r7| j                  dd       | j                  dd       | j                  dd       n| j                  dd       t        |           y )NzAccess-Control-Allow-Origin*zAccess-Control-Allow-MethodszGET, HEAD, OPTIONSzAccept-Rangesbytes?   r   /z.htmlz.htmzCache-Controlz#no-cache, no-store, must-revalidatePragmazno-cacheExpires0zpublic, max-age=86400)send_headerpathsplitendswithsuperend_headers)selfp	__class__s     /opt/static-assets/serve.pyr   zHandler.end_headers   s    6<79MN'2IIOOC#A&::c?ajj1QZZ5G_.STXz2Y,_.EF    c                 F    | j                  d       | j                          y )N   )send_responser   )r   s    r   
do_OPTIONSzHandler.do_OPTIONS   s    3r   c           	         | j                  | j                        }t        j                  j                  |      st        j                  j	                  |      sd | _        t        	|          S | j                  j                  d      }|sd | _        t        	|          S t        j                  d|j                               }|r"|j                  d      s&|j                  d      sd | _        t        	|          S 	 t        |d      }	 t        j"                  |j%                               j&                  }|j                  d      rKt)        |j                  d            }|j                  d      rt)        |j                  d            n|dz
  }n,t+        d|t)        |j                  d            z
        }|dz
  }t-        ||dz
        }||kD  s||k\  rG| j/                  d	       | j1                  d
d|        | j3                          |j5                          y ||z
  dz   }||f| _        | j/                  d       | j1                  d| j7                  |             | j1                  d
d| d| d|        | j1                  dt9        |             | j3                          |j;                  |       |S # t        $ r | j!                  dd       Y y w xY w# t<        $ r |j5                           w xY w)NRangezbytes=(\d*)-(\d*)\s*$r	      rbi  zFile not foundr   i  zContent-Rangezbytes */   zContent-Typezbytes -r
   zContent-Length)translate_pathr   osisdirisfile_ranger   	send_headheadersgetrematchstripgroupopenOSError
send_errorfstatfilenost_sizeintmaxminr   r   r   close
guess_typestrseek	Exception)
r   r   rngmfsizestartendlengthr   s
            r   r(   zHandler.send_head   sy   ""499-77==bggnnT&:DK7$&&llw'DK7$&&HH-syy{;AGGAJDK7$&&	T4 A	88AHHJ'//DwwqzAGGAJ)*c!''!*oAtc!''!*o56Qhc4!8$Cs{etm""3'  HTF2CD  "	5[1_F &/DKs#^T__T-BC_ugQse1TF.KL-s6{;FF5MH5  	OOC!12	6  	GGI	s&    J> DK "BK >KKK:c                     t        | dd       }|st        | 	  ||      S |\  }}|}|dkD  rD|j                  t	        d|            }|sy |j                  |       |t        |      z  }|dkD  rCy y )Nr'   r   i   )getattrr   copyfilereadr7   writelen)	r   source
outputfiler=   _startrC   	remainingchunkr   s	           r   rF   zHandler.copyfileM   s{    dHd+7#FJ77	!mKKE9 56EU#U#I !mr   )__name__
__module____qualname__r   r   r(   rF   __classcell__)r   s   @r   r   r      s    ,\$ $r   r   )z0.0.0.0i  )__doc__http.serverhttpr$   r+   ROOTserverSimpleHTTPRequestHandlerr   chdirThreadingHTTPServerserve_forever r   r   <module>r]      s`     	 	K$dkk22 K$\ 	    17 ; I I Kr   