ÿØÿà JFIF      ÿÛ „ 	 ( %!1!%)+//.383,7(-.+



-%%-////---/-.+/--+------/------/--0+--/-/-----.-----ÿÀ  ¥2" ÿÄ               ÿÄ J  	     ! 1AQ"aq2‘#BR‚¡ÁÑ3br’¢±Âð$CSƒ²á4c“%DsÓñÿÄ              ÿÄ *        !1AQa‘"2q3±ð#b¡ÿÚ   ? ¼QxJQaÍuò¸Zö Úü8,ÐÚú
"SSn<rçù–´âE—^ªBÖ9À\†¸ÔÁT­ÃÛ5
ëd´³Í#Ý;Þ38œî ¶H£M:wÎ3…³…âpÔF&‚FK¸9„â4àGEõªfÿ ‘ñ(ßw­pŽF|È¥ù®häðÍÑ¶¹‘[ÒinÙW¶ùñY˜Q{›K"išÒ[Ú8žë\F¹@-?v"ÔU”,ìöžkÿ {I‡£šÍ?e
ríV
..............................................................................................................................................................................
.............................................................................                                                  
                                                                                                                                                                                     ÿØÿà JFIF      ÿÛ „ 	 ( %!1!%)+//.383,7(-.+



-%%-////---/-.+/--+------/------/--0+--/-/-----.-----ÿÀ  ¥2" ÿÄ               ÿÄ J  	     ! 1AQ"aq2‘#BR‚¡ÁÑ3br’¢±Âð$CSƒ²á4c“%DsÓñÿÄ              ÿÄ *        !1AQa‘"2q3±ð#b¡ÿÚ   ? ¼QxJQaÍuò¸Zö Úü8,ÐÚú
"SSn<rçù–´âE—^ªBÖ9À\†¸ÔÁT­ÃÛ5
ëd´³Í#Ý;Þ38œî ¶H£M:wÎ3…³…âpÔF&‚FK¸9„â4àGEõªfÿ ‘ñ(ßw­pŽF|È¥ù®häðÍÑ¶¹‘[ÒinÙW¶ùñY˜Q{›K"išÒ[Ú8žë\F¹@-?v"ÔU”,ìöžkÿ {I‡£šÍ?e
ríV
..............................................................................................................................................................................
.............................................................................                                                  
                                                                                                                                                                                     U
    e5d                     @   s  d Z dddddgZ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
Z
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ZddlZddlZddlZddlZddlmZ dd	lmZ d
ZdZG dd dejZG dd dejeZG dd dej Z!G dd de!Z"dd Z#da$dd Z%dd Z&G dd de"Z'dd Z(e!edddfddZ)e*dkrddl+Z+e+, Z-e-j.ddd d! e-j.d"d#d$d%d& e-j.d'd(e/ d)d* e-j.d+d,de0d-d.d/ e-1 Z2e2j3re'Z4nee"e2j5d0Z4G d1d2 d2eZ6e)e4e6e2j7e2j8d3 dS )4z0.6
HTTPServerThreadingHTTPServerBaseHTTPRequestHandlerSimpleHTTPRequestHandlerCGIHTTPRequestHandler    N)partial)
HTTPStatusa  <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
        "http://www.w3.org/TR/html4/strict.dtd">
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html;charset=utf-8">
        <title>Error response</title>
    </head>
    <body>
        <h1>Error response</h1>
        <p>Error code: %(code)d</p>
        <p>Message: %(message)s.</p>
        <p>Error code explanation: %(code)s - %(explain)s.</p>
    </body>
</html>
ztext/html;charset=utf-8c                   @   s   e Zd ZdZdd ZdS )r      c                 C   s4   t j|  | jd d \}}t|| _|| _d S )N   )socketserver	TCPServerserver_bindZserver_addresssocketZgetfqdnserver_nameserver_port)selfhostport r   #/usr/lib64/python3.8/http/server.pyr      s    zHTTPServer.server_bindN)__name__
__module____qualname__Zallow_reuse_addressr   r   r   r   r   r      s   c                   @   s   e Zd ZdZdS )r   TN)r   r   r   Zdaemon_threadsr   r   r   r   r      s   c                   @   sF  e Zd Zdej d  Zde Ze	Z
eZdZdd Zdd Zd	d
 Zdd ZdEddZdFddZdGddZdd Zdd Zdd ZdHddZdd Zedd  eed!ed"d#D Zd$ee d%< d&d' Z!d(d) Z"dId*d+Z#d,d- Z$d.d/d0d1d2d3d4gZ%dd5d6d7d8d9d:d;d<d=d>d?d@gZ&dAdB Z'dCZ(e)j*j+Z,dDd  e-j./ D Z0dS )Jr   zPython/r   z	BaseHTTP/HTTP/0.9c              
   C   s  d | _ | j | _}d| _t| jd}|d}|| _| }t	|dkrLdS t	|dkr&|d }zT|
