%global _empty_manifest_terminate_build 0 Name: python-lowhaio Version: 0.0.88 Release: 1 Summary: Lightweight Python asyncio HTTP client License: MIT License URL: https://github.com/michalc/lowhaio Source0: https://mirrors.nju.edu.cn/pypi/web/packages/83/8a/8bf4f87bd6a0c4384448881a97cd1860f122e1585f937916fe03b7920d52/lowhaio-0.0.88.tar.gz BuildArch: noarch Requires: python3-aiodnsresolver %description # lowhaio [![CircleCI](https://circleci.com/gh/michalc/lowhaio.svg?style=svg)](https://circleci.com/gh/michalc/lowhaio) [![Test Coverage](https://api.codeclimate.com/v1/badges/418d72f1de909bff27b6/test_coverage)](https://codeclimate.com/github/michalc/lowhaio/test_coverage) A lightweight Python asyncio HTTP/1.1 client. No additional tasks are created; all code is in a single module; and other than the standard library only a single dependency is required, [aiodnsresolver](https://github.com/michalc/aiodnsresolver) Lowhaio has a deliberately limited scope: it includes just enough code to be a useful HTTP client and allow more complex behaviour to be added on top if required. Connections are DNS-aware, in that they are only re-used if they match a current A record for the domain. ## Installation ```bash pip install lowhaio ``` ## Usage The API is streaming-first: for both request and response bodies, asynchronous iterators are used. ```python import asyncio from lowhaio import Pool async def main(): request, close = Pool() async def request_body(): yield b'a' yield b'bc' code, headers, response_body = await request( b'POST', 'https://postman-echo.com/post', headers=((b'content-length', b'3'), (b'content-type', b'text/plain'),), body=request_body, ) async for chunk in response_body: print(chunk) await close() loop = asyncio.get_event_loop() loop.run_until_complete(main()) ``` However, there are helper functions `streamed` and `buffered` when this isn't required or possible. ```python import asyncio from lowhaio import Pool, streamed, buffered async def main(): request, close = Pool() request_body = streamed(b'abc') code, headers, response_body = await request( b'POST', 'https://postman-echo.com/post', headers=((b'content-length', b'3'), (b'content-type', b'text/plain'),), body=request_body, ) print(await buffered(response_body)) await close() loop = asyncio.get_event_loop() loop.run_until_complete(main()) ``` ## Headers The only header automatically added to requests is the `host` header, which is the idna/punycode-encoded domain name from the requested URL. ## Exceptions Exceptions are usually subclasses of `HttpError`. If a lower-level exception caused this, it is set in the `__cause__` attribute of the `HttpError`. Specifically, before any data is sent `HttpConnectionError` is raised, and after data is sent, `HttpDataError` is raised. This difference is to make it possible to know if non-idempotent requests can be retried. However, `asyncio.CancelledError` and exceptions that do not directive from `Exception`, such as `SystemExit`, are allowed to bubble up. ## Custom SSL context Lowhaio can be used with an custom SSL context through through the `get_ssl_context` parameter to `Pool`. For example, to use the certifi CA bundle, you can install it by ```bash pip install certifi ``` and use it as below. ```python import asyncio import ssl import certifi from lowhaio import Pool, buffered, streamed async def main(): request, close = Pool( get_ssl_context=lambda: ssl.create_default_context(cafile=certifi.where()), ) request_body = streamed(b'abc') code, headers, response_body = await request( b'POST', 'https://postman-echo.com/post', headers=((b'content-length', b'3'), (b'content-type', b'text/plain'),), body=request_body, ) print(await buffered(response_body)) await close() loop = asyncio.get_event_loop() loop.run_until_complete(main()) ``` ## Scope The scope of the core functions is restricted to: - (TLS) connection opening, closing and pooling; - passing and receiving HTTP headers and streaming bodies; - decoding chunked responses; - raising exceptions on timeouts. This is to make the core behaviour useful to a reasonable range of uses, but to _not_ include what can be added by layer(s) on top. Specifically not included: - following redirects, implemented by [lowhaio-redirect](https://github.com/michalc/lowhaio-redirect); - retrying failed requests, implemented by [lowhaio-retry](https://github.com/michalc/lowhaio-retry); - encoding chunked requests, implemented by [lowhaio-chunked](https://github.com/michalc/lowhaio-chunked); - authentication, such as AWS Signature Version 4 implemented by [lowhaio-aws-sigv4](https://github.com/michalc/lowhaio-aws-sigv4), or AWS Signature Version 4 with unsigned payload implemented by [lowhaio-aws-sigv4-unsigned-payload](https://github.com/michalc/lowhaio-aws-sigv4-unsigned-payload); - compressing/decompressing requests/responses; - cookies. %package -n python3-lowhaio Summary: Lightweight Python asyncio HTTP client Provides: python-lowhaio BuildRequires: python3-devel BuildRequires: python3-setuptools BuildRequires: python3-pip %description -n python3-lowhaio # lowhaio [![CircleCI](https://circleci.com/gh/michalc/lowhaio.svg?style=svg)](https://circleci.com/gh/michalc/lowhaio) [![Test Coverage](https://api.codeclimate.com/v1/badges/418d72f1de909bff27b6/test_coverage)](https://codeclimate.com/github/michalc/lowhaio/test_coverage) A lightweight Python asyncio HTTP/1.1 client. No additional tasks are created; all code is in a single module; and other than the standard library only a single dependency is required, [aiodnsresolver](https://github.com/michalc/aiodnsresolver) Lowhaio has a deliberately limited scope: it includes just enough code to be a useful HTTP client and allow more complex behaviour to be added on top if required. Connections are DNS-aware, in that they are only re-used if they match a current A record for the domain. ## Installation ```bash pip install lowhaio ``` ## Usage The API is streaming-first: for both request and response bodies, asynchronous iterators are used. ```python import asyncio from lowhaio import Pool async def main(): request, close = Pool() async def request_body(): yield b'a' yield b'bc' code, headers, response_body = await request( b'POST', 'https://postman-echo.com/post', headers=((b'content-length', b'3'), (b'content-type', b'text/plain'),), body=request_body, ) async for chunk in response_body: print(chunk) await close() loop = asyncio.get_event_loop() loop.run_until_complete(main()) ``` However, there are helper functions `streamed` and `buffered` when this isn't required or possible. ```python import asyncio from lowhaio import Pool, streamed, buffered async def main(): request, close = Pool() request_body = streamed(b'abc') code, headers, response_body = await request( b'POST', 'https://postman-echo.com/post', headers=((b'content-length', b'3'), (b'content-type', b'text/plain'),), body=request_body, ) print(await buffered(response_body)) await close() loop = asyncio.get_event_loop() loop.run_until_complete(main()) ``` ## Headers The only header automatically added to requests is the `host` header, which is the idna/punycode-encoded domain name from the requested URL. ## Exceptions Exceptions are usually subclasses of `HttpError`. If a lower-level exception caused this, it is set in the `__cause__` attribute of the `HttpError`. Specifically, before any data is sent `HttpConnectionError` is raised, and after data is sent, `HttpDataError` is raised. This difference is to make it possible to know if non-idempotent requests can be retried. However, `asyncio.CancelledError` and exceptions that do not directive from `Exception`, such as `SystemExit`, are allowed to bubble up. ## Custom SSL context Lowhaio can be used with an custom SSL context through through the `get_ssl_context` parameter to `Pool`. For example, to use the certifi CA bundle, you can install it by ```bash pip install certifi ``` and use it as below. ```python import asyncio import ssl import certifi from lowhaio import Pool, buffered, streamed async def main(): request, close = Pool( get_ssl_context=lambda: ssl.create_default_context(cafile=certifi.where()), ) request_body = streamed(b'abc') code, headers, response_body = await request( b'POST', 'https://postman-echo.com/post', headers=((b'content-length', b'3'), (b'content-type', b'text/plain'),), body=request_body, ) print(await buffered(response_body)) await close() loop = asyncio.get_event_loop() loop.run_until_complete(main()) ``` ## Scope The scope of the core functions is restricted to: - (TLS) connection opening, closing and pooling; - passing and receiving HTTP headers and streaming bodies; - decoding chunked responses; - raising exceptions on timeouts. This is to make the core behaviour useful to a reasonable range of uses, but to _not_ include what can be added by layer(s) on top. Specifically not included: - following redirects, implemented by [lowhaio-redirect](https://github.com/michalc/lowhaio-redirect); - retrying failed requests, implemented by [lowhaio-retry](https://github.com/michalc/lowhaio-retry); - encoding chunked requests, implemented by [lowhaio-chunked](https://github.com/michalc/lowhaio-chunked); - authentication, such as AWS Signature Version 4 implemented by [lowhaio-aws-sigv4](https://github.com/michalc/lowhaio-aws-sigv4), or AWS Signature Version 4 with unsigned payload implemented by [lowhaio-aws-sigv4-unsigned-payload](https://github.com/michalc/lowhaio-aws-sigv4-unsigned-payload); - compressing/decompressing requests/responses; - cookies. %package help Summary: Development documents and examples for lowhaio Provides: python3-lowhaio-doc %description help # lowhaio [![CircleCI](https://circleci.com/gh/michalc/lowhaio.svg?style=svg)](https://circleci.com/gh/michalc/lowhaio) [![Test Coverage](https://api.codeclimate.com/v1/badges/418d72f1de909bff27b6/test_coverage)](https://codeclimate.com/github/michalc/lowhaio/test_coverage) A lightweight Python asyncio HTTP/1.1 client. No additional tasks are created; all code is in a single module; and other than the standard library only a single dependency is required, [aiodnsresolver](https://github.com/michalc/aiodnsresolver) Lowhaio has a deliberately limited scope: it includes just enough code to be a useful HTTP client and allow more complex behaviour to be added on top if required. Connections are DNS-aware, in that they are only re-used if they match a current A record for the domain. ## Installation ```bash pip install lowhaio ``` ## Usage The API is streaming-first: for both request and response bodies, asynchronous iterators are used. ```python import asyncio from lowhaio import Pool async def main(): request, close = Pool() async def request_body(): yield b'a' yield b'bc' code, headers, response_body = await request( b'POST', 'https://postman-echo.com/post', headers=((b'content-length', b'3'), (b'content-type', b'text/plain'),), body=request_body, ) async for chunk in response_body: print(chunk) await close() loop = asyncio.get_event_loop() loop.run_until_complete(main()) ``` However, there are helper functions `streamed` and `buffered` when this isn't required or possible. ```python import asyncio from lowhaio import Pool, streamed, buffered async def main(): request, close = Pool() request_body = streamed(b'abc') code, headers, response_body = await request( b'POST', 'https://postman-echo.com/post', headers=((b'content-length', b'3'), (b'content-type', b'text/plain'),), body=request_body, ) print(await buffered(response_body)) await close() loop = asyncio.get_event_loop() loop.run_until_complete(main()) ``` ## Headers The only header automatically added to requests is the `host` header, which is the idna/punycode-encoded domain name from the requested URL. ## Exceptions Exceptions are usually subclasses of `HttpError`. If a lower-level exception caused this, it is set in the `__cause__` attribute of the `HttpError`. Specifically, before any data is sent `HttpConnectionError` is raised, and after data is sent, `HttpDataError` is raised. This difference is to make it possible to know if non-idempotent requests can be retried. However, `asyncio.CancelledError` and exceptions that do not directive from `Exception`, such as `SystemExit`, are allowed to bubble up. ## Custom SSL context Lowhaio can be used with an custom SSL context through through the `get_ssl_context` parameter to `Pool`. For example, to use the certifi CA bundle, you can install it by ```bash pip install certifi ``` and use it as below. ```python import asyncio import ssl import certifi from lowhaio import Pool, buffered, streamed async def main(): request, close = Pool( get_ssl_context=lambda: ssl.create_default_context(cafile=certifi.where()), ) request_body = streamed(b'abc') code, headers, response_body = await request( b'POST', 'https://postman-echo.com/post', headers=((b'content-length', b'3'), (b'content-type', b'text/plain'),), body=request_body, ) print(await buffered(response_body)) await close() loop = asyncio.get_event_loop() loop.run_until_complete(main()) ``` ## Scope The scope of the core functions is restricted to: - (TLS) connection opening, closing and pooling; - passing and receiving HTTP headers and streaming bodies; - decoding chunked responses; - raising exceptions on timeouts. This is to make the core behaviour useful to a reasonable range of uses, but to _not_ include what can be added by layer(s) on top. Specifically not included: - following redirects, implemented by [lowhaio-redirect](https://github.com/michalc/lowhaio-redirect); - retrying failed requests, implemented by [lowhaio-retry](https://github.com/michalc/lowhaio-retry); - encoding chunked requests, implemented by [lowhaio-chunked](https://github.com/michalc/lowhaio-chunked); - authentication, such as AWS Signature Version 4 implemented by [lowhaio-aws-sigv4](https://github.com/michalc/lowhaio-aws-sigv4), or AWS Signature Version 4 with unsigned payload implemented by [lowhaio-aws-sigv4-unsigned-payload](https://github.com/michalc/lowhaio-aws-sigv4-unsigned-payload); - compressing/decompressing requests/responses; - cookies. %prep %autosetup -n lowhaio-0.0.88 %build %py3_build %install %py3_install install -d -m755 %{buildroot}/%{_pkgdocdir} if [ -d doc ]; then cp -arf doc %{buildroot}/%{_pkgdocdir}; fi if [ -d docs ]; then cp -arf docs %{buildroot}/%{_pkgdocdir}; fi if [ -d example ]; then cp -arf example %{buildroot}/%{_pkgdocdir}; fi if [ -d examples ]; then cp -arf examples %{buildroot}/%{_pkgdocdir}; fi pushd %{buildroot} if [ -d usr/lib ]; then find usr/lib -type f -printf "/%h/%f\n" >> filelist.lst fi if [ -d usr/lib64 ]; then find usr/lib64 -type f -printf "/%h/%f\n" >> filelist.lst fi if [ -d usr/bin ]; then find usr/bin -type f -printf "/%h/%f\n" >> filelist.lst fi if [ -d usr/sbin ]; then find usr/sbin -type f -printf "/%h/%f\n" >> filelist.lst fi touch doclist.lst if [ -d usr/share/man ]; then find usr/share/man -type f -printf "/%h/%f.gz\n" >> doclist.lst fi popd mv %{buildroot}/filelist.lst . mv %{buildroot}/doclist.lst . %files -n python3-lowhaio -f filelist.lst %dir %{python3_sitelib}/* %files help -f doclist.lst %{_docdir}/* %changelog * Tue May 30 2023 Python_Bot - 0.0.88-1 - Package Spec generated