σ
	Q[c           @` sQ  d  d l  m Z m Z m Z m Z d  d l m Z m 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 Z d  d l m Z d  d l m Z m Z m Z d  d l m Z e j d  Z e
 j j e  Z e j Z e
 j j  e d	  Z! d
 e f d     YZ" d e f d     YZ# d e f d     YZ$ d e j% f d     YZ& e! e d d  Z( e) d k rMd  d l* Z* e* j+ d d  Z, e, j- d d d e. d d d d e, j- d d d d  d e/ d! d" d d# e, j- d$ d% d d& d e0 d! d' d d( e, j- d) d d* d e d! d+ d d, e, j- d- d d. d e d! d+ d d/ e, j1   Z2 e2 j3 e _3 e2 j4 r|e$ Z5 n0 e# Z5 e	 j6 re
 j7   e5 _8 n e
 j9   e5 _8 e j: e j;  Z< e< j= e!  e2 j> rηe< j? e2 j>  n  e2 j@ re< jA e2 j@  n  e" d0 e2 jB f e5 e<  ZC e2 j3 r=eD d1 jE e2   n  eC jF d2  n  d S(3   i    (   t   absolute_importt   divisiont   print_functiont   unicode_literals(   t   filtert   str(   t   utilsN(   t   parse(   t
   HTTPServert   SimpleHTTPRequestHandlert   BaseHTTPRequestHandler(   t   supportu	   threadingu   keycert.pemt   HTTPSServerc           B` s#   e  Z d    Z d   Z d   Z RS(   c         C` s    t  j |  | |  | |  _ d  S(   N(   t   _HTTPServert   __init__t   context(   t   selft   server_addresst   handler_classR   (    (    s@   lib/python2.7/site-packages/future/backports/test/ssl_servers.pyR      s    c         C` s   d |  j  j |  j |  j f S(   Nu
   <%s %s:%s>(   t	   __class__t   __name__t   server_namet   server_port(   R   (    (    s@   lib/python2.7/site-packages/future/backports/test/ssl_servers.pyt   __str__   s    	c         C` sw   y1 |  j  j   \ } } |  j j | d t } Wn9 t  j k
 rl } t j rf t j	 j
 d |  n    n X| | f S(   Nt   server_sideu   Got an error:
%s
(   t   sockett   acceptR   t   wrap_sockett   Truet   errorR   t   verboset   syst   stderrt   write(   R   t   sockt   addrt   sslconnt   e(    (    s@   lib/python2.7/site-packages/future/backports/test/ssl_servers.pyt   get_request"   s    	(   R   t
   __module__R   R   R&   (    (    (    s@   lib/python2.7/site-packages/future/backports/test/ssl_servers.pyR      s   		t   RootedHTTPRequestHandlerc           B` s,   e  Z d  Z e Z d Z d   Z d   Z RS(   u   TestHTTPS/1.0i   c         C` s΅   t  j j |  d } t j j t  j j |   } | j d  } t d |  } |  j
 } xS | D]K } t j j |  \ } } t j j |  \ } } t j j | |  } qb W| S(   uρ   Translate a /-separated PATH to the local filename syntax.

        Components that mean special things to the local file system
        (e.g. drive or directory names) are ignored.  (XXX They should
        probably be diagnosed.)

        i   u   /N(   t   urllibR   t   urlparset   ost   patht   normpatht   unquotet   splitR   t   Nonet   roott
   splitdrivet   join(   R   R,   t   wordst   wordt   drivet   head(    (    s@   lib/python2.7/site-packages/future/backports/test/ssl_servers.pyt   translate_path8   s    		c         G` sR   t  j rN t j j d |  j j |  j j |  j j	   |  j
   | | f  n  d  S(   Nu    server (%s:%d %s):
   [%s] %s
(   R   R   R   t   stdoutR!   t   serverR   R   t   requestt   ciphert   log_date_time_string(   R   t   formatt   args(    (    s@   lib/python2.7/site-packages/future/backports/test/ssl_servers.pyt   log_messageL   s    				(   R   R'   t   server_versiont   hereR1   t   timeoutR8   R@   (    (    (    s@   lib/python2.7/site-packages/future/backports/test/ssl_servers.pyR(   .   s
   	t   StatsRequestHandlerc           B` s2   e  Z d  Z d Z e d  Z d   Z d   Z RS(   uS   Example HTTP request handler which returns SSL statistics on GET
    requests.
    u   StatsHTTPS/1.0c         C` sΓ   |  j  j j } | j } i | j   d 6| j   d 6| j   d 6} t j |  } | j	 d  } |  j
 d  |  j d d  |  j d t t |    |  j   | rΏ |  j j |  n  d	 S(
   u   Serve a GET request.u   session_cacheu   cipheru   compressionu   utf-8iΘ   u   Content-typeu   text/plain; charset=utf-8u   Content-LengthN(   t   rfilet   rawt   _sockR   t   session_statsR<   t   compressiont   pprintt   pformatt   encodet   send_responset   send_headerR   t   lent   end_headerst   wfileR!   (   R   t	   send_bodyR"   R   t   statst   body(    (    s@   lib/python2.7/site-packages/future/backports/test/ssl_servers.pyt   do_GET^   s    	
c         C` s   |  j  d t  d S(   u   Serve a HEAD request.RR   N(   RU   t   False(   R   (    (    s@   lib/python2.7/site-packages/future/backports/test/ssl_servers.pyt   do_HEADp   s    c         G` s#   t  j r t j |  | |  n  d  S(   N(   R   R   R
   t   log_request(   R   R>   R?   (    (    s@   lib/python2.7/site-packages/future/backports/test/ssl_servers.pyRX   t   s    	(   R   R'   t   __doc__RA   R   RU   RW   RX   (    (    (    s@   lib/python2.7/site-packages/future/backports/test/ssl_servers.pyRD   W   s
   	t   HTTPSServerThreadc           B` s>   e  Z e d d   Z d   Z d d  Z d   Z d   Z RS(   c         C` sV   d  |  _ t | d f | p t |  |  _ |  j j |  _ t j j	 |   t
 |  _ d  S(   Ni    (   R0   t   flagR   R(   R:   R   t   portt	   threadingt   ThreadR   R   t   daemon(   R   R   t   hostR   (    (    s@   lib/python2.7/site-packages/future/backports/test/ssl_servers.pyR   {   s    		c         C` s   d |  j  j |  j f S(   Nu   <%s %s>(   R   R   R:   (   R   (    (    s@   lib/python2.7/site-packages/future/backports/test/ssl_servers.pyR      s    c         C` s   | |  _  t j j |   d  S(   N(   R[   R]   R^   t   start(   R   R[   (    (    s@   lib/python2.7/site-packages/future/backports/test/ssl_servers.pyRa      s    	c         C` sB   |  j  r |  j  j   n  z |  j j d  Wd  |  j j   Xd  S(   Ng©?(   R[   t   setR:   t   serve_forevert   server_close(   R   (    (    s@   lib/python2.7/site-packages/future/backports/test/ssl_servers.pyt   run   s
    	c         C` s   |  j  j   d  S(   N(   R:   t   shutdown(   R   (    (    s@   lib/python2.7/site-packages/future/backports/test/ssl_servers.pyt   stop   s    N(	   R   R'   t   HOSTR0   R   R   Ra   Re   Rg   (    (    (    s@   lib/python2.7/site-packages/future/backports/test/ssl_servers.pyRZ   y   s
   			c         ` st   t  j t  j  } | j |  t | | |    t j   }   j |  | j     f d   } |  j	 |    S(   Nc           ` sP   t  j r t j j d  n    j   t  j rB t j j d  n    j   d  S(   Nu   stopping HTTPS server
u   joining HTTPS thread
(   R   R   R   R9   R!   Rg   R3   (    (   R:   (    s@   lib/python2.7/site-packages/future/backports/test/ssl_servers.pyt   cleanup   s    	
	(
   t   sslt
   SSLContextt   PROTOCOL_SSLv23t   load_cert_chainRZ   R]   t   EventRa   t   waitt
   addCleanup(   t   caset   certfileR`   R   R   R[   Ri   (    (   R:   s@   lib/python2.7/site-packages/future/backports/test/ssl_servers.pyt   make_https_server   s    
u   __main__t   descriptionuE   Run a test HTTPS server. By default, the current directory is served.u   -pu   --portt   typet   defaultiQ  t   helpu(   port to listen on (default: %(default)s)u   -qu   --quiett   destu   verboset   actionu   store_falseu   be less verboseu   -su   --statsu   use_stats_handleru
   store_trueu   always return stats pageu   --curve-nameu
   curve_nameu   storeu&   curve name for EC-based Diffie-Hellmanu   --dhu   dh_fileu!   PEM file containing DH parametersu    u'   Listening on https://localhost:{0.port}gΉ?(G   t
   __future__R    R   R   R   t   future.builtinsR   R   t   futureR   R+   R   Rj   RJ   R   t   future.backports.urllibR   t   urllib_parset   future.backports.http.serverR   R   R	   R
   t   future.backports.testR   t   import_moduleR]   R,   t   dirnamet   __file__RB   Rh   R3   t   CERTFILER   R(   RD   R^   RZ   R0   Rs   R   t   argparset   ArgumentParsert   parsert   add_argumentt   intR   RV   t
   parse_argsR?   R   t   use_stats_handlerR   t   PY2t   getcwduR1   t   getcwdRk   t   PROTOCOL_TLSv1R   Rm   t
   curve_namet   set_ecdh_curvet   dh_filet   load_dh_paramsR\   R:   t   printR>   Rc   (    (    (    s@   lib/python2.7/site-packages/future/backports/test/ssl_servers.pyt   <module>   sh   "	)"								