B
    EDb¼0  ã            	   @   s  d dl Z d dlZd dlZd dlZd dlZd dlZd dlZd dlmZm	Z	 d dl
mZmZ d dlmZ d dlmZmZ e jd  dkr¤d dlmZmZ d dlmZmZ n(d d	lmZ d d
lmZ d dlmZmZ e dej¡ae dej¡Ze dej¡Ze dej¡a d7dd„Z!dd„ Z"dd„ Z#G dd„ de$ƒZ%G dd„ de$ƒZ&e'dkre j(d Z)e j(d Z*e&e)ƒZ+e*dkrŽe,dd -e+ .¡ ¡ ƒ e  /d ¡ e+ 0e*¡Z1e2e1d ƒZ3e2e1d  ƒZ4ed!e j(d  d" -e1d ¡f d#Z5e	e5d$d%ƒZ6e	e5d&d'e* ƒZ7x„e3D ]|Z8e1d( e8 d) d*kr@e6j9d+e8 :d,d-¡ e8d.d/ -e1d( e8 d0 ¡d1 n.e6j9d+e8 :d,d-¡ e8d/ -e1d( e8 d0 ¡d2 qôW e5 ;e6¡ x„e4D ]|Z8e1d( e8 d) d*krÐe7j9d+e8 :d,d-¡ e8d.d/ -e1d( e8 d0 ¡d1 n.e7j9d+e8 :d,d-¡ e8d/ -e1d( e8 d0 ¡d2 q„W e5 ;e7¡ e5 <¡ \Z=Z>i Z?x:e1d  D ].Z8e@d3e8 ƒZAeAdkr(e4 Be8¡ eAe?e8< q(W x:e1d D ].Z8e@d3e8 ƒZAeAdkrde3 Be8¡ eAe?e8< qdW eCe j(ƒdeCe3ƒ k rÊe,d4d" -e3¡ ƒ e  /d¡ d ZDx*e>dd… D ]ZEeEe?e3eD < eDd7 ZDqÜW eje@d5e* ƒjFdd6 dS )8é    N)ÚOptionParserÚOptionGroup)ÚMultiPartReaderÚMultiPartWriter)Ú
attachment)ÚPORTABLE_STRINGÚPORTABLE_STRING_TYPESé   )ÚurlparseÚ	splitport)ÚHTTPConnectionÚHTTPSConnection)r   )r
   zcharset\s*=\s*([-_.a-zA-Z0-9]+)zmultipart/([^; ]+)zboundary=([^; ]+)z
^cid:(.+)$úUTF-8c             C   sL   y:t  | d ¡}t|ƒr |d S | d  d¡d  d¡d S    Y nX |S )NzCONTENT-TYPEr   zHTTP-ACCEPT-CHARSETú;ú,)Úrx_ctype_charsetÚfindallÚlenÚsplit)ÚheadersÚdefaultÚres© r   ú5G:\easytimepro\master/mysite/ladon\clients\jsonwsp.pyÚprobe_charset   s    r   c             C   sÀ   t | dƒrNx.d|d  }|d  d7  < ||d krP qW | |d |< d| S t| ƒtkr¼t| ƒdkr¼| d dkr¼tj | dd … ¡r¼tj | dd … ¡}||kr¼t|d	ƒ|d |< d| S d S )
NÚreadzfile%sÚcid_seqé   Úfileszcid:%sr   ú@Úrb)	ÚhasattrÚtyper   r   ÚosÚpathÚisfileÚnormpathÚopen)ÚvalÚattachment_mapÚcidr   r   r   Úfix_attachment$   s    
8r+   c             C   sÊ   xÄ|   ¡ D ]¸\}}t|ƒtkr.t|ƒ}|| |< t|ƒtkrx†tt|ƒƒD ]B}t|| ƒtkrlt|| |ƒ qHt|| |ƒ}|d ksH|||< qHW q
t|ƒtkr¨t||ƒ q
t||ƒ}|d ks
|| |< q
W d S )N)	Úitemsr"   ÚtupleÚlistÚranger   ÚdictÚwalk_args_dictr+   )Úkwr)   Úkeyr(   ÚvidxZattachment_refr   r   r   r1   7   s     
r1   c               @   s.   e Zd Zdd„ Zdd„ Zdd„ Zd
dd	„ZdS )ÚJSONWSPResponsec             C   s.   d| _ i | _|| _|| _|| _i | _g | _d S )NÚ )Úresponse_bodyÚresponse_dictr   ÚstatusÚreasonÚattachmentsÚdict_attachments)Úselfr9   r:   r   r   r   r   Ú__init__M   s    zJSONWSPResponse.__init__c             C   s\   i | _ x| jD ]}|j ¡  ~qW x4| j ¡ D ]&\}}|jj}|j ¡  ~t |¡ q.W d S )N)	r8   r<   Ú	bufferobjÚcloser;   r,   Únamer#   Úunlink)r=   Úar*   Úfnamer   r   r   Ú__del__W   s    

