a
    ß™fbÌ  ã                   @   s€   d dl Z d dlZd dlZd dlZd dlmZ d dlmZm	Z	 ddl
mZ ddlmZ g ZG dd„ deƒZG dd	„ d	eje	ƒZdS )
é    N)ÚSimpleXMLRPCRequestHandlerÚSimpleXMLRPCServeré   )Ú	SAMP_ICON)ÚSAMPWarningc                   @   s    e Zd ZdZdd„ Zdd„ ZdS )ÚSAMPSimpleXMLRPCRequestHandlerz6
    XMLRPC handler of Standard Profile requests.
    c                 C   s:   | j dkr6|  dd¡ |  dd¡ |  ¡  | j t¡ d S )Nz
/samp/iconéÈ   ZOKzContent-Typez	image/png)ÚpathÚsend_responseÚsend_headerÚend_headersÚwfileÚwriter   )Úself© r   ú<lib/python3.9/site-packages/astropy/samp/standard_profile.pyÚdo_GET   s
    
z%SAMPSimpleXMLRPCRequestHandler.do_GETc              
   C   s¢  |   ¡ s|  ¡  dS zTd}t| jd ƒ}g }|r`t||ƒ}| | j |¡¡ |t|d ƒ8 }q.d 	|¡}t
 |¡\}}|dkrÔt|ƒ}| | j¡ d| jv r²| | j d¡¡ n
| d¡ t|ƒ}t
j||d	}n`|d
v r4d}|dkr
|  ¡ |d d< ||d d< n|  ¡ |d d< ||d d< t
j||d	}|  |¡}|du rNW dS | j |t| ddƒ| j¡}	W n’ tyü }
 zx|  d¡ t| jdƒrÔ| jjrÔ|  dt|
ƒ¡ t ¡ }t| dd¡dƒ}|  d|¡ |  dd¡ |   ¡  W Y d}
~
nªd}
~
0 0 |  d¡ |  dd¡ | j!durvt|	ƒ| j!krv|  "¡  dd¡}|rvzt
 #|	¡}	|  dd¡ W n t$yt   Y n0 |  dtt|	ƒƒ¡ |   ¡  | j% &|	¡ dS )zÏ
        Handles the HTTP POST request.

        Attempts to interpret all HTTP POST requests as XML-RPC calls,
        which are forwarded to the server's ``_dispatch`` method for
        handling.
        Ni    zcontent-lengthéÿÿÿÿó    zsamp.webhub.registerZOriginÚunknown)Z
methodname)zsamp.hub.notifyzsamp.hub.notifyAllzsamp.hub.callzsamp.hub.callAllúsamp.hub.callAndWaitr   é   ZhostÚuserZ	_dispatchiô  Ú_send_traceback_headerzX-exceptionÚASCIIÚbackslashreplacezX-tracebackzContent-lengthÚ0r   zContent-typeztext/xmlZgzipr   zContent-Encoding)'Zis_rpc_path_validZ
report_404ÚintZheadersÚminÚappendZrfileÚreadÚlenÚjoinÚxmlrpcÚloadsÚlistÚclient_addressÚgetÚtupleÚdumpsZaddress_stringZdecode_request_contentZserverZ_marshaled_dispatchÚgetattrr	   Ú	Exceptionr
   Úhasattrr   r   ÚstrÚ	tracebackÚ
format_excÚencoder   Zencode_thresholdZaccept_encodingsZgzip_encodeÚNotImplementedErrorr   r   )r   Zmax_chunk_sizeZsize_remainingÚLZ
chunk_sizeÚdataÚparamsÚmethodr   ZresponseÚeZtraceÚqr   r   r   Údo_POST   sx    








ÿ
ÿ

z&SAMPSimpleXMLRPCRequestHandler.do_POSTN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r8   r   r   r   r   r      s   r   c                   @   s,   e Zd ZdZdedddfdd„Zdd„ ZdS )ÚThreadingXMLRPCServerz3
    Asynchronous multithreaded XMLRPC server.
    NTc                 C   s   || _ t | |||||¡ d S )N)Úlogr   Ú__init__)r   Zaddrr>   ZrequestHandlerZlogRequestsZ
allow_noneÚencodingr   r   r   r?   ‡   s    
ÿzThreadingXMLRPCServer.__init__c                 C   s<   | j d u rtj | ||¡ nt d |t ¡ d ¡t	¡ d S )Nz;Exception happened during processing of request from {}: {}r   )
r>   ÚsocketserverZ
BaseServerÚhandle_errorÚwarningsÚwarnÚformatÚsysÚexc_infor   )r   Zrequestr&   r   r   r   rB   Ž   s    
ÿþz"ThreadingXMLRPCServer.handle_error)r9   r:   r;   r<   r   r?   rB   r   r   r   r   r=   ‚   s   þ
r=   )rF   r.   rC   rA   Zxmlrpc.clientZclientr#   Zxmlrpc.serverr   r   Z	constantsr   Úerrorsr   Ú__all__r   ZThreadingMixInr=   r   r   r   r   Ú<module>   s   q