î
yË XÏ  ã               @   sÏ   d  d l  Z  d  d l Z d  d l Z d  d l Z d  d l Z y d  d l Z Wn e k
 rf d Z Yn Xd  d l j j	 Z	 d  d l
 m Z Gd d „  d e ƒ Z Gd d „  d e	 j ƒ Z Gd d „  d ƒ Z d S)	é    N)ÚWSGIServerHttpProtocolc               @   s   e  Z d  Z d d „  Z d S)r   c             C   s,   |  j  j | | | t j d d | ƒ ƒ d  S)Nr   )ÚloggerÚaccessÚdatetimeÚ	timedelta)ÚselfÚrequestÚenvironÚresponseÚtime© r   úJ/home/ubuntu/projects/ifolica/build/gunicorn/gunicorn/workers/_gaiohttp.pyÚ
log_access   s    z!WSGIServerHttpProtocol.log_accessN)Ú__name__Ú
__module__Ú__qualname__r   r   r   r   r   r      s   r   c                   sµ   e  Z d  Z ‡  f d d †  Z ‡  f d d †  Z d d „  Z d d „  Z d	 d
 „  Z d d „  Z e	 j
 d d „  ƒ Z e	 j
 d d „  ƒ Z e	 j
 d d „  ƒ Z e d d „  ƒ Z ‡  S)ÚAiohttpWorkerc                sY   t  ƒ  j | | Ž  |  j } | j r: |  j | ƒ |  _ n	 d  |  _ g  |  _ i  |  _ d  S)N)ÚsuperÚ__init__ÚcfgZis_sslÚ_create_ssl_contextÚssl_contextÚserversÚconnections)r   ÚargsÚkwr   )Ú	__class__r   r   r      s    				zAiohttpWorker.__init__c                s@   t  j ƒ  j ƒ  t  j ƒ  |  _ t  j |  j ƒ t ƒ  j ƒ  d  S)N)ÚasyncioZget_event_loopÚcloseZnew_event_loopÚloopZset_event_loopr   Úinit_process)r   )r   r   r   r    '   s    zAiohttpWorker.init_processc          
   C   sM   t  j |  j ƒ  d |  j ƒ|  _ z |  j j |  j ƒ Wd  |  j j ƒ  Xd  S)Nr   )r   ÚasyncÚ_runr   Z_runnerZrun_until_completer   )r   r   r   r   Úrun0   s    !zAiohttpWorker.runc             C   s=   t  | | j |  j ƒ | _ t  | | j |  j d ƒ | _ | S)NF)Ú_wrpZconnection_mader   Zconnection_lost)r   Úprotor   r   r   Úwrap_protocol8   s
    zAiohttpWorker.wrap_protocolc             C   sp   |  j  j t j k } t | d d d |  j d |  j  d | d |  j j d |  j  j d |  j j	 ƒ} |  j
 | ƒ S)	NZreadpayloadTr   ÚlogÚdebugÚ
keep_aliveÚ
access_logÚaccess_log_format)r'   ZloglevelÚloggingÚDEBUGr   r   r   Ú	keepaliver*   r+   r&   )r   ÚwsgiÚaddrZis_debugr%   r   r   r   Úfactory?   s    		zAiohttpWorker.factoryc             C   s   t  j |  j |  j | ƒ S)N)Ú	functoolsÚpartialr1   r/   )r   Úsockr0   r   r   r   Úget_factoryM   s    zAiohttpWorker.get_factoryc          	   c   sJ   y+ t  |  j d ƒ r* |  j j ƒ  Dd  Hn  Wn |  j j d ƒ Yn Xd  S)Nr   zProcess shutdown exception)Úhasattrr/   r   r'   Ú	exception)r   r   r   r   r   P   s
    zAiohttpWorker.closec             c   sÔ  xJ |  j  D]? } |  j | j | j ƒ } |  j j |  j | | ƒ Dd  Hƒ q
 Wt j ƒ  } y)x"|  j	 sq |  j
 r€|  j ƒ  |  j	 rÊ | t j ƒ  k rÊ |  j t j ƒ  k rÊ |  j j d |  ƒ d |  _	 n  |  j	 sb|  j r)|  j j d | t |  j
 ƒ ƒ x |  j D] } | j ƒ  qW|  j j ƒ  n  x6 |  j
 j ƒ  D]" } t | d ƒ r9| j ƒ  q9q9Wn  t j d d |  j ƒDd  Hq_ WWn t k
 r–Yn X|  j rÁx |  j D] } | j ƒ  qªWn  |  j ƒ  Dd  Hd  S)Nz!Parent changed, shutting down: %sFz$Stopping server: %s, connections: %sÚclosingg      ð?r   )Zsocketsr5   r4   Zcfg_addrr   ÚappendÚ_create_serverÚosÚgetpidÚaliver   ÚnotifyZppidÚgetppidr'   ÚinfoÚlenr   ÚclearÚvaluesr6   r8   r   Úsleepr   ÚKeyboardInterrupt)r   r4   r1   ÚpidÚserverÚconnr   r   r   r"   X   s<    	
	'			#	zAiohttpWorker._runc             C   s"   |  j  j | d | j d |  j ƒS)Nr4   Ússl)r   Zcreate_serverr4   r   )r   r1   r4   r   r   r   r:   ƒ   s    zAiohttpWorker._create_serverc             C   sp   t  j |  j ƒ } | j |  j |  j ƒ |  j | _ |  j rP | j	 |  j ƒ n  |  j
 rl | j |  j
 ƒ n  | S)z Creates SSLContext instance for usage in asyncio.create_server.

        See ssl.SSLSocket.__init__ for more details.
        )rI   Ú
SSLContextÚssl_versionÚload_cert_chainÚcertfileÚkeyfileÚ	cert_reqsÚverify_modeÚca_certsÚload_verify_locationsÚciphersÚset_ciphers)r   Úctxr   r   r   r   ˆ   s    		z!AiohttpWorker._create_ssl_context)r   r   r   r   r    r#   r&   r1   r5   r   Z	coroutiner   r"   r:   Ústaticmethodr   r   r   )r   r   r      s   
	+r   c               @   s+   e  Z d  Z d d d „ Z d d „  Z d S)r$   Tc             C   s7   | |  _  t | ƒ |  _ | |  _ | |  _ | |  _ d  S)N)Ú_protoÚidÚ_idÚ_methÚ	_trackingÚ_add)r   r%   ÚmethZtrackingÚaddr   r   r   r   š   s
    			z_wrp.__init__c             G   sT   |  j  r |  j |  j |  j <n" |  j |  j k rA |  j |  j =n  |  j | Œ  } | S)N)r\   rW   r[   rY   rZ   )r   r   rH   r   r   r   Ú__call__¡   s    	z_wrp.__call__N)r   r   r   r   r_   r   r   r   r   r$   ˜   s   r$   )r   r   r2   r,   r;   rI   ÚImportErrorZgunicorn.workers.baseZworkersÚbaseZaiohttp.wsgir   ZOldWSGIServerHttpProtocolZWorkerr   r$   r   r   r   r   Ú<module>   s   }