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   s|   	 t j|d }tjt j|}|d}td |}| j	}|D ]}tj
|\}}tj|\}}tj||}q"|S )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
ddZdd Zdd Zd	S )StatsRequestHandlerzStatsHTTPS/1.0Tc                 C   s   	 | j jj}|j}| | | d}t|}|	d}| 
d | dd | dtt| |   |rB| j| d S d S )N)Zsession_cacher8   compressionzutf-8   zContent-typeztext/plain; charset=utf-8zContent-Length)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 )NF)rI   )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"   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   )rO   rQ   rR   start)r   rO   r   r   r   rU      s   zHTTPSServerThread.startc                 C   s:   | j r| j   z| jd W | j  d S | j  w )Ng?)rO   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   rU   rX   rZ   r   r   r   r   rN   x   s    	
rN   )r   certfilerT   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   rZ   r1   r   r7   r   r   cleanup   s   z"make_https_server.<locals>.cleanup)sslcreate_default_contextPurposeCLIENT_AUTHload_cert_chainrN   rQ   EventrU   waitZ
addCleanup)caser   r\   rT   r   rO   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   rQ   urllib.parser&   Zhttp.serverr   r	   r   r   testr   Ztest.supportr   r*   dirname__file__r>   r[   r1   ZCERTFILEr   r#   r@   rR   rN   rg   r   argparseArgumentParserparseradd_argumentintrG   
parse_argsr;   r   rp   r   getcwdr/   r`   ra   rb   r   rc   rr   Zset_ecdh_curveru   Zload_dh_paramsrt   Zset_ciphersrP   r7   printr:   rW   r   r   r   r   <module>   s|    )"




