Merge remote-tracking branch 'origin/master'

This commit is contained in:
cr0hn
2019-11-20 15:18:09 +01:00
4 changed files with 279 additions and 80 deletions
+5 -5
View File
@@ -9,7 +9,7 @@ User Interface
The User HTTP interface is used to serve final user requests. The User HTTP interface is used to serve final user requests.
By default it binds to address `0.0.0.0` and port `8080`, but can be changed via By default it binds to address ``0.0.0.0`` and port ``8080``, but can be changed via
the ``--bind`` flag. the ``--bind`` flag.
@@ -19,15 +19,15 @@ Control Interface
The Control HTTP interface is used by the command `kapow route` to The Control HTTP interface is used by the command `kapow route` to
administer the list of system routes. administer the list of system routes.
By default it binds to address `127.0.0.1` and port `8081`, but can be changed By default it binds to address ``127.0.0.1`` and port ``8081``, but can be changed
via the ``--control-bind`` flag. via the ``--control-bind`` flag.
Data Interface Data Interface
-------------- --------------
The Data HTTP interface is used by the commands `kapow get` and `kapow The Data HTTP interface is used by the commands ``kapow get`` and ``kapow
set` to exchange the data for a particular request. set`` to exchange the data for a particular request.
By default it binds to address `127.0.0.1` and port `8082`, but can be changed By default it binds to address ``127.0.0.1`` and port ``8082``, but can be changed
via the ``--data-bind`` flag. via the ``--data-bind`` flag.
+29
View File
@@ -0,0 +1,29 @@
Philosophy
==========
We Provide a Single Static Binary
---------------------------------
- Because it makes deployments easier.
Shell Agnostic
--------------
- Kapow! knows nothing about the shell you are using.
- It only spawns executables.
- You can use anything you want that ends interacting with the `data
api`.
- This helps with multiplatform and with future higher level tools.
Not a Silver Bullet
-------------------
You should not use Kapow! for projects with complex business logic.
If you try to encode business logic in a shell script, you will **deeply**
regret it.
Kapow! is for automating simple stuff.
+12 -8
View File
@@ -8,22 +8,26 @@ answered by the User HTTP Interface.
#. The request is matched against the route table #. The request is matched against the route table
#. Kapow! provides a HANDLER_ID to identify this request #. Kapow! provides a `HANDLER_ID` to identify this request
#. Kapow! spawns the binary specified as entrypoint in the matching route #. Kapow! spawns the binary specified as entrypoint in the matching route
The default entrypoint is /bin/sh; we'll explain this workflow for now. The default entrypoint is /bin/sh; we'll explain this workflow for now.
The spawned entrypoint is run with following variables added to its environment: The spawned entrypoint is run with the following variables added to its environment:
- KAPOW_HANDLER_ID
- KAPOW_DATAAPI_URL - ``KAPOW_HANDLER_ID``: Containing the `HANDLER_ID`
- KAPOW_CONTROLAPI_URL - ``KAPOW_DATAAPI_URL``: With the URL of the `data interface`
- ``KAPOW_CONTROLAPI_URL``: With the URL of the `control interface`
#. During the lifetime of the shell, the request and response resources are available via these commands: #. During the lifetime of the shell, the request and response resources are available via these commands:
- kapow get /request/... - ``kapow get /request/...``
- kapow set /response/... - ``kapow set /response/...``
These commands use the aforementioned environment variables to read
data of the user request and to write the response.
TODO: link to resource tree TODO: link to resource tree
#. When the shell dies, Kapow! finalizes the original request. #. When the shell dies, Kapow! finalizes the original request
+233 -67
View File
@@ -1,5 +1,5 @@
The Resource Tree The `Kapow!` Resource Tree
================= ==========================
This is the model that Kapow! uses to expose the internals of the user request This is the model that Kapow! uses to expose the internals of the user request
being serviced. being serviced.
@@ -17,169 +17,335 @@ Overview
.. code-block:: plain .. code-block:: plain
/ The root of the resource paths tree /
├─ request All information related to the HTTP request. Read-Only ├─ request
│ ├──── method Used HTTP Method (GET, POST) │ ├──── method Used HTTP Method (GET, POST)
│ ├──── host Host part of the URL │ ├──── host Host part of the URL
│ ├──── path Complete URL path (URL-unquoted) │ ├──── path Complete URL path (URL-unquoted)
│ ├──── matches Previously matched URL path parts │ ├──── matches
│ │ └──── <name> │ │ └──── <name> Previously matched URL path parts
│ ├──── params URL parameters (after the "?" symbol) │ ├──── params
│ │ └──── <name> │ │ └──── <name> URL parameters (after the "?" symbol)
│ ├──── headers HTTP request headers │ ├──── headers
│ │ └──── <name> │ │ └──── <name> HTTP request headers
│ ├──── cookies HTTP request cookie │ ├──── cookies
│ │ └──── <name> │ │ └──── <name> HTTP request cookie
│ ├──── form Form-urlencoded form fields (names only) │ ├──── form
│ │ └──── <name> Value of the form field with name <name> │ │ └──── <name> Value of the form field with name <name>
│ ├──── files Files uploaded via multi-part form fields (names only) │ ├──── files
│ │ └──── <name> │ │ └──── <name>
│ │ └──── filename Original file name │ │ └──── filename Original file name of the file uploaded in the form field <name>
│ │ └──── content The file content │ │ └──── content The contents of the file uploaded in the form field <name>
│ └──── body HTTP request body │ └──── body HTTP request body
└─ response All information related to the HTTP request. Write-Only └─ response
├──── status HTTP status code ├──── status HTTP status code
├──── headers HTTP response headers ├──── headers
│ └──── <name> │ └──── <name> HTTP response headers
├──── cookies HTTP request cookie ├──── cookies
│ └──── <name> │ └──── <name> HTTP request cookie
──── body Response body. Mutually exclusive with response/stream ──── body Response body
└──── stream Alias for /response/body
Resources Resources
--------- ---------
``/request/method`` ``/request/method``
~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~
The HTTP method of the incoming request. The HTTP method of the incoming request.
Sample usage: **Sample Usage**
.. code-block:: bash
$ kapow get /request/method
GET
``/request/host``
~~~~~~~~~~~~~~~~~
The ``Host`` header as defined in the HTTP/1.1 spec.
Sample usage:
If the user runs: If the user runs:
.. code-block:: bash .. code-block:: bash
$ curl http://kapow.example:8080
$ curl -X POST http://kapow.example:8080
then, when handling the request: then, when handling the request:
.. code-block:: bash .. code-block:: bash
$ kapow get /request/method
POST
``/request/host``
~~~~~~~~~~~~~~~~~
The ``Host`` header as defined in the HTTP/1.1 spec of the incoming
request.
**Sample Usage**
If the user runs:
.. code-block:: bash
$ curl http://kapow.example:8080
then, when handling the request:
.. code-block:: bash
$ kapow get /request/host $ kapow get /request/host
kapow.example kapow.example
``/request/path`` ``/request/path``
~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~
Contains the path substring of the URL. Contains the path substring of the URL.
**Sample Usage**
Sample usage: If the user runs:
.. code-block:: bash .. code-block:: bash
# GET http://url.example/foo/bar?q=1
$ curl http://kapow.example:8080/foo/bar?qux=1
then, when handling the request:
.. code-block:: bash
$ kapow get /request/path $ kapow get /request/path
/foo/bar /foo/bar
``/request/matches/<name>`` ``/request/matches/<name>``
~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~
Sample usage:
Contains the part of the URL captured by the pattern ``name``.
**Sample Usage**
For a route defined like this:
.. code-block:: bash .. code-block:: bash
$ kapow get
$ kapow route add /foo/{mymatch}/bar
if the user runs:
.. code-block:: bash
$ curl http://kapow.example:8080/foo/1234/bar
then, when handling the request:
.. code-block:: bash
$ kapow get /request/matches/mymatch
1234
``/request/params/<name>`` ``/request/params/<name>``
~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~
Sample usage:
Contains the value of the URL parameter ``name``
**Sample Usage**
If the user runs:
.. code-block:: bash .. code-block:: bash
$ kapow get
$ curl http://kapow.example:8080/foo?myparam=bar
then, when handling the request:
.. code-block:: bash
$ kapow get /request/params/myparam
myparam
``/request/headers/<name>`` ``/request/headers/<name>``
~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~
Sample usage:
Contains the value of the HTTP header ``name`` of the incoming request.
**Sample Usage**
If the user runs:
.. code-block:: bash .. code-block:: bash
$ kapow get
$ curl -H X-My-Header=Bar http://kapow.example:8080/
then, when handling the request:
.. code-block:: bash
$ kapow get /request/headers/X-My-Header
Bar
``/request/cookies/<name>`` ``/request/cookies/<name>``
~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~
Sample usage:
Contains the value of the HTTP cookie ``name`` of the incoming request.
**Sample Usage**
If the user runs:
.. code-block:: bash .. code-block:: bash
$ kapow get
$ curl --cookie "MYCOOKIE=Bar" http://kapow.example:8080/
then, when handling the request:
.. code-block:: bash
$ kapow get /request/cookies/MYCOOKIE
Bar
``/request/form/<name>`` ``/request/form/<name>``
~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~
Sample usage:
Contains the value of the field ``name`` of the incoming request.
**Sample Usage**
If the user runs:
.. code-block:: bash .. code-block:: bash
$ kapow get
``/request/files/<name>`` $ curl -F -d myfield=foo http://kapow.example:8080/
~~~~~~~~~~~~~~~~~~~~~~~~~
Sample usage: then, when handling the request:
.. code-block:: bash .. code-block:: bash
$ kapow get
$ kapow get /request/form/myfield
foo
``/request/files/<name>/filename`` ``/request/files/<name>/filename``
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Sample usage:
Contains the name of the file uploaded through the incoming request.
**Sample Usage**
If the user runs:
.. code-block:: bash .. code-block:: bash
$ kapow get
$ curl -F -d myfile=@filename.txt http://kapow.example:8080/
then, when handling the request:
.. code-block:: bash
$ kapow get /request/files/myfile/filename
filename.txt
``/request/files/<name>/content`` ``/request/files/<name>/content``
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Sample usage:
Contents of the file that is being uploaded in the incoming request.
**Sample Usage**
If the user runs:
.. code-block:: bash .. code-block:: bash
$ kapow get
$ curl -F -d myfile=@filename.txt http://kapow.example:8080/
then, when handling the request:
.. code-block:: bash
$ kapow get /request/files/myfile/content
...filename.txt contents...
``/request/body`` ``/request/body``
~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~
Sample usage:
Raw contents of the incoming request HTTP body.
**Sample Usage**
If the user runs:
.. code-block:: bash .. code-block:: bash
$ kapow get
$ curl --data-raw foobar http://kapow.example:8080/
then, when handling the request:
.. code-block:: bash
$ kapow get /request/body
foobar
``/response/status`` ``/response/status``
~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~
Sample usage:
Contains the status code given in the user response.
**Sample Usage**
If during the request handling:
.. code-block:: bash .. code-block:: bash
$ kapow get
$ kapow set /response/status 418
then the response will have the status code ``418 I am a Teapot``.
``/response/headers/<name>`` ``/response/headers/<name>``
~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Sample usage:
Contains the value of the header ``name`` in the user response.
**Sample Usage**
If during the request handling:
.. code-block:: bash .. code-block:: bash
$ kapow get
$ kapow set /response/headers/X-My-Header Foo
then the response will contain an HTTP header named ``X-My-Header`` with
value ``Foo``.
``/response/cookies/<name>`` ``/response/cookies/<name>``
~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Sample usage:
Contains the value of the cookie ``name`` that will be set to the user
response.
**Sample Usage**
If during the request handling:
.. code-block:: bash .. code-block:: bash
$ kapow get
$ kapow set /response/cookies/MYCOOKIE Foo
then the response will set the cookie ``MYCOOKIE`` to the user in
following requests.
``/response/body`` ``/response/body``
~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~
Sample usage:
Contains the value of the response HTTP body.
**Sample Usage**
.. code-block:: bash .. code-block:: bash
$ kapow get
$ kapow set /response/body foobar
then the response will contain ``foobar`` in the body.