agent-first-http 0.4.3

Persistent HTTP client for AI agents — one request, one JSON line
Documentation
+
�YjrO����Rt^RIt^RIt^RIt^RIt^RIt^RIt^RIt^RI	t	!RR]P]PP4t
!RR]PP4tRRlt]R8Xdh]!]P&4^8�d]!]P&^,4MRt]
!R	]3]4t]!R
]2]P.R7]P14R#R# ]d]P54R#i;i)
zr
Test HTTP server for afhttp stress tests.
Endpoints with configurable size, delay, streaming, redirects, errors.
Nc�D�]tRt^tRtRt/t]P!4t	Rt
R#)�ThreadedHTTPServerT�N)�__name__�
__module__�__qualname__�__firstlineno__�daemon_threads�allow_reuse_address�retry_counters�	threading�Lock�
retry_lock�__static_attributes__r��E/Users/roger/me/agentfirstkit/spores/agent-first-http/tests/server.pyrrs���N����N����!�Jrrc�Ba�]tRt^toRtRtRtRtRtRt	Rt
VtR#)	�TestHandlerzHTTP/1.1c��R#)Nr)�self�argss&*r�log_message�TestHandler.log_messages��rc�p�VPPRR4pRVP49d�RpVPP	4P4pV'gV#\
V^4pV^8Xd8VPP	4P4pV'dK3V#W PPV4,
pVPP	4K�\
VPPR^44pV^8�dVPPV4#R#)z?Read request body, handling both Content-Length and chunked TE.zTransfer-Encoding��chunkedr�Content-Length)�headers�get�lower�rfile�readline�strip�int�read)r�te�body�	size_line�
chunk_size�trailer�lengths&      r�read_request_body�TestHandler.read_request_bodys���
�\�\�
�
�1�2�
6������
�"��D�� �J�J�/�/�1�7�7�9�	� ���K�!��B�/�
���?��"&�*�*�"5�"5�"7�"=�"=�"?��&�w�!���K��
�
���
�3�3���
�
�#�#�%�����)�)�*:�A�>�?�F�.4�q�j�4�:�:�?�?�6�*�A�c�Arc	�,1�VPpVR8Xd�\P!RRR\P!4/4P	4pVP^�4VP
RR4VP
R\\V444VP4VPPV4R#\P!RV4pV'd�\VP^44p\P !VR	,4\P!R
V/4P	4pVP^�4VP
RR4VP
R\\V444VP4VPPV4R#\P!RV4pV'd�\VP^44pRV,pVP^�4VP
RR
4VP
R\V44VP4VPPV4R#\P!RV4pV'd�\VP^44pRV,P	4pVP^�4VP
RR4VP
R\V44VP4VPPV4R#\P!RV4pV'd�\VP^44p\P!RRV,/4P	4pVP^�4VP
RR4VP
R\\V444VP4VPPV4R#\P!RV4pV'd�\VP^44pV^�8Xd$VP^�4VP4R#\P!RV/4P	4pVPV4VP
RR4VP
R\\V444VP4VPPV4R#VR8Xd$VP^�4VP4R#VR8Xd�VP"P%4UUu/uFwrxWxbK		p	pp\P!V	4P	4pVP^�4VP
RR4VP
R\\V444VP4VPPV4R#\P!RV4pV'Ed
\VP^44pV^8�dRVPR4VP
RRV^,
24VP
RR4VP4R#\P!RR/4P	4pVP^�4VP
RR4VP
R\\V444VP4VPPV4R#\P!RV4pV'Ed=\VP^44p\VP^44p
\'V4Uu.uF	pRVR 2NK	ppR!P)V4P	4p
VP^�4VP
RR"4VP
R\\V
444VP4VFlpVPPVP	44VPP+4V
^8�gKO\P !V
R	,4Kn	R#\P!R#V4pV'EdV\VP^44p\VP^44p
\'V4Uu.uF"p\P!R$V/4R%,NK$	ppR!P)V4P	4p
VP^�4VP
RR&4VP
R\\V
444VP4VFlpVPPVP	44VPP+4V
^8�gKO\P !V
R	,4Kn	R#\P!R'V4pV'd�\VP^44p\-\'R(44VR(,^,,pVRVpVP^�4VP
RR
4VP
R\V44VP4VPPV4R#VR)8Xd\P !^x4R#VR*8Xd�\P!RR/4P	4pVP^�4VP
RR4VP
R\\V444VP
R+R,4VP
R+R-4VP
R.R/4VP
R.R04VP4VPPV4R#VR18Xd�^RIp\P!R2RR3R4/4P	4pVP1V4pVP^�4VP
RR4VP
R5R64VP
R\\V444VP4VPPV4R#VR78Xd�\P!R8R9/4P	4pVP^�4VP
RR:4VP
R\\V444VP4VPPV4R#\P!R;V4pV'd�\VP^44pVP^�4VP
RR
4VP
R\V^
,44VP4VPPRV,4VPP+4VP2P54R#\P!R<V4pV'EdP\VP^44p\VP^44p
R!P)R=\'V^,444pVP^�4VP
RR4VP
R\\V444VP4\'V4FqpVPPR>VR%2P	44VPP+4T
^8�gKT\P !T
R	,4Ks	VP2P54R#\P!R?V4pV'd�\VP^44p\P!R@RARBV/4P	4pVPRC4VP
RR4VP
R\\V444VP
RD\V44VP4VPPV4R#VRE8Xd�\P!RR/4P	4pVP^�4VP
RR4VP
R\\V444\'^24FpVP
RFV2RGVRHR]24K 	VP4VPPV4R#\P!RIV4pV'Ed2\VP^44p\VP^44p\VP^44p
VP^�4VP
RR
4VP
R\V44VP4^pVV8d�\9VVV,
4pVPPRJV,4VPP+4TT,
pT
^8�gKiTT8gKr\P !T
R	,4K�R#\P!RKV4pV'Ed�VP^4p\VP^44pVP:P<;_uu_4VP:P>PAV^4pV^,VP:P>V&RRR4XV8d�\P!R@RARLV/4P	4pVPRC4VP
RR4VP
R\\V444VP
RDR4VP4VPPV4R#\P!RRRMV^,/4P	4pVP^�4VP
RR4VP
R\\V444VP4VPPV4R#\P!RNV4pV'Ed\VP^44pRV,p
VP"PAROR!4pVPCRP4'd�\VRQ,PERH44pV
VRpVP^�4VP
RR
4VP
RRRSVRHV^,
RTV24VP
R\\V444VP4VPPV4R#VP^�4VP
RR
4VP
R\V44VP4VPPV
4R#VRV8XdwRWpVP^�4VP
RR4VP
R\\V444VP4VPPV4R#VRX8XdwRYpVP^�4VP
RR4VP
R\\V444VP4VPPV4R#VRZ8Xd�.R^OpR[P)V4R[,pVP^�4VP
RR4VP
R\\V444VP4VPPV4R#VPR\4VP
RR4VP4R#uuppiuupiuupi \6dR#i;i \6dR#i;i +'giEL;i \F\H3d8TPRU4TP
RR4TP4R#i;i)_z/fast�okT�ts�Content-Type�application/jsonrNz/delay/(\d+)g@�@�
delayed_msz/size/(\d+)�Xzapplication/octet-streamz/text/(\d+)�Az
text/plainz/json/(\d+)�data�Zz
/status/(\d+)�statusz/emptyz/headersz/redirect/(\d+)i.�Locationz
/redirect/�0�
redirectedz/stream/sse/(\d+)/(\d+)zdata: {"i":z}

