a
    mzf                     @   s   d 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
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 dZg dZG dd deZG dd deZG dd deZG dd de
ZdS )z0Browser to test web applications.
(from web.py)
    N)BytesIO   )htmlunquote)
re_compile)HTTPHandlerHTTPCookieProcessorRequest	HTTPError)build_opener)urljoin)	CookieJar)
addinfourlF)BrowserErrorBrowser
AppBrowser
AppHandlerc                   @   s   e Zd ZdS )r   N)__name__
__module____qualname__ r   r   9/var/www/media/lib/python3.9/site-packages/web/browser.pyr      s   r   c                   @   s   e Zd Zdd Zedd Zdd Zdd Zd	d
 Zdi fddZ	dd Z
dd Zdd Zd+ddZdd Zd,ddZd-ddZd.ddZd/ddZd d! Zd0d#d$Zd%d& Zd'd( Zd)d* ZdS )1r   c                 C   sB   t  | _t| j| _d | _d| _d| _d | _d | _d | _	d | _
d S )Nzhttp://0.0.0.0:8080//)r   	cookiejarr   _cookie_processorformurlpathstatusdata	_response_formsselfr   r   r   __init__   s    zBrowser.__init__c                 C   s   | j dS )Nzutf-8)r   decoder!   r   r   r   text)   s    zBrowser.textc                 C   s   | j   dS )zClears all cookies and history.N)r   clearr!   r   r   r   reset-   s    zBrowser.resetc                 C   s   t  S )zBuilds the opener using (urllib2/urllib.request).build_opener.
        Subclasses can override this function to prodive custom openers.
        )urllib_build_openerr!   r   r   r   r
   1   s    zBrowser.build_openerc              
   C   s   t rtd| |  |  }|| j z||| _W n* t	yf } z|| _W Y d }~n
d }~0 0 | j
 | _t| jj| _| j | _| jj| _d | _d | _|  S )NZ
requesting)DEBUGprint
get_methodget_full_urlr
   add_handlerr   openr   r	   geturlr   r   selectorr   readr   coder   r    r   get_response)r"   reqopenerer   r   r   
do_request7   s    
zBrowser.do_requestNc                 C   s"   t | j|}t|||}| |S )zOpens the specified url.)r   r   r   r7   )r"   r   r   headersr4   r   r   r   r.   K   s    zBrowser.openc                 C   s<   t dd}|| j |  dtjd }t | dS )z+Opens the current page in real web browser.z	page.htmlwzfile://N)r.   writer   closeosr   abspath
webbrowser)r"   fr   r   r   r   showR   s
    
zBrowser.showc                 C   s   t t| j| j | j S )z'Returns a copy of the current response.)r   r   r   r   infor/   r!   r   r   r   r3   [   s    zBrowser.get_responsec                 C   s   ddl }| | jS )z/Returns beautiful soup of the current document.r   N)BeautifulSoupr   )r"   rB   r   r   r   get_soupa   s    zBrowser.get_soupc                 C   s$   |p
|   }ddd | D S )z;Returns content of e or the current document as plain text. c                 S   s   g | ]}t |trt|qS r   )
isinstancestrr   ).0cr   r   r   
<listcomp>k       z$Browser.get_text.<locals>.<listcomp>)rC   joinZrecursiveChildGenerator)r"   r6   r   r   r   get_textg   s    zBrowser.get_textc                 C   s   |   }dd |jddD S )Nc                 S   s   g | ]}|qS r   r   )rG   ar   r   r   rI   p   rJ   z&Browser._get_links.<locals>.<listcomp>rM   name)rC   ZfindAll)r"   Zsoupr   r   r   
_get_linksn   s    zBrowser._get_linksc                 C   s   | j |  |||||dS )z"Returns all links in the document.r%   
text_regexr   	url_regex	predicate)_filter_linksrP   )r"   r%   rR   r   rS   rT   r   r   r   	get_linksr   s    zBrowser.get_linksc                 C   sL   |d u r.| j |  |||||d}|o,|d }|r@| |d S tdd S )NrQ   r   hrefzNo link found)rU   rV   r.   r   )r"   linkr%   rR   r   rS   rT   linksr   r   r   follow_link   s    	zBrowser.follow_linkc                 C   s*   | j |  |||||d}|r&|d p(d S )NrQ   r   )rU   rV   )r"   r%   rR   r   rS   rT   rY   r   r   r   	find_link   s    zBrowser.find_linkc                    s   g d ur fdd d ur8 fdd d urR fdd d url fdd |rz| | fdd  fdd	|D S )
Nc                    s
   | j  kS N)stringrX   )r%   r   r   <lambda>   rJ   z'Browser._filter_links.<locals>.<lambda>c                    s   t  | jpdS )NrD   )r   searchr]   r^   )rR   r   r   r_      rJ   c                    s   |  d kS )NrW   )getr^   )r   r   r   r_      rJ   c                    s   t  | ddS )NrW   rD   )r   r`   ra   r^   )rS   r   r   r_      rJ   c                    s    D ]}|| s dS qdS )NFTr   )rX   p)
