B
    EDb=                 @   s  d dl m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 d dl	m
Z
 d dlmZ d dlmZmZ d dlmZmZ d dlmZmZ d d	lmZm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" d dl#T ej$d  dkrd dl%m%Z% d dl&m'Z'm&Z& n,ej$d  dkr2d dl(m'Z'm&Z& d dl)m%Z% e*dej+a,e*dej+a-e*dej+a.e*dej+Z/d ddZ0dd Z1dd Z2G dd de3Z4dS )!    )request_uriN)global_service_collection)
Dispatcher)CustomResponse)catalog_default_cssservice_default_css)catalog_default_templateservice_default_template)MultiPartReaderMultiPartWriter)_interfacesname_to_interface)UndefinedInterfaceNameUndefinedService)type_to_jsontypePORTABLE_STRING_TYPES)Template)publish_parts)*   )StringIO)parse_qsurlparse   zcharset\s*=\s*([-_.a-zA-Z0-9]+)zmultipart/([^; ]+)zboundary=([^; ]+)z^@publisher: (\w+).*$UTF-8c             C   sJ   y:t | d }t|r |d S | d dd dd S    |S d S )NCONTENT_TYPEr   ZHTTP_ACCEPT_CHARSET;,)rx_ctype_charsetfindalllensplit)envdefaultres r%   =G:\easytimepro\master/mysite/ladon\server\wsgi_application.pyprobe_charset"   s    r'   c             C   s   d| kr| d S t | ddS )NZHTTP_LADON_PROXY_PATHr   )Zinclude_query)r   )environr%   r%   r&   probe_client_path,   s    r)   c             C   s   t | r| d  }t|}d}|r@| d }| dd  }n| }|dkrbtd|ddd S |d	krtd
|S |dkrd|S d S )Nr   raw   Zdocutils
Zhtml)Zwriter_nameZbodyZprez<br/>)r    striprx_detect_publishermatchgroupsr   join)	doc_linesZ
first_linemZ	publisherZdoclinesr%   r%   r&   publish_doc3   s    

r4   c               @   sX   e Zd ZdddefddZdd Zdd Zdd	 Zdd
dZdd Z	dd Z
dd ZdS )LadonWSGIApplicationNc             C   s   t ddtddtddtddddddddd| _i | _|| _|| _|| _|sZd| _|sdd| _t	|t
krz|g| _n|| _|| _|rt	|t
kr|g| _| jrt	| jttgkrx(| jD ]}|tjkrt j|g7  _qW |   d S )Nr   )datamtime )zcatalog.csszservice.csszcatalog.templatezservice.templatezskins/catalog-extra.csszskins/service-extra.csszLadon Service CatalogzThis is the Ladon Service Catalog. It presents the services exposed by on this particular site. Click on a service name to examine which methods and interfaces it exposes.)r   r   r   r	   staticfilesskinsloggingcatalog_namecatalog_desctyper   service_list	path_listlisttuplesyspathfind_custom_service_skins)selfr?   r@   r<   r=   r;   pr%   r%   r&   __init__G   s>    

zLadonWSGIApplication.__init__c       	      C   s   i }x| j D ]}tj|d}tj|rt|}xj|D ]b}tj||}tj|d}tj|d}tj|r:tj|r:tj|r:||kr:|||< q:W qW || _|S )Nr:   zservice.templatezservice.css)r@   osrD   r1   existslistdirisdirr:   )	rF   r:   rG   Z
skins_pathfilesfZ	skin_pathtemplate_pathcss_pathr%   r%   r&   rE   {   s    

,z.LadonWSGIApplication.find_custom_service_skinsc             C   s   x| j D ]z}tj||}tj|rt|j}|| jksN|| j| d kr|i | j|< || j| d< t|	 | j| d< dS qqW dS )Nr7   r6   TF)
r@   rI   rD   r1   rJ   statst_mtimer9   openread)rF   Z
staticfilerG   Z
staticpathZstatic_mtimer%   r%   r&   update_static   s    
z"LadonWSGIApplication.update_staticc       
   	   C   s   |  d |  d |  d t|}d|j|j|jf }|dd  dkrV|d d }||| jd d | jd d ||j|| d}t| jd d }	|		|
