3
e`                 @   s   d dl Z d dlZd dlZddlmZ ejr6d dlm	Z	 G dd 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 )    N   )	UserAgent)WSGIEnvironmentc               @   s   e Zd ZU dcZejejejeef   d{Z	ejejejeef   	dEZ
ejdFZdGdHdIdJZeejeje eje eje eje f dKdLdMZdGS )|_UserAgentParser cros chromeos
iphone|iosiphoneipaddarwin\b|mac\b|os\s*xmacoswinwindowsandroidnetbsdopenbsdfreebsd	dragonflydragonflybsd(sun|i86)ossolarisx11\b|lin(\b|ux)?linuxnintendo\s+wiiwiiirixhp-?uxhpuxaixsco|unix_svscobsdamigablackberry|playbook
blackberrysymbian	googlebotgooglemsnbotmsnyahoo
ask jeevesaskaol|america\s+online\s+browseraol	opera|oproperaedge|edgedgechrome|crioschrome	seamonkey"firefox|firebird|phoenix|iceweaselfirefoxgaleonsafari|versionsafariwebkitcamino	konquerork-meleonkmeleonnetscape4msie|microsoft\s+internet\s+explorer|trident/.+? rv:msielynxlinksBaiduspiderbaidubingbotbingmozillaz&(?:{pattern})[/\sa-z(]*(\d+[.\da-z]+)?za(?:;\s*|\s+)(\b\w{2}\b(?:-\b\w{2}\b)?)\s*;|(?:\(|\[|;)\s*(\b\w{2}\b(?:-\b\w{2}\b)?)\s*(?:\]|\)|;)N)returnc                s,   dd  j D  _ fdd jD  _d S )Nc             S   s"   g | ]\}}|t j|t jfqS  )recompileI).0abrK   rK   7/tmp/pip-build-3irwxpxt/Werkzeug/werkzeug/useragents.py
<listcomp>D   s    z-_UserAgentParser.__init__.<locals>.<listcomp>c                s,   g | ]$\}}|t j jj|d t jfqS ))pattern)rL   rM   _browser_version_reformatrN   )rO   rP   rQ   )selfrK   rR   rS   F   s   )platform_rules	platformsbrowser_rulesbrowsers)rW   rK   )rW   rR   __init__C   s    
z_UserAgentParser.__init__)
user_agentrJ   c       	      C   s   x*| j D ]\}}|j|}|d k	rP qW d }d}tjdtjj| rdd|krd|d dkrd|jd}x@| jD ].\}}|j||d  }|d k	rl|jd}P qlW d  }}| jj|}|d k	r|jdp|jd}nd }||||fS )Nr   ztrident/.+? rv:)r      )	rY   searchrL   rM   rN   rindexr[   group_language_re)	rW   r]   platformregexmatchZlast_closing_parenbrowserversionlanguagerK   rK   rR   __call__J   s*    


z_UserAgentParser.__call__r   r   r   r	   r
   r
   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r    r!   r!   r"   r"   r#   r$   r%   r%   )rl   rm   rn   ro   rp   rq   rr   rs   rt   ru   rv   rw   rx   ry   rz   r{   r|   r}   r~   r   r   r&   r'   r(   r)   r*   r*   r+   r,   r-   r.   r/   r0   r1   r2   r3   r4   r5   r5   r6   r7   r8   r8   r9   r:   r;   r;   r<   r<   r=   r=   r>   r?   r@   r@   rA   rB   rC   rC   rD   rD   rE   rF   rG   rH   rI   rI   )r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   )__name__
__module____qualname__rX   tZClassVarIterableTuplestrrZ   rU   rL   rM   rd   r\   Optionalrk   rK   rK   rK   rR   r      sd   
                                          r   c                   s&   e Zd ZdZdd fddZ  ZS )UserAgentParserzA simple user agent parser.  Used by the `UserAgent`.

    .. deprecated:: 2.0
        Will be removed in Werkzeug 2.1. Use a dedicated parser library
        instead.
    N)rJ   c                s   t jdtdd t j  d S )Nzl'UserAgentParser' is deprecated and will be removed in Werkzeug 2.1. Use a dedicated parser library instead.r_   )
stacklevel)warningswarnDeprecationWarningsuperr\   )rW   )	__class__rK   rR   r\   {   s
    zUserAgentParser.__init__)r   r   r   __doc__r\   __classcell__rK   rK   )r   rR   r   s   s   r   c                   sN   e Zd Zejdgejf dd fddZejejejd fddZ  ZS )	_deprecated_property
_UserAgentN)fgetrJ   c                s    t  j| d|jd| _d S )NzVThe built-in user agent parser is deprecated and will be removed in Werkzeug 2.1. The z property will be 'None'. Subclass 'werkzeug.user_agent.UserAgent' and set 'Request.user_agent_class' to use a different parser.)r   r\   r   message)rW   r   )r   rK   rR   r\      s    z_deprecated_property.__init__)argskwargsrJ   c                s    t j| jtdd t j||S )N   )r   )r   r   r   r   r   __get__)rW   r   r   )r   rK   rR   r      s    z_deprecated_property.__get__)	r   r   r   r   CallableZAnyr\   r   r   rK   rK   )r   rR   r      s   "
r   c                   s   e Zd Ze Zedd fddZeej	e dddZ
eej	e ddd	Zeej	e dd
dZeej	e dddZ  ZS )r   N)stringrJ   c                s.   t  j| | j|}|\| _| _| _| _d S )N)r   r\   _parser	_platform_browser_version	_language)rW   r   info)r   rK   rR   r\      s    
z_UserAgent.__init__)rJ   c             C   s   | j S )N)r   )rW   rK   rK   rR   re      s    z_UserAgent.platformc             C   s   | j S )N)r   )rW   rK   rK   rR   rh      s    z_UserAgent.browserc             C   s   | j S )N)r   )rW   rK   rK   rR   ri      s    z_UserAgent.versionc             C   s   | j S )N)r   )rW   rK   rK   rR   rj      s    z_UserAgent.language)r   r   r   r   r   r   r\   r   r   r   re   rh   ri   rj   r   rK   rK   )r   rR   r      s   r   c                   s(   e Zd ZdZddd fddZ  ZS )r   a  Represents a parsed user agent header value.

    This uses a basic parser to try to extract some information from the
    header.

    :param environ_or_string: The header value to parse, or a WSGI
        environ containing the header.

    .. deprecated:: 2.0
        Will be removed in Werkzeug 2.1. Subclass
        :class:`werkzeug.user_agent.UserAgent` (note the new module
        name) to use a dedicated parser instead.

    .. versionchanged:: 2.0
        Passing a WSGI environ is deprecated and will be removed in 2.1.
    zt.Union[str, WSGIEnvironment]N)environ_or_stringrJ   c                sL   t |tr(tjdtdd |jdd}n|}tjdtdd t j| d S )NzzPassing an environ to 'UserAgent' is deprecated and will be removed in Werkzeug 2.1. Pass the header value string instead.r_   )r   ZHTTP_USER_AGENT zThe 'werkzeug.useragents' module is deprecated and will be removed in Werkzeug 2.1. The new base API is 'werkzeug.user_agent.UserAgent'.)
isinstancedictr   r   r   getr   r\   )rW   r   r   )r   rK   rR   r\      s    
zUserAgent.__init__)r   r   r   r   r\   r   rK   rK   )r   rR   r      s   r   )rL   typingr   r   r]   r   Z_BaseUserAgentZTYPE_CHECKINGZ_typeshed.wsgir   r   r   propertyr   r   rK   rK   rK   rR   <module>   s   h