An open API service indexing awesome lists of open source software.

https://github.com/sesh/thttp

A lightweight wrapper around urllib
https://github.com/sesh/thttp

http python urllib

Last synced: 10 months ago
JSON representation

A lightweight wrapper around urllib

Awesome Lists containing this project

README

          

# thttp

`thttp` is a single file, lightweight, well-tested wrapper around `urllib` that's intended to be copied directly into your project.

It's features include:

- Making GET, POST, PATCH, PUT, HEAD and OPTIONS requests
- Sending query parameters with your request
- Encoding JSON payloads for POST, PATCH and PUT requests
- Encoding form-encoded payloads for POST, PATCH and PUT request
- Sending custom headers with any request
- Disabling SSL certificate verification for local testing / corporate proxies
- Following (or not following) redirects
- Sending through a CookieJar object that can be reused between requests
- Authenticating with HTTP basic auth
- Specifying a custom timeout for your request
- Decompressing gzipped content in the response
- Loading JSON from the response
- Returning error responses instead of throwing exceptions from `urllib`
- `pretty()` function for printing responses
- Ability to upload files using the `{"file": open("file.png", "rb")}` style

Future features:

- Better detection of JSON responses
- Improve handling of non-utf-8 requests
- Improve handling of non-utf-8 responses

_Note: this project is not intended to solve all use cases that can be achieved with urllib, requests, httpx, or other HTTP libraries. The intent is to provide a lightweight tool that simplifies some of the most common use cases for developers._

## Installation

copy `thttp.py` directly into your project:

```
curl https://raw.githubusercontent.com/sesh/thttp/main/thttp.py > thttp.py
```

Or, install with `pip`:

```
python3 -m pip install thttp
```

## Basic Usage

See the tests for examples of usage, but, effectively it's as simple as:

```python
from thttp import request

response = request("https://httpbingo.org/get", params={"data": "empty"})

response.json
# {'args': {'data': ['empty']}, 'headers': {'Accept-Encoding': ['identity'], 'Fly-Client-Ip': ['45.76.105.111'], 'Fly-Forwarded-Port': ['443'], 'Fly-Forwarded-Proto': ['https'], 'Fly-Forwarded-Ssl': ['on'], 'Fly-Region': ['hkg'], 'Fly-Request-Id': ['01F6P2WQAY1NGPRDCXV9H60XW5'], 'Host': ['httpbingo.org'], 'User-Agent': ['Python-urllib/3.8'], 'Via': ['1.1 fly.io'], 'X-Forwarded-For': ['45.76.105.111, 77.83.142.42'], 'X-Forwarded-Port': ['443'], 'X-Forwarded-Proto': ['https'], 'X-Forwarded-Ssl': ['on'], 'X-Request-Start': ['t=1622091390302198']}, 'origin': '45.76.105.111, 77.83.142.42', 'url': 'https://httpbingo.org/get?data=empty'}

response.status
# 200
```

## Running the tests

```sh
> python3 -m unittest thttp.py
```

And to check the coverage:

```sh
> coverage run -m unittest thttp.py
> coverage html && open htmlcov/index.html
```

Run `black` before committing any changes.

```sh
> black thttp.py
```

## Packaging for release

```
rm dist/*
python3 -m build
python3 -m twine upload dist/*
```

## License

This code is currently released under the [UNLICENSE](UNLICENSE.md) and considered public domain.
If more appropriate for your usage you may consider this project released under the [MIT License](LICENSE.md).