
    \jj                        d dl Z d dlZd dlZd dlmZ d dlZd dlZd dlmZm	Z	 d Z
d Zd Zd Z G d d	e      Z G d
 de	      Z G d d      Z G d d      Z G d de      Z G d d      Z G d d      Z G d d      Zy)    N)Thread)
HTTPServerBaseHTTPRequestHandlerc                      t        j                   t         j                  t         j                        } | j                  d       | j	                         \  }}| j                          |S )N)type)	localhostr   )socketAF_INETSOCK_STREAMbindgetsocknameclose)s_ports      ;/root/env/lib/python3.12/site-packages/testing/http_util.pyget_available_portr   	   sF    fnnV-?-?@AFFmmoGAtGGIK    c                    t        j                          dz   }t        j                          |k  r:t        j                         }	 |j                  d| f       	 |j                          y t        d| z        # t        j                  $ r Y nw xY w	 |j                          n# |j                          w xY wt        j
                  d       t        j                          |k  r|)N   r   g?z(test server on port %d was not reachable)timer	   connectr   errorsleep	Exception)r   deadliner   s      r   poll_until_startedr      s    yy{QH
))+
 MMO	II{D)* GGI
>E
FF || 		GGIAGGI

4 ))+
 s$   A7 7B
B" BB" "B4c                  x    t        t               d      } | j                          t        | j                         | S )NFMockServerWrapperr   startr   r   sws    r   start_serverr$      s,    	-/	7BHHJrwwIr   c                  x    t        t               d      } | j                          t        | j                         | S )NTr   r"   s    r   start_secure_serverr&   $   s,    	-/	6BHHJrwwIr   c                   H    e Zd Zd Zd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zy)r    c                 h   t        j                  |        || _        d|rdnd|fz  | _        t	        d|ft
              | _        |r<t        j                  | j                  j                  ddd      | j                  _	        | | j                  _
        i | _        t        j                         | _        y )	Nz%s://localhost:%dhttpshttpr   z./testing/selfsigned.pemz./testing/selfsigned.keyT)certfilekeyfileserver_side)r   __init__r   urir   MockServerRequestHandlerserversslwrap_socketr	   server_wrappermatchersqueueQueuerequests)selfr   secures      r   r.   zMockServerWrapper.__init__+   s    	&V')NN +t!46NO!$""32 	"DKK &*"r   c                 l    | j                   j                          | j                   j                          y N)r1   shutdownserver_closer9   s    r   r   zMockServerWrapper.close;   s"      "r   c                 :    | j                   j                  d       y )Ng?)r1   serve_foreverr?   s    r   runzMockServerWrapper.run?   s    !!#&r   c                 $    || j                   |<   | S r<   )r5   )r9   uri_pathcontents      r   for_pathzMockServerWrapper.for_pathB   s    ")hr   c                 6    | j                   j                         S r<   r8   getr?   s    r   await_requestzMockServerWrapper.await_requestF   s    }}  ""r   c                 :    | j                   j                  d      S )NF)blockrH   r?   s    r   require_requestz!MockServerWrapper.require_requestI   s    }}  u --r   c                 n    | j                   j                         }| j                   j                  |       y r<   )r8   rI   put)r9   reqs     r   wait_until_request_receivedz-MockServerWrapper.wait_until_request_receivedL   s&    mm!#r   c                 *   | j                   j                         |k7  rvg }| j                   j                         sN|j                  t	        | j                   j                  d                   | j                   j                         sNJ d||fz         y )NFz$expected %d more requests but had %s)r8   qsizeemptyappendstrrI   )r9   countrss      r   should_have_requestsz&MockServerWrapper.should_have_requestsP   sw    == E)Bmm))+		#dmm//678 mm))+N@E2;NN5	 *r   c                     | S r<    r?   s    r   	__enter__zMockServerWrapper.__enter__X       r   c                 $    | j                          y r<   r   r9   r   value	tracebacks       r   __exit__zMockServerWrapper.__exit__[       

r   N)__name__
__module____qualname__r.   r   rB   rF   rJ   rM   rQ   rY   r\   rc   r[   r   r   r    r    *   s5    & #'#.Or   r    c                   $    e Zd Zd Zd Zd Zd Zy)r0   c                 $    | j                          y r<   _do_requestr?   s    r   
do_CONNECTz#MockServerRequestHandler.do_CONNECT_       r   c                 $    | j                          y r<   rj   r?   s    r   do_GETzMockServerRequestHandler.do_GETb   rm   r   c                 $    | j                          y r<   rj   r?   s    r   do_POSTz MockServerRequestHandler.do_POSTe   rm   r   c                    | j                   j                  }|j                  j                  t	        |              |j
                  j                  | j                        }|r|j                  |        y | j                  d       y )Ni  )
