o
    ˷ek"                     @   s   d 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dl	m
Z
 ddlmZ ddlmZ ddlmZ d	Zed
Zdd Zd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jZddefddZdS )a0  
HTTP server that implements the Python WSGI protocol (PEP 333, rev 1.21).

Based on wsgiref.simple_server which is part of the standard library since 2.5.

This is a simple server for use in testing or debugging Django apps. It hasn't
been reviewed for security issues. DON'T USE IT FOR PRODUCTION USE!
    N)simple_server)ImproperlyConfigured)LimitedStream)get_wsgi_application)connections)import_string)
WSGIServerWSGIRequestHandlerzdjango.serverc               
   C   sV   ddl m}  t| d}|du rt S zt|W S  ty* } ztd| |d}~ww )aK  
    Load and return the WSGI application as configured by the user in
    ``settings.WSGI_APPLICATION``. With the default ``startproject`` layout,
    this will be the ``application`` object in ``projectname/wsgi.py``.

    This function, and the ``WSGI_APPLICATION`` setting itself, are only useful
    for Django's internal server (runserver); external WSGI servers should just
    be configured to point to the correct application object directly.

    If settings.WSGI_APPLICATION is not set (is ``None``), return
    whatever ``django.core.wsgi.get_wsgi_application`` returns.
    r   )settingsWSGI_APPLICATIONNzBWSGI application '%s' could not be loaded; Error importing module.)django.confr
   getattrr   r   ImportErrorr   )r
   app_patherr r   S/var/www/ideatree/venv/lib/python3.10/site-packages/django/core/servers/basehttp.pyget_internal_wsgi_application   s    

r   c                  C   s   t  \} }}t| tttfS N)sysexc_info
issubclassBrokenPipeErrorConnectionAbortedErrorConnectionResetError)exc_type_r   r   r   is_broken_pipe_error7   s   r   c                       s8   e Zd ZdZdZddd fdd
Z fdd	Z  ZS )
r   z7BaseHTTPServer that implements the Python WSGI protocol
   FT)ipv6allow_reuse_addressc                   s(   |rt j| _|| _t j|i | d S r   )socketAF_INET6address_familyr    super__init__)selfr   r    argskwargs	__class__r   r   r%   H   s   zWSGIServer.__init__c                    s(   t  rtd| d S t || d S )Nz- Broken pipe from %s)r   loggerinfor$   handle_error)r&   requestclient_addressr)   r   r   r-   N   s   zWSGIServer.handle_error)__name__
__module____qualname____doc__request_queue_sizer%   r-   __classcell__r   r   r)   r   r   C   s
    r   c                       sJ   e Zd ZdZdZdd fdd
Z fddZd	d
 Z fddZ  Z	S )ThreadedWSGIServerz$A threaded version of the WSGIServerTN)connections_overridec                   s   t  j|i | || _d S r   )r$   r%   r7   )r&   r7   r'   r(   r)   r   r   r%   Z   s   
zThreadedWSGIServer.__init__c                    s4   | j r| j  D ]\}}|t|< qt || d S r   )r7   itemsr   r$   process_request_thread)r&   r.   r/   aliasconnr)   r   r   r9   `   s   
z)ThreadedWSGIServer.process_request_threadc                 C   s   t   d S r   )r   	close_allr&   r   r   r   _close_connectionsh   s   z%ThreadedWSGIServer._close_connectionsc                    s   |    t | d S r   )r>   r$   close_request)r&   r.   r)   r   r   r?   l   s   z ThreadedWSGIServer.close_request)
r0   r1   r2   r3   daemon_threadsr%   r9   r>   r?   r5   r   r   r)   r   r6   U   s    r6   c                       s8   e Zd ZdZ fddZ fddZ fddZ  ZS )ServerHandlerz1.1c              	      sR   z	t |d}W n ttfy   d}Y nw t jt|||||fi | dS )a#  
        Use a LimitedStream so that unread request data will be ignored at
        the end of the request. WSGIRequest uses a LimitedStream but it
        shouldn't discard the data since the upstream servers usually do this.
        This fix applies only for testserver/runserver.
        CONTENT_LENGTHr   N)intget
ValueError	TypeErrorr$   r%   r   )r&   stdinstdoutstderrenvironr(   content_lengthr)   r   r   r%   t   s   
zServerHandler.__init__c                    sZ   t    d| jvrd| jd< nt| jjtjsd| jd< | jddkr+d| j_	d S d S )NzContent-Lengthclose
ConnectionT)
r$   cleanup_headersheaders
isinstancerequest_handlerserversocketserverThreadingMixInrD   close_connectionr=   r)   r   r   rN      s   


zServerHandler.cleanup_headersc                    s   |     t   d S r   )	get_stdin_read_limitedr$   rL   r=   r)   r   r   rL      s   zServerHandler.close)r0   r1   r2   http_versionr%   rN   rL   r5   r   r   r)   r   rA   q   s
    rA   c                       s@   e Zd ZdZdd Zdd Z fddZdd	 Zd
d Z  Z	S )r	   zHTTP/1.1c                 C   s
   | j d S )Nr   )r/   r=   r   r   r   address_string   s   
z!WSGIRequestHandler.address_stringc                 G   s   | j |  d}|d d dkr$|d dr$d|d< tjd|d	 d S |d  rPt|d d
krPt|d }||d< |dkrDtj}n|dkrLtj}ntj	}ntj	}||g|R d|i d S )N)r.   server_time   r   4zi  status_codezNYou're accessing the development server over HTTPS, but it only supports HTTP.)extra   i  r^   )
r.   log_date_time_string
startswithr+   errorisdigitlenrC   warningr,   )r&   formatr'   r^   r]   levelr   r   r   log_message   s*   zWSGIRequestHandler.log_messagec                    s&   | j D ]
}d|v r| j |= qt  S )Nr   )rO   r$   get_environ)r&   kr)   r   r   ri      s
   

zWSGIRequestHandler.get_environc              	   C   sP   d| _ |   | j s|   | j r
z
| jtj W d S  ttfy'   Y d S w )NT)rU   handle_one_request
connectionshutdownr!   SHUT_WRAttributeErrorOSErrorr=   r   r   r   handle   s   zWSGIRequestHandler.handlec                 C   s|   | j d| _t| jdkrd| _d| _d| _| d dS |  s$dS t	| j | j
|  |  }| |_|| j  dS )zDCopy of WSGIRequestHandler.handle() but with different ServerHandleri  i    i  N)rfilereadlineraw_requestlinerd   requestlinerequest_versioncommand
send_errorparse_requestrA   wfile
get_stderrri   rQ   runrR   get_app)r&   handlerr   r   r   rk      s   
z%WSGIRequestHandler.handle_one_request)
r0   r1   r2   protocol_versionrY   rh   ri   rq   rk   r5   r   r   r)   r   r	      s    
r	   Fc           	      C   sR   | |f}|rt dtj|fi }n|}||t|d}|rd|_|| |  d S )Nr   )r   T)typerS   rT   r	   r@   set_appserve_forever)	addrportwsgi_handlerr   	threading
server_clsserver_address	httpd_clshttpdr   r   r   r}      s   
r}   )r3   loggingr!   rS   r   wsgirefr   django.core.exceptionsr   django.core.handlers.wsgir   django.core.wsgir   	django.dbr   django.utils.module_loadingr   __all__	getLoggerr+   r   r   r   rT   r6   rA   r	   r}   r   r   r   r   <module>   s(    	
&O