o
    g                     @   s   d dl Zd dlZd dlmZmZmZ d dlmZ d dl	m
Z
mZmZmZ d dlmZmZmZ d dlmZ G dd de
Zdd	efd
dZ	ddejejef fddZddejfddZdd Zdd Zdd ZdS )    N)urljoinurlparse
urlunparse)etree)Resolver	XMLParserXMLSyntaxError
fromstring)DTDForbiddenEntitiesForbiddenr   )Settingsc                   @   s    e Zd ZdZdd Zdd ZdS )ImportResolverz/Custom lxml resolve to use the transport objectc                 C   s
   || _ d S )N)	transport)selfr    r   D/home/ubuntu/webapp/venv/lib/python3.10/site-packages/zeep/loader.py__init__   s   
zImportResolver.__init__c                 C   s*   t |jdv r| j|}| ||S d S )N)httphttps)r   schemer   loadresolve_string)r   urlpubidcontextcontentr   r   r   resolve   s   zImportResolver.resolveN)__name__
__module____qualname____doc__r   r   r   r   r   r   r      s    r   r   c              
   C   s   |pt  }|j }tdd||jd}|jt| z<t| ||d}| j	}|j
r6|jr6t|j
|j|j|jrT|j|jfD ]}|du rFq?| D ]}	t|	j|	jq?|W S  tjyl }
 z	td|
j | dd}
~
ww )a  Parse an XML string and return the root Element.

    :param content: The XML string
    :type content: str
    :param transport: The transport instance to load imported documents
    :type transport: zeep.transports.Transport
    :param base_url: The base url of the document, used to make relative
      lookups absolute.
    :type base_url: str
    :param settings: A zeep.settings.Settings object containing parse settings.
    :type settings: zeep.settings.Settings
    :returns: The document root
    :rtype: lxml.etree._Element

    TF)remove_commentsresolve_entitiesrecover	huge_tree)parserbase_urlNz!Invalid XML content received (%s))r   )r   strictr   xml_huge_tree	resolversaddr   r	   getroottreedocinfodoctype
forbid_dtdr
   
system_url	public_idforbid_entitiesinternalDTDexternalDTDiterentitiesr   namer   r   r   msg)r   r   r&   settingsr#   r%   elementtreer,   dtdentityexcr   r   r   	parse_xml   s>   


r<   r   c                 C   sF   |pt  }t| dr|  }n|rt| |} || }t||||dS )Load an external XML document.

    :param url:
    :param transport:
    :param base_url:
    :param settings: A zeep.settings.Settings object containing parse settings.
    :type settings: zeep.settings.Settings

    readr7   r   hasattrr>   absolute_locationr   r<   r   r   r&   r7   r   r   r   r   load_externalG   s   




rD   c                    sN   |pt  }t| dr|  }n|rt| |} || I dH }t||||dS )r=   r>   Nr?   r@   rC   r   r   r   load_external_async]   s   




rE   c                 C   sX   |rt ||}|r*| jr*t|}t|}|j|jkr*|j|jkr*td|dd  }|S )zReturn a 'normalized' url for the given url.

    This will make the url absolute and force it to https when that setting is
    enabled.

    )r      N)rB   force_httpsr   netlocr   r   )r7   r   r&   base_url_parts	url_partsr   r   r   normalize_locationq   s   

rK   c                 C   sp   | |kr| S t | jdv r| S |rt |jdv rt|| S tj| r%| S |r6tjtjtj|| S | S )zMake an url absolute (if it is optional) via the passed base url.

    :param location: The (relative) url
    :type location: str
    :param base: The base location
    :type base: str
    :returns: An absolute URL
    :rtype: str

    r   r   file)	r   r   r   ospathisabsrealpathjoindirname)locationbaser   r   r   rB      s   
rB   c                 C   s    t | jdv r	dS tj|  S )zCheck if the given value is a relative path

    :param value: The value
    :type value: str
    :returns: Boolean indicating if the url is relative. If it is absolute then
      False is returned.
    :rtype: boolean

    rL   F)r   r   rN   rO   rP   )valuer   r   r   is_relative_path   s   
rW   )NN)os.pathrN   typingurllib.parser   r   r   lxmlr   
lxml.etreer   r   r   r	   zeep.exceptionsr
   r   zeep.settingsr   r   strr<   UnionIOrD   rE   rK   rB   rW   r   r   r   r   <module>   s"    0