r1   r4   r8   rO   MockServerRequestr5   rI   pathwrite
send_error)r9   r4   handlers      r   rk   z$MockServerRequestHandler._do_requesth   s`    33##$5d$;< ))--dii8MM$OOC r   N)re   rf   rg   rl   ro   rq   rk   r[   r   r   r0   r0   ^   s    !r   r0   c                       e Zd Zd Zd Zy)rs   c                 &   |j                   | _        |j                  | _        |j                  | _        t	        |j                  j                  dd            }|r0|j                  j                  |      j                  d      | _	        y d | _	        y )Nzcontent-lengthr   UTF-8)
commandmethodrt   headersintrI   rfilereaddecodebody)r9   requestcontent_lengths      r   r.   zMockServerRequest.__init__r   sj    ooLL	W__001A1EF**>:AA'JDIDIr   c                 8    | j                   d| j                  S )N )r|   rt   r?   s    r   __str__zMockServerRequest.__str__|   s    ++tyy11r   N)re   rf   rg   r.   r   r[   r   r   rs   rs   q   s    2r   rs   c                        e Zd ZddZd Zd Zy)BasicResponseNc                 6    || _         || _        |xs i | _        y r<   )statusr   r}   )r9   r   r   r}   s       r   r.   zBasicResponse.__init__   s    	}"r   c                 Z    |xs i j                         D ]  \  }}|| j                  |<    y r<   )itemsr}   )r9   r}   keyra   s       r   add_headerszBasicResponse.add_headers   s0    "=b//1 	&JC %DLL	&r   c                 D   |j                  | j                         | j                  j                         D ]  \  }}|j	                  ||        |j                          | j                  r5|j                  j                  | j                  j                  d             y y )Nrz   )
send_responser   r}   r   send_headerend_headersr   wfileru   encode)r9   r   r   ra   s       r   ru   zBasicResponse.write   s}    dkk*,,,,. 	,JCU+	,99MM		 0 0 9: r   )NN)re   rf   rg   r.   r   ru   r[   r   r   r   r      s    %
&;r   r   c                       e Zd ZddZy)JsonResponseNc                     |xs i }|j                  ddi       t        j                  | dt        j                  |xs i       |       y )NzContent-Typezapplication/json   )updater   r.   jsondumps)r9   datar}   hs       r   r.   zJsonResponse.__init__   s>    Mr	>#578tS$**TZR*@!Dr   r<   )re   rf   rg   r.   r[   r   r   r   r      s    Er   r   c                   2    e Zd ZddZd Zd Zd Zd Zd Zy)	ChunkedResponseNc                 L    t        j                         | _         |xs i | _        y r<   )r6   r7   r}   )r9   r}   s     r   r.   zChunkedResponse.__init__   s    [[]
}"r   c                 @    || j                   j                  |       y y r<   r6   rO   )r9   chunks     r   pushzChunkedResponse.push   s    JJNN5! r   c                 :    | j                   j                  d        y r<   r   r?   s    r   r   zChunkedResponse.close   s    

tr   c                 n   |j                  d       |j                  dd       | j                  j                         D ]  \  }}|j                  ||        |j	                          |j
                  j                          	 | j                  j                         }|E|j
                  j                  dj                  d             |j
                  j                          y |j
                  j                  dt        |      |fz  j                  d             |j
                  j                          )Nr   zTransfer-Encodingchunkedz0

rz   z%x
%s
)r   r   r}   r   r   r   flushr6   rI   ru   r   len)r9   r   r   ra   r   s        r   ru   zChunkedResponse.write   s    c"/;,,,,. 	,JCU+	,JJNN$E}##K$6$6w$?@##%##^s5z56I%I$Q$QRY$Z[##% r   c                     | S r<   r[   r?   s    r   r\   zChunkedResponse.__enter__   r]   r   c                 $    | j                          y r<   r_   r`   s       r   rc   zChunkedResponse.__exit__   rd   r   r<   )	re   rf   rg   r.   r   r   ru   r\   rc   r[   r   r   r   r      s     %"&"r   r   c                       e Zd Zd Zy)CauseNetworkErrorc                     t        d      )Nzintentional error)r   )r9   r   s     r   ru   zCauseNetworkError.write   s    +,,r   N)re   rf   rg   ru   r[   r   r   r   r      s    -r   r   c                       e Zd Zd Zd Zy)SequentialHandlerc                      || _         d| _        y )Nr   )handlerscounter)r9   argvs     r   r.   zSequentialHandler.__init__   s    r   c                     | j                   | j                     }| j                  t        | j                         dz
  k  r| xj                  dz  c_        |j                  |       y )Nr   )r   r   r   ru   )r9   r   rw   s      r   ru   zSequentialHandler.write   sH    ---<<#dmm,q00LLALgr   N)re   rf   rg   r.   ru   r[   r   r   r   r      s    r   r   )r   r	   r2   	threadingr   r   r6   http.serverr   r   r   r   r$   r&   r    r0   rs   r   r   r   r   r   r[   r   r   <module>r      s      
    :G2 2h!5 !&2 2; ;$E= E! !F- -	 	r   