o
    ,])                     @   s<  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dZe
jeZejZe
j ed	Z!G d
d deZ"G dd deZ#G dd deZ$G dd dej%Z&e!edfddZ'e(dkrd dl)Z)e)j*ddZ+e+j,dde-ddd e+j,ddddd d!d" e+j,d#d$d%d&d'd(d" e+j,d)d*ed+d,d- e+j,d.d/ed+d0d- e+. Z/e/j0e_0e/j1re$Z2ne#Z2e	j3re
4 e2_5ne
6 e2_5e7ej8Z9e9:e! e/j;re9<e/j; e/j=re9>e/j= e"d1e/j?fe2e9Z@e/j0reAd2Be/ e@Cd3 dS dS )4    )absolute_importdivisionprint_functionunicode_literals)filterstr)utilsN)parse)
HTTPServerSimpleHTTPRequestHandlerBaseHTTPRequestHandler)support	threadingzkeycert.pemc                   @   s$   e Zd Zdd Zdd Zdd ZdS )HTTPSServerc                 C   s   t | || || _d S N)_HTTPServer__init__context)selfserver_addresshandler_classr    r   C/usr/lib/python3/dist-packages/future/backports/test/ssl_servers.pyr      s   
zHTTPSServer.__init__c                 C   s   d| j j| j| jf S )Nz
<%s %s:%s>)	__class____name__server_nameserver_portr   r   r   r   __str__   s   zHTTPSServer.__str__c              
   C   s\   z| j  \}}| jj|dd}W ||fS  t jy- } ztjr(tj	d|   d }~ww )NT)server_sidezGot an error:
%s
)
socketacceptr   wrap_socketerrorr   verbosesysstderrwrite)r   sockaddrsslconner   r   r   get_request"   s   zHTTPSServer.get_requestN)r   
__module____qualname__r   r   r,   r   r   r   r   r      s    r   c                   @   s(   e Zd ZdZeZdZdd Zdd ZdS )RootedHTTPRequestHandlerzTestHTTPS/1.0   c                 C   sz   t j|d }tjt j|}|d}td|}| j	}|D ]}tj
|\}}tj|\}}tj||}q!|S )zTranslate 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.)

           /N)urllibr	   urlparseospathnormpathunquotesplitr   root
splitdrivejoin)r   r6   wordsworddriveheadr   r   r   translate_path8   s   	

z'RootedHTTPRequestHandler.translate_pathc              	   G   s>   t jrtjd| jj| jj| j	 | 
 || f  d S d S )Nz server (%s:%d %s):
   [%s] %s
)r   r$   r%   stdoutr'   serverr   r   requestcipherlog_date_time_stringr   formatargsr   r   r   log_messageL   s   
z$RootedHTTPRequestHandler.log_messageN)	r   r-   r.   server_versionherer:   timeoutrA   rJ   r   r   r   r   r/   .   s    r/   c                   @   s.   e Zd ZdZdZdddZdd Zdd	 Zd
S )StatsRequestHandlerzSExample HTTP request handler which returns SSL statistics on GET
    requests.
    zStatsHTTPS/1.0Tc                 C   s   | j jj}|j}| | | d}t|}|	d}| 
d | dd | dtt| |   |rA| j| dS dS )zServe a GET request.)session_cacherE   compressionzutf-8   zContent-typeztext/plain; charset=utf-8zContent-LengthN)rfileraw_sockr   session_statsrE   rP   pprintpformatencodesend_responsesend_headerr   lenend_headerswfiler'   )r   	send_bodyr(   r   statsbodyr   r   r   do_GET^   s   



zStatsRequestHandler.do_GETc                 C   s   | j dd dS )zServe a HEAD request.F)r^   N)ra   r   r   r   r   do_HEADp   s   zStatsRequestHandler.do_HEADc                 G   s"   t jrtj| |g|R   d S d S r   )r   r$   r   log_requestrG   r   r   r   rc   t   s   zStatsRequestHandler.log_requestN)T)r   r-   r.   __doc__rK   ra   rb   rc   r   r   r   r   rN   W   s    
rN   c                   @   s<   e Zd ZedfddZdd ZdddZdd	 Zd
d ZdS )HTTPSServerThreadNc                 C   s<   d | _ t|df|p
t|| _| jj| _tj|  d| _	d S )Nr   T)
flagr   r/   rC   r   portr   Threadr   daemon)r   r   hostr   r   r   r   r   {   s   

zHTTPSServerThread.__init__c                 C   s   d| j j| jf S )Nz<%s %s>)r   r   rC   r   r   r   r   r      s   zHTTPSServerThread.__str__c                 C   s   || _ tj|  d S r   )rf   r   rh   start)r   rf   r   r   r   rk      s   zHTTPSServerThread.startc                 C   s:   | j r| j   z| jd W | j  d S | j  w )Ng?)rf   setrC   serve_foreverserver_closer   r   r   r   run   s
   
zHTTPSServerThread.runc                 C   s   | j   d S r   )rC   shutdownr   r   r   r   stop   s   zHTTPSServerThread.stopr   )	r   r-   r.   HOSTr   r   rk   ro   rq   r   r   r   r   re   y   s    	
re   c                    sV   t t j}|| t||| t } | |   fdd}| 	|  S )Nc                      s8   t jr	tjd    t jrtjd    d S )Nzstopping HTTPS server
zjoining HTTPS thread
)r   r$   r%   rB   r'   rq   r<   r   rC   r   r   cleanup   s   z"make_https_server.<locals>.cleanup)
ssl
SSLContextPROTOCOL_SSLv23load_cert_chainre   r   Eventrk   wait
addCleanup)casecertfilerj   r   r   rf   rt   r   rs   r   make_https_server   s   


r~   __main__zERun a test HTTPS server. By default, the current directory is served.)descriptionz-pz--portiQ  z(port to listen on (default: %(default)s))typedefaulthelpz-qz--quietr$   Tstore_falsezbe less verbose)destr   actionr   z-sz--statsuse_stats_handlerF
store_truezalways return stats pagez--curve-name
curve_namestorez&curve name for EC-based Diffie-Hellman)r   r   r   r   z--dhdh_filez!PEM file containing DH parameters z'Listening on https://localhost:{0.port}g?)D
__future__r   r   r   r   future.builtinsr   r   futurer   r5   r%   ru   rV   r    future.backports.urllibr	   urllib_parsefuture.backports.http.serverr
   r   r   r   future.backports.testr   import_moduler   r6   dirname__file__rL   rr   r<   CERTFILEr   r/   rN   rh   re   r~   r   argparseArgumentParserparseradd_argumentint
parse_argsrI   r$   r   r   PY2getcwdur:   getcwdrv   PROTOCOL_TLSv1r   rx   r   set_ecdh_curver   load_dh_paramsrg   rC   printrH   rm   r   r   r   r   <module>   sx    
)"



