o
    ›¨ÊhØ  ã                   @   sl   d dl Z d dlmZ d dlmZ ddlmZmZ ddlm	Z	 ddl
mZ G d	d
„ d
eƒZG dd„ deƒZdS )é    N)Úurljoin)Úget_anymail_settingé   )ÚAnymailBaseBackendÚBasePayloadé   )ÚAnymailRequestsAPIError)Ú__version__c                       sT   e Zd ZdZ‡ fdd„Zdd„ Zdd„ Z‡ fdd	„Zd
d„ Zdd„ Z	dd„ Z
‡  ZS )ÚAnymailRequestsBackendzO
    Base Anymail email backend for ESPs that use an HTTP API via requests
    c                    s6   || _ td|dd�| _tt| ƒjdi |¤Ž d| _dS )z!Init options from Django settingsÚrequests_timeouté   )ÚkwargsÚdefaultN© )Úapi_urlr   ÚtimeoutÚsuperr
   Ú__init__Úsession)Úselfr   r   ©Ú	__class__r   úP/var/www/html/env/lib/python3.10/site-packages/anymail/backends/base_requests.pyr      s   
zAnymailRequestsBackend.__init__c                 C   sf   | j rdS zt ¡ | _ W n tjy   | js‚ Y d S w dj| j ¡ t| j j	 
dd¡d�| j j	d< dS )NFz%django-anymail/{version}-{esp} {orig}z
User-AgentÚ )ÚespÚversionÚorigT)r   ÚrequestsÚSessionÚRequestExceptionÚfail_silentlyÚformatÚesp_nameÚlowerr	   ÚheadersÚget©r   r   r   r   Úopen   s   ÿÿ
þzAnymailRequestsBackend.openc                 C   s\   | j d u rd S z"z| j  ¡  W n tjy   | js‚ Y nw W d | _ d S W d | _ d S d | _ w ©N)r   Úcloser   r   r    r&   r   r   r   r)   %   s   
ÿÿÿ
ýzAnymailRequestsBackend.closec                    s2   | j d u r| jj}tdj|d�ƒ‚tt| ƒ |¡S )Nz›Session has not been opened in {class_name}._send. (This is either an implementation error in {class_name}, or you are incorrectly calling _send directly.))Ú
class_name)r   r   Ú__name__ÚRuntimeErrorr!   r   r
   Ú_send)r   Úmessager*   r   r   r   r-   0   s   
þÿzAnymailRequestsBackend._sendc              
   C   sŽ   |  | j¡}| d| j¡ z| jjdi |¤Ž}W n% tjy= } ztdt	t|ƒfi ƒ}|d| 
dd¡ |||d�‚d}~ww |  |||¡ |S )	a%  Post payload to ESP send API endpoint, and return the raw response.

        payload is the result of build_message_payload
        message is the original EmailMessage
        return should be a requests.Response

        Can raise AnymailRequestsAPIError for HTTP errors in the post
        r   r   zError posting to %s:Úurlz<missing url>)Úraised_fromÚemail_messageÚpayloadNr   )Úget_request_paramsr   Ú
setdefaultr   r   Úrequestr   r   Útyper   r%   Úraise_for_status)r   r2   r.   ÚparamsÚresponseÚerrÚ	exc_classr   r   r   Úpost_to_esp9   s   	þ€üz"AnymailRequestsBackend.post_to_espc                 C   s   |j dkrt|||| d�‚dS )zâRaise AnymailRequestsAPIError if response is an HTTP error

        Subclasses can override for custom error checking
        (though should defer parsing/deserialization of the body to
        parse_recipient_status)
        éÈ   ©r1   r2   r9   ÚbackendN)Ústatus_coder   ©r   r9   r2   r.   r   r   r   r7   P   s
   
ÿÿz'AnymailRequestsBackend.raise_for_statusc              
   C   s2   z|  ¡ W S  ty   td| j |||| d�‚w )znDeserialize an ESP API response that's in json.

        Useful for implementing deserialize_response
        zInvalid JSON in %s API responser>   )ÚjsonÚ
ValueErrorr   r"   rA   r   r   r   Údeserialize_json_response[   s   

þÿz0AnymailRequestsBackend.deserialize_json_response)r+   Ú
__module__Ú__qualname__Ú__doc__r   r'   r)   r-   r<   r7   rD   Ú__classcell__r   r   r   r   r
   
   s    	r
   c                       s>   e Zd ZdZ		d‡ fdd„	Zdd„ Zdd	„ Zd
d„ Z‡  ZS )ÚRequestsPayloadz+Abstract Payload for AnymailRequestsBackendÚPOSTNc
           
         s<   || _ || _|| _|| _|| _|	| _tt| ƒ |||¡ d S r(   )	Úmethodr8   Údatar$   ÚfilesÚauthr   rI   r   )
r   r.   Údefaultsr?   rK   r8   rL   r$   rM   rN   r   r   r   r   k   s   zRequestsPayload.__init__c              	   C   sD   |   ¡ }|durt||ƒ}n|}t| j|| j|  ¡ | j| j| jd�S )z¥Returns a dict of requests.request params that will send payload to the ESP.

        :param api_url: the base api_url for the backend
        :return: dict
        N)rK   r/   r8   rL   r$   rM   rN   )	Úget_api_endpointr   ÚdictrK   r8   Úserialize_datar$   rM   rN   )r   r   Úapi_endpointr/   r   r   r   r3   v   s   ùz"RequestsPayload.get_request_paramsc                 C   s   dS )zVReturns a str that should be joined to the backend's api_url for sending this payload.Nr   r&   r   r   r   rP   Ž   s   z RequestsPayload.get_api_endpointc                 C   s   | j S )zJPerforms any necessary serialization on self.data, and returns the result.)rL   r&   r   r   r   rR   ’   s   zRequestsPayload.serialize_data)rJ   NNNNN)	r+   rE   rF   rG   r   r3   rP   rR   rH   r   r   r   r   rI   h   s    þrI   )r   Úsix.moves.urllib.parser   Úanymail.utilsr   Úbaser   r   Ú
exceptionsr   Ú_versionr	   r
   rI   r   r   r   r   Ú<module>   s    ^