zJSONWSPResponse.__del__c             C   sr   t |ƒtkrnt |¡}|rn| ¡ d | jkrn| j| ¡ d  }tt|jj	dƒ|j
|jd ƒ}|  j|g7  _|S d S )Nr   r    )r"   r   Úrx_detect_attachment_refÚmatchÚgroupsr;   r   r'   r?   rA   Úsizer   r<   )r=   r(   ÚmrC   Zattachment_copyr   r   r   Úcheck_attachmentd   s    
z JSONWSPResponse.check_attachmentNc             C   sÐ   |d kr| j }x¼| ¡ D ]°\}}|| j kr4|dkr4qt|ƒtkr–x†tt|ƒƒD ]B}t|| ƒtkrr|  || ¡ qN|  || ¡}|d ksN|||< qNW qt|ƒtkr®|  |¡ q|  |¡}|d ks|||< qW d S )NÚresult)	r8   r,   r"   r.   r/   r   r0   Úwalk_result_dictrK   )r=   rL   r3   r(   r4   r   r   r   r   rM   o   s"    
z JSONWSPResponse.walk_result_dict)N)Ú__name__Ú
__module__Ú__qualname__r>   rE   rK   rM   r   r   r   r   r5   L   s   
r5   c               @   s^   e Zd 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d„Z
di fdd„ZdS )ÚJSONWSPClientNFc             C   s:   d| _ || _|r"|  |¡ |  ¡  |r0|  |¡ || _d S )NF)Údescription_loadedÚ	via_proxyÚ	parse_urlÚparse_descriptionÚdebug)r=   ÚdescriptionÚurlrV   rS   r   r   r   r>   ˆ   s    

zJSONWSPClient.__init__c             C   sz   d| _ t|ƒ}|j| _| j ¡ dkr,d| _n| j ¡ dkrBd| _nd| _ t|jƒ\| _}t|ƒ 	¡ rnt
|ƒ| _|j| _d S )NTÚhttpsi»  ZhttpéP   F)Z	valid_urlr
   ÚschemeÚlowerÚportr   ZnetlocÚhostnameÚstrÚisdigitÚintr$   )r=   rX   ZparseresZcustom_portr   r   r   rT   ’   s    
zJSONWSPClient.parse_urlc             K   s  di dœ}d }d|kr|d }t ||ƒ | jr€|  |¡}t|d ƒ}t|d ƒ}x"| ¡ D ]}||krZ| |¡ qZW t|ƒr€dS d|i}	d|krž| d¡|	d< ||	d	< t|d
 ƒrÎ| jt	 
|	¡|d
 |d}
n| jt	 
|	¡|d}
|
jdkrt|
jƒ}t	 t|
j|ƒ¡|
_|
 ¡  |
S )Nr   )r   r   Úextra_headersÚmandatory_paramsÚoptional_paramséÿÿÿÿZ
methodnameZmirrorÚargsr   )rb   éÈ   )r1   rR   Úmethod_infor.   ÚkeysÚremover   ÚpopÚpost_mp_requestÚjsonÚdumpsÚpost_requestr9   r   r   Úloadsr   r7   r8   rM   )r=   Úmethod_namer2   r)   rb   Úminforc   rd   ÚargÚdataÚjsonwsp_responseÚresponse_charsetr   r   r   Úcall_method¢   s4    



zJSONWSPClient.call_methodc             C   s   | j d  ¡ S )NÚmethods)Újsonwsp_descriptionri   )r=   r   r   r   Úlist_methodsÃ   s    zJSONWSPClient.list_methodsc       	      C   s¢   | j d | }|d }g }g }dgt|ƒ }x$| ¡ D ]\}}|||d d < q6W x2|D ]*}|| }|d rx||g7 }qX||g7 }qXW ||||||d |d d	œS )
Nrx   Úparamsr6   Z	def_orderr   ZoptionalÚ	doc_linesÚret_info)rq   Úparams_orderrc   rd   Úparams_infor|   r}   )ry   r   r,   )	r=   rq   rr   r{   rc   rd   r~   ZpnameZpinfor   r   r   rh   Ç   s&    
zJSONWSPClient.method_infoc             C   sz   | j dd| jd}t|jƒ}t t|j|ƒ¡| _|  	| jd ¡ x.| jd  
¡ D ]}td| ƒ td| ƒ qPW d| _d S )Nr6   )rS   rX   rx   z?def placeholder(self,**kw):
	return self.call_method('%s',**kw)z,self.%s = types.MethodType(placeholder,self)T)ro   rS   r   r   rm   rp   r   r7   ry   rT   ri   ÚexecrR   )r=   ru   rv   rq   r   r   r   rU   á   s    
