o
    Vh                     @  s   d dl mZ d dlZd dlZd dlmZmZmZ d dlmZm	Z	m
Z
 d dlmZmZmZ er4d dlmZ dZddddZdddZG dd dZG dd deZG dd deZG dd deZdS )    )annotationsN)datetime	timedeltatimezone)
formatdate	parsedateparsedate_tz)TYPE_CHECKINGAnyMapping)HTTPResponsez%a, %d %b %Y %H:%M:%S GMTdeltar   datedatetime | Nonereturnr   c                 C  s   |pt tj}||  S N)r   nowr   utc)r   r    r   k/var/www/html/construction_image-detection-poc/venv/lib/python3.10/site-packages/cachecontrol/heuristics.pyexpire_after   s   r   dtstrc                 C  s   t t|  S r   )r   calendartimegm	timetuple)r   r   r   r   datetime_to_header   s   r   c                   @  s*   e Zd ZdddZddd	Zdd
dZdS )BaseHeuristicresponser   r   
str | Nonec                 C  s   dS )a!  
        Return a valid 1xx warning header value describing the cache
        adjustments.

        The response is provided too allow warnings like 113
        http://tools.ietf.org/html/rfc7234#section-5.5.4 where we need
        to explicitly say response is over 24 hours old.
        z110 - "Response is Stale"r   selfr   r   r   r   warning   s   	zBaseHeuristic.warningdict[str, str]c                 C  s   i S )zUpdate the response headers with any new headers.

        NOTE: This SHOULD always include some Warning header to
              signify that the response was cached by the client, not
              by way of the provided headers.
        r   r    r   r   r   update_headers'   s   zBaseHeuristic.update_headersc                 C  s@   |  |}|r|j| | |}|d ur|jd|i |S )NWarning)r$   headersupdater"   )r!   r   updated_headerswarning_header_valuer   r   r   apply0   s   

zBaseHeuristic.applyNr   r   r   r   r   r   r   r#   )r   r   r   r   )__name__
__module____qualname__r"   r$   r*   r   r   r   r   r      s    

	r   c                   @  s   e Zd ZdZd	ddZdS )
OneDayCachezM
    Cache the response by providing an expires 1 day in the
    future.
    r   r   r   r#   c                 C  sZ   i }d|j vr+t|j d }ttddt|d d dtjid}t||d< d|d	< |S )
Nexpiresr      )days   tzinfo)r   publiccache-control)r&   r   r   r   r   r   r   r   )r!   r   r&   r   r1   r   r   r   r$   B   s   
zOneDayCache.update_headersNr,   )r-   r.   r/   __doc__r$   r   r   r   r   r0   <   s    r0   c                   @  s.   e Zd ZdZdddZdddZdddZdS )ExpiresAfterz;
    Cache **all** requests for a defined time period.
    kwr
   r   Nonec                 K  s   t di || _d S )Nr   )r   r   )r!   r:   r   r   r   __init__U   s   zExpiresAfter.__init__r   r   r#   c                 C  s   t | j}t|ddS )Nr6   )r1   r7   )r   r   r   )r!   r   r1   r   r   r   r$   X   s   
zExpiresAfter.update_headersr   c                 C  s   d}|| j  S )Nz:110 - Automatically cached for %s. Response might be stale)r   )r!   r   tmplr   r   r   r"   \   s   
zExpiresAfter.warningN)r:   r
   r   r;   r,   r+   )r-   r.   r/   r8   r<   r$   r"   r   r   r   r   r9   P   s
    

r9   c                   @  s,   e Zd ZdZh dZdddZdd
dZdS )LastModifieda  
    If there is no Expires header already, fall back on Last-Modified
    using the heuristic from
    http://tools.ietf.org/html/rfc7234#section-4.2.2
    to calculate a reasonable value.

    Firefox also does something like this per
    https://developer.mozilla.org/en-US/docs/Web/HTTP/Caching_FAQ
    http://lxr.mozilla.org/mozilla-release/source/netwerk/protocol/http/nsHttpResponseHead.cpp#397
    Unlike mozilla we limit this to 24-hr.
    >   ,  -                        respr   r   r#   c                 C  s   |j }d|v r	i S d|v r|d dkri S |j| jvri S d|vs%d|vr'i S t|d }|d us3J t|d d }t|d }|d u rHi S t }td|| }|t| }tdt	|d d	}	|	|krji S ||	 }
dt
tt|
iS )
Nr1   r7   r6   r   zlast-modifiedr4   r   
   iQ )r&   statuscacheable_by_default_statusesr   r   r   r   timemaxminstrftimeTIME_FMTgmtime)r!   rJ   r&   
time_tupler   last_modifiedr   current_ager   freshness_lifetimer1   r   r   r   r$   |   s.   zLastModified.update_headersr   c                 C  s   d S r   r   )r!   rJ   r   r   r   r"      s   zLastModified.warningN)rJ   r   r   r#   )rJ   r   r   r   )r-   r.   r/   r8   rM   r$   r"   r   r   r   r   r>   a   s
    
 r>   r   )r   r   r   r   r   r   )r   r   r   r   )
__future__r   r   rN   r   r   r   email.utilsr   r   r   typingr	   r
   r   urllib3r   rR   r   r   r   r0   r9   r>   r   r   r   r   <module>   s   
!