
?T1                 @   sv  d  d l  Z  d  d l Z d  d l Z e  j d  d k Z y$ d  d l m Z d  d l m Z Wn2 e k
 r d  d l	 m
 Z d  d l	 m Z Yn Xy0 d  d l m Z d  d l m Z m Z m Z Wn> e k
 r d  d l m Z d  d l m Z m Z m Z Yn Xd	 Z d
 a d d   Z Gd d   d e  Z Gd d   d e  Z d d   Z d d d d  d d  Z Gd d   d e  Z Gd d   d e  Z Gd d   d e  Z Gd d   d  Z Gd d   d e  Z Gd d    d  e  Z  e! d! k rre  d" d# d
 Z" e" j# d$  Z$ e% e$  e" j& d%  Z' e% e'  e" j# d$ d&  Z( e% e(  e" j# d'  Z) e% e)  n  d S)(    N   )HTTPConnection)HTTPSConnection)HTTP)HTTPS)unquote)	splithost	splittype	splituserz0.0.1   c               C   s   t  d a  t  S)Nr   )ID r   r   4/home/prologic/work/circuits/tests/web/jsonrpclib.py_gen_id:   s    
r   c               @   s"   e  Z d  Z d Z d d   Z d S)ErrorzBase class for client errors.c             C   s
   t  |   S)N)repr)selfr   r   r   __str__H   s    zError.__str__N)__name__
__module____qualname____doc__r   r   r   r   r   r   F   s   r   c               @   s.   e  Z d  Z d Z d d   Z d d   Z d S)ProtocolErrorz!Indicates an HTTP protocol error.c             C   s>   t  j |   | |  _ | |  _ | |  _ | |  _ | |  _ d  S)N)r   __init__urlerrcodeerrmsgheadersresponse)r   r   r   r   r   r   r   r   r   r   Y   s    				zProtocolError.__init__c             C   s   d |  j  |  j |  j f S)Nz<ProtocolError for %s: %s %s>)r   r   r   )r   r   r   r   __repr__a   s    zProtocolError.__repr__N)r   r   r   r   r   r   r   r   r   r   r   V   s   r   c             C   s"   t  |   } t |  } | | f S)N)UnmarshallerParser)encodingZunZparr   r   r   	getparserh   s    r#   c             C   s>   | r: i  } | | d <|  | d <t    | d <t j |  Sd  S)Nmethodparamsid)r   jsondumps)r%   
methodnamemethodresponser"   
allow_nonerequestr   r   r   r(   n   s    

r(   c               @   s4   e  Z d  Z d d   Z d d   Z d d   Z d S)r    c             C   s   d  |  _  | |  _ d  S)N)datar"   )r   r"   r   r   r   r   z   s    	zUnmarshaller.__init__c             C   s/   |  j  d  k r | |  _  n |  j  | |  _  d  S)N)r-   )r   r-   r   r   r   feed~   s    zUnmarshaller.feedc             C   s   t  j |  j j |  j   S)N)r'   loadsr-   decoder"   )r   r   r   r   close   s    zUnmarshaller.closeN)r   r   r   r   r.   r1   r   r   r   r   r    x   s   r    c               @   s4   e  Z d  Z d d   Z d d   Z d d   Z d S)r!   c             C   s   | |  _  d  |  _ d  S)N)_targetr-   )r   Zunmarshallerr   r   r   r      s    	zParser.__init__c             C   s/   |  j  d  k r | |  _  n |  j  | |  _  d  S)N)r-   )r   r-   r   r   r   r.      s    zParser.feedc             C   s   |  j  j |  j  d  S)N)r2   r.   r-   )r   r   r   r   r1      s    zParser.closeN)r   r   r   r   r.   r1   r   r   r   r   r!      s   r!   c               @   s4   e  Z d  Z d d   Z d d   Z d d   Z d S)_Methodc             C   s   | |  _  | |  _ d  S)N)_Method__send_Method__name)r   sendnamer   r   r   r      s    	z_Method.__init__c             C   s   t  |  j d |  j | f  S)Nz%s.%s)r3   r4   r5   )r   r7   r   r   r   __getattr__   s    z_Method.__getattr__c             G   s   |  j  |  j |  S)N)r4   r5   )r   argsr   r   r   __call__   s    z_Method.__call__N)r   r   r   r   r8   r:   r   r   r   r   r3      s   r3   c               @   s   e  Z d  Z d Z d e Z d d d  Z d d   Z d d	   Z d
 d   Z	 d d   Z
 d d   Z d d   Z d d   Z d d   Z d d   Z d S)	Transportz2Handles an HTTP transaction to an JSON-RPC server.z jsonlib.py/%s (by matt harrison)r   c             C   sP  |  j  |  } | r% | j d  n  |  j | | |  t sQ |  j | |  n  |  j |  |  j | |  y% | j   \ } } }	 | j   }
 Wn< t	 k
 r | j
   }
 |
 j } |
 j } |
 j   }	 Yn X| d k r	|
 j   } t | | | | |	 |   n  | |  _ y | j j } Wn t	 k
 r<d  } Yn X|  j |
 | |  S)Nr      )make_connectionset_debuglevelsend_requestPY3	send_hostsend_user_agentsend_contentZgetreplygetfileAttributeErrorgetresponsestatusreason
