
    z%io                     &   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                   j#                  e      Zej(                  Ze j                   j+                  ed      Z G d de	      Z G d d	e
      Z G d
 de      Z G d dej4                        ZdeedddZedk(  rd dlZ ej>                  d      Z e jC                  dde"dd       e jC                  dddddd       e jC                  dd d!d"d#d$       e jC                  d%d&e#d'd()       e jC                  d*d+e#d,-       e jC                  d.d/e#d'd0)       e jI                         Z%e%jL                  e_&        e%jN                  reZ(neZ( e jR                         e(_*         ejV                  ejX                  jZ                        Z.e.j_                  e       e%j`                  re.jc                  e%j`                         e%jd                  re.jg                  e%jd                         e%jh                  re.jk                  e%jh                          ed1e%jl                  fe(e.      Z7e%jL                  r e8d2js                  e%             e7ju                  d3       yy)4    N)
HTTPServerSimpleHTTPRequestHandlerBaseHTTPRequestHandler)support)socket_helperzkeycert.pemc                       e Zd Zd Zd Zd Zy)HTTPSServerc                 @    t        j                  | ||       || _        y N)_HTTPServer__init__context)selfserver_addresshandler_classr   s       D/home/uftp/.pyenv/versions/3.12.0/lib/python3.12/test/ssl_servers.pyr   zHTTPSServer.__init__   s    T>=A    c                 j    d| j                   j                  d| j                  d| j                  dS )N< :>)	__class____name__server_nameserver_portr   s    r   __str__zHTTPSServer.__str__   s+    ((!!!!# 	$r   c                    	 | j                   j                         \  }}| j                  j                  |d      }||fS # t        $ r8}t
        j                  r"t        j                  j                  d|z          d }~ww xY w)NT)server_sidezGot an error:
%s
)
socketacceptr   wrap_socketOSErrorr   verbosesysstderrwrite)r   sockaddrsslconnes        r   get_requestzHTTPSServer.get_request!   sv    	++-JD$ll..t.FG }  	

  !6!:;		s   :A   	B	3A<<BN)r   
__module____qualname__r   r   r-    r   r   r	   r	      s    $
r   r	   c                   8    e Zd ZdZeZej                  Zd Z	d Z
y)RootedHTTPRequestHandlerzTestHTTPS/1.0c                    	 t         j                  j                  |      d   }t        j                  j                  t         j                  j                  |            }|j                  d      }t        d |      }| j                  }|D ]f  }t        j                  j                  |      \  }}t        j                  j                  |      \  }}t        j                  j                  ||      }h |S )N   /)urllibparseurlparseospathnormpathunquotesplitfilterroot
splitdrivejoin)r   r:   wordsworddriveheads         r   translate_pathz'RootedHTTPRequestHandler.translate_path7   s    	 ||$$T*1-ww 4 4T :;

