Skip to main content

Library to provide HTTP over STDIN/STDOUT

Project description

[![Build Status](https://travis-ci.org/denismakogon/hotfn-py.svg?branch=master)](https://travis-ci.org/denismakogon/hotfn-py)

HTTP over STDIN/STDOUT lib parser
=================================

Purpose of this library to provide simple interface to parse HTTP 1.1 requests represented as string

Raw HTTP request
----------------

Parses raw HTTP request that contains:
- method
- route + query
- headers
- protocol version
Optionally:
- data

Raw HTTP request may have next look:

GET /v1/apps?something=something&etc=etc HTTP/1.1
Host: localhost:8080
Content-Length: 5
Content-Type: application/x-www-form-urlencoded
User-Agent: curl/7.51.0

hello

Each new line define by set of special characters:

\n
\r

and combination is:

\r\n

This type of class stands for HTTP request parsing to a sane structure of:

- HTTP request method
- HTTP request URL
- HTTP request query string represented as map
- HTTP request headers represented as map
- HTTP protocol version represented as tuple of major and minor versions
- HTTP request body

```python
import os
import sys

from hotfn.http import request

with os.fdopen(sys.stdin.fileno(), 'rb') as stdin:
req = request.RawRequest(stdin)
method, url, query_parameters, headers, (major, minor), body = req.parse_raw_request()
```

Raw HTTP response
-----------------

This type of class stands for transforming HTTP request object into valid string representation

```python
import sys
import os

from hotfn.http import request
from hotfn.http import response

with os.fdopen(sys.stdin.fileno(), 'rb') as stdin:
req = request.RawRequest(stdin)
method, url, query_parameters, headers, (major, minor), body = req.parse_raw_request()
resp = response.RawResponse((major, minor), 200, "OK", response_data=body)
with os.fdopen(sys.stdout.fileno(), 'wb') as stdout:
resp.dump(stdout)
```

Example
-------

Assume we have HTTP 1.1 request:
```bash
GET /v1/apps?something=something&etc=etc HTTP/1.1
Host: localhost:8080
Content-Length: 11
Content-Type: application/x-www-form-urlencoded
User-Agent: curl/7.51.0

hello:hello

```
This request can be transformed into data structure described above.
Using code snippet mentioned above request data can be used to assemble a response object of the following view:
```bash
HTTP/1.1 200 OK
Content-Length: 11
Content-Type: text/plain; charset=utf-8

hello:hello

```
This is totally valid HTTP response object.

Notes
-----

Please be aware that response object by default sets content type as `text/plain; charset=utf-8`. If you need to change it use following code:
```python
import os
import sys

from hotfn.http import request
from hotfn.http import response

with os.fdopen(sys.stdin.fileno(), 'rb') as stdin:
req = request.RawRequest(stdin)
method, url, query_parameters, headers, (major, minor), body = req.parse_raw_request()
resp = response.RawResponse((major, minor), 200, "OK", response_data=body)
resp.headers["Content-Type"] = "application/json"
with os.fdopen(sys.stdout.fileno(), 'wb') as stdout:
resp.dump(stdout)

```

Handling Hot Functions
----------------------

A main loop is supplied that can repeatedly call a user function with a series of HTTP requests.
(TODO: should this use the WSGI API?)

In order to utilise this, you can write your `app.py` as follows:

```python
from hotfn.http import worker
from hotfn.http import response


def app(context, **kwargs):
body = kwargs.get('data')
return response.RawResponse(context.version, 200, "OK", body.readall())


if __name__ == "__main__":
worker.run(app)

```

Automatic input coercions
-------------------------

Decorators are provided that will attempt to coerce input values to Python types.
Some attempt is made to coerce return values from these functions also:

```python
from hotfn.http import worker


@worker.coerce_input_to_content_type
def app(context, **kwargs):
"""
body is a request body, it's type depends on content type
"""
return kwargs.get('data')


if __name__ == "__main__":
worker.run(app)

```

Working with async automatic input coercions
--------------------------------------------

Latest version (from 0.0.6) supports async coroutines as a request body processors:
```python

import asyncio

from hotfn.http import worker
from hotfn.http import response


@worker.coerce_input_to_content_type
async def app(context, **kwargs):
headers = {
"Content-Type": "plain/text",
}
return response.RawResponse(
context.version, 200, "OK",
http_headers=headers,
response_data="OK")


if __name__ == "__main__":
loop = asyncio.get_event_loop()
worker.run(app, loop=loop)

```
As you can see `app` function is no longer callable, because its type: coroutine, so we need to bypass event loop inside



Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

hotfn-0.0.6.tar.gz (14.8 kB view details)

Uploaded Source

Built Distribution

hotfn-0.0.6-py2.py3-none-any.whl (15.6 kB view details)

Uploaded Python 2 Python 3

File details

Details for the file hotfn-0.0.6.tar.gz.

File metadata

  • Download URL: hotfn-0.0.6.tar.gz
  • Upload date:
  • Size: 14.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No

File hashes

Hashes for hotfn-0.0.6.tar.gz
Algorithm Hash digest
SHA256 052402be2e2d871dab9187f6682f7c7d3c2d09dd02b14ae59cb10cf4cdfd65b3
MD5 945befe611e52076c1184521d7d4b731
BLAKE2b-256 034d05b941238ca70c6d3c78f433d1242f894c4110a55a854a2ffca57296f679

See more details on using hashes here.

File details

Details for the file hotfn-0.0.6-py2.py3-none-any.whl.

File metadata

File hashes

Hashes for hotfn-0.0.6-py2.py3-none-any.whl
Algorithm Hash digest
SHA256 1750ee331c89ec02c6cf0b6dadfe171451aabe3235726b60955f45579e684cb1
MD5 705ba879391645ea4c8451466dd66d45
BLAKE2b-256 bc20e64da0707e1736690c6514623f145cd68601c204e01f1d327b5e55172a66

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page