getheadersreadr   verboseZ_connsock_parse_response)r   hosthandlerrequest_bodyr"   rK   hr   r   r   rr   rL   r   r   r   r,      s:    			zTransport.requestc             C   s
   t  |  S)N)r#   )r   r"   r   r   r   r#      s    zTransport.getparserc             C   s   i  } t  | t  r$ | \ } } n  t |  \ } } | r| t j t |   } d j | j    } d d | f g } n d  } | | | f S)N AuthorizationzBasic )
isinstancetupler
   base64encodestringr   joinsplit)r   rN   x509authextra_headersr   r   r   get_host_info   s    zTransport.get_host_infoc             C   s"   |  j  |  \ } } } t |  S)N)r^   r   )r   rN   r]   r[   r   r   r   r=     s    zTransport.make_connectionc             C   s   | j  d |  d  S)NPOST)
putrequest)r   
connectionrO   rP   r   r   r   r?     s    zTransport.send_requestc             C   s   |  j  |  \ } } } | j d |  | r| t | t  rR t | j    } n  x' | D] \ } } | j | |  qY Wn  d  S)NHost)r^   	putheaderrU   dictlistitems)r   ra   rN   r]   r[   keyvaluer   r   r   rA   &  s    zTransport.send_hostc             C   s   | j  d |  j  d  S)Nz
User-Agent)rc   
user_agent)r   ra   r   r   r   rB   4  s    zTransport.send_user_agentc             C   sP   | j  d d  | j  d t t |    | j   | rL | j |  n  d  S)NzContent-Typeztext/xmlzContent-Length)rc   strlen
endheadersr6   )r   ra   rP   r   r   r   rC   =  s
    
zTransport.send_contentc             C   s   |  j  | d   S)N)rM   )r   filer   r   r   parse_responseJ  s    zTransport.parse_responsec             C   s   |  j  |  \ } } x` | r0 | j d  } n | j d  } | sI Pn  |  j rh t d t |   n  | j |  q | j   | j   | j   S)Ni   zbody:)r#   recvrJ   rK   printr   r.   r1   )r   rm   rL   r"   pur   r   r   r   rM   X  s    	

zTransport._parse_responseN)r   r   r   r   __version__ri   r,   r#   r^   r=   r?   rA   rB   rC   rn   rM   r   r   r   r   r;      s   
-		r;   c               @   s"   e  Z d  Z d Z d d   Z d S)SafeTransportz3Handles an HTTPS transaction to an JSON-RPC server.c             C   s]   |  j  |  \ } } } y
 t } Wn t k
 rB t d   Yn X| | d  | pU i   Sd  S)Nz-your version of httplib doesn't support HTTPS)r^   r   rE   NotImplementedError)r   rN   r]   r[   r   r   r   r   r=   v  s    
zSafeTransport.make_connectionN)r   r   r   r   r=   r   r   r   r   rt   q  s   rt   c               @   sR   e  Z d  Z d d d d d d  Z d d   Z d d   Z e Z d	 d
   Z d S)ServerProxyNr   c             C   s   t  |  \ } } | d k r- t d   n  t |  \ |  _ |  _ |  j sZ d |  _ n  | d  k r | d k r~ t   } q t   } n  | |  _ | |  _ | |  _	 | |  _
 d  S)NhttphttpszUnsupported JSONRPC protocolz/RPC2)zhttpzhttps)r	   IOErrorr   _ServerProxy__host_ServerProxy__handlerrt   r;   _ServerProxy__transport_ServerProxy__encoding_ServerProxy__verbose_ServerProxy__allow_none)r   uri	transportr"   rK   r+   Zutyper   r   r   r     s    				zServerProxy.__init__c             C   s}   t  | | d |  j d |  j } |  j j |  j |  j | j |  j  |  j d |  j } t	 |  d k ry | d } n  | S)z+call a method on the remote server
        r"   r+   rK   r   r   )
r(   r}   r   r|   r,   rz   r{   encoder~   rk   )r   r)   r%   r,   r   r   r   r   	__request  s    		zServerProxy.__requestc             C   s   d |  j  |  j f S)Nz<JSONProxy for %s%s>)rz   r{   )r   r   r   r   r     s    zServerProxy.__repr__c             C   s   t  |  j |  S)N)r3   _ServerProxy__request)r   r7   r   r   r   r8     s    zServerProxy.__getattr__)r   r   r   r   r   r   r   r8   r   r   r   r   rv     s   rv   __main__zhttp://localhost:8080/foo/rK   zfoo barotherZbaz   )*sysr'   rW   version_infor@   http.clientr   r   ImportErrorhttplibr   r   urllib.parser   r   r	   r
   urllibrs   r   r   	Exceptionr   r   r#   r(   objectr    r!   r3   r;   rt   rv   r   sechocrp   Zbaddefr   r   r   r   <module>!   sN    !		9


