a
    mzf                     @   s   d Z ddlZddlZddlZddlZzddlmZ W n eyR   ddlmZ Y n0 g dZ	dd Z
dd Zd	d
 ZdddZdd Zdd Zdd Zdd Zdd Zdd Zdd ZedkrddlZe  dS )z!
Network Utilities
(from web.py)
    N)quote)validipaddrvalidip6addrvalidipportvalidip	validaddrurlquotehttpdateparsehttpdate	htmlquotehtmlunquotewebsafec              
   C   s4   zt t j|  W n t jttfy.   Y dS 0 dS )a  
    Returns True if `address` is a valid IPv6 address.

        >>> validip6addr('::')
        True
        >>> validip6addr('aaaa:bbbb:cccc:dddd::1')
        True
        >>> validip6addr('1:2:3:4:5:6:7:8:9:10')
        False
        >>> validip6addr('12:10')
        False
    FT)socket	inet_ptonAF_INET6errorAttributeError
ValueError)address r   5/var/www/media/lib/python3.9/site-packages/web/net.pyr       s
    r   c                 C   sv   z\|  d}t|dkrW dS |D ]6}d|v r6 W dS dt|  krNdks"n  W dS q"W n typ   Y dS 0 dS )a  
    Returns True if `address` is a valid IPv4 address.

        >>> validipaddr('192.168.1.1')
        True
        >>> validipaddr('192.168. 1.1')
        False
        >>> validipaddr('192.168.1.800')
        False
        >>> validipaddr('192.168.1')
        False
    .   F r      T)splitlenintr   )r   octetsxr   r   r   r   5   s    
r   c                 C   s>   z$dt |   krdks"n W dS W n ty8   Y dS 0 dS )z
    Returns True if `port` is a valid IPv4 port.

        >>> validipport('9000')
        True
        >>> validipport('foo')
        False
        >>> validipport('1000000')
        False
    r   i  FT)r   r   )portr   r   r   r   R   s    
r   0.0.0.0  c                 C   s>  |}|}t d| }|rht|drx|drXt|drf|dt|dfS qx|d|fS nt| rx| |fS | dd} t| dkr| d snBt| d r| d }n,t| d rt| d }nt	d
| d nXt| dkr$| \}}t|rt|st	d
| d t|}nt	d
| d ||fS )a  
    Returns `(ip_address, port)` from string `ip_addr_port`

        >>> validip('1.2.3.4')
        ('1.2.3.4', 8080)
        >>> validip('80')
        ('0.0.0.0', 80)
        >>> validip('192.168.0.1:85')
        ('192.168.0.1', 85)
        >>> validip('::')
        ('::', 8080)
        >>> validip('[::]:88')
        ('::', 88)
        >>> validip('[::1]:80')
        ('::1', 80)

    z^\[([^]]+)\](?::(\d+))?$      :r   z is not a valid IP address/port)researchr   groupr   r   r   r   r   r   join)ipZdefaultaddrZdefaultportaddrr    matchr   r   r   r   e   s6    


r   c                 C   s   d| v r| S t | S dS )a  
    Returns either (ip_address, port) or "/path/to/socket" from string_

        >>> validaddr('/path/to/socket')
        '/path/to/socket'
        >>> validaddr('8000')
        ('0.0.0.0', 8000)
        >>> validaddr('127.0.0.1')
        ('127.0.0.1', 8080)
        >>> validaddr('127.0.0.1:8000')
        ('127.0.0.1', 8000)
        >>> validip('[::1]:80')
        ('::1', 80)
        >>> validaddr('fff')
        Traceback (most recent call last):
            ...
        ValueError: fff is not a valid IP address/port
    /N)r   )string_r   r   r   r      s    r   c                 C   s"   | du rdS t | d} t| S )u   
    Quotes a string for use in a URL.

        >>> urlquote('://?f=1&j=1')
        '%3A//%3Ff%3D1%26j%3D1'
        >>> urlquote(None)
        ''
        >>> urlquote(u'‽')
        '%E2%80%BD'
    N utf-8)strencoder   valr   r   r   r      s    r   c                 C   s
   |  dS )z
    Formats a datetime object for use in HTTP headers.

        >>> import datetime
        >>> httpdate(datetime.datetime(1970, 1, 1, 1, 1, 1))
        'Thu, 01 Jan 1970 01:01:01 GMT'
    z%a, %d %b %Y %H:%M:%S GMT)strftime)Zdate_objr   r   r   r	      s    r	   c                 C   s8   zt | d}W n ty$   Y dS 0 tj|dd  S )z
    Parses an HTTP date into a datetime object.

        >>> parsehttpdate('Thu, 01 Jan 1970 01:01:01 GMT')
        datetime.datetime(1970, 1, 1, 1, 1, 1)
    z%a, %d %b %Y %H:%M:%S %ZN   )timestrptimer   datetime)r.   tr   r   r   r
      s
    r
   c                 C   s@   |  dd} |  dd} |  dd} |  dd} |  d	d
} | S )zs
    Encodes `text` for raw use in HTML.

        >>> htmlquote(u"<'&\">")
        u'&lt;&#39;&amp;&quot;&gt;'
    &&amp;<&lt;>&gt;'&#39;"&quot;replacetextr   r   r   r      s    r   c                 C   s@   |  dd} |  dd} |  dd} |  dd} |  d	d
} | S )zt
    Decodes `text` that's HTML quoted.

        >>> htmlunquote(u'&lt;&#39;&amp;&quot;&gt;')
        u'<\'&">'
    rD   rC   rB   rA   r@   r?   r>   r=   r<   r;   rE   rG   r   r   r   r      s    r   c                 C   s<   | du rdS t | tr"| d} nt | ts4t| } t| S )z
    Converts `val` so that it is safe for use in Unicode HTML.

        >>> websafe("<'&\">")
        u'&lt;&#39;&amp;&quot;&gt;'
        >>> websafe(None)
        u''
        >>> websafe(u'\u203d') == u'\u203d'
        True
    Nr/   r0   )
isinstancebytesdecoder1   r   r3   r   r   r   r      s    

r   __main__)r!   r"   )__doc__r9   r&   r   r7   urllib.parser   ImportErrorurllib__all__r   r   r   r   r   r   r	   r
   r   r   r   __name__doctesttestmodr   r   r   r   <module>   s.   
7