B
    18\+                 @   s  d dl 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	m
Z
mZ d dlm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deedd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,d- ejd.d/e!d'd0d) e" Z#e#j$e_$e#j%r|eZ&neZ&e ' e&_(e)ej*j+Z,e,-e e#j.re,/e#j. e#j0re,1e#j0 e#j2re,3e#j2 ed1e#j4fe&e,Z5e#j$re6d27e# e58d3 dS )4    N)
HTTPServerSimpleHTTPRequestHandlerBaseHTTPRequestHandler)supportz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   T/oak/stanford/groups/akundaje/marinovg/programs/Python-3.7.3/Lib/test/ssl_servers.pyr      s    zHTTPSServer.__init__c             C   s   d| j j| j| jf S )Nz
<%s %s:%s>)	__class____name__Zserver_nameserver_port)r
   r   r   r   __str__   s    zHTTPSServer.__str__c          
   C   sf   y"| j  \}}| jj|dd}W n: tk
r\ } ztjrJtj	d|   W d d }~X Y nX ||fS )NT)Zserver_sidezGot an error:
%s
)
socketacceptr	   Zwrap_socketOSErrorr   verbosesysstderrwrite)r
   sockaddrZ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   s~   t j|d }tjt j|}|d}td|}| j	}x:|D ]2}tj
|\}}tj|\}}tj||}qDW |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)urllibparseurlparseospathnormpathunquotesplitfilterroot
splitdrivejoin)r
   r(   wordsworddriveheadr   r   r   translate_path6   s    	


z'RootedHTTPRequestHandler.translate_pathc          	   G   s:   t jr6tjd| jj| jj| j	 | 
 || f  d S )Nz server (%s:%d %s):
   [%s] %s
)r   r   r   stdoutr   serverr   r   requestcipherZlog_date_time_string)r
   formatargsr   r   r   log_messageJ   s    z$RootedHTTPRequestHandler.log_messageN)	r   r   r   server_versionherer-   timeoutr4   r;   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| |   |r~| j| dS )zServe a GET request.)Zsession_cacher8   compressionzutf-8   zContent-typeztext/plain; charset=utf-8zContent-LengthN)Zrfileraw_sockr	   Zsession_statsr8   r@   pprintpformatencodeZsend_responseZsend_headerstrlenZend_headersZwfiler   )r
   	send_bodyr   r	   Zstatsbodyr   r   r   do_GET\   s    



zStatsRequestHandler.do_GETc             C   s   | j dd dS )zServe a HEAD request.F)rI   N)rK   )r
   r   r   r   do_HEADn   s    zStatsRequestHandler.do_HEADc             G   s   t jrtj| |f|  d S )N)r   r   r   log_request)r
   r9   r:   r   r   r   rM   r   s    zStatsRequestHandler.log_requestN)T)r   r   r   __doc__r<   rK   rL   rM   r   r   r   r   r?   U   s
   
r?   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    r6   r   port	threadingThreadr   daemon)r
   r	   hostr   r   r   r   r   y   s    
zHTTPSServerThread.__init__c             C   s   d| j j| jf S )Nz<%s %s>)r   r   r6   )r
   r   r   r   r      s    zHTTPSServerThread.__str__c             C   s   || _ tj|  d S )N)rP   rR   rS   start)r
   rP   r   r   r   rV      s    zHTTPSServerThread.startc             C   s2   | j r| j   z| jd W d | j  X d S )Ng?)rP   setr6   serve_foreverZserver_close)r
   r   r   r   run   s
    
zHTTPSServerThread.runc             C   s   | j   d S )N)r6   shutdown)r
   r   r   r   stop   s    zHTTPSServerThread.stop)N)	r   r   r   HOSTr   r   rV   rY   r[   r   r   r   r   rO   w   s
   	
rO   )r	   certfilerU   r   c               s`   |d krt t j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   r5   r   r[   r/   r   )r6   r   r   cleanup   s    z"make_https_server.<locals>.cleanup)sslcreate_default_contextPurposeCLIENT_AUTHload_cert_chainrO   rR   EventrV   wait
addCleanup)caser	   r]   rU   r   rP   r^   r   )r6   r   make_https_server   s    


rh   __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)destrl   actionrm   z-sz--statsuse_stats_handlerF
store_truezalways return stats pagez--curve-name
curve_namestorez&curve name for EC-based Diffie-Hellman)ro   rk   rp   rm   z	--cipherscipherszallowed cipher list)ro   rk   rm   z--dhdh_filez!PEM file containing DH parameters z'Listening on https://localhost:{0.port}g?)9r'   r   r_   rD   rR   urllib.parser$   Zhttp.serverr   r   r   r   testr   r(   dirname__file__r=   r\   r/   ZCERTFILEr   r    r?   rS   rO   rh   r   argparseArgumentParserparseradd_argumentintrG   
parse_argsr:   r   rq   r   getcwdr-   r`   ra   rb   r	   rc   rs   Zset_ecdh_curverv   Zload_dh_paramsru   Zset_ciphersrQ   r6   printr9   rX   r   r   r   r   <module>   sf   )"






