a
    zeo                     @   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 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/d0e#d(d1d* e $ Z%e%j&e_&e%j'reZ(neZ(e ) e(_*e+ej,j-Z.e./e e%j0re.1e%j0 e%j2re.3e%j2 e%j4re.5e%j4 ed2e%j6fe(e.Z7e%j&re8d39e% e7:d4 dS )5    N)
HTTPServerSimpleHTTPRequestHandlerBaseHTTPRequestHandler)support)socket_helperz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   &/usr/lib/python3.9/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   sh   z"| j  \}}| jj|dd}W n< ty^ } z$tjrHtj	d|   W Y d }~n
d }~0 0 ||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ejZdd Z	dd Z
dS )RootedHTTPRequestHandlerzTestHTTPS/1.0c                 C   sz   t j|d }tjt j|}|d}td|}| j	}|D ]2}tj
|\}}tj|\}}tj||}qB|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*   wordsZworddriveheadr   r   r   translate_path7   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   ZrequestcipherZlog_date_time_stringr   formatargsr   r   r   log_messageK   s    z$RootedHTTPRequestHandler.log_messageN)r   r!   r"   server_versionherer/   r   ZLOOPBACK_TIMEOUTtimeoutr5   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   rA   pprintZ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_HEADo   s    zStatsRequestHandler.do_HEADc                 G   s   t jrtj| |g|R   d S r   )r   r   r   log_requestr9   r   r   r   rM   s   s    zStatsRequestHandler.log_requestN)T)r   r!   r"   __doc__r=   rK   rL   rM   r   r   r   r   r@   V   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#   r7   r   port	threadingThreadr
   daemon)r   r   hostr   r   r   r   r
   z   s    
zHTTPSServerThread.__init__c                 C   s   d| j j| jf S )Nz<%s %s>)r   r   r7   r   r   r   r   r      s    zHTTPSServerThread.__str__c                 C   s   || _ tj|  d S r   )rP   rR   rS   start)r   rP   r   r   r   rV      s    zHTTPSServerThread.startc                 C   s<   | j r| j   z| jd W | j  n| j  0 d S )Ng?)rP   setr7   serve_foreverZserver_closer   r   r   r   run   s
    
zHTTPSServerThread.runc                 C   s   | j   d S r   )r7   shutdownr   r   r   r   stop   s    zHTTPSServerThread.stop)N)	r   r!   r"   HOSTr
   r   rV   rY   r[   r   r   r   r   rO   x   s
   	
rO   )r   certfilerU   r   c                   s`   |d u 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   r6   r   r[   r1   r   r7   r   r   cleanup   s    z"make_https_server.<locals>.cleanup)sslcreate_default_contextPurposeCLIENT_AUTHload_cert_chainrO   rR   EventrV   waitZ
addCleanup)Zcaser   r]   rU   r   rP   r_   r   r^   r   make_https_server   s    


rg   __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)destrk   actionrl   z-sz--statsuse_stats_handlerF
store_truezalways return stats pagez--curve-name
curve_namestorez&curve name for EC-based Diffie-Hellman)rn   rj   ro   rl   z	--cipherscipherszallowed cipher list)rn   rj   rl   z--dhdh_filez!PEM file containing DH parameters z'Listening on https://localhost:{0.port}g?);r)   r   r`   rE   rR   urllib.parser&   Zhttp.serverr   r	   r   r   testr   Ztest.supportr   r*   dirname__file__r>   r\   r1   ZCERTFILEr   r#   r@   rS   rO   rg   r   argparseArgumentParserparseradd_argumentintrG   
parse_argsr;   r   rp   r   getcwdr/   ra   rb   rc   r   rd   rr   Zset_ecdh_curveru   Zload_dh_paramsrt   Zset_ciphersrQ   r7   printr:   rX   r   r   r   r   <module>   sx   )"




