a
    mzfo(                     @   sB  d dl Z d dlZd dlZddlmZ ddlmZ zd dlmZ W n e	y^   d dl
mZ Y n0 zd dlmZmZmZ W n. e	y   d dlmZ d dlmZmZ Y n0 zd d	lmZ d d
lmZ W n& e	y   d dlZd d
lmZ Y n0 dgZdddZdadddZdd ZG dd deZG dd dZG dd dZdS )    N   )utils)webapi)BytesIO)
HTTPServerSimpleHTTPRequestHandlerBaseHTTPRequestHandler)r   )r   r   )parse)unquote	runsimplez0.0.0.0i  c                    sn   ddl }ddlddlddlG fdddt G  fddd|jt}td|  || |  dS )a'  
      Runs a simple HTTP server hosting WSGI app `func`. The directory `static/`
      is hosted statically.

      Based on [WsgiServer][ws] from [Colin Stewart][cs].

    [ws]: http://www.owlfish.com/software/wsgiutils/documentation/wsgi-server-api.html
    [cs]: http://www.owlfish.com/
    r   Nc                       sB   e Zd Z fddZeZeZeZdd Zd
ddZdd	 Z	dS )zrunbasic.<locals>.WSGIHandlerc                    s  t  d| j \}}}}}}dd| jtjddd| j| j||| jdd| jdd| jd | j	j
d t| j	j
d | jd	}| j D ] \}}	|	|d
|dd  < qd| _g | _z| j	|| j}
zJz.|
D ]}|r| | qW t|
dr|
  nt|
dr|
  0 W nh jy` } z4|jd  j jfv rLW Y d }~W d S W Y d }~n"d }~0  jyx   Y W d S 0 W n   t tjd Y n0 | js| d d S )Nzhttp://dummyhost%s)r   r   httpr   r   zContent-Type zContent-Length)zwsgi.versionzwsgi.url_schemez
wsgi.inputwsgi.errorszwsgi.multithreadzwsgi.multiprocesszwsgi.run_onceREQUEST_METHODZREQUEST_URI	PATH_INFOQUERY_STRINGCONTENT_TYPECONTENT_LENGTHREMOTE_ADDRZSERVER_NAMEZSERVER_PORTZSERVER_PROTOCOLzHTTP_%s-_closefile ) urlparsepathrfilesysstderrcommandheadersgetclient_addressserverserver_addressstrZrequest_versionitemsreplaceupperwsgi_sent_headerswsgi_headersappwsgi_start_responsewsgi_write_datahasattrr   errorargsECONNABORTEDEPIPEtimeoutprint
format_excwebdebug)selfprotocolhostr   
parametersqueryfragmentenvZhttp_headerZ
http_valueresultdataZ
socket_errerrnosocket	traceback </var/www/media/lib/python3.9/site-packages/web/httpserver.pyrun_wsgi_app2   s\    


$
z*runbasic.<locals>.WSGIHandler.run_wsgi_appc                 S   s$   | j drt|  n|   d S )N/static/)r   
startswithr   do_GETrI   r:   rG   rG   rH   rL   p   s    z$runbasic.<locals>.WSGIHandler.do_GETNc                 S   s   | j rtd||f| _| jS )Nz5Headers already sent and start_response called again!)r+   	Exceptionr,   r/   )r:   Zresponse_statusresponse_headersexc_inforG   rG   rH   r.   v   s    
z1runbasic.<locals>.WSGIHandler.wsgi_start_responsec                 S   s   | j sp| j\}}|d |d }||dd d  }| t|| |D ]\}}| || qL|   d| _ | j| d S )Nr   r   )	r+   r,   findsend_responseintsend_headerend_headerswfilewrite)r:   rB   statusr"   status_codeZ
status_msgheadervaluerG   rG   rH   r/   }   s    
z-runbasic.<locals>.WSGIHandler.wsgi_write_data)N)
__name__
__module____qualname__rI   Zdo_POSTZdo_PUTZ	do_DELETErL   r.   r/   rG   rC   rG   rH   WSGIHandler1   s   :
r_   c                       s   e Zd Z fddZdS )zrunbasic.<locals>.WSGIServerc                    s    t j | |  || _d| _d S )Nr   )r   __init__r-   ZserverShuttingDown)r:   funcr&   r_   rG   rH   r`      s    z%runbasic.<locals>.WSGIServer.__init__N)r\   r]   r^   r`   rG   rb   rG   rH   
WSGIServer   s   rc   http://%s:%d/)	SocketServerrE   rD   rF   r   ThreadingMixInr   r6   serve_forever)ra   r&   re   rc   rG   )r_   rD   rE   rF   rH   runbasic   s    Zrh   c              	   C   s   t | } t| } t|| ad|d v r4td|  n tjrHtd|  ntd|  zt  W n" ttfy   t	  daY n0 dS )z
    Runs [CherryPy][cp] WSGI server hosting WSGI app `func`.
    The directory `static/` is hosted statically.

    [cp]: http://www.cherrypy.org
    /r   z%szhttps://%s:%d/rd   N)
StaticMiddlewareLogMiddlewarerc   r%   r6   Zssl_adapterstartKeyboardInterrupt
SystemExitstop)ra   r&   rG   rG   rH   r      s    
c                 C   s0   ddl m} |j| |dd}tjd |_|S )zCreates CherryPy WSGI server listening at `server_address` to serve `wsgi_app`.
    This function can be overwritten to customize the webserver or use a different webserver.
    r   )wsgi	localhost)Zserver_namejava)Zcherootrp   Serverr   platformrK   Znodelay)r&   Zwsgi_apprp   r%   rG   rG   rH   rc      s    rc   c                   @   sB   e Zd ZdZdd ZdddZdd Zd	d
 Zdd Zdd Z	dS )	StaticAppz*WSGI application for serving static files.c                 C   s    g | _ || _|| _t | _d S N)r"   environstart_responseosgetcwd	directory)r:   rw   rx   rG   rG   rH   r`      s    zStaticApp.__init__r   c                 C   s   t t|d | | _d S )Nr   )r'   rS   rX   )r:   rX   msgrG   rG   rH   rR      s    zStaticApp.send_responsec                 C   s   | j ||f d S rv   )r"   append)r:   namer[   rG   rG   rH   rT      s    zStaticApp.send_headerc                 C   s   d S rv   rG   rM   rG   rG   rH   rU      s    zStaticApp.end_headersc                  G   s   d S rv   rG   )arG   rG   rH   log_message   s    zStaticApp.log_messagec           	      c   s  | j }|dd| _|dd|ddf| _|dd| _t | _z`| | j}dtj	| }|d}| 