zJSONWSPClient.parse_descriptionc             C   s  t dd„ | ¡ D ƒƒ}t|j|j|ƒ}t|jƒ}| d¡}| dd¡}t	 
|¡}t|ƒrú|d }t 
|¡}t|ƒrø|d }	td|	 |¡|ƒ}
|
 ¡  x|
js¦|
 ¡  q–W xB|
j ¡ D ]4\}}tt|d d	ƒ|d
 |d |ƒ|jt||ƒ< q´W |
j}||_n| ¡ }||_|S )Nc             s   s   | ]\}}|  ¡ |fV  qd S )N)Úupper)Ú.0ÚkÚvr   r   r   ú	<genexpr>í   s    z/JSONWSPClient.parse_response.<locals>.<genexpr>zcontent-typeÚ
r6   r   i N  r$   r    rI   r   )r0   Z
getheadersr5   r9   r:   r   r   Z	getheaderÚreplaceÚrx_detect_multipartr   r   Úrx_detect_boundaryr   ÚencodeZ
read_chunkZeosZattachments_by_idr,   r   r'   r;   r   Zinterface_requestr7   r   )r=   Zresponser   ru   Zjsonwsp_charsetZcontent_typeZmultipart_matchZ	multipartZboundary_matchÚboundaryZmprr*   ZcinfoZresdatar   r   r   Úparse_responseì   s,    



0zJSONWSPClient.parse_responser6   c       	      C   s    dddœ}|r.d| j  ¡ | j| j| jf |d< | j  ¡ dkrLt| j| jƒ}nt| j| jƒ}| jd | }|rv| |¡ | d|||¡ |  	| 
¡ ¡}| ¡  |S )	Nzapplication/json, charset=UTF-8z"application/json,multipart/related)zContent-typeÚAcceptz%s://%s:%d%szLadon-Proxy-PathrY   ú/ÚPOST)r[   r\   r^   r]   r$   r   r   ÚupdateÚrequestrŒ   Úgetresponser@   )	r=   rt   Ú
extra_pathrS   rb   r   ÚconnÚreq_pathru   r   r   r   ro     s    
zJSONWSPClient.post_requestc             C   sü   t  ¡ }t|dƒ}t|ƒ}| | d¡dd¡ x"| ¡ D ]\}}	| |	d|¡ q8W | ¡  | ¡  d|j	 ddœ}
| j
 ¡ d	krt| j| jƒ}nt| j| jƒ}| jd
 | }t|dƒ}|
 |¡ | d|||
¡ | ¡  |  | ¡ ¡}| ¡  t |¡ |S )NÚwbzutf-8zapplication/json, charset=UTF-8Zbodyzapplication/octet-streams   multipart/related; boundary=s"   application/json,multipart/related)zContent-typer   rY   rŽ   r    r   )ÚtempfileZmktempr'   r   Zadd_attachmentrŠ   r,   Zdoner@   r‹   r[   r\   r   r^   r]   r   r$   r   r‘   rŒ   r’   r#   rB   )r=   rt   r   r“   rb   Zbuffer_fnameZ	buffer_fpZmpwr*   Úfpr   r”   r•   ru   r   r   r   rl     s,    



zJSONWSPClient.post_mp_request)NNFF)r6   FN)rN   rO   rP   r>   rT   rw   rz   rh   rU   rŒ   ro   rl   r   r   r   r   rQ   †   s   

!
rQ   Ú__main__r   é   )z-hz--helpz
  rc   rd   z'%s SERVICE_URL METHOD_NAME %s [OPTIONS]ú )Úusagez"Mandatory argument option-bindingszÁAll mandatory arguments to a service method can be given via normal arguments, but in some cases it is nessecary to have option-bindings to an argument like when using xargs and other commands.ZOptionszOptions for %sr   r"   Zbooleanz--%sÚ_ú-Ú
store_truer†   r|   )ÚdestÚactionÚhelp)r    r¢   z
options.%sz Missing mandatory parameters: %szcli.%s(**method_call_args))Úindent)r   )GÚsysrm   ÚtypesZpprintr#   r—   ÚreZoptparser   r   Z#mysite.ladon.tools.multiparthandlerr   r   Zmysite.ladon.types.attachmentr   Zmysite.ladon.compatr   r   Úversion_infoZurllib.parser
   r   Zhttp.clientr   r   ZurllibZhttplibÚcompileÚIr   rˆ   r‰   rF   r   r+   r1   Úobjectr5   rQ   rN   ÚargvZservice_urlrq   ZcliÚprintÚjoinrz   Úexitrh   rr   r.   ZmparamsZoparamsÚparserZmandatory_groupZoptional_groupÚpZ
add_optionr‡   Zadd_option_groupÚ
parse_argsZoptionsrf   Zmethod_call_argsÚevalZpvalrj   r   Zarg_idxrs   r8   r   r   r   r   Ú<module>   sœ   8
: 0





"
 

 





