o
    GXho                     @   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%j0re.1e%j0 e%j2re.3e%j2 e%j4re.5e%j4 ed2e%j6fe(e.Z7e%j&re8d39e% e7:d4 dS 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   :/opt/python-3.10.19/usr/lib/python3.10/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   sZ   z| j  \}}| jj|dd}W ||fS  ty, } ztjr'tj	d|   d }~ww )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 ]}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)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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   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| |   |rA| j| dS 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 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  d S | j  w )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.stopr   )	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)caser   r]   rU   r   rP   r_   r   r^   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?);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   rh   r   argparseArgumentParserparseradd_argumentintrG   
parse_argsr;   r   rq   r   getcwdr/   ra   rb   rc   r   rd   rs   Zset_ecdh_curverv   Zload_dh_paramsru   Zset_ciphersrQ   r7   printr:   rX   r   r   r   r   <module>   s|    )"




