a
    Lcòf«  ã                   @   sÒ   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	m
Z
mZ d dlmZ d dlmZ d dlmZ d d	lmZ ed
ƒZG dd„ deƒZG dd„ de	ƒZG dd„ dejƒZdd„ Zdd„ Zdd„ Zdd„ ZdS )é    )ÚIOBase)Úsettings)Úsignals)Úbase)ÚHttpRequestÚ	QueryDictÚparse_cookie)Úset_script_prefix)Úrepercent_broken_unicode)Úcached_property)Ú_lazy_re_compiles   /+c                   @   s,   e Zd ZdZdd„ Zd
dd„Zddd„Zd	S )ÚLimitedStreamzâ
    Wrap another stream to disallow reading it past a number of bytes.

    Based on the implementation from werkzeug.wsgi.LimitedStream
    See https://github.com/pallets/werkzeug/blob/dbf78f67/src/werkzeug/wsgi.py#L828
    c                 C   s    |j | _|j| _d| _|| _d S )Nr   )ÚreadÚ_readÚreadlineÚ	_readlineÚ_posÚlimit)ÚselfÚstreamr   © r   úV/home/httpd/docs/test/DocsMgr/lib/python3.9/site-packages/django/core/handlers/wsgi.pyÚ__init__   s    zLimitedStream.__init__éÿÿÿÿc                C   s`   | j }| j}||krdS |dks(|d u r2|| }nt||| ƒ}|  |¡}|  j t|ƒ7  _ |S ©Nó    r   )r   r   Úminr   Úlen)r   Úsizer   r   Údatar   r   r   r      s    

zLimitedStream.readc                C   s`   | j }| j}||krdS |dks(|d u r2|| }nt||| ƒ}|  |¡}|  j t|ƒ7  _ |S r   )r   r   r   r   r   )r   r   r   r   Úliner   r   r   r   *   s    

zLimitedStream.readlineN)r   )r   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   r   r   r   r   r   r      s   
r   c                   @   sZ   e Zd Zdd„ Zdd„ Zedd„ ƒZdd„ Zd	d
„ Zedd„ ƒZ	e
dd„ ƒZe
eeƒZdS )ÚWSGIRequestc              	   C   sÀ   t |ƒ}t|ƒpd}|| _|| _d| d¡| ddd¡f | _|| _|| jd< || jd< |d  ¡ | _	|  
|¡ zt| d¡ƒ}W n ttfyœ   d	}Y n0 t| jd
 |ƒ| _d| _d | _d S )Nú/z%s/%sÚ é   Ú	PATH_INFOÚSCRIPT_NAMEÚREQUEST_METHODÚCONTENT_LENGTHr   z
wsgi.inputF)Úget_script_nameÚget_path_infoÚenvironÚ	path_infoÚrstripÚreplaceÚpathZMETAÚupperÚmethodZ_set_content_type_paramsÚintÚgetÚ
ValueErrorÚ	TypeErrorr   Ú_streamZ_read_startedZresolver_match)r   r/   Úscript_namer0   Úcontent_lengthr   r   r   r   9   s"    