|S )	Nzcatalog.csszcatalog.templatezskins/catalog-extra.cssz	%s://%s%s/r6   )r<   r=   css	extra_cssclient_pathquery_stringcharsetservices)rU   r   ZschemeZnetlocrD   r9   queryvaluesr   renderencode)
rF   r]   rZ   r<   r=   r\   fix_pathZpretty_client_pathZcatalog_infotemplater%   r%   r&   generate_catalog_html   s"    


z*LadonWSGIApplication.generate_catalog_htmlc                s~   fdd} fdd}d}d}t |}	| d |rxd| }d	| }| |rZ| |sd}d}| | | | n| | | |  j jt jt g g | j| d
 | jd d
 ||	j|t	| j
 |d}
x  D ]}| g t|j||j||jt|j|jdd}x| D ]}|d ||d ||d |d t|d |d d}d|kr|d }|d tkrd|d  |d< nt|d |d< |d  |g7  < q(W |
d  |g7  < qW |
d } jj}xx|D ]p}t|tkri }|d |d< i |d< x8|d D ],\}}}||}||||d|d |< qW ||g7 }qW t| j| d
 }||
|S )Nc                sF   t | tkr,| d  jjkr&| d jS dS n|  jjkr>| jS dS d S )Nr   F)r>   rA   typemanager	type_dict__name__)typ)servicer%   r&   get_ladontype   s    
zALadonWSGIApplication.generate_service_html.<locals>.get_ladontypec                sn   | }t |tkr>|d }| jjkr0d|j }qjdt|  }n,| jjkrR|j}n|tkrdt| }n|j}|S )Nr   z[ %s ])r>   rA   re   rf   rg   r   )rh   Z	paramtypeZparamtype_str)ri   r%   r&   type_to_string   s    
zBLadonWSGIApplication.generate_service_html.<locals>.type_to_stringzservice.csszservice.templatezskins/service-extra.csszskins/%s/service.csszskins/%s/service.templater6   )servicenamer2   docZ
interfacesmethodstypesrX   rY   rZ   r[   r\   r:   Zcurrent_skin)r>   	ladontyperm   r2   )Z
methodnameparamsrm   Zreturnsnamer>   optionalrm   )rr   r>   rp   rs   rm   r2   r#   z"%s"rq   rn   ro   Z
attributes)r>   propsrp   )r   rU   rl   r2   r4   r   keysr9   r^   rA   r:   Zmethod_listrr   Z_method_docZ_rtypeZ
_rtype_docargsr   strre   
type_orderr>   dictr   r`   ra   )rF   ri   rZ   r\   skinrj   rk   rP   rO   rb   Zservice_infomethodZmethod_infoZparamZ
param_infoZdefault_typero   rx   rh   Z	desc_typekvrt   Zdesc_type_valrc   r%   )ri   r&   generate_service_html   s    








z*LadonWSGIApplication.generate_service_htmlc             C   s   x|D ]}t | qW d S )N)
__import__)rF   r?   ri   r%   r%   r&   import_services  s    
z$LadonWSGIApplication.import_servicesc             C   s
  g }dg}d|kr$|d   d}|d dkr<|dd  }x|D ]}|  rB||g7 }qBW d  } }}t|dkr||d }t|dkr|d }t|dkr|d }d  }}	d|kr|d }
|
dd}
t|
}t|r|d }t|
}t|r|d }	|||||	fS )	Nr8   Z	PATH_INFOrW   r   r+   r   r   r,   )r-   r!   r    replacerx_detect_multipartr   rx_detect_boundary)rF   r(   
path_partsZ	path_inforG   snameifnameaction	multipartboundarycontent_typeZmultipart_matchZboundary_matchr%   r%   r&   parse_environ"  s6    


z"LadonWSGIApplication.parse_environc       $   
      s  d}g }d}dt |dd}yP| | j | |\}}}	}
}t|}d  }}|rnt|}|snt|d| |rt |}t	|st
|d| |d }d }|r|rt|||| j}nb|sd	}| t j|| j| j|n>|r|sd	}t|d
 }|dd gd }| |||||rl|jrl|	dkrf|j }|d|d }|j||7 ndg}|d |ks|ddsd||f }d| }|dd|f |7 n|j }t|d }|
rL|rLtd|||d |}|  x|js|  q W t |j d d}|j!}|r6||_"|j#|d< |j$|d< n|d %|}|&||}t'|t(r||) 7 }||| |* S t	|d j+rht,- }t.|d}t/|}|0|d||f d x.|d j+1 D ]\}}|0|d||j2 qW |3  |4  t5t67|j8}t.|dt9j:d dkrFd |j; }n t9j:d d!krld t5|j;d" }n|W nF t<k
r }  z&d#}d}t= }!t>j?|!d$ |!@ W d d } ~ X Y nX d|krx(|d 1 D ]\}"}#t6A|#d%  qW tBd&st5t	}|d'd(||f fd)|fg7 }||| tBd&rdd* d+|krP|d+  S tC fd,d-dS t9j:d d!krtDt5krtE|gS ).Nz200 OKz
text/plainr8   zUTF-8)r#   z,The interface name "%s" has not been definedz!Service "%s" has not been exposedr   z	text/htmlZQUERY_STRINGrz   descriptionz/descriptionZPOSTZREQUEST_METHODZCONTENT_LENGTHz+Requests for %s %s interface must be postedz405 %sZAllowr   i N  z
wsgi.inputattachmentsattachments_by_idZresponse_attachmentswbz%s, charset=%szrpc-partzapplication/octet-stramrbr   zmultipart/related; boundary=r   z
iso-8859-1z1500 An Error occured while processing the request)filerD   rT   zContent-Typez%s; charset=%szContent-Lengthi   zwsgi.file_wrapperc                  s
     S )N)rT   r%   )
block_sizeoutputr%   r&   <lambda>      z/LadonWSGIApplication.__call__.<locals>.<lambda>)Fr'   r   r?   r   r)   r   r   r   Zservices_by_namer    r   r   r;   rd   r]   r<   r=   r   getr~   ZifaceZdescription_content_typefindr   appendr1   Zresponse_content_typeintr
   ra   Z
read_chunkZeosZinterface_request_headersZinterface_requestZresponse_encodingr   r   rT   Zdispatch_request
isinstancer   response_headersZresponse_dataZattachments_by_cidtempfileZmktemprS   r   Zadd_attachmentitemsZheadersZdonecloserw   rI   rQ   st_sizerC   version_infor   	Exceptionr   	traceback	print_excgetvalueunlinkhasattriterr>   bytes)$rF   r(   Zstart_responsestatusr   r   r\   r   r   r   r   r   rZ   ZsinstZifclassZservice_searchZ
dispatcherr^   rz   Zservice_urlZallowed_methodsmessageZcontent_lengthZmphZencapsulated_charsetZrequest_dataZresponse_partZresponse_temp_fnameZtemp_bufferZmpwZcidaeZstrioZa_idZa_infor%   )r   r   r&   __call__D  s    











zLadonWSGIApplication.__call__)N)rg   
__module____qualname__Z
NO_LOGGINGrH   rE   rU   rd   r~   r   r   r   r%   r%   r%   r&   r5   E   s   4
j"r5   )r   )5Zwsgiref.utilr   rI   rerC   r   r   Z!mysite.ladon.ladonizer.collectionr   Zmysite.ladon.server.dispatcherr   Z"mysite.ladon.server.customresponser   Zmysite.ladon.server.default.cssr   r   Z%mysite.ladon.server.default.templatesr   r	   Z#mysite.ladon.tools.multiparthandlerr
   r   Zmysite.ladon.interfacesr   r   Z"mysite.ladon.exceptions.dispatcherr   r   Zmysite.ladon.compatr   r   Zjinja2r   Zdocutils.corer   Zmysite.ladon.serverr   r   r   r   Zurllib.parseiocompileIr   r   r   r.   r'   r)   r4   objectr5   r%   r%   r%   r&   <module>   s>   