predicatesr   r   r?      s    z Browser._filter_links.<locals>.fc                    s   g | ]} |r|qS r   r   )rG   rX   )r?   r   r   rI      rJ   z)Browser._filter_links.<locals>.<listcomp>)append)r"   rY   r%   rR   r   rS   rT   r   )r?   rc   r%   rR   r   rS   r   rU      s"    	


zBrowser._filter_linksc                 C   s,   | j du r&ddl}|j|  dd| _ | j S )zReturns all forms in the current document.
        The returned form objects implement the ClientForm.HTMLForm interface.
        Nr   F)Zbackwards_compat)r    
ClientFormZParseResponser3   )r"   re   r   r   r   	get_forms   s    
zBrowser.get_formsr   c                    sX   |   } dur" fdd|D }r8fdd|D }|rL|| | _| jS tddS )zSelects the specified form.Nc                    s   g | ]}|j  kr|qS r   rN   rG   r?   rN   r   r   rI      rJ   z'Browser.select_form.<locals>.<listcomp>c                    s   g | ]} |r|qS r   r   rg   )rT   r   r   rI      rJ   No form selected.)rf   r   r   )r"   rO   rT   indexZformsr   )rO   rT   r   select_form   s    
zBrowser.select_formc                 K   s.   | j du rtd| j jf i |}| |S )z$submits the currently selected form.Nrh   )r   r   Zclickr7   )r"   kwr4   r   r   r   submit   s    
zBrowser.submitc                 C   s
   | j | S r\   r   )r"   keyr   r   r   __getitem__   s    zBrowser.__getitem__c                 C   s   || j |< d S r\   rm   )r"   rn   valuer   r   r   __setitem__   s    zBrowser.__setitem__)N)NNNNN)NNNNNN)NNNNN)NNNNN)NNr   )r   r   r   r#   propertyr%   r'   r
   r7   r.   r@   r3   rC   rL   rP   rV   rZ   r[   rU   rf   rj   rl   ro   rq   r   r   r   r   r      sD   
	
 
      
 
     
!
r   c                   @   s    e Zd ZdZdd Zdd ZdS )r   a  Browser interface to test web.py apps.

    b = AppBrowser(app)
    b.open('/')
    b.follow_link(text='Login')

    b.select_form(name='login')
    b['username'] = 'joe'
    b['password'] = 'secret'
    b.submit()

    assert b.path == '/'
    assert 'Welcome joe' in b.get_text()
    c                 C   s   t |  || _d S r\   )r   r#   appr"   rs   r   r   r   r#      s    
zAppBrowser.__init__c                 C   s   t t| jS r\   )r(   r   rs   r!   r   r   r   r
     s    zAppBrowser.build_openerN)r   r   r   __doc__r#   r
   r   r   r   r   r      s   r   c                   @   s:   e Zd ZdZdZejZdd Zdd Z	dd Z
d	d
 ZdS )r   z<urllib2 handler to handle requests using web.py application.d   c                 C   s
   || _ d S r\   )rs   rt   r   r   r   r#     s    zAppHandler.__init__c                 C   s@   | j j|j| |j|jt| |jdkd}| 	||
 S )Nhttps)Z	localpartmethodhostr   r8   rw   )rs   requestr0   r+   ry   r   dictheader_itemstype_make_responser,   )r"   r4   resultr   r   r   	http_open  s    
zAppHandler.http_openc                 C   s
   |  |S r\   )r   )r"   r4   r   r   r   
https_open  s    zAppHandler.https_openc           	      C   sb   d dd |jD }dd l}||}tt|j||}|jd d\}}t	|| |_
|_|S )Nz
c                 S   s   g | ]\}}d ||f qS )z%s: %sr   )rG   kvr   r   r   rI      rJ   z-AppHandler._make_response.<locals>.<listcomp>r   r   )rK   r|   emailmessage_from_stringr   r   r   r   splitintr2   msg)	r"   r   r   r   r   r8   responser2   r   r   r   r   r~     s    
zAppHandler._make_responseN)r   r   r   ru   handler_orderr   do_request_https_requestr#   r   r   r~   r   r   r   r   r     s   r   )ru   r<   r>   ior   netr   utilsr   urllib.requestr   r   r   r	   r
   r(   urllib.parser   http.cookiejarr   urllib.responser   r)   __all__	Exceptionr   objectr   r   r   r   r   r   r   <module>   s"    U