
    Df                         d Z ddlZddlZddlZddlZ	 ddlmZ n# e$ r	 ddlmZ Y nw xY wg dZ	d Z
d Zd Zdd
Zd Zd Zd Zd Zd Zd Zd Zedk    rddlZ ej                     dS dS )z!
Network Utilities
(from web.py)
    N)quote)validipaddrvalidip6addrvalidipportvalidip	validaddrurlquotehttpdateparsehttpdate	htmlquotehtmlunquotewebsafec                     	 t          j        t           j        |            n## t           j        t          t
          f$ r Y dS w xY w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)addresss    6/var/www/media/lib/python3.11/site-packages/web/net.pyr   r       sQ    '2222L.*5   uu 4s   " AAc                     	 |                      d          }t          |          dk    rdS |D ](}d|v r dS dt          |          cxk    rdk    sn  dS )n# t          $ r Y dS w xY w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xs      r   r   r   5   s    s##v;;!5 	 	AaxxuuQ&&&&3&&&&uu '		    uu4s!   (A 	A A A 
A&%A&c                 h    	 dt          |           cxk    rdk    sn dS n# t          $ r Y dS w xY w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   )ports    r   r   r   R   s]    SYY''''%''''5 (   uu4s   ! 
//0.0.0.0  c                    |}|}t          j        d|           }|rt          |                    d                    r|                    d          rZt	          |                    d                    r7|                    d          t          |                    d                    fS n+|                    d          |fS nt          |           r| |fS |                     dd          } t          |           dk    rw| d         snt          | d                   r	| d         }nt	          | d                   rt          | d                   }nt          d
                    |           dz             t          |           dk    rX| \  }}t          |          rt	          |          s%t          d
                    |           dz             t          |          }n%t          d
                    |           dz             ||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)ipdefaultaddrdefaultportaddrr#   matchs         r   r   r   e   s   $ DD I1266E 	A'' 	.{{1~~ .u{{1~~.. A!KKNNCA,?,?@@A A--	.  	: 
#q		B
2ww!||!u 	OA 	Oa5DDA 	Or!u::DDSXXb\\,MMNNN	RA
d4   	OD(9(9 	OSXXb\\,MMNNN4yy"(IIJJJ$<    c                 ,    d| v r| S t          |           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
    /)r   )string_s    r   r   r      s     & g~~wr3   c                 l    | 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   vals    r   r	   r	      s1     {r
c((//'
"
"C::r3   c                 ,    |                      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)date_objs    r   r
   r
      s     8999r3   c                 ~    	 t          j        | d          }n# t          $ r Y dS w xY w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)r6   ts     r   r   r      sS    M'#=>>   ttae$$s    
&&c                     |                      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texts    r   r   r      sh     <<h''D<<g&&D<<g&&D<<h''D<<i((DKr3   c                     |                      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'<\'&">'
    rQ   rP   rO   rN   rM   rL   rK   rJ   rI   rH   rR   rT   s    r   r   r      sh     <<	4((D<<$''D<<&&D<<&&D<<$''DKr3   c                     | dS t          | t                    r|                     d          } n$t          | t                    st          |           } 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
    Nr8   r9   )
isinstancebytesdecoder:   r   r<   s    r   r   r      s\     {s#u jj!!S!! #hhS>>r3   __main__)r$   r%   )__doc__rE   r*   r   rC   urllib.parser   ImportErrorurllib__all__r   r   r   r   r   r	   r
   r   r   r   r   __name__doctesttestmod r3   r   <module>re      sr     				  """""""       *  :  &4 4 4 4n     2  $: : :% % %      , zNNNGO s    ))