Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/jsoendermann/hapttic
:fast_forward: Hapttic is a simple HTTP server that forwards all requests to a shell script.
https://github.com/jsoendermann/hapttic
golang http-proxy http-server
Last synced: 16 days ago
JSON representation
:fast_forward: Hapttic is a simple HTTP server that forwards all requests to a shell script.
- Host: GitHub
- URL: https://github.com/jsoendermann/hapttic
- Owner: jsoendermann
- License: other
- Created: 2017-06-16T03:13:22.000Z (over 7 years ago)
- Default Branch: master
- Last Pushed: 2019-02-27T01:16:50.000Z (over 5 years ago)
- Last Synced: 2024-08-01T05:20:27.963Z (3 months ago)
- Topics: golang, http-proxy, http-server
- Language: Go
- Homepage:
- Size: 14.6 KB
- Stars: 186
- Watchers: 6
- Forks: 18
- Open Issues: 1
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# hapttic
## What is this good for?
- You want to run some code in response to a webhook, like a github push.
- You have some code on your Raspberry Pi that you want to run from work (great in combination with [ngrok](https://ngrok.com/)).
- That's pretty much it.## How does it work?
Hapttic listens for incoming HTTP connections. When it receives a connection, it dumps all relevant data (headers, path, parameters, the body and other stuff) into a JSON object and calls a bash script with this object as its parameters.
## Isn't this just a reinvention of CGI?
The basic idea is pretty similar. The main advantage of hapttic is ease of setup with a simple Docker image that lets you quickly connect a shell script to a http endpoint.
## Show me an example
First, create a request handler at `~/hapttic_request_handler.sh`:
```bash
echo $1
```Then run the following command to spin up the docker container that runs hapttic:
`docker run --rm -p 8080:8080 -v ~/hapttic_request_handler.sh:/hapttic_request_handler.sh --name hapttic jsoendermann/hapttic -file "/hapttic_request_handler.sh"`
Finally, run `open http://localhost:8080` to see the output of your script.
## Show me a more realistic example
```bash
REQUEST=$1
SECRET_TOKEN=$(jq -r '.Header."X-My-Secret"[0]' <(echo $REQUEST))if [[ "$SECRET_TOKEN" != "SECRET" ]]; then
echo "Incorrect secret token"
exit -1
ficurl https://www.example.com/api/call/in/response/to/webhook
```This request handling script can be run with `curl -H "X-My-Secret: SECRET" http://localhost:8080`
The [`jsoendermann/hapttic`](https://hub.docker.com/r/jsoendermann/hapttic/) Dockerfile includes `jq` and `curl`, if you need any other command in your request handling script, you should create your own image.
## The Request JSON object
The JSON object your request handling script gets called with is a subset of Go's `http.Request`. It's defined in [hapttic.go](https://github.com/jsoendermann/hapttic/blob/master/hapttic.go) as `marshallableRequest`. For documentation on http.Request, see [the official net/http page](https://golang.org/pkg/net/http/#Request).
## SSL Support
You can add encryption by putting an nginx proxy in front of it with a docker-compose file like so:
```yaml
version: '3'volumes:
vhost:
html:services:
nginx-proxy:
restart: always
image: jwilder/nginx-proxy
ports:
- 80:80
- 443:443
volumes:
- /var/run/docker.sock:/tmp/docker.sock:ro
- /var/certs:/etc/nginx/certs:ro
- vhost:/etc/nginx/vhost.d
- html:/usr/share/nginx/html
labels:
- "com.github.jrcs.letsencrypt_nginx_proxy_companion.nginx_proxy=true"letsencrypt-nginx-proxy-companion:
restart: always
image: jrcs/letsencrypt-nginx-proxy-companion
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
- /var/certs:/etc/nginx/certs:rw
- vhost:/etc/nginx/vhost.d
- html:/usr/share/nginx/htmlhapttic:
restart: always
image: jsoendermann/hapttic
environment:
- VIRTUAL_HOST=hapttic.your.domain.com # Replace this
- LETSENCRYPT_HOST=hapttic.your.domain.com # Replace this
- [email protected] # Replace this
volumes:
- /my-request-handler.sh:/hapttic_request_handler.sh # Replace this
command: ["-file", "/hapttic_request_handler.sh"]
depends_on:
- nginx-proxy
- letsencrypt-nginx-proxy-companion
```