Name | httpy JSON |
Version |
2.0.3
JSON |
| download |
home_page | https://github.com/jenca-adam/httpy |
Summary | A lightweight socket-based HTTP(s) and WebSocket client. |
upload_time | 2024-02-27 12:46:33 |
maintainer | |
docs_url | None |
author | Adam Jenca |
requires_python | >=3.6.0 |
license | |
keywords |
|
VCS |
|
bugtrack_url |
|
requirements |
No requirements were recorded.
|
Travis-CI |
No Travis.
|
coveralls test coverage |
No coveralls.
|
.. image:: https://badgen.net/github/release/jenca-adam/httpy?color=green
:target: https://github.com/jenca-adam/httpy/releases/latest
:alt: Latest Release
.. image:: https://badgen.net/github/stars/jenca-adam/httpy?color=red
:target: https://github.com/jenca-adam/httpy/
:alt: Stars
.. image:: https://badgen.net/github/tags/jenca-adam/httpy?color=cyan
:target: https://github.com/jenca-adam/httpy/tags
:alt: Tags
.. image:: https://badgen.net/github/releases/jenca-adam/httpy?color=yellow
:target: https://github.com/jenca-adam/httpy/releases
:alt: Releases Count
.. image:: https://badgen.net/github/license/jenca-adam/httpy?color=black
:target: https://github.com/jenca-adam/httpy/blob/main/LICENSE
:alt: License
.. image:: https://badgen.net/badge/icon/github?icon=github&label
:target: https://github.com/jenca-adam/httpy/
:alt: GitHub
.. image:: https://badgen.net/badge/icon/pypi?icon=pypi&label&color=purple
:target: https://pypi.org/project/httpy
:alt: PyPI
.. image:: https://readthedocs.org/projects/httpy/badge/?version=latest
:target: https://httpy.readthedocs.io/en/latest/?badge=latest
:alt: Documentation Status
.. image:: https://badgen.net/badgesize/normal/jenca-adam/httpy/master/latest_release/latest.whl
:target: https://github.com/jenca-adam/httpy
:alt: Size
.. image:: https://img.shields.io/pypi/dm/httpy.svg
:target: https://pypi.org/project/httpy
:alt: Downloads/Month
Docs at https://httpy.readthedocs.io/
=====
httpy
=====
A Python lightweight socket-based library to create HTTP(s) and
WebSocket connections.
Features
========
- Cookies support
- Caching support
- Easy debugging
- HTTP Basic and Digest authentication
- Form support
- Keep-Alive and Sessions support
- JSON support
- Sessions support
- Runs in PyPy
- Independent of http.client
- HTTP/2 Support
- Async IO support
Requirements
============
- Python>=3.6
Installation
============
Any platform
------------
Git
~~~
1. ``git clone https://github.com/jenca-adam/httpy``
2. ``cd httpy``
3. ``python3 setup.py install``
The Python version check will be performed automatically
Pip
~~~
1. ``python3 -m pip install httpy``
Arch Linux
----------
1. ``yay -S httpy``
Usage
=====
`REFERENCE <httpy.html#submodules>`__
HTTP
----
It's easy.
.. code-block:: python
import httpy
resp = httpy.request("https://example.com/") # Do a request
resp.content #Access content
Specifying a HTTP version
~~~~~~~~~~~~~~~~~~~~~~~~~
Set the ``http_version`` argument, but keep in mind the following
1. You can't make an asynchronous request using HTTP/1.1
2. HTTP/2 requests can't be performed over insecure (http scheme)
connections.
If you don't set it, the HTTP version will be automatically detected
using ALPN <https://datatracker.ietf.org/doc/html/rfc7301>.
Valid ``http_version`` values are ``"1.1"`` and ``"2"``.
Non-blocking requests
~~~~~~~~~~~~~~~~~~~~~
.. code-block:: python
import httpy
pending = httpy.request("https://example.com/", blocking = False)
``PendingRequest.response`` returns the result of the response. You can
check if the request is already done using ``PendingRequest.finished``
I want cookies!
~~~~~~~~~~~~~~~
The ``Dir`` class allows you to store httpy's data (cache and cookies)
on the path of your choice. By default, the data is stored in
``~/.cache/httpy``. If you want to store the data without using the ``Dir`` class, use the
``enable_cookies`` or ``enable_cache`` argument of ``request``.
.. code-block:: python
import httpy
directory = httpy.Dir("your/path")
directory.request("https://example.com/") # ...
Keep-Alive requests
~~~~~~~~~~~~~~~~~~~
If you want to reuse a connection, it is highly recommended to use a
``Session`` class. It offers more control over connection closure than
the standard ``request``
.. code-block:: python
import httpy
session = httpy.Session()
session.request("https://example.com/")
HTTPy sets ``Connection: close`` by default in non-Session requests. If
you want to keep the connection alive outside a session, you must
specify so in the ``headers`` argument.
Asynchronous requests
~~~~~~~~~~~~~~~~~~~~~
You can perform async requests using the ``async_request`` method.
The simplest use case:
.. code-block:: python
import httpy
async def my_function():
return await httpy.request("https://example.com/")
If you want to perform multiple requests at once on the same connection
(i.e. with ``asyncio.gather``), use the ``initiate_http2_connection``
method of ``Session``:
.. code-block:: python
import httpy
import asyncio
async def my_function():
session = httpy.Session()
await session.initiate_http2_connection(host="example.com")
return await asyncio.gather(*(session.async_request("https://www.example.com/") for _ in range(69)))
``Session`` and ``Dir`` and everything with a ``request()`` method has
an ``async_request()`` equivalent.
``Response`` class attributes
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
The ``Response`` class returned by ``request()`` has some useful
attributes:
``Response.content``
^^^^^^^^^^^^^^^^^^^^
The response content as ``bytes``. Example:
.. code-block:: python
import httpy
resp = httpy.request("https://www.google.com/")
print(resp.content)
#b'!<doctype html>\n<html>...
``Response.status``
^^^^^^^^^^^^^^^^^^^
The response status as a ``Status`` object. Example:
.. code-block:: python
import httpy
resp = httpy.request("https://www.example.com/this_url_doesnt_exist")
print(resp.status)
# 404
print(resp.status.reason)
# NOT FOUND
print(resp.status.description)
# indicates that the origin server did not find a current representation for the target resource or is not willing to disclose that one exists.
print(resp.status>400)
# True
``Status`` subclasses ``int``.
``Response.history``
^^^^^^^^^^^^^^^^^^^^
All the redirects on the way to this response as ``list``.
Example:
.. code-block:: python
import httpy
resp = httpy.request("https://httpbin.org/redirect/1")
print(resp.history)
# [<Response GET [302 Found] (https://httpbin.org/redirect/1/)>, <Response GET [200 OK] (https://httpbin.org/get/)>]
``Response.history`` is ordered from oldest to newest
``Response.fromcache``
^^^^^^^^^^^^^^^^^^^^^^
Indicates whether the response was loaded from cache (``bool``).
Example:
.. code-block:: python
import httpy
resp = httpy.request("https://example.com/")
print(resp.fromcache)
# False
resp = httpy.request("https://example.com/")
print(resp.fromcache)
# True
``Response.request``
^^^^^^^^^^^^^^^^^^^^
Some of the attributes of the request that produced this response, as a
``Request`` object.
``Request``'s attributes
''''''''''''''''''''''''
- ``Request.url`` - the URL requested (``str``)
- ``Request.headers`` - the requests' headers (``Headers``)
- ``Request.socket`` - the underlying connection (either
``socket.socket`` or ``httpy.http2.connection.HTTP2Connection``)
- ``Request.cache`` - the same as ``Response.fromcache`` (``bool``)
- ``Request.http_version`` - the HTTP version used (``str``)
- ``Request.method`` - the HTTP method used (``str``)
Example:
.. code-block:: python
import httpy
resp = httpy.request("https://example.com/")
print(resp.request.url)
# https://example.com/
print(resp.request.headers)
# {'Accept-Encoding': 'gzip, deflate, identity', 'Host': 'example.com', 'User-Agent': 'httpy/2.0.0', 'Connection': 'close', 'Accept': '*/*'}
print(resp.request.method)
# GET
``Response.original_content``
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Raw content received from the server, not decoded with Content-Encoding
(``bytes``).
Example:
.. code-block:: python
import httpy
resp = httpy.request("https://example.com/")
print(resp.original_content)
# b'\x1f\x8b\x08\x00\xc2 ...
``Response.time_elapsed``
^^^^^^^^^^^^^^^^^^^^^^^^^
Time the request took, in seconds. Only the loading time of this
particular request, doesn't account for redirects. (``float``).
Example:
.. code-block:: python
import httpy
resp = httpy.request("https://example.com/")
print(resp.time_elapsed)
# 0.2497
``Response.speed``
^^^^^^^^^^^^^^^^^^
The download speed for the response, in bytes per second. (``float``).
Might be different for HTTP/2 request. Example:
.. code-block:: python
import httpy
resp = httpy.request("https://example.com/")
print(resp.speed)
# 2594.79
``Response.content_type``
^^^^^^^^^^^^^^^^^^^^^^^^^
The response's ``Content-Type`` header contents, with the charset
information stripped. If the headers lack ``Content-Type``, it's
``text/html`` by default.
.. code-block:: python
import httpy
resp = httpy.request("https://example.com/")
print(resp.content_type)
# text/html
``Response.charset`` (property)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Gets the charset of the response (``str`` or ``None``):
1. If a charset was specified in the response headers, return it
2. If a charset was not specified, but ``chardet`` is available, try to
detect the charset (Note that this still returns ``None`` if
``chardet`` fails)
3. If a charset was not specified, and ``chardet`` is not available,
return ``None``
Example:
.. code-block:: python
import httpy
resp = httpy.request("https://example.com/")
print(resp.charset)
# UTF-8
``Response.string`` (property)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
``Response.content``, decoded using ``Response.charset`` (``str``)
.. warning::
Do not try to access ``Response.string``, if ``Response.charset`` is
``None``, unless you are absolutely sure the response data is
decodable by the default locale encoding.
For ASCII responses this is probably harmless, but you have been
warned!
Example:
.. code-block:: python
import httpy
resp = httpy.request("https://example.com/")
print(resp.string)
#<!doctype html>
...
``Response.json`` (property)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^
If ``Response.content_type`` is ``application/json``, try to parse
``Response.string`` using JSON. Throw an error otherwise.
.. warning::
The same as above applies.
Example:
.. code-block:: python
import httpy
resp = httpy.request("https://httpbin.org/get")
print(resp.json["url"])
# https://httpbin.org/get
``Response.method``
^^^^^^^^^^^^^^^^^^^
The same as ``Response.request.method``
WebSockets
----------
Easy again...
.. code-block:: python
>>> import httpy
>>> sock = httpy.WebSocket("wss://echo.websocket.events/")# create a websocket client(echo server example)
>>> sock.send("Hello, world!💥")# you can send also bytes
>>> sock.recv()
"Hello, world!💥"
Examples
========
POST method
-----------
Simple Form
~~~~~~~~~~~
.. code-block:: python
import httpy
resp = httpy.request("https://example.com/", method="POST", body = {"foo":"bar"})
# ...
Sending files
~~~~~~~~~~~~~
.. code-block:: python
import httpy
resp = httpy.request("https://example.com/", method = "POST", body = { "foo" : "bar", "file" : httpy.File.open( "example.txt" ) })
# ...
Sending binary data
~~~~~~~~~~~~~~~~~~~
.. code-block:: python
import httpy
resp = httpy.request("https://example.com/", method = "POST", body= b" Hello, World ! ")
# ...
Sending plain text
~~~~~~~~~~~~~~~~~~
.. code-block:: python
resp = httpy.request("https://example.com/", method = "POST", body = "I support Ünicode !")
# ...
Sending JSON
~~~~~~~~~~~~
.. code-block:: python
resp = httpy.request("https://example.com/", method = "POST", body = "{\"foo\" : \"bar\" }", content_type = "application/json")
# ...
Debugging
=========
Just set ``debug`` to ``True`` :
.. code-block:: python
>>> import httpy
>>> httpy.request("https://example.com/",debug=True)
[INFO][request](1266): request() called.
[INFO][_raw_request](1112): _raw_request() called.
[INFO][_raw_request](1113): Accessing cache.
[INFO][_raw_request](1120): No data in cache.
[INFO][_raw_request](1151): Establishing connection
[INFO]Connection[__init__](778): Created new Connection upon <socket.socket fd=3, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=6, laddr=('192.168.100.88', 58998), raddr=('93.184.216.34', 443)>
send:
GET / HTTP/1.1
Accept-Encoding: gzip, deflate, identity
Host: www.example.com
User-Agent: httpy/1.1.0
Connection: keep-alive
response:
HTTP/1.1 200 OK
Content-Encoding: gzip
Age: 438765
Cache-Control: max-age=604800
Content-Type: text/html; charset=UTF-8
Date: Wed, 13 Apr 2022 12:59:07 GMT
Etag: "3147526947+gzip"
Expires: Wed, 20 Apr 2022 12:59:07 GMT
Last-Modified: Thu, 17 Oct 2019 07:18:26 GMT
Server: ECS (dcb/7F37)
Vary: Accept-Encoding
X-Cache: HIT
Content-Length: 648
<Response [200 OK] (https://www.example.com/)>
Raw data
{
"_id": null,
"home_page": "https://github.com/jenca-adam/httpy",
"name": "httpy",
"maintainer": "",
"docs_url": null,
"requires_python": ">=3.6.0",
"maintainer_email": "",
"keywords": "",
"author": "Adam Jenca",
"author_email": "jenca.a@gjh.sk",
"download_url": "https://files.pythonhosted.org/packages/30/35/1ef511820ae83c6b11e6db0e1b1080b2c2f426bdbecd4728037af4417aa7/httpy-2.0.3.tar.gz",
"platform": null,
"description": "\n.. image:: https://badgen.net/github/release/jenca-adam/httpy?color=green\n :target: https://github.com/jenca-adam/httpy/releases/latest\n :alt: Latest Release\n\n.. image:: https://badgen.net/github/stars/jenca-adam/httpy?color=red\n :target: https://github.com/jenca-adam/httpy/\n :alt: Stars\n\n.. image:: https://badgen.net/github/tags/jenca-adam/httpy?color=cyan\n :target: https://github.com/jenca-adam/httpy/tags\n :alt: Tags\n\n.. image:: https://badgen.net/github/releases/jenca-adam/httpy?color=yellow\n :target: https://github.com/jenca-adam/httpy/releases\n :alt: Releases Count\n\n.. image:: https://badgen.net/github/license/jenca-adam/httpy?color=black\n :target: https://github.com/jenca-adam/httpy/blob/main/LICENSE\n :alt: License\n\n.. image:: https://badgen.net/badge/icon/github?icon=github&label\n :target: https://github.com/jenca-adam/httpy/\n :alt: GitHub\n\n.. image:: https://badgen.net/badge/icon/pypi?icon=pypi&label&color=purple\n :target: https://pypi.org/project/httpy\n :alt: PyPI\n\n.. image:: https://readthedocs.org/projects/httpy/badge/?version=latest\n :target: https://httpy.readthedocs.io/en/latest/?badge=latest\n :alt: Documentation Status\n\n.. image:: https://badgen.net/badgesize/normal/jenca-adam/httpy/master/latest_release/latest.whl\n :target: https://github.com/jenca-adam/httpy\n :alt: Size\n\n\n.. image:: https://img.shields.io/pypi/dm/httpy.svg\n :target: https://pypi.org/project/httpy\n :alt: Downloads/Month\n\n\n\nDocs at https://httpy.readthedocs.io/\n\n=====\nhttpy\n=====\n\n\nA Python lightweight socket-based library to create HTTP(s) and\nWebSocket connections.\n\nFeatures\n========\n\n- Cookies support\n- Caching support\n- Easy debugging\n- HTTP Basic and Digest authentication\n- Form support\n- Keep-Alive and Sessions support\n- JSON support\n- Sessions support\n- Runs in PyPy\n- Independent of http.client\n- HTTP/2 Support\n- Async IO support\n\nRequirements\n============\n\n- Python>=3.6\n\nInstallation\n============\n\nAny platform\n------------\n\nGit\n~~~\n\n 1. ``git clone https://github.com/jenca-adam/httpy``\n 2. ``cd httpy``\n 3. ``python3 setup.py install``\n\nThe Python version check will be performed automatically\n\nPip\n~~~\n\n 1. ``python3 -m pip install httpy``\n\nArch Linux\n----------\n\n 1. ``yay -S httpy``\n\nUsage\n=====\n\n`REFERENCE <httpy.html#submodules>`__\n\nHTTP\n----\n\nIt's easy.\n\n.. code-block:: python\n\n import httpy\n resp = httpy.request(\"https://example.com/\") # Do a request\n resp.content #Access content\n\nSpecifying a HTTP version\n~~~~~~~~~~~~~~~~~~~~~~~~~\n\nSet the ``http_version`` argument, but keep in mind the following\n\n1. You can't make an asynchronous request using HTTP/1.1\n2. HTTP/2 requests can't be performed over insecure (http scheme)\n connections.\n\nIf you don't set it, the HTTP version will be automatically detected\nusing ALPN <https://datatracker.ietf.org/doc/html/rfc7301>.\n\nValid ``http_version`` values are ``\"1.1\"`` and ``\"2\"``.\n\nNon-blocking requests\n~~~~~~~~~~~~~~~~~~~~~\n\n.. code-block:: python\n\n import httpy\n pending = httpy.request(\"https://example.com/\", blocking = False)\n\n``PendingRequest.response`` returns the result of the response. You can\ncheck if the request is already done using ``PendingRequest.finished``\n\nI want cookies!\n~~~~~~~~~~~~~~~\n\nThe ``Dir`` class allows you to store httpy's data (cache and cookies)\non the path of your choice. By default, the data is stored in\n``~/.cache/httpy``. If you want to store the data without using the ``Dir`` class, use the\n``enable_cookies`` or ``enable_cache`` argument of ``request``. \n.. code-block:: python\n\n import httpy\n directory = httpy.Dir(\"your/path\")\n directory.request(\"https://example.com/\") # ...\n\nKeep-Alive requests\n~~~~~~~~~~~~~~~~~~~\n\nIf you want to reuse a connection, it is highly recommended to use a\n``Session`` class. It offers more control over connection closure than\nthe standard ``request``\n\n.. code-block:: python\n\n import httpy\n session = httpy.Session()\n session.request(\"https://example.com/\")\n\nHTTPy sets ``Connection: close`` by default in non-Session requests. If\nyou want to keep the connection alive outside a session, you must\nspecify so in the ``headers`` argument.\n\nAsynchronous requests\n~~~~~~~~~~~~~~~~~~~~~\n\nYou can perform async requests using the ``async_request`` method.\n\nThe simplest use case:\n\n.. code-block:: python\n\n import httpy\n\n async def my_function():\n return await httpy.request(\"https://example.com/\")\n\nIf you want to perform multiple requests at once on the same connection\n(i.e.\u00a0with ``asyncio.gather``), use the ``initiate_http2_connection``\nmethod of ``Session``:\n\n.. code-block:: python\n\n import httpy\n import asyncio\n\n async def my_function():\n session = httpy.Session()\n await session.initiate_http2_connection(host=\"example.com\")\n return await asyncio.gather(*(session.async_request(\"https://www.example.com/\") for _ in range(69)))\n\n``Session`` and ``Dir`` and everything with a ``request()`` method has\nan ``async_request()`` equivalent.\n\n``Response`` class attributes\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nThe ``Response`` class returned by ``request()`` has some useful\nattributes:\n\n``Response.content``\n^^^^^^^^^^^^^^^^^^^^\n\nThe response content as ``bytes``. Example:\n\n.. code-block:: python\n\n import httpy\n resp = httpy.request(\"https://www.google.com/\")\n print(resp.content)\n #b'!<doctype html>\\n<html>...\n\n``Response.status``\n^^^^^^^^^^^^^^^^^^^\n\nThe response status as a ``Status`` object. Example:\n\n.. code-block:: python\n\n import httpy\n resp = httpy.request(\"https://www.example.com/this_url_doesnt_exist\")\n print(resp.status)\n # 404\n print(resp.status.reason)\n # NOT FOUND\n print(resp.status.description)\n # indicates that the origin server did not find a current representation for the target resource or is not willing to disclose that one exists.\n print(resp.status>400)\n # True\n\n``Status`` subclasses ``int``.\n\n``Response.history``\n^^^^^^^^^^^^^^^^^^^^\n\nAll the redirects on the way to this response as ``list``.\n\nExample:\n\n.. code-block:: python\n\n import httpy\n resp = httpy.request(\"https://httpbin.org/redirect/1\")\n print(resp.history)\n # [<Response GET [302 Found] (https://httpbin.org/redirect/1/)>, <Response GET [200 OK] (https://httpbin.org/get/)>]\n\n``Response.history`` is ordered from oldest to newest\n\n``Response.fromcache``\n^^^^^^^^^^^^^^^^^^^^^^\n\nIndicates whether the response was loaded from cache (``bool``).\n\nExample:\n\n.. code-block:: python\n\n import httpy\n resp = httpy.request(\"https://example.com/\")\n print(resp.fromcache)\n # False\n resp = httpy.request(\"https://example.com/\")\n print(resp.fromcache)\n # True\n\n``Response.request``\n^^^^^^^^^^^^^^^^^^^^\n\nSome of the attributes of the request that produced this response, as a\n``Request`` object.\n\n``Request``'s attributes\n''''''''''''''''''''''''\n\n- ``Request.url`` - the URL requested (``str``)\n- ``Request.headers`` - the requests' headers (``Headers``)\n- ``Request.socket`` - the underlying connection (either\n ``socket.socket`` or ``httpy.http2.connection.HTTP2Connection``)\n- ``Request.cache`` - the same as ``Response.fromcache`` (``bool``)\n- ``Request.http_version`` - the HTTP version used (``str``)\n- ``Request.method`` - the HTTP method used (``str``)\n\nExample:\n\n.. code-block:: python\n\n import httpy\n resp = httpy.request(\"https://example.com/\")\n print(resp.request.url)\n # https://example.com/\n print(resp.request.headers)\n # {'Accept-Encoding': 'gzip, deflate, identity', 'Host': 'example.com', 'User-Agent': 'httpy/2.0.0', 'Connection': 'close', 'Accept': '*/*'}\n print(resp.request.method)\n # GET\n\n``Response.original_content``\n^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\nRaw content received from the server, not decoded with Content-Encoding\n(``bytes``).\n\nExample:\n\n.. code-block:: python\n\n import httpy\n resp = httpy.request(\"https://example.com/\")\n print(resp.original_content)\n # b'\\x1f\\x8b\\x08\\x00\\xc2 ...\n\n``Response.time_elapsed``\n^^^^^^^^^^^^^^^^^^^^^^^^^\n\nTime the request took, in seconds. Only the loading time of this\nparticular request, doesn't account for redirects. (``float``).\n\nExample:\n\n.. code-block:: python\n\n import httpy\n resp = httpy.request(\"https://example.com/\")\n print(resp.time_elapsed)\n # 0.2497\n\n``Response.speed``\n^^^^^^^^^^^^^^^^^^\n\nThe download speed for the response, in bytes per second. (``float``).\nMight be different for HTTP/2 request. Example:\n\n.. code-block:: python\n\n import httpy\n resp = httpy.request(\"https://example.com/\")\n print(resp.speed)\n # 2594.79\n\n``Response.content_type``\n^^^^^^^^^^^^^^^^^^^^^^^^^\n\nThe response's ``Content-Type`` header contents, with the charset\ninformation stripped. If the headers lack ``Content-Type``, it's\n``text/html`` by default.\n\n.. code-block:: python\n\n import httpy\n resp = httpy.request(\"https://example.com/\")\n print(resp.content_type)\n # text/html\n\n``Response.charset`` (property)\n^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\nGets the charset of the response (``str`` or ``None``):\n\n1. If a charset was specified in the response headers, return it\n2. If a charset was not specified, but ``chardet`` is available, try to\n detect the charset (Note that this still returns ``None`` if\n ``chardet`` fails)\n3. If a charset was not specified, and ``chardet`` is not available,\n return ``None``\n\nExample:\n\n.. code-block:: python\n\n import httpy\n resp = httpy.request(\"https://example.com/\")\n print(resp.charset)\n # UTF-8\n\n``Response.string`` (property)\n^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\n``Response.content``, decoded using ``Response.charset`` (``str``)\n\n.. warning::\n\n Do not try to access ``Response.string``, if ``Response.charset`` is\n ``None``, unless you are absolutely sure the response data is\n decodable by the default locale encoding.\n\n For ASCII responses this is probably harmless, but you have been\n warned!\n\nExample:\n\n.. code-block:: python\n\n import httpy\n resp = httpy.request(\"https://example.com/\")\n print(resp.string)\n #<!doctype html>\n ...\n\n``Response.json`` (property)\n^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\nIf ``Response.content_type`` is ``application/json``, try to parse\n``Response.string`` using JSON. Throw an error otherwise.\n\n.. warning::\n\n The same as above applies.\n\nExample:\n\n.. code-block:: python\n\n import httpy\n resp = httpy.request(\"https://httpbin.org/get\")\n print(resp.json[\"url\"])\n # https://httpbin.org/get\n\n``Response.method``\n^^^^^^^^^^^^^^^^^^^\n\nThe same as ``Response.request.method``\n\nWebSockets\n----------\n\nEasy again...\n\n.. code-block:: python\n\n >>> import httpy\n >>> sock = httpy.WebSocket(\"wss://echo.websocket.events/\")# create a websocket client(echo server example)\n >>> sock.send(\"Hello, world!\ud83d\udca5\")# you can send also bytes\n >>> sock.recv()\n \"Hello, world!\ud83d\udca5\"\n\nExamples\n========\n\nPOST method\n-----------\n\nSimple Form\n~~~~~~~~~~~\n\n.. code-block:: python\n\n import httpy\n resp = httpy.request(\"https://example.com/\", method=\"POST\", body = {\"foo\":\"bar\"})\n # ...\n\nSending files\n~~~~~~~~~~~~~\n\n.. code-block:: python\n\n import httpy\n resp = httpy.request(\"https://example.com/\", method = \"POST\", body = { \"foo\" : \"bar\", \"file\" : httpy.File.open( \"example.txt\" ) })\n # ...\n\nSending binary data\n~~~~~~~~~~~~~~~~~~~\n\n.. code-block:: python\n\n import httpy\n resp = httpy.request(\"https://example.com/\", method = \"POST\", body= b\" Hello, World ! \")\n # ...\n\nSending plain text\n~~~~~~~~~~~~~~~~~~\n\n.. code-block:: python\n\n resp = httpy.request(\"https://example.com/\", method = \"POST\", body = \"I support \u00dcnicode !\")\n # ...\n\nSending JSON\n~~~~~~~~~~~~\n\n.. code-block:: python\n\n resp = httpy.request(\"https://example.com/\", method = \"POST\", body = \"{\\\"foo\\\" : \\\"bar\\\" }\", content_type = \"application/json\")\n # ...\n\nDebugging\n=========\n\nJust set ``debug`` to ``True`` :\n\n.. code-block:: python\n\n >>> import httpy\n >>> httpy.request(\"https://example.com/\",debug=True)\n [INFO][request](1266): request() called.\n [INFO][_raw_request](1112): _raw_request() called.\n [INFO][_raw_request](1113): Accessing cache.\n [INFO][_raw_request](1120): No data in cache.\n [INFO][_raw_request](1151): Establishing connection\n [INFO]Connection[__init__](778): Created new Connection upon <socket.socket fd=3, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=6, laddr=('192.168.100.88', 58998), raddr=('93.184.216.34', 443)>\n\n send:\n GET / HTTP/1.1\n Accept-Encoding: gzip, deflate, identity\n Host: www.example.com\n User-Agent: httpy/1.1.0\n Connection: keep-alive\n\n response: \n HTTP/1.1 200 OK\n\n Content-Encoding: gzip\n Age: 438765\n Cache-Control: max-age=604800\n Content-Type: text/html; charset=UTF-8\n Date: Wed, 13 Apr 2022 12:59:07 GMT\n Etag: \"3147526947+gzip\"\n Expires: Wed, 20 Apr 2022 12:59:07 GMT\n Last-Modified: Thu, 17 Oct 2019 07:18:26 GMT\n Server: ECS (dcb/7F37)\n Vary: Accept-Encoding\n X-Cache: HIT\n Content-Length: 648\n <Response [200 OK] (https://www.example.com/)>\n",
"bugtrack_url": null,
"license": "",
"summary": "A lightweight socket-based HTTP(s) and WebSocket client.",
"version": "2.0.3",
"project_urls": {
"Homepage": "https://github.com/jenca-adam/httpy"
},
"split_keywords": [],
"urls": [
{
"comment_text": "",
"digests": {
"blake2b_256": "b59cf542eb9d1d41570f9dc3b2f3b2214eb197d4ee2a8cfb6fae3cf16b6879de",
"md5": "38fa7f2e5d662f3355b9503de2985602",
"sha256": "6f833c13138e14e429333f86c5df8a2e1f9e6f41b3ad680340887eeccd761fb8"
},
"downloads": -1,
"filename": "httpy-2.0.3-py3-none-any.whl",
"has_sig": false,
"md5_digest": "38fa7f2e5d662f3355b9503de2985602",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": ">=3.6.0",
"size": 70946,
"upload_time": "2024-02-27T12:42:34",
"upload_time_iso_8601": "2024-02-27T12:42:34.464778Z",
"url": "https://files.pythonhosted.org/packages/b5/9c/f542eb9d1d41570f9dc3b2f3b2214eb197d4ee2a8cfb6fae3cf16b6879de/httpy-2.0.3-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "30351ef511820ae83c6b11e6db0e1b1080b2c2f426bdbecd4728037af4417aa7",
"md5": "438b60fe6466e9a52d4c7fec9d1c5edf",
"sha256": "2cded4a553774a7606c87cc0735c8e6c5e84e0c970d80017f46fb89ea8140d59"
},
"downloads": -1,
"filename": "httpy-2.0.3.tar.gz",
"has_sig": false,
"md5_digest": "438b60fe6466e9a52d4c7fec9d1c5edf",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.6.0",
"size": 68658,
"upload_time": "2024-02-27T12:46:33",
"upload_time_iso_8601": "2024-02-27T12:46:33.661220Z",
"url": "https://files.pythonhosted.org/packages/30/35/1ef511820ae83c6b11e6db0e1b1080b2c2f426bdbecd4728037af4417aa7/httpy-2.0.3.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2024-02-27 12:46:33",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "jenca-adam",
"github_project": "httpy",
"travis_ci": false,
"coveralls": false,
"github_actions": true,
"requirements": [],
"lcname": "httpy"
}