dsrt|d	d
d
 }|d}t	|dkrtt|d t|d
 f}W n, ttfk
r   | tjd|  Y dS X |dkr | jdkr d| _|dkr | tjd|  dS || _dt	|  krBdksZn | tjd|  dS |d d \}}t	|dkrd| _|dkr| tjd|  dS || | _ | _| j
drd	| jd	 | _ztjj| j| jd| _W n tjjk
r( } z| tjdt| W Y dS d }~X Y nB tjjk
rh } z| tjdt| W Y dS d }~X Y nX | jdd}	|	 dkrd| _n |	 dkr| jdkrd| _| jdd}
|
 dkr| jdkr| jdkr|   sdS dS )NTz
iso-8859-1z
r   F   zHTTP//r	   .r
   zBad request version (%r))r	   r	   zHTTP/1.1)r
   r   zInvalid HTTP version (%s)zBad request syntax (%r)ZGETzBad HTTP/0.9 request type (%r)z//)Z_classzLine too longzToo many headers
Connection close
keep-aliveZExpectz100-continue)!commanddefault_request_versionrequest_versionclose_connectionstrraw_requestlinerstriprequestlinesplitlen
startswith
ValueErrorint
IndexError
send_errorr   ZBAD_REQUESTprotocol_versionZHTTP_VERSION_NOT_SUPPORTEDpathlstriphttpclientZparse_headersrfileMessageClassheadersZLineTooLongZREQUEST_HEADER_FIELDS_TOO_LARGEZHTTPExceptiongetlowerhandle_expect_100)r   versionr)   wordsZbase_version_numberZversion_numberr"   r2   errZconntypeZexpectr   r   r   parse_request  s    






z$BaseHTTPRequestHandler.parse_requestc                 C   s   |  tj |   dS NT)send_response_onlyr   ZCONTINUEend_headersr   r   r   r   r;   x  s    z(BaseHTTPRequestHandler.handle_expect_100c              
   C   s   z| j d| _t| jdkrBd| _d| _d| _| tj	 W d S | jsTd| _
W d S |  sbW d S d| j }t| |s| tjd| j  W d S t| |}|  | j  W n< tjk
r } z| d| d| _
W Y d S d }~X Y nX d S )Ni  i   r   TZdo_zUnsupported method (%r)zRequest timed out: %r)r6   readliner'   r+   r)   r$   r"   r0   r   ZREQUEST_URI_TOO_LONGr%   r?   hasattrNOT_IMPLEMENTEDgetattrwfileflushr   Ztimeout	log_error)r   Zmnamemethoder   r   r   handle_one_request  s6    


z)BaseHTTPRequestHandler.handle_one_requestc                 C   s"   d| _ |   | j s|   qd S r@   )r%   rM   rC   r   r   r   handle  s    zBaseHTTPRequestHandler.handleNc                 C   s  z| j | \}}W n tk
r.   d\}}Y nX |d kr<|}|d krH|}| d|| | || | dd d }|dkr|tjtjtjfkr| j	|t
j|ddt
j|ddd }|d	d
}| d| j | dtt| |   | jdkr|r| j| d S )N)???rO   zcode %d, message %sr   r       Fquote)codemessageexplainzUTF-8replacezContent-TypeContent-LengthZHEAD)	responsesKeyErrorrJ   send_responsesend_headerr   Z
NO_CONTENTZRESET_CONTENTNOT_MODIFIEDerror_message_formathtmlescapeencodeerror_content_typer&   r+   rB   r"   rH   write)r   rS   rT   rU   ZshortmsgZlongmsgZbodyZcontentr   r   r   r0     s:    z!BaseHTTPRequestHandler.send_errorc                 C   s:   |  | | || | d|   | d|   d S )NZServerZDate)log_requestrA   r[   version_stringdate_time_stringr   rS   rT   r   r   r   rZ     s    
z$BaseHTTPRequestHandler.send_responsec                 C   sd   | j dkr`|d kr0|| jkr,| j| d }nd}t| ds@g | _| jd| j||f dd d S )Nr   r   r   _headers_bufferz
%s %d %s
latin-1strict)r$   rX   rE   rg   appendr1   r`   rf   r   r   r   rA     s    



 z)BaseHTTPRequestHandler.send_response_onlyc                 C   sl   | j dkr6t| dsg | _| jd||f dd | dkrh| dkrVd| _n| d	krhd
