ó
mÜJ]c           @` ss  d  Z  d d l m Z m Z m Z m Z d d l Z e j e ƒ Z	 d d l
 m Z d d l Z d d l Z d d l Z d d l Z d d l m Z m Z d d l m Z d Z d Z e j j e ƒ Z e j j d	 d
 ƒ Z d Z d e f d „  ƒ  YZ d e  f d „  ƒ  YZ! e j" d d ƒ d „  ƒ Z# d e d e Z$ e j j% e ƒ soe	 j& e$ ƒ d sot' e$ ƒ ‚ n  d S(   u‡    Define a simple web server for testing purpose.

Used for serves the testing html pages that are needed by the webdriver unit
tests.

i    (   t   absolute_importt   divisiont   print_functiont   unicode_literalsN(   t   open(   t   BaseHTTPRequestHandlert
   HTTPServer(   t	   URLopeneru	   127.0.0.1i@  u	   WEBDRIVERu   <undefined>u   file_serveru   HtmlOnlyHandleru   SimpleWebServert   HtmlOnlyHandlerc           B` s    e  Z d  Z d „  Z d „  Z RS(   u   Http handler.c         C` s¾   y’ |  j  d j d ƒ d } t t j  j t | ƒ d d d ƒ} |  j d ƒ |  j d d	 ƒ |  j ƒ  |  j	 j
 | j ƒ  j d
 ƒ ƒ | j ƒ  Wn% t k
 r¹ |  j d d | ƒ n Xd S(   u   GET method handler.i   u   ?i    u   rt   encodingu   latin-1iÈ   u   Content-typeu	   text/htmlu   utf-8i”  u   File Not Found: %sN(   t   patht   splitR   t   ost   joint	   HTML_ROOTt   send_responset   send_headert   end_headerst   wfilet   writet   readt   encodet   closet   IOErrort
   send_error(   t   selfR
   t   html(    (    sA   lib/python2.7/site-packages/bokeh/_testing/plugins/file_server.pyt   do_GET?   s    $
c         G` s   d S(   u)   Override default to avoid trashing stderrN(    (   R   t   formatt   args(    (    sA   lib/python2.7/site-packages/bokeh/_testing/plugins/file_server.pyt   log_messageL   s    (   t   __name__t
   __module__t   __doc__R   R   (    (    (    sA   lib/python2.7/site-packages/bokeh/_testing/plugins/file_server.pyR   =   s   	t   SimpleWebServerc           B` sA   e  Z d  Z e e d „ Z d „  Z d „  Z d „  Z d „  Z	 RS(   u   A very basic web server.c         C` sŸ   t  |  _ | } | } xk t r‚ y/ t | | f t ƒ |  _ | |  _ | |  _ PWq t j	 k
 r~ t
 j d | ƒ | d 7} q Xq Wt j d |  j ƒ |  _ d  S(   Nu%   port %d is in use, trying to next onei   t   target(   t   Falset   stop_servingt   TrueR   R   t   servert   hostt   portt   sockett   errort   logt   debugt	   threadingt   Threadt   _run_web_servert   thread(   R   R(   R)   (    (    sA   lib/python2.7/site-packages/bokeh/_testing/plugins/file_server.pyt   __init__S   s    				c         C` s;   t  j d ƒ x |  j s) |  j j ƒ  q W|  j j ƒ  d S(   u   Runs the server loop.u   web server startedN(   R,   R-   R%   R'   t   handle_requestt   server_close(   R   (    (    sA   lib/python2.7/site-packages/bokeh/_testing/plugins/file_server.pyR0   d   s    c         C` s   |  j  j ƒ  d S(   u   Starts the server.N(   R1   t   start(   R   (    (    sA   lib/python2.7/site-packages/bokeh/_testing/plugins/file_server.pyR5   k   s    c         C` s_   t  |  _ y$ t ƒ  j d |  j |  j f ƒ Wn t k
 r@ n Xt j d ƒ |  j	 j
 ƒ  d S(   u   Stops the server.u   http://%s:%du   Shutting down the webserverN(   R&   R%   R   R   R(   R)   R   R,   t   infoR1   R   (   R   (    (    sA   lib/python2.7/site-packages/bokeh/_testing/plugins/file_server.pyt   stopo   s    	$c         C` s   d |  j  |  j | f S(   Nu   http://%s:%d/%s(   R(   R)   (   R   R
   (    (    sA   lib/python2.7/site-packages/bokeh/_testing/plugins/file_server.pyt   where_isz   s    (
   R   R    R!   t   DEFAULT_HOSTt   DEFAULT_PORTR2   R0   R5   R7   R8   (    (    (    sA   lib/python2.7/site-packages/bokeh/_testing/plugins/file_server.pyR"   Q   s   			t   scopeu   sessionc         C` s'   t  ƒ  } | j ƒ  |  j | j ƒ | S(   N(   R"   R5   t   addfinalizerR7   (   t   requestR'   (    (    sA   lib/python2.7/site-packages/bokeh/_testing/plugins/file_server.pyt   file_server}   s    	
uX   Can't find 'common_web' directory, try setting WEBDRIVER environment variable WEBDRIVER:u     HTML_ROOT:(   u   file_serveru   HtmlOnlyHandleru   SimpleWebServer((   R!   t
   __future__R    R   R   R   t   loggingt	   getLoggerR   R,   t   ioR   R   R*   R.   t   pytestt   six.moves.BaseHTTPServerR   R   t   six.moves.urllib.requestR   R9   R:   R
   t   dirnamet   __file__R   t   environt   gett	   WEBDRIVERt   __all__R   t   objectR"   t   fixtureR>   t   _html_root_error_messaget   isdirR+   t   AssertionError(    (    (    sA   lib/python2.7/site-packages/bokeh/_testing/plugins/file_server.pyt   <module>   s0   "  ,