
                         l    d dl Z d dlZd dlZd dlZddZ G d dej
                        Z G d de      Zy)    Nc                     d}d}	 t        j                   | gg g |      d   }|s	 |S | j                  |      }|s	 |S ||z  }=)Ni       r   )selectrecv)socktimeoutchunkscontentmore_to_readnew_contents         ?platform/gsutil/third_party/requests/tests/testserver/server.pyconsume_socket_contentr      se    FG
}}dVRW=a@ N ii' N 	; r   c                   ~     e Zd ZdZdZ	 	 	 	 	 d fd	Zedd       Zed        Zd Z	d Z
d Zd	 Zd
 Zd Zd Z xZS )Serverz#Dummy server using for unit testing   c                     t         |           |xs t        | _        g | _        || _        || _        || _        || _        t        j                         | _        t        j                         | _        y N)super__init__r   handlerhandler_resultshostportrequests_to_handlewait_to_close_event	threadingEventready_event
stop_event)selfr   r   r   r   r   	__class__s         r   r   zServer.__init__   s`     	8"8!		"4#6 $??,#//+r   c                 *    fd}t        |fi |S )Nc                 b    t        |       }| j                  j                  d             |S )N)r   zutf-8)r   sendencode)r   request_contentrequest_timeouttexts     r   text_response_handlerz:Server.text_response_server.<locals>.text_response_handler5   s*    4T?SOIIdkk'*+""r   )r   )clsr(   r'   kwargsr)   s    ``  r   text_response_serverzServer.text_response_server3   s    	# +6v66r   c                 (     | j                   	 di |S )N)z&HTTP/1.1 200 OK
Content-Length: 0

)r,   )r*   r+   s     r   basic_response_serverzServer.basic_response_server=   s"    's''?
CI
 	
r   c                 D   	 | j                         | _        | j                  j                         d   | _        | j                  j                          | j                          | j                  r%| j                  j                  | j                         | j                  j                          | j                          | j                  j                          y # | j                  j                          | j                          | j                  j                          w xY w)N   )_create_socket_and_bindserver_sockgetsocknamer   r   set_handle_requestsr   waitWAIT_EVENT_TIMEOUT _close_server_sock_ignore_errorsr   r    s    r   runz
Server.runC   s    	"#;;=D((446q9DI  "!!#''((--d.E.EF  "113OO!   "113OO!s   BC ADc                     t        j                          }|j                  | j                  | j                  f       |j	                          |S r   )socketbindr   r   listenr    r   s     r   r1   zServer._create_socket_and_bindR   s4    }}		499dii()r   c                 X    	 | j                   j                          y # t        $ r Y y w xY wr   )r2   closeOSErrorr9   s    r   r8   z'Server._close_server_sock_ignore_errorsX   s+    	""$ 		s    	))c                     t        | j                        D ]R  }| j                         }|s y | j                  |      }| j                  j                  |       |j                          T y r   )ranger   _accept_connectionr   r   appendrA   )r    _r   handler_results       r   r5   zServer._handle_requests^   sV    t../A**,D!\\$/N  ''7JJL 0r   c                     	 t        j                   | j                  gg g | j                        \  }}}|sy | j                  j                         d   S # t        $ r Y y w xY w)Nr   )r   r2   r7   acceptrB   )r    readyrG   s      r   rE   zServer._accept_connectioni   sg    		 --!!"BD,C,CKE1a ##**,Q// 		s   3A A 	AAc                     | j                          | j                  j                  | j                        st	        d      | j
                  | j                  fS )Nz'Timeout waiting for server to be ready.)startr   r6   r7   RuntimeErrorr   r   r9   s    r   	__enter__zServer.__enter__u   sD    

$$T%<%<=HIIyy$))##r   c                     |&| j                   j                  | j                         n&| j                  r| j                  j	                          | j                          | j                          y)NF)r   r6   r7   r   r4   r8   join)r    exc_type	exc_value	tracebacks       r   __exit__zServer.__exit__{   sW    OO  !8!89'' ((,,. 	--/		r   )N	localhostr   r0   Ng      ?)__name__
__module____qualname____doc__r7   r   classmethodr,   r.   r:   r1   r8   r5   rE   rO   rU   __classcell__r!   s   @r   r   r      sm    -  ,* 7 7 
 

"	
$r   r   c            
       :     e Zd Zdddddddddd	 fd
Zd Z xZS )		TLSServerNrV   r   r0   F)	r   r   r   r   r   
cert_chainkeyfile
mutual_tlscacertc       	            t         
|   |||||       || _        || _        t	        j
                  t        j                        | _        | j                  j                  | j                  | j                         || _	        |	| _
        |rEt        j                  | j                  _        | j                  j                  | j                         y y )N)r   r   r   r   r   )rb   )r   r   ra   rb   ssl
SSLContextPROTOCOL_TLS_SERVERssl_contextload_cert_chainrc   rd   CERT_OPTIONALverify_modeload_verify_locations)r    r   r   r   r   r   ra   rb   rc   rd   r!   s             r   r   zTLSServer.__init__   s     	1 3 	 	
 %>>#*A*AB(($,,(O$ ,/+<+<D(224;;?	 r   c                     t        j                          }| j                  j                  |d      }|j                  | j                  | j
                  f       |j                          |S )NT)server_side)r<   ri   wrap_socketr=   r   r   r>   r?   s     r   r1   z!TLSServer._create_socket_and_bind   sO    }}++Dd+C		499dii()r   )rX   rY   rZ   r   r1   r]   r^   s   @r   r`   r`      s,      @@r   r`   rW   )r   r<   rf   r   r   Threadr   r`    r   r   <module>rs      s7      
 $nY nb& &r   