| _d S )Nr   rg   z%s: %s
rh   ri   Z
connectionr    Tr!   F)r$   rE   rg   rj   r`   r:   r%   )r   keywordvaluer   r   r   r[     s    

z"BaseHTTPRequestHandler.send_headerc                 C   s"   | j dkr| jd |   d S )Nr   s   
)r$   rg   rj   flush_headersrC   r   r   r   rB     s    
z"BaseHTTPRequestHandler.end_headersc                 C   s(   t | dr$| jd| j g | _d S )Nrg       )rE   rH   rb   joinrg   rC   r   r   r   rm     s    
z$BaseHTTPRequestHandler.flush_headers-c                 C   s.   t |tr|j}| d| jt|t| d S )Nz
"%s" %s %s)
isinstancer   rl   log_messager)   r&   )r   rS   sizer   r   r   rc      s    
  z"BaseHTTPRequestHandler.log_requestc                 G   s   | j |f|  d S N)rr   )r   formatargsr   r   r   rJ   +  s    z BaseHTTPRequestHandler.log_errorc                 C   s   i | ]}|d |dqS )z\xZ02xr   ).0cr   r   r   
<dictcomp>;  s      z!BaseHTTPRequestHandler.<dictcomp>          z\\\c                 G   s2   || }t jd|  |  || jf  d S )Nz%s - - [%s] %s
)sysstderrrb   address_stringlog_date_time_string	translate_control_char_table)r   ru   rv   rT   r   r   r   rr   >  s    
z"BaseHTTPRequestHandler.log_messagec                 C   s   | j d | j S )N )server_versionsys_versionrC   r   r   r   rd   X  s    z%BaseHTTPRequestHandler.version_stringc                 C   s    |d krt   }tjj|ddS )NT)Zusegmt)timeemailutilsZ
formatdate)r   Z	timestampr   r   r   re   \  s    z'BaseHTTPRequestHandler.date_time_stringc              	   C   sB   t   }t |\	}}}}}}}}	}
d|| j| ||||f }|S )Nz%02d/%3s/%04d %02d:%02d:%02d)r   	localtime	monthname)r   ZnowZyearZmonthZdayZhhZmmZssxyzsr   r   r   r   b  s         z+BaseHTTPRequestHandler.log_date_time_stringZMonZTueZWedZThuZFriZSatZSunZJanZFebZMarZAprZMayZJunZJulZAugZSepZOctZNovZDecc                 C   s
   | j d S Nr   )client_addressrC   r   r   r   r   p  s    z%BaseHTTPRequestHandler.address_stringHTTP/1.0c                 C   s   i | ]}||j |jfqS r   )phraseZdescription)rw   vr   r   r   ry     s    )NN)N)N)rp   rp   )N)1r   r   r   r~   r<   r*   r   __version__r   DEFAULT_ERROR_MESSAGEr]   DEFAULT_ERROR_CONTENT_TYPEra   r#   r?   r;   rM   rN   r0   rZ   rA   r[   rB   rm   rc   rJ   r&   	maketrans	itertoolschainranger   ordrr   rd   re   r   Zweekdaynamer   r   r1   r4   r5   ZHTTPMessager7   r   __members__valuesrX   r   r   r   r   r      s\   ij%
5



          	c                       s   e Zd Zde Zdd fdd
Zdd Zdd	 Zd
d Zdd Z	dd Z
dd Zdd Zejshe  ej Zeddddd   ZS )r   zSimpleHTTP/N	directoryc                   s(   |d krt  }|| _t j|| d S rt   )osgetcwdr   super__init__)r   r   rv   kwargs	__class__r   r   r     s    z!SimpleHTTPRequestHandler.__init__c                 C   s.   |   }|r*z| || j W 5 |  X d S rt   )	send_headr    copyfilerH   r   fr   r   r   do_GET  s
    zSimpleHTTPRequestHandler.do_GETc                 C   s   |   }|r|  d S rt   )r   r    r   r   r   r   do_HEAD  s    z SimpleHTTPRequestHandler.do_HEADc                 C   s^  |  | j}d }tj|rtj| j}|jds| t	j
 |d |d |d d |d |d f}tj|}| d| |   d S dD ]&}tj||}tj|r|} qq| |S | |}|dr| t	jd	 d S zt|d
}W n& tk
r   | t	jd	 Y d S X z"t| }d| jkrd| jkrztj| jd }	W n ttttfk
r|   Y nzX |	j d kr|	j!t"j#j$d}	|	j t"j#j$krt"j"%|j&t"j#j$}
|
j!dd}
|
|	kr| t	j' |   |(  W d S | t	j) | d| | dt*|d  | d| +|j& |   |W S    |(   Y nX d S )Nr   r   r	   r
   r      ZLocation)z
index.htmlz	index.htmzFile not foundrbzIf-Modified-SincezIf-None-Match)tzinfo)ZmicrosecondContent-typerW      zLast-Modified),translate_pathr2   r   isdirurllibparseZurlsplitendswithrZ   r   ZMOVED_PERMANENTLYZ
urlunsplitr[   rB   ro   existslist_directory
guess_typer0   	NOT_FOUNDopenOSErrorfstatfilenor8   r   r   Zparsedate_to_datetime	TypeErrorr/   OverflowErrorr-   r   rV   datetimetimezoneZutcZfromtimestampst_mtimer\   r    OKr&   re   )r   r2   r   partsZ	new_partsZnew_urlindexZctypeZfsZimsZ
last_modifr   r   r   r     s     


 

z"SimpleHTTPRequestHandler.send_headc              	   C   s  zt |}W n$ tk
r2   | tjd Y d S X |jdd d g }ztjj	| j
dd}W n" tk
r   tj	| j
}Y nX tj|dd}t }d	| }|d
 |d |d|  |d|  |d|  |d |D ]v}t j
||}| }	}
t j
|r$|d }	|d }
t j
|r:|d }	|dtjj|
ddtj|	ddf  q|d d||d}t }|| |d | tj | dd|  | dtt| |   |S )NzNo permission to list directoryc                 S   s   |   S rt   )r:   )ar   r   r   <lambda>  rn   z9SimpleHTTPRequestHandler.list_directory.<locals>.<lambda>)keysurrogatepasserrorsFrQ   zDirectory listing for %szZ<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">z<html>
<head>z@<meta http-equiv="Content-Type" content="text/html; charset=%s">z<title>%s</title>
</head>z<body>
<h1>%s</h1>z	<hr>
<ul>r   @z<li><a href="%s">%s</a></li>z</ul>
<hr>
</body>
</html>

surrogateescaper   r   ztext/html; charset=%srW   ) r   listdirr   r0   r   r   sortr   r   unquoter2   UnicodeDecodeErrorr^   r_   r~   getfilesystemencodingrj   ro   r   islinkrR   r`   ioBytesIOrb   seekrZ   r   r[   r&   r+   rB   )r   r2   listrZdisplaypathenctitlenamefullnameZdisplaynameZlinknameZencodedr   r   r   r   r      sh    







