B
    îq\Ì  ã               @   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.7/site-packages/astropy/samp/standard_profile.pyÚdo_GET   s
    
z%SAMPSimpleXMLRPCRequestHandler.do_GETc          
   C   s¤  |   ¡ s|  ¡  dS yVd}t| jd ƒ}g }x4|rbt||ƒ}| | j |¡¡ |t|d ƒ8 }q0W d 	|¡}t
 |¡\}}|dkrØt|ƒ}| | j¡ d| jkr¶| | j d¡¡ n
| d¡ t|ƒ}t
j||d	}n`|d
kr8d}|dkr|  ¡ |d d< ||d d< n|  ¡ |d d< ||d d< t
j||d	}|  |¡}|dkrPdS | j |t| ddƒ| j¡}	W n tk
rü }
 zp|  d¡ t| jdƒrØ| jjrØ|  dt|
ƒ¡ t ¡ }t| dd¡dƒ}|  d|¡ |  dd¡ |   ¡  W dd}
~
X Y n¤X |  d¡ |  dd¡ | j!dk	rxt|	ƒ| j!krx|  "¡  dd¡}|rxyt
 #|	¡}	|  dd¡ W n t$k
rv   Y nX |  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.callAllzsamp.hub.callAndWaitzsamp.hub.callAndWaité   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ÚdataZparamsÚmethodr   ZresponseÚeZtraceÚqr   r   r   Údo_POST   st    












z&SAMPSimpleXMLRPCRequestHandler.do_POSTN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r6   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 k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   r@   Ž   s
    
z"ThreadingXMLRPCServer.handle_error)r7   r8   r9   r:   r   r=   r@   r   r   r   r   r;   ‚   s
   r;   )rD   r-   rA   r?   Zxmlrpc.clientZclientr"   Zxmlrpc.serverr   r   Z	constantsr   Úerrorsr   Ú__all__r   ZThreadingMixInr;   r   r   r   r   Ú<module>   s   q