d	| ||kr| d
d | | j| j W d S W n ty   Y n0 |  }| | j| j |rd}||}|sq|V  q|  n| j }|V  d S )Nr   r   r   r   REMOTE_PORTr   z"%s"ZHTTP_IF_NONE_MATCHETagi0  zNot Modifiedi @  )rw   r#   r   r$   r!   r   rV   Ztranslate_pathry   getmtimerT   rR   rx   rX   r"   OSErrorZ	send_headreadr   getvalue)	r:   rw   r   etagZclient_etagf
block_sizebufr[   rG   rG   rH   __iter__   s:    






zStaticApp.__iter__N)r   )
r\   r]   r^   __doc__r`   rR   rT   rU   r   r   rG   rG   rG   rH   ru      s   
ru   c                   @   s*   e Zd ZdZd
ddZdd Zdd Zd	S )rj   z)WSGI middleware for serving static files.rJ   c                 C   s   || _ || _d S rv   )r-   prefix)r:   r-   r   rG   rG   rH   r`     s    zStaticMiddleware.__init__c                 C   s<   | dd}| |}|| jr,t||S | ||S d S )Nr   r   )r#   normpathrK   r   ru   r-   )r:   rw   rx   r   rG   rG   rH   __call__  s
    

zStaticMiddleware.__call__c                 C   s$   t t|}|dr |d7 }|S )Nri   )	posixpathr   r
   endswith)r:   r   path2rG   rG   rH   r     s    
zStaticMiddleware.normpathN)rJ   )r\   r]   r^   r   r`   r   r   rG   rG   rG   rH   rj     s   
	rj   c                   @   s(   e Zd ZdZdd Zdd Zdd ZdS )	rk   z'WSGI middleware for logging the status.c                    s:   || _ d| _t  G  fddd}t| d d j| _d S )Nz%s - - [%s] "%s %s %s" - %sc                       s   e Zd Z fddZdS )z*LogMiddleware.__init__.<locals>.FakeSocketc                    s    S rv   rG   )r:   r   r   rG   rH   makefile"  s    z3LogMiddleware.__init__.<locals>.FakeSocket.makefileN)r\   r]   r^   r   rG   r   rG   rH   
FakeSocket!  s   r   )r-   formatr   r   log_date_time_string)r:   r-   r   rG   r   rH   r`     s    zLogMiddleware.__init__c                    s    fdd}  |S )Nc                    s"   | |g|R  } |   |S rv   )log)rX   rO   r2   outrw   r:   rx   rG   rH   xstart_response+  s    z/LogMiddleware.__call__.<locals>.xstart_response)r-   )r:   rw   rx   r   rG   r   rH   r   *  s    zLogMiddleware.__call__c           
      C   s   | dtj}| dd}| dd}| dd}d| dd| d	df }|  }| j||||||f }	tt|	|d
 d S )Nr   r   r   ZACTUAL_SERVER_PROTOCOLr   r   z%s:%sr   r   r   )r#   r8   r9   r   r   r6   r   Zsafestr)
r:   rX   rw   outfilereqr;   methodr<   timer|   rG   rG   rH   r   2  s    

zLogMiddleware.logN)r\   r]   r^   r   r`   r   r   rG   rG   rG   rH   rk     s   rk   )r   )r   )ry   r   r   r   r   r   r8   ior   ImportErrorStringIOZhttp.serverr   r   r   SimpleHTTPServerBaseHTTPServerurllibr	   r   urllib.parser
   __all__rh   r%   r   rc   ru   rj   rk   rG   rG   rG   rH   <module>   s6   
z
>