z'SimpleHTTPRequestHandler.list_directoryc                 C   s   | ddd }| ddd }| d}ztjj|dd}W n  tk
rb   tj|}Y nX t|}| d}t	d |}| j
}|D ]0}tj|s|tjtjfkrqtj||}q|r|d7 }|S )N?r	   r   #r   r   r   )r*   r(   r   r   r   r   r   	posixpathnormpathfilterr   r   r2   dirnamecurdirpardirro   )r   r2   Ztrailing_slashr=   Zwordr   r   r   r   :  s$    	


z'SimpleHTTPRequestHandler.translate_pathc                 C   s   t || d S rt   )shutilZcopyfileobj)r   sourceZ
outputfiler   r   r   r   X  s    z!SimpleHTTPRequestHandler.copyfilec                 C   sL   t |\}}|| jkr"| j| S | }|| jkr>| j| S | jd S d S )Nr   )r   splitextextensions_mapr:   )r   r2   baseZextr   r   r   r   h  s    



z#SimpleHTTPRequestHandler.guess_typezapplication/octet-streamz
text/plain)r   .pyz.cz.h)r   r   r   r   r   r   r   r   r   r   r   r   r   	mimetypesZinitedZinitZ	types_mapcopyr   update__classcell__r   r   r   r   r     s$   	W:
c           	      C   s   |  d\} }}tj| } | d}g }|d d D ],}|dkrL|  q6|r6|dkr6|| q6|r| }|r|dkr|  d}q|dkrd}nd}|rd||f}dd| |f}d|}|S )Nr   r   r   z..r   r   )	partitionr   r   r   r*   poprj   ro   )	r2   _query
path_partsZ
head_partspartZ	tail_partZ	splitpathcollapsed_pathr   r   r   _url_collapse_path  s.    


