o
    f3                     @   s4  d Z ddlmZmZ ddlZddlZddlmZ ddl	m
Z
 dZg dZde Ze
 d	 ej d  Zed
 e ZG dd deZG dd deZG dd deZdd ZeefddZedkredde'Zej Zeded ded d ddlZed e  W d   dS 1 sw   Y  dS dS )a!  BaseHTTPServer that implements the Python WSGI protocol (PEP 3333)

This is both an example of how WSGI can be implemented, and a basis for running
simple web applications on a local machine, such as might be done when testing
or debugging an application.  It has not been reviewed for security issues,
however, and we strongly recommend that you use a "real" web server for
production use.

For example usage, see the 'if __name__=="__main__"' block at the end of the
module.  See also the BaseHTTPServer module docs for other API information.
    )BaseHTTPRequestHandler
HTTPServerN)SimpleHandler)python_implementationz0.2)
WSGIServerWSGIRequestHandlerdemo_appmake_serverWSGIServer// c                   @   s   e Zd ZeZdd ZdS )ServerHandlerc              	   C   s<   z| j | jddd | j W t|  d S t|  w )Nr      r   )request_handlerlog_requeststatussplit
bytes_sentr   closeself r   ,/usr/lib/python3.10/wsgiref/simple_server.pyr       s
   zServerHandler.closeN)__name__
__module____qualname__software_versionserver_softwarer   r   r   r   r   r      s    r   c                   @   s4   e Zd ZdZdZdd Zdd Zdd Zd	d
 ZdS )r   z7BaseHTTPServer that implements the Python WSGI protocolNc                 C   s   t |  |   dS )z.Override server_bind to store the server name.N)r   server_bindsetup_environr   r   r   r   r   0   s   
zWSGIServer.server_bindc                 C   sF   i  }| _ | j|d< d|d< t| j|d< d|d< d|d< d|d< d S )	NSERVER_NAMEzCGI/1.1GATEWAY_INTERFACESERVER_PORT REMOTE_HOSTCONTENT_LENGTHSCRIPT_NAME)base_environserver_namestrserver_port)r   envr   r   r   r   5   s   

zWSGIServer.setup_environc                 C   s   | j S Napplicationr   r   r   r   get_app?      zWSGIServer.get_appc                 C   s
   || _ d S r,   r-   )r   r.   r   r   r   set_appB   s   
zWSGIServer.set_app)	r   r   r   __doc__r.   r   r   r/   r1   r   r   r   r   r   *   s    
r   c                   @   s,   e Zd Zde Zdd Zdd Zdd ZdS )	r   r
   c                 C   sL  | j j }| j|d< | j|d< | j|d< d| jv r$| jdd\}}n| jd}}tj	
|d|d< ||d	< |  }|| jd
 krF||d< | jd
 |d< | jdd u r]| j |d< n| jd |d< | jd}|rp||d< | j D ].\}}|dd }| }||v rqud| |v r|d|   d| 7  < qu||d| < qu|S )NSERVER_PROTOCOLSERVER_SOFTWAREREQUEST_METHOD?r   r#   z
iso-8859-1	PATH_INFOQUERY_STRINGr   r$   REMOTE_ADDRzcontent-typeCONTENT_TYPEzcontent-lengthr%   -_HTTP_,)serverr'   copyrequest_versionserver_versioncommandpathr   urllibparseunquoteaddress_stringclient_addressheadersgetget_content_typeitemsreplaceupperstrip)r   r+   rD   queryhostlengthkvr   r   r   get_environK   s6   



zWSGIRequestHandler.get_environc                 C   s   t jS r,   )sysstderrr   r   r   r   
get_stderrp   r0   zWSGIRequestHandler.get_stderrc                 C   s   | j d| _t| jdkrd| _d| _d| _| d dS |  s$dS t	| j | j
|  |  dd}| |_|| j  dS )zHandle a single HTTP requesti  i   r#   i  NF)multithread)rfilereadlineraw_requestlinelenrequestlinerA   rC   
send_errorparse_requestr   wfilerY   rV   r   runr?   r/   )r   handlerr   r   r   handles   s   
zWSGIRequestHandler.handleN)r   r   r   __version__rB   rV   rY   re   r   r   r   r   r   G   s
    %r   c                 C   sr   ddl m} | }td|d t|d t|  }|D ]\}}t|dt||d q|ddg | dgS )	Nr   )StringIOzHello world!)file=z200 OK)zContent-Typeztext/plain; charset=utf-8zutf-8)iorg   printsortedrM   reprgetvalueencode)environstart_responserg   stdouthrT   rU   r   r   r   r      s   
r   c                 C   s   || |f|}| | |S )zACreate a new WSGI server listening on `host` and `port` for `app`)r1   )rR   portappserver_classhandler_classr?   r   r   r   r	      s   
r	   __main__r#   i@  zServing HTTP onrt   r   z...zhttp://localhost:8000/xyz?abc) r2   http.serverr   r   rW   urllib.parserE   wsgiref.handlersr   platformr   rf   __all__rB   versionr   sys_versionr   r   r   r   r   r	   r   httpdsocketgetsocknamesark   
webbrowseropenhandle_requestr   r   r   r   <module>   s4    C
	


"