
    Df                        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e          Z G d de          Z G d de          Z G 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                       e Zd ZdS )r   N)__name__
__module____qualname__     :/var/www/media/lib/python3.11/site-packages/web/browser.pyr   r      s        Dr   r   c                       e Zd Zd Zed             Zd Zd Zd Zdi fdZ	d Z
d	 Zd
 ZddZd Z	 ddZ	 	 	 	 	 	 ddZ	 ddZ	 	 	 	 	 ddZd ZddZd Zd Zd ZdS )r   c                     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selfs    r   __init__zBrowser.__init__   sT    "!4T^!D!D	)		r   c                 6    | j                             d          S )Nzutf-8)r#   decoder&   s    r   textzBrowser.text)   s    y(((r   c                 8    | j                                          dS )zClears all cookies and history.N)r   clearr&   s    r   resetzBrowser.reset-   s    r   c                     t                      S )zBuilds the opener using (urllib2/urllib.request).build_opener.
        Subclasses can override this function to prodive custom openers.
        )urllib_build_openerr&   s    r   r   zBrowser.build_opener1   s     #$$$r   c                 d   t           r5t          d|                                |                                           |                                 }|                    | j                   	 |                    |          | _        n# t          $ r}|| _        Y d }~nd }~ww xY w| j        
                                | _        t          | j                  j        | _        | j                                        | _        | j        j        | _        d | _        d | _        |                                 S )N
requesting)DEBUGprint
get_methodget_full_urlr   add_handlerr   openr$   r
   geturlr    r	   selectorr!   readr#   coder"   r%   r   get_response)r'   reqopeneres       r   
do_requestzBrowser.do_request7   s    	F, 0 0#2B2B2D2DEEE""$$41222	#[[--DNN 	 	 	DNNNNNN	 >((**DH%%.	N''))	n)	  """s   ,B 
B"BB"Nc                 x    t          | j        |          }t          |||          }|                     |          S )zOpens the specified url.)r   r    r	   rA   )r'   r    r#   headersr>   s        r   r8   zBrowser.openK   s6    dh$$c4))s###r   c                     t          dd          }|                    | j                   |                                 dt          j                            d          z   }t          j         |           dS )z+Opens the current page in real web browser.z	page.htmlwzfile://N)r8   writer#   closeosr!   abspath
webbrowser)r'   fr    s      r   showzBrowser.showR   s`    c""						"'//+666r   c                     t          t          | j                  | j                                        | j                                                  S )z'Returns a copy of the current response.)r   r   r#   r$   infor9   r&   s    r   r=   zBrowser.get_response[   sA    DI 3 3 5 5t~7L7L7N7N
 
 	
r   c                 >    ddl }|                     | j                  S )z/Returns beautiful soup of the current document.r   N)BeautifulSoupr#   )r'   rP   s     r   get_soupzBrowser.get_soupa   s$    **49555r   c                     |p|                                  }d                    d |                                D                       S )z;Returns content of e or the current document as plain text. c                 V    g | ]&}t          |t                    t          |          'S r   )
isinstancestrr   ).0cs     r   
<listcomp>z$Browser.get_text.<locals>.<listcomp>k   s.    WWWJqRUDVDVW[^^WWWr   )rQ   joinrecursiveChildGenerator)r'   r@   s     r   get_textzBrowser.get_textg   sG     wwWWQ%>%>%@%@WWW
 
 	
r   c                 j    |                                  }d |                    d          D             S )Nc                     g | ]}|S r   r   )rW   as     r   rY   z&Browser._get_links.<locals>.<listcomp>p   s    222a222r   r_   name)rQ   findAll)r'   soups     r   
_get_linkszBrowser._get_linksn   s1    }}224<<S<112222r   c                 \    |                      |                                 |||||          S )z"Returns all links in the document.r+   
text_regexr    	url_regex	predicate)_filter_linksrd   )r'   r+   rg   r    rh   ri   s         r   	get_linkszBrowser.get_linksr   s=     !!OO! " 
 
 	
r   c                     |7|                      |                                 |||||          }|o|d         }|r|                     |d                   S t          d          )Nrf   r   hrefzNo link found)rj   rk   r8   r   )r'   linkr+   rg   r    rh   ri   linkss           r   follow_linkzBrowser.follow_link   s{     <&&  %## '  E %U1XD 	099T&\***///r   c                 t    |                      |                                 |||||          }|r|d         pd S )Nrf   r   )rj   rk   )r'   r+   rg   r    rh   ri   ro   s          r   	find_linkzBrowser.find_link   sP     ""NN! # 
 
 !q)T)r   c                 6   g                      fd                                fd                                fd                                fd           |r|                     |           fdfd|D             S )Nc                     | j         k    S N)string)rn   r+   s    r   <lambda>z'Browser._filter_links.<locals>.<lambda>   s    4;$+> r   c                 V    t                                        | j        pd          S )NrS   )r   searchrv   )rn   rg   s    r   rw   z'Browser._filter_links.<locals>.<lambda>   s$    Z