3tU#yy 	,D'',,T2KE4t,JD$77<<d+D	, r   c           	         t         j                  ryt        j                  j	                  d| j
                  j                  | j
                  j                  | j                  j                         | j                         ||z  fz         y y )Nz server (%s:%d %s):
   [%s] %s
)r   r%   r&   stdoutr(   serverr   r   requestcipherlog_date_time_stringr   formatargss      r   log_messagez$RootedHTTPRequestHandler.log_messageK   sj    ??JJ@"kk88"kk55"ll113"779$Tk	++ , r   N)r   r.   r/   server_versionherer?   r   LOOPBACK_TIMEOUTtimeoutrF   rP   r0   r   r   r2   r2   -   s#    
 %ND&&G(,r   r2   c                   &    e Zd Z	 dZddZd Zd Zy)StatsRequestHandlerzStatsHTTPS/1.0c                    	 | j                   j                  j                  }|j                  }|j	                         |j                         |j                         d}t        j                  |      }|j                  d      }| j                  d       | j                  dd       | j                  dt        t        |                   | j                          |r| j                  j!                  |       y y )N)session_cacherK   compressionzutf-8   zContent-typeztext/plain; charset=utf-8zContent-Length)rfileraw_sockr   session_statsrK   rY   pprintpformatencodesend_responsesend_headerstrlenend_headerswfiler(   )r   	send_bodyr)   r   statsbodys         r   do_GETzStatsRequestHandler.do_GET]   s    "zz~~##,,$224kkm++-
 ~~e${{7#3)DE)3s4y>:JJT" r   c                 *    	 | j                  d       y )NF)rh   )rk   r   s    r   do_HEADzStatsRequestHandler.do_HEADo   s    #e$r   c                 T    t         j                  rt        j                  | |g|  y y r   )r   r%   r   log_requestrM   s      r   ro   zStatsRequestHandler.log_requests   s#    ??"..tVCdC r   N)T)r   r.   r/   rQ   rk   rm   ro   r0   r   r   rV   rV   V   s     &N#$%Dr   rV   c                   2    e Zd ZedfdZd ZddZd Zd Zy)HTTPSServerThreadNc                     d | _         t        |df|xs t        |      | _        | j                  j                  | _        t        j                  j                  |        d| _	        y )Nr   T)
flagr	   r2   rI   r   port	threadingThreadr   daemon)r   r   hostr   s       r   r   zHTTPSServerThread.__init__z   sU    	!4)"/"K3K")+ KK++	!!$'r   c                 P    d| j                   j                  d| j                  dS )Nr   r   r   )r   r   rI   r   s    r   r   zHTTPSServerThread.__str__   s     NN33T[[AAr   c                 P    || _         t        j                  j                  |        y r   )rs   ru   rv   start)r   rs   s     r   r{   zHTTPSServerThread.start   s    	t$r   c                     | j                   r| j                   j                          	 | j                  j                  d       | j                  j	                          y # | j                  j	                          w xY w)Ng?)rs   setrI   serve_foreverserver_closer   s    r   runzHTTPSServerThread.run   sN    99IIMMO	'KK%%d+KK$$&DKK$$&s   A A:c                 8    | j                   j                          y r   )rI   shutdownr   s    r   stopzHTTPSServerThread.stop   s    r   r   )	r   r.   r/   HOSTr   r   r{   r   r   r0   r   r   rq   rq   x   s!    %) B%'r   rq   )r   certfilerx   r   c                8   |-t        j                  t         j                  j                        }|j	                  |       t        |||      t        j                         }j                  |       |j                          fd}| j                  |       S )Nc                     t         j                  rt        j                  j	                  d        j                          t         j                  rt        j                  j	                  d        j                          y )Nzstopping HTTPS server
zjoining HTTPS thread
)r   r%   r&   rH   r(   r   rA   )rI   s   r   cleanupz"make_https_server.<locals>.cleanup   sI    ??JJ67??JJ56r   )sslcreate_default_contextPurposeCLIENT_AUTHload_cert_chainrq   ru   Eventr{   wait
addCleanup)caser   r   rx   r   rs   r   rI   s          @r   make_https_serverr      sw    ,,S[[-D-DEH%wm<F??D
LLIIK 	OOGMr   __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	--cipherscipherszallowed cipher list)r   r   r   z--dhdh_filez!PEM file containing DH parameters z'Listening on https://localhost:{0.port}g?);r9   r&   r   r_   ru   urllib.parser6   http.serverr   r   r   r   testr   test.supportr   r:   dirname__file__rR   r   rA   CERTFILEr	   r2   rV   rv   rq   r   r   argparseArgumentParserparseradd_argumentintrd   
parse_argsrO   r%   r   r   getcwdr?   r   r   r   r   r   r   set_ecdh_curver   load_dh_paramsr   set_ciphersrt   rI   printrN   r~   r0   r   r   <module>r      s   	 
 
   6 6  &	wwx 77<<m,+ 0&,7 &,RD0 DD	(( < (,ht* z$X$$CDF hS$G  I
ii,3D  F
i.A5+2L  N
\&E  G )#2  4
YS@  BDllGO+0&RYY[(c(()@)@AGH%t/||t||,||DLL)"dii-AF||7>>tDE
M r   