zWSGIRequest.__init__c                 C   s   | j  d¡S )Nzwsgi.url_scheme)r/   r7   ©r   r   r   r   Ú_get_schemeR   s    zWSGIRequest._get_schemec                 C   s   t | jddƒ}t|| jd�S )NÚQUERY_STRINGr'   )Úencoding)Úget_bytes_from_wsgir/   r   Ú	_encoding)r   Zraw_query_stringr   r   r   ÚGETU   s    zWSGIRequest.GETc                 C   s   t | dƒs|  ¡  | jS )NÚ_post)ÚhasattrÚ_load_post_and_filesrD   r=   r   r   r   Ú	_get_post[   s    
zWSGIRequest._get_postc                 C   s
   || _ d S ©N)rD   )r   Úpostr   r   r   Ú	_set_post`   s    zWSGIRequest._set_postc                 C   s   t | jddƒ}t|ƒS )NZHTTP_COOKIEr'   )Úget_str_from_wsgir/   r   )r   Z
raw_cookier   r   r   ÚCOOKIESc   s    zWSGIRequest.COOKIESc                 C   s   t | dƒs|  ¡  | jS )NÚ_files)rE   rF   rM   r=   r   r   r   ÚFILESh   s    
zWSGIRequest.FILESN)r!   r"   r#   r   r>   r   rC   rG   rJ   rL   ÚpropertyrN   ÚPOSTr   r   r   r   r%   8   s   


r%   c                       s(   e Zd ZeZ‡ fdd„Zdd„ Z‡  ZS )ÚWSGIHandlerc                    s   t ƒ j|i |¤Ž |  ¡  d S rH   )Úsuperr   Zload_middleware)r   ÚargsÚkwargs©Ú	__class__r   r   r   t   s    zWSGIHandler.__init__c                 C   s®   t t|ƒƒ tjj| j|d� |  |¡}|  |¡}| j|_d|j	|j
f }g | ¡ ¢dd„ |j ¡ D ƒ¢}|||ƒ t|dd ƒd urª| d¡rª|j|j_|d |j|jƒ}|S )N)Zsenderr/   z%d %sc                 s   s   | ]}d |j dd�fV  qdS )z
Set-Cookier'   )ÚheaderN)Úoutput)Ú.0Úcr   r   r   Ú	<genexpr>ƒ   r   z'WSGIHandler.__call__.<locals>.<genexpr>Úfile_to_streamzwsgi.file_wrapper)r	   r-   r   Zrequest_startedÚsendrV   Úrequest_classZget_responseZ_handler_classÚstatus_codeZreason_phraseÚitemsÚcookiesÚvaluesÚgetattrr7   Úcloser\   Ú
block_size)r   r/   Zstart_responseÚrequestÚresponseÚstatusÚresponse_headersr   r   r   Ú__call__x   s(    

ÿþ
ÿ
ÿzWSGIHandler.__call__)r!   r"   r#   r%   r^   r   rj   Ú__classcell__r   r   rU   r   rQ   q   s   rQ   c                 C   s   t | ddƒ}t|ƒ ¡ S )z0Return the HTTP request's PATH_INFO as a string.r)   r&   )rA   r
   Údecode)r/   r0   r   r   r   r.   “   s    r.   c                 C   s|   t jdurt jS t| ddƒp&t| ddƒ}|rhd|v r@t d|¡}t| ddƒ}|rb|dt|ƒ … n|}nt| ddƒ}| ¡ S )	aE  
    Return the equivalent of the HTTP request's SCRIPT_NAME environment
    variable. If Apache mod_rewrite is used, return what would have been
    the script name prior to any rewriting (so it's the script name as seen
    from the client's perspective), unless the FORCE_SCRIPT_NAME setting is
    set (to anything).
    NZ
SCRIPT_URLr'   ZREDIRECT_URLs   //ó   /r)   r*   )r   ZFORCE_SCRIPT_NAMErA   Ú_slashes_reÚsubr   rl   )r/   Z
script_urlr0   r;   r   r   r   r-   š   s    
ÿr-   c                 C   s   |   ||¡}| d¡S )zh
    Get a value from the WSGI environ dictionary as bytes.

    key and default should be strings.
    z
iso-8859-1)r7   Úencode©r/   ÚkeyÚdefaultÚvaluer   r   r   rA   »   s    rA   c                 C   s   t | ||ƒ}|jdd�S )zj
    Get a value from the WSGI environ dictionary as str.

    key and default should be str objects.
    r2   )Úerrors)rA   rl   rq   r   r   r   rK   È   s    rK   N)Úior   Zdjango.confr   Zdjango.corer   Zdjango.core.handlersr   Zdjango.httpr   r   r   Zdjango.urlsr	   Zdjango.utils.encodingr
   Zdjango.utils.functionalr   Zdjango.utils.regex_helperr   rn   r   r%   ÚBaseHandlerrQ   r.   r-   rA   rK   r   r   r   r   Ú<module>   s    )9"!