r   c                  C   sr   t rt S zdd l} W n tk
r*   Y dS X z| dd a W n. tk
rl   dtdd |  D  a Y nX t S )Nr   r   nobodyr
   r	   c                 s   s   | ]}|d  V  qdS )r
   Nr   )rw   r   r   r   r   	<genexpr>  s     znobody_uid.<locals>.<genexpr>)r   pwdImportErrorgetpwnamrY   maxZgetpwall)r   r   r   r   
nobody_uid  s     r   c                 C   s   t | t jS rt   )r   accessX_OK)r2   r   r   r   
executable  s    r  c                   @   sR   e Zd ZeedZdZdd Zdd Zdd Z	d	d
gZ
dd Zdd Zdd ZdS )r   forkr   c                 C   s$   |   r|   n| tjd d S )NzCan only POST to CGI scripts)is_cgirun_cgir0   r   rF   rC   r   r   r   do_POST  s    
zCGIHTTPRequestHandler.do_POSTc                 C   s   |   r|  S t| S d S rt   )r  r  r   r   rC   r   r   r   r     s    zCGIHTTPRequestHandler.send_headc                 C   sP   t | j}|dd}|d | ||d d   }}|| jkrL||f| _dS dS )Nr   r	   TF)r   r2   findcgi_directoriescgi_info)r   r   Zdir_sepheadtailr   r   r   r    s    


zCGIHTTPRequestHandler.is_cgiz/cgi-binz/htbinc                 C   s   t |S rt   )r  )r   r2   r   r   r   is_executable  s    z#CGIHTTPRequestHandler.is_executablec                 C   s   t j|\}}| dkS )N)r   z.pyw)r   r2   r   r:   )r   r2   r  r  r   r   r   	is_python  s    zCGIHTTPRequestHandler.is_pythonc           )   	   C   s  | j \}}|d | }|dt|d }|dkr|d | }||d d  }| |}tj|r|| }}|dt|d }q*qq*|d\}}}	|d}|dkr|d | ||d   }
}n
|d }
}|d |
 }| |}tj|s
| 	t
jd|  d S tj|s.| 	t
jd|  d S | |}| jsF|sh| |sh| 	t
jd|  d S ttj}|  |d	< | jj|d
< d|d< | j|d< t| jj|d< | j|d< tj|}||d< | ||d< ||d< |	r|	|d< | jd |d< | j d}|r|! }t|dkrdd l"}dd l#}|d |d< |d $ dkrz"|d %d}|&|'d}W n |j(t)fk
r   Y n&X |!d}t|dkr|d |d< | j dd kr| j* |d< n| jd |d< | j d}|r||d< | j d }|r||d!< g }| j+d"D ]>}|d d d#krR|,|-  n||d$d  !d% }q,d%.||d&< | j d'}|r||d(< t/d | j0d)g }d*.|}|r||d+< d,D ]}|1|d q| 2t
j3d- | 4  |	5d.d/}| jr|
g}d0|kr|,| t6 }| j78  t9 }|dkrt:|d\}}t;;| j<gg g dd r~| j<=dsNq~qN|r| >d1| d S z\zt?| W n t@k
r   Y nX tA| j<B d tA| j7B d tC||| W n(   | jD| jE| j tFd2 Y nX ndd lG} |g}!| |rrtHjI}"|"$ Jd3rf|"d d4 |"d5d   }"|"d6g|! }!d0|	kr|!,|	 | Kd7| L|! ztM|}#W n tNtOfk
r   d}#Y nX | jP|!| jQ| jQ| jQ|d8}$| j$ d9kr|#dkr| j<=|#}%nd }%t;;| j<jRgg g dd r>| j<jRSds
q>q
|$T|%\}&}'| j7U|& |'rj| >d:|' |$jVW  |$jXW  |$jY}(|(r| >d1|( n
| Kd; d S )<Nr   r	   r   r   r   zNo such CGI script (%r)z#CGI script is not a plain file (%r)z!CGI script is not executable (%r)ZSERVER_SOFTWAREZSERVER_NAMEzCGI/1.1ZGATEWAY_INTERFACEZSERVER_PROTOCOLZSERVER_PORTZREQUEST_METHODZ	PATH_INFOZPATH_TRANSLATEDZSCRIPT_NAMEQUERY_STRINGZREMOTE_ADDRauthorizationr
   Z	AUTH_TYPEZbasicascii:ZREMOTE_USERzcontent-typeZCONTENT_TYPEzcontent-lengthCONTENT_LENGTHrefererHTTP_REFERERacceptz	
    ,ZHTTP_ACCEPTz