33::4;;L"MM r   c                 6    |                      d          k    S )Nrm   )get)rn   r    s    r   rw   z'Browser._filter_links.<locals>.<lambda>   s    488F+;+;s+B r   c                 p    t                                        |                     dd                    S )Nrm   rS   )r   ry   r{   )rn   rh   s    r   rw   z'Browser._filter_links.<locals>.<lambda>   s+    Z	2299$((62:N:NOO r   c                 .    D ]} ||           s dS dS )NFTr   )rn   p
predicatess     r   rK   z Browser._filter_links.<locals>.f   s3     ! !qww ! 55!4r   c                 *    g | ]} |          |S r   r   )rW   rn   rK   s     r   rY   z)Browser._filter_links.<locals>.<listcomp>   s&    222!!D''2222r   )append)	r'   ro   r+   rg   r    rh   ri   rK   r   s	     ```` @@r   rj   zBrowser._filter_links   s     
>>>>???!MMMM   ?BBBBCCC OOOO    	(Y'''	 	 	 	 	 32222222r   c                     | j         2ddl}|                    |                                 d          | _         | j         S )zReturns all forms in the current document.
        The returned form objects implement the ClientForm.HTMLForm interface.
        Nr   F)backwards_compat)r%   
ClientFormParseResponser=   )r'   r   s     r   	get_formszBrowser.get_forms   sO     ;$22!!##e 3  DK {r   r   c                     |                                  }fd|D             }rfd|D             }|r||         | _        | j        S t          d          )zSelects the specified form.Nc                 *    g | ]}|j         k    |S r   r`   )rW   rK   ra   s     r   rY   z'Browser.select_form.<locals>.<listcomp>   s     88814Qr   c                 *    g | ]} |          |S r   r   )rW   rK   ri   s     r   rY   z'Browser.select_form.<locals>.<listcomp>   s&    666116Q666r   No form selected.)r   r   r   )r'   ra   ri   indexformss    ``  r   select_formzBrowser.select_form   s}      8888888E 	76666666E 	4eDI92333r   c                 |    | j         t          d           | j         j        di |}|                     |          S )z$submits the currently selected form.Nr   r   )r   r   clickrA   )r'   kwr>   s      r   submitzBrowser.submit   sD    92333dio####s###r   c                     | j         |         S ru   r   )r'   keys     r   __getitem__zBrowser.__getitem__   s    y~r   c                     || j         |<   d S ru   r   )r'   r   values      r   __setitem__zBrowser.__setitem__   s    	#r   ru   )NNNNN)NNNNNN)NNr   )r   r   r   r(   propertyr+   r.   r   rA   r8   rL   r=   rQ   r\   rd   rk   rp   rr   rj   r   r   r   r   r   r   r   r   r   r      s          ) ) X)  % % %# # #( "2 $ $ $ $  
 
 
6 6 6
 
 
 
3 3 3
 OS
 
 
 
 0 0 0 04 OS* * * *  3 3 3 3B
 
 
4 4 4 4$ $ $      r   r   c                       e Zd ZdZd Z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                 H    t                               |            || _        d S ru   )r   r(   appr'   r   s     r   r(   zAppBrowser.__init__   s!    r   c                 D    t          t          | j                            S ru   )r0   r   r   r&   s    r   r   zAppBrowser.build_opener  s    ":dh#7#7888r   N)r   r   r   __doc__r(   r   r   r   r   r   r      s<           9 9 9 9 9r   r   c                   <    e Zd ZdZdZej        Zd Zd Z	d Z
d ZdS )r   z<urllib2 handler to handle requests using web.py application.d   c                     || _         d S ru   )r   r   s     r   r(   zAppHandler.__init__  s    r   c           
      $   | j                             |j        |                                |j        |j        t          |                                          |j        dk              }| 	                    ||
                                          S )Nhttps)	localpartmethodhostr#   rC   r   )r   requestr:   r5   r   r#   dictheader_itemstype_make_responser6   )r'   r>   results      r   	http_openzAppHandler.http_open  s    !!l>>##))++,,8w& " 
 
 ""63+;+;+=+=>>>r   c                 ,    |                      |          S ru   )r   )r'   r>   s     r   
https_openzAppHandler.https_open  s    ~~c"""r   c                 :   d                     d |j        D                       }dd l}|                    |          }t	          t          |j                  ||          }|j                            d d          \  }}t          |          |c|_
        |_        |S )Nz
c                 "    g | ]\  }}|d |S )z: r   )rW   kvs      r   rY   z-AppHandler._make_response.<locals>.<listcomp>   s'    NNN$!Q11-NNNr   r   r   )rZ   r   emailmessage_from_stringr   r   r#   r"   splitintr<   msg)	r'   r   r    r#   r   rC   responser<   r   s	            r   r   zAppHandler._make_response  s    {{NN&:MNNNOO++D11gfk22GSAAM''a00	c&)$ii#x|r   N)r   r   r   r   handler_orderr   do_request_https_requestr(   r   r   r   r   r   r   r   r     sc        FFM+M  	? 	? 	?# # #    r   r   )r   rH   rJ   ior   netr   utilsr   urllib.requestr   r   r	   r
   r   r0   urllib.parser   http.cookiejarr   urllib.responser   r3   __all__	Exceptionr   objectr   r   r   r   r   r   <module>r      s    
			                       O O O O O O O O O O O O > > > > > >             $ $ $ $ $ $ & & & & & & 	
A
A
A	 	 	 	 	9 	 	 	Q Q Q Q Qf Q Q Qh9 9 9 9 9 9 9 90" " " " " " " " " "r   