rztext/event-streamz/stream/ndjson/(\d+)/(\d+)�seq�
zapplication/x-ndjsonz
/binary/(\d+)�z/hangz
/multi-headerz
Set-Cookieza=1zb=2zX-Multi�first�secondz/gzip�
compressed�messagezhello from gzipzContent-Encoding�gzipz/unicode�textu 你好世界 🌍 café résumézapplication/json; charset=utf-8z/disconnect/(\d+)z/stream/disconnect/(\d+)/(\d+)c3�."�TFpRVR2x�K
	R#5i)�line r<Nr)�.0�is& r�	<genexpr>�%TestHandler.do_GET.<locals>.<genexpr>s��� E��1�5���2���s�rEz/rate-limit/(\d+)�error�rate_limited�retry_afteri�zRetry-Afterz
/huge-headersz	X-Header-zvalue-�-z/slow-body/(\d+)/(\d+)/(\d+)�Dz/retry-succeed/([^/]+)/(\d+)�attempt�attemptsz/range-file/(\d+)�Rangezbytes=:�NNz
Content-Rangezbytes �/i�z/invalid-utf8/textscaf� r�sum�z/invalid-utf8/jsons��{"key":"value"}z/stream/invalid-utf8�
��dxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx)s	chunk1:��s	chunk2:��s	chunk3:��)%�path�json�dumps�time�encode�
send_response�send_header�str�len�end_headers�wfile�write�re�matchr#�group�sleepr�items�range�join�flush�bytesrB�compress�
connection�close�	Exception�min�serverrrr�
startswith�rstrip�
ValueError�
IndexError)rrWr&�m�ms�n�code�k�vr�delay_msrG�events�	full_body�	event_str�lines�line_str�gzip_mod�raw�
total_data�totalr(�sent�to_send�key�
fail_count�count�range_header�start�partial�chunkss&                              r�do_GET�TestHandler.do_GET6s)���y�y���7�?��:�:�t�T�4�����=�>�E�E�G�D����s�#����^�-?�@����-�s�3�t�9�~�>������J�J���T�"��
�H�H�_�d�+����Q�W�W�Q�Z��B��J�J�r�F�{�#��:�:�|�R�0�1�8�8�:�D����s�#����^�-?�@����-�s�3�t�9�~�>������J�J���T�"��
�H�H�^�T�*����A�G�G�A�J��A��!�8�D����s�#����^�-G�H����-�s�1�v�6������J�J���T�"��
�H�H�^�T�*����A�G�G�A�J��A��!�G�#�#�%�D����s�#����^�\�:����-�s�1�v�6������J�J���T�"��
�H�H�^�T�*����A�G�G�A�J��A��:�:�v�s�Q�w�/�0�7�7�9�D����s�#����^�-?�@����-�s�3�t�9�~�>������J�J���T�"��
�H�H�%�t�,����q�w�w�q�z�?�D��s�{��"�"�3�'�� � �"���:�:�x��.�/�6�6�8�D����t�$����^�-?�@����-�s�3�t�9�~�>������J�J���T�"���8�����s�#�������:��(,���(:�(:�(<�=�(<���q�t�(<�G�=��:�:�g�&�-�-�/�D����s�#����^�-?�@����-�s�3�t�9�~�>������J�J���T�"��
�H�H�'��.���1��A�G�G�A�J��A��1�u��"�"�3�'�� � ��z�!�A�#��-?�@�� � �!1�3�7�� � �"�
�
�z�z�<��"6�7�>�>�@���"�"�3�'�� � ��1C�D�� � �!1�3�s�4�y�>�B�� � �"��
�
� � ��&��
�H�H�/��6���1��A�G�G�A�J��A��1�7�7�1�:��H�:?��(�C�(�Q��q�c��0�(�F�C������.�.�0�I����s�#����^�-@�A����-�s�3�y�>�/B�C�����#�	��
�
� � ��!1�!1�!3�4��
�
� � �"��a�<��J�J�x�&�0�1�	$�

�
�H�H�2�D�9���1��A�G�G�A�J��A��1�7�7�1�:��H�<A�!�H�E�H�q�T�Z�Z���
�+�d�2�2�H�E�E������-�-�/�I����s�#����^�-C�D����-�s�3�y�>�/B�C�����!���
�
� � ����!2�3��
�
� � �"��a�<��J�J�x�&�0�1�	"�

�
�H�H�%�t�,����A�G�G�A�J��A���s��$��S��1��5�D����8�D����s�#����^�-G�H����-�s�1�v�6������J�J���T�"���7�?��J�J�s�O���?�"��:�:�t�T�l�+�2�2�4�D����s�#����^�-?�@����-�s�3�t�9�~�>����\�5�1����\�5�1����Y��0����Y��1������J�J���T�"���7�?�#��*�*�l�D�)�=N�O�P�W�W�Y�C��$�$�S�)�D����s�#����^�-?�@����/��8����-�s�3�t�9�~�>������J�J���T�"���:���:�:�v�'I�J�K�R�R�T�D����s�#����^�-N�O����-�s�3�t�9�~�>������J�J���T�"��
�H�H�)�4�0����A�G�G�A�J��A����s�#����^�-G�H����-�s�1�r�6�{�;������J�J���T�A�X�&��J�J�����O�O�!�!�#��
�H�H�6��=���1��A�G�G�A�J��A��1�7�7�1�:��H���� E��a�!�e�� E�E�J����s�#����^�\�:����-�s�3�z�?�/C�D������1�X����J�J�$�$�u�Q�C�r�]�%9�%9�%;�<��J�J�$�$�&��a�<��J�J�x�&�0�1��
�O�O�!�!�#��
�H�H�)�4�0����A�G�G�A�J��A��:�:�w��
�q�I�J�Q�Q�S�D����s�#����^�-?�@����-�s�3�t�9�~�>����]�C��F�3������J�J���T�"���?�"��:�:�t�T�l�+�2�2�4�D����s�#����^�-?�@����-�s�3�t�9�~�>��2�Y��� � �9�Q�C��F�1�#�Q�y�k�2J�K�������J�J���T�"��
�H�H�4�d�;���1������
�O�E��Q�W�W�Q�Z��J��1�7�7�1�:��H����s�#����^�-G�H����-�s�5�z�:������D���,��j�%�$�,�7����J�J�$�$�T�G�^�4��J�J�$�$�&������a�<�D�5�L��J�J�x�&�0�1��
�H�H�4�d�;���1��'�'�!�*�C��Q�W�W�Q�Z��J����'�'�'����2�2�6�6�s�A�>��27�!�)����*�*�3�/�(��z�!��z�z�7�N�I�u�"M�N�U�U�W���"�"�3�'�� � ��1C�D�� � �!1�3�s�4�y�>�B�� � ���4�� � �"��
�
� � ��&�
�
�z�z�4��z�5�1�9�"E�F�M�M�O���"�"�3�'�� � ��1C�D�� � �!1�3�s�4�y�>�B�� � �"��
�
� � ��&��
�H�H�)�4�0���1��A�G�G�A�J��A��q��I��<�<�+�+�G�R�8�L��&�&�x�0�0�'���R� 0� 7� 7�� <�=�E�'���/�G��&�&�s�+��$�$�^�5O�P��$�$�_��u�g�Q�q��s�e�1�Q�C�6P�Q��$�$�%5�s�3�w�<�7H�I��$�$�&��J�J�$�$�W�-�
��"�"�3�'�� � ��1K�L�� � �!1�3�q�6�:�� � �"��
�
� � ��+���'�'�*�D����s�#����^�\�:����-�s�3�t�9�~�>������J�J���T�"���'�'�1�D����s�#����^�-?�@����-�s�3�t�9�~�>������J�J���T�"���)�)�Q�F��:�:�f�%��-�D����s�#����^�\�:����-�s�3�t�9�~�>������J�J���T�"�����3�����)�3�/������E	>��BD��$F��B!�����b!�����(�'�'��H#�J�/�'��&�&�s�+��$�$�%5�s�;��$�$�&�
�'�sp�
A`�5A`�(A`
�2AA`�H<A`%�K7AA`7�TB:Aa�`A`"�`!A`"�`%A`4�`3A`4�`7Aa	�aAAb�bAbc���VPpVR8XEdVP4pVPPRR4pRTR\	V4RVPP4UUu/uFwrEWEbK		upp/pVP
R4VR&\P!V4P4pVP^�4VPRR
4VPR\\	V444VP4VPP!V4R#VR
8XEd^RIHpVP4pVPPRR4pV!VP
R4RR7p	RTRV	UUu.uFwrERVRV/NK
	upp/p\P!V4P4pVP^�4VPRR
4VPR\\	V444VP4VPP!V4R#VR8Xd�VP4pVPPRR4pRVR\	V4RRVP'49/p\P!V4P4pVP^�4VPRR
4VPR\\	V444VP4VPP!V4R#VPR4VPRR4VP4R#uuppi \d
RTR	&EL�i;iuuppi)z/echor0r�content_type�body_lengthrzutf-8r&T�body_binaryr1rNz/echo-urlencoded)�	parse_qsl)�keep_blank_values�fields�name�valuez/echo-multipart�
has_multipart�	multipartrUr9)rWr+rrr_rg�decode�UnicodeDecodeErrorrXrYr[r\r]r^r`rarb�urllib.parser�r)
rrWr&�ctrzr{�resp�	resp_bodyr��pairss
&         r�do_POST�TestHandler.do_POST�s����y�y���7�?��)�)�+�D����!�!�.�"�5�B����s�4�y��T�\�\�-?�-?�-A�B�-A�T�Q�A�D�-A�B��D�
+�#�{�{�7�3��V���
�
�4�(�/�/�1�I����s�#����^�-?�@����-�s�3�y�>�/B�C������J�J���Y�'���%�%�.��)�)�+�D����!�!�.�"�5�B��d�k�k�'�2�d�K�E����u�E�u�t�q�F�A�w��2�u�E��D��
�
�4�(�/�/�1�I����s�#����^�-?�@����-�s�3�y�>�/B�C������J�J���Y�'���$�$��)�)�+�D����!�!�.�"�5�B����s�4�y������
�!:��D�
�
�
�4�(�/�/�1�I����s�#����^�-?�@����-�s�3�y�>�/B�C������J�J���Y�'�����3�����)�3�/������iC��
&�
+�&*��]�#�
+��$Fs�,
M�?M�M3�M0�/M0c���VPR8XdHVP^�4VPRR4VPRR4VP4R#VPR4VP4R#)z
/head-testr0r1r�1000NrU)rWr\r]r`)rs&r�do_HEAD�TestHandler.do_HEAD�sg���9�9��$����s�#����^�-?�@����-�v�6���������3�����rrN)rrrr�protocol_versionrr+r�r�r�r�__classdictcell__)�
__classdict__s@rrrs-����!��
�B�0x�t>�@�rr�Fc��\RV3\4p\P!VPRR7pVP4V#)�	127.0.0.1T)�target�daemon)rrr�Thread�
serve_foreverr�)�portrq�threads&  r�start_serverr��s9��
��d� 3�[�
A�F�
�
�
�V�%9�%9�$�
G�F�
�L�L�N��Mr�__main__r�z Test server on http://127.0.0.1:)�file)r�)�__doc__�http.server�httprXrc�socketserver�sysrrZ�os�ThreadingMixInrq�
HTTPServerr�BaseHTTPRequestHandlerrr�rr_�argvr#r��print�stderrr��KeyboardInterrupt�shutdownrrr�<module>r�s����
��	��
���	�"��4�4�d�k�k�6L�6L�"�`�$�+�+�4�4�`�F��z��"�3�8�8�}�q�0�3�s�x�x��{��e�D�
��d� 3�[�
A�F�	�,�T�F�
3�#�*�*�E���������������s�
C!�!C<�;C<