user-agentHTTP_USER_AGENTZcookiez, HTTP_COOKIE)r  ZREMOTE_HOSTr  r  r  r  zScript output follows+r   =zCGI script exit status %#xr{   zw.exez-uzcommand: %s)stdinstdoutr   envZpostz%szCGI script exited OK)Zr
  r  r+   r   r   r2   r   r   r   r0   r   r   isfileZ	FORBIDDENr  	have_forkr  r   Zdeepcopyenvironrd   Zserverr   r1   r&   r   r"   r   r   r   r   r8   r9   r*   base64binasciir:   r`   ZdecodebytesdecodeErrorUnicodeErrorZget_content_typeZgetallmatchingheadersrj   stripro   r   Zget_all
setdefaultrZ   r   rm   rV   r   rH   rI   r  waitpidselectr6   readrJ   setuidr   dup2r   execveZhandle_errorZrequest_exit
subprocessr~   r  r   rr   Zlist2cmdliner.   r   r-   PopenPIPEZ_sockZrecvZcommunicaterb   r   r    r   
returncode))r   dirrestr2   iZnextdirZnextrestZ	scriptdirr   r   ZscriptZ
scriptnameZ
scriptfileZispyr!  Zuqrestr  r%  r&  Zlengthr  r  lineZuacoZ
cookie_strkZdecoded_queryrv   r   pidstsr3  ZcmdlineZinterpnbytespdatar   r   Zstatusr   r   r   r    s<   




















zCGIHTTPRequestHandler.run_cgiN)r   r   r   rE   r   r#  Zrbufsizer  r   r  r	  r  r  r  r   r   r   r   r     s   
c                  G   s4   t j| t jt jd}tt|\}}}}}||fS )N)typeflags)r   ZgetaddrinfoZSOCK_STREAMZ
AI_PASSIVEnextiter)ZaddressZinfosZfamilyrB  protoZ	canonnameZsockaddrr   r   r   _get_best_family  s    rG  r   i@  c           	      C   s   t ||\|_}|| _||| }|j d d \}}d|krLd| dn|}td| d| d| d| d	 z|  W n& tk
r   td	 t	d
 Y nX W 5 Q R X d S )Nr
   r  []zServing HTTP on z port z	 (http://z/) ...z&
Keyboard interrupt received, exiting.r   )
rG  Zaddress_familyr1   r   ZgetsocknameprintZserve_foreverKeyboardInterruptr~   exit)	HandlerClassServerClassZprotocolr   bindZaddrZhttpdr   Zurl_hostr   r   r   test  s    rP  __main__z--cgi
store_truezRun as CGI Server)actionhelpz--bindz-bZADDRESSz8Specify alternate bind address [default: all interfaces])metavarrT  z--directoryz-dz9Specify alternative directory [default:current directory])defaultrT  r   Zstorer   z&Specify alternate port [default: 8000])rS  rV  rB  nargsrT  r   c                       s   e Zd Z fddZ  ZS )DualStackServerc              	      s4   t t | jtjtjd W 5 Q R X t  S r   )	
contextlibsuppress	Exceptionr   Z
setsockoptZIPPROTO_IPV6ZIPV6_V6ONLYr   r   rC   r   r   r   r     s      zDualStackServer.server_bind)r   r   r   r   r   r   r   r   r   rX    s   rX  )rM  rN  r   rO  )9r   __all__r   r   Zemail.utilsr   r^   Zhttp.clientr4   r   r   r   r   r   r-  r   r   r   r~   r   Zurllib.parser   rY  	functoolsr   r   r   r   r   r   ZThreadingMixInr   ZStreamRequestHandlerr   r   r   r   r   r  r   rG  rP  r   argparseArgumentParserparseradd_argumentr   r.   
parse_argsrv   ZcgiZhandler_classr   rX  r   rO  r   r   r   r   <module>S   s         s  
0  
  


 