3
‡Œði)  ã               @   s>  d dl mZmZmZmZ d dlmZmZ d dlm	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mZmZ d dlmZ ejdƒZe
jjeƒZejZe
j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&e!edf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+d0d-� e+j.ƒ Z/e/j0e_0e/j1�r¨e$Z2n"e#Z2e	j3�rÀe
j4ƒ e2_5n
e
j6ƒ e2_5ej7ej8ƒZ9e9j:e!ƒ e/j;�rôe9j<e/j;ƒ e/j=�re9j>e/j=ƒ e"d1e/j?fe2e9ƒZ@e/j0�r0eAd2jBe/ƒƒ e@jCd3ƒ dS )4é    )Úabsolute_importÚdivisionÚprint_functionÚunicode_literals)ÚfilterÚstr)ÚutilsN)Úparse)Ú
HTTPServerÚSimpleHTTPRequestHandlerÚBaseHTTPRequestHandler)ÚsupportÚ	threadingzkeycert.pemc               @   s$   e Zd Zdd„ Zdd„ Zdd„ ZdS )ÚHTTPSServerc             C   s   t j| ||ƒ || _d S )N)Ú_HTTPServerÚ__init__Úcontext)ÚselfÚserver_addressÚhandler_classr   © r   úC/tmp/pip-build-6m2fasei/future/future/backports/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   y"| j jƒ \}}| jj|dd�}W n< t jk
r^ } ztjrLtjj	d| ƒ ‚ W Y d d }~X nX ||fS )NT)Úserver_sidezGot an error:
%s
)
ÚsocketÚacceptr   Úwrap_socketÚerrorr   Ú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dZdd„ Zdd„ ZdS )ÚRootedHTTPRequestHandlerzTestHTTPS/1.0é   c             C   s~   t jj|ƒd }tjjt jj|ƒƒ}|jdƒ}td|ƒ}| j	}x:|D ]2}tjj
|ƒ\}}tjj|ƒ\}}tjj||ƒ}qDW |S )zñTranslate 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)Úurllibr	   ÚurlparseÚosÚpathÚnormpathÚunquoteÚsplitr   ÚrootÚ
splitdriveÚjoin)r   r2   ÚwordsÚwordÚdriveÚheadr   r   r   Útranslate_path8   s    	


z'RootedHTTPRequestHandler.translate_pathc             G   s:   t jr6tjjd| jj| jj| jj	ƒ | j
ƒ || f ƒ d S )Nz server (%s:%d %s):
   [%s] %s
)r   r!   r"   Ústdoutr$   Úserverr   r   ÚrequestÚcipherZlog_date_time_string)r   ÚformatÚargsr   r   r   Úlog_messageL   s    z$RootedHTTPRequestHandler.log_messageN)	r   r)   r*   Úserver_versionÚherer6   Útimeoutr=   rD   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}|jƒ |jƒ |jƒ dœ}tj|ƒ}|j	dƒ}| j
dƒ | jddƒ | jdtt|ƒƒƒ | jƒ  |r~| jj|ƒ dS )zServe a GET request.)Zsession_cacherA   Úcompressionzutf-8éÈ   zContent-typeztext/plain; charset=utf-8zContent-LengthN)ÚrfileÚrawÚ_sockr   Úsession_statsrA   rI   ÚpprintÚpformatÚencodeZsend_responseZsend_headerr   ÚlenZend_headersÚwfiler$   )r   Ú	send_bodyr%   r   ÚstatsÚbodyr   r   r   Údo_GET^   s    



zStatsRequestHandler.do_GETc             C   s   | j dd� dS )zServe a HEAD request.F)rT   N)rW   )r   r   r   r   Údo_HEADp   s    zStatsRequestHandler.do_HEADc             G   s   t jrtj| |f|žŽ  d S )N)r   r!   r   Úlog_request)r   rB   rC   r   r   r   rY   t   s    zStatsRequestHandler.log_requestN)T)r   r)   r*   Ú__doc__rE   rW   rX   rY   r   r   r   r   rH   W   s
   
rH   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j| ƒ d| _	d S )Nr   T)
Úflagr   r+   r?   r   Úportr   ÚThreadr   Údaemon)r   r   Úhostr   r   r   r   r   {   s    
zHTTPSServerThread.__init__c             C   s   d| j j| jf S )Nz<%s %s>)r   r   r?   )r   r   r   r   r   „   s    zHTTPSServerThread.__str__c             C   s   || _ tjj| ƒ d S )N)r\   r   r^   Ústart)r   r\   r   r   r   ra   ‡   s    zHTTPSServerThread.startc          
   C   s2   | j r| j jƒ  z| jjdƒ W d | jjƒ  X d S )Ngš™™™™™©?)r\   Úsetr?   Úserve_foreverÚserver_close)r   r   r   r   Úrun‹   s
    
zHTTPSServerThread.runc             C   s   | j jƒ  d S )N)r?   Úshutdown)r   r   r   r   Ústop“   s    zHTTPSServerThread.stop)N)	r   r)   r*   ÚHOSTr   r   ra   re   rg   r   r   r   r   r[   y   s
   	
r[   c                sV   t jt jƒ}|j|ƒ t|||ƒ‰ tjƒ }ˆ j|ƒ |jƒ  ‡ fdd„}| j	|ƒ ˆ S )Nc                  s8   t jrtjjdƒ ˆ jƒ  t jr,tjjdƒ ˆ jƒ  d S )Nzstopping HTTPS server
zjoining HTTPS thread
)r   r!   r"   r>   r$   rg   r8   r   )r?   r   r   ÚcleanupŸ   s    z"make_https_server.<locals>.cleanup)
ÚsslÚ
SSLContextÚPROTOCOL_SSLv23Úload_cert_chainr[   r   ÚEventra   ÚwaitZ
addCleanup)ZcaseÚcertfiler`   r   r   r\   ri   r   )r?   r   Úmake_https_server—   s    


rq   Ú__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)Údestru   Úactionrv   z-sz--statsÚuse_stats_handlerFÚ
store_truezalways return stats pagez--curve-nameÚ
curve_nameÚstorez&curve name for EC-based Diffie-Hellman)rx   rt   ry   rv   z--dhÚdh_filez!PEM file containing DH parametersÚ z'Listening on https://localhost:{0.port}gš™™™™™¹?)DÚ
__future__r   r   r   r   Zfuture.builtinsr   r   Úfuturer   r1   r"   rj   rO   r   Zfuture.backports.urllibr	   Úurllib_parseZfuture.backports.http.serverr
   r   r   r   Zfuture.backports.testr   Úimport_moduler   r2   ÚdirnameÚ__file__rF   rh   r8   ZCERTFILEr   r+   rH   r^   r[   rq   r   ÚargparseÚArgumentParserÚparserÚadd_argumentÚintÚ
parse_argsrC   r!   rz   r   ÚPY2Zgetcwdur6   Úgetcwdrk   ÚPROTOCOL_TLSv1r   rm   r|   Úset_ecdh_curver~   Úload_dh_paramsr]   r?   ÚprintrB   rc   r   r   r   r   Ú<module>   sh   
)"





