HTTP Source
Introduction
The HTTP Source is a Vanus Connector which aims to convert an incoming HTTP Request to a CloudEvent.
For example, the incoming HTTP Request looks like:
curl --location --request POST 'localhost:8080/webhook?source=123&id=abc&type=456&subject=def&test=demo' \
--header 'Content-Type: text/plain' \
--data-raw '{
"test":"demo"
}'
which is converted to:
{
"specversion": "1.0",
"id": "abc",
"source": "123",
"type": "456",
"subject": "def",
"datacontenttype": "application/json",
"time": "2023-01-29T03:25:26.229114Z",
"data": {
"body": {
"test": "demo"
},
"headers": {
"Accept": "*/*",
"Content-Length": "21",
"Content-Type": "text/plain",
"Host": "localhost:8080",
"User-Agent": "curl/7.85.0"
},
"method": "POST",
"path": "/webhook",
"query_args": {
"id": "abc",
"source": "123",
"subject": "def",
"test": "demo",
"type": "456"
}
},
"xvhttpremoteip": "::1",
"xvhttpremoteaddr": "[::1]:57822",
"xvhttpbodyisjson": true
}
Quick Start
This section will show you how to use HTTP Source to convert an HTTP request(made by cURL) to a CloudEvent.
Create Config file
cat << EOF > config.yml
target: http://localhost:31081
port: 8082
EOF
Name | Required | Default | Description |
---|---|---|---|
target | YES | the target URL to send CloudEvents | |
port | NO | 8080 | the port to receive HTTP request |
The HTTP Source tries to find the config file at /vanus-connect/config/config.yml
by default. You can specify the position of config file by setting the environment variable CONNECTOR_CONFIG
for your connector.
Start with Docker
docker run -it --rm --network=host \
-v ${PWD}:/vanus-connect/config \
--name source-http public.ecr.aws/vanus/connector/source-http
Test
Open a terminal and use the following command to run a Display sink, which receives and prints CloudEvents.
docker run -it --rm \
-p 31081:8080 \
--name sink-display public.ecr.aws/vanus/connector/sink-display
Make sure the target
value in your config file is http://localhost:31081
so that the Source can send the CloudEvents to the Display Sink.
docker run -it --rm --network=host \
-v ${PWD}:/vanus-connect/config \
--name source-http public.ecr.aws/vanus/connector/source-http
Open a terminal and use the following command to send an http request to HTTP Source
curl --location --request POST 'localhost:8082/webhook?source=123&id=abc&type=456&subject=def' \
--header 'Content-Type: text/plain' \
--data-raw '{
"test":"demo"
}'
Here is the sort of CloudEvent you should expect to receive in the Display Sink:
{
"specversion": "1.0",
"id": "abc",
"source": "123",
"type": "456",
"subject": "def",
"datacontenttype": "application/json",
"time": "2023-01-29T03:25:26.229114Z",
"data": {
"body": {
"test": "demo"
},
"headers": {
"Accept": "*/*",
"Content-Length": "21",
"Content-Type": "text/plain",
"Host": "localhost:8080",
"User-Agent": "curl/7.85.0"
},
"method": "POST",
"path": "/webhook",
"query_args": {
"id": "abc",
"source": "123",
"subject": "def",
"type": "456"
}
},
"xvhttpremoteip": "::1",
"xvhttpremoteaddr": "[::1]:57822",
"xvhttpbodyisjson": true
}
Clean
docker stop source-http sink-display
Source details
Attributes
Changing Default Required Attributes
If you want to change the default attributes of id
, source
, type
, and subject
(defined by CloudEvents) to your own, you could use the Query Parameter
to set them.
Attribute | Default | Query Parameter | Example |
---|---|---|---|
id | UUID | ?id=xxx | http://url:port/webhook?id=xxxx |
source | vanus-http-source | ?source=xxx | http://url:port/webhook?source=xxxx |
type | naive-http-request | ?type=xxx | http://url:port/webhook?type=xxxx |
subject | empty | ?subject=xxx | http://url:port/webhook?subject=xxxx |
dataschema | empty | ?dataschema=xxx | http://url:port/webhook?dataschema=xxxx |
datacontenttype
will be automatically inferred based on the request body. If the body can be converted to JSON
, the application/json
will be set. Otherwise, text/plain
will be set.
Extension Attributes
The HTTP Source defines following CloudEvents Extension Attributes
Attribute | Type | Description |
---|---|---|
xvhttpbodyisjson | boolean | HTTP Sink will validate if request body is JSON format data, if it is, this attribute is true , otherwise false |
xvhttpremoteip | string | The IP of the request from where, if the request was through reverse-proxy like Nginx, the value may be not the original IP |
xvhttpremoteaddr | string | The address of the request from where, if the request was through reverse-proxy like Nginx, the value may be not the original IP |
Run in Kubernetes
kubectl apply -f source-http.yaml
apiVersion: v1
kind: Service
metadata:
name: source-http
namespace: vanus
spec:
selector:
app: source-http
type: ClusterIP
ports:
- port: 8080
name: source-http
---
apiVersion: v1
kind: ConfigMap
metadata:
name: source-http
namespace: vanus
data:
config.yml: |-
target: http://<url>:<port>/gateway/<eventbus>
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: source-http
namespace: vanus
labels:
app: source-http
spec:
selector:
matchLabels:
app: source-http
replicas: 1
template:
metadata:
labels:
app: source-http
spec:
containers:
- name: source-http
image: public.ecr.aws/vanus/connector/source-http:latest
resources:
requests:
memory: "128Mi"
cpu: "100m"
limits:
memory: "512Mi"
cpu: "500m"
imagePullPolicy: Always
volumeMounts:
- name: config
mountPath: /vanus-connect/config
volumes:
- name: config
configMap:
name: source-http
Integrate with Vanus
This section shows how a source connector can send CloudEvents to a running Vanus cluster.
Prerequisites
- Have a running K8s cluster
- Have a running Vanus cluster
- Vsctl Installed
- Export the VANUS_GATEWAY environment variable (the ip should be a host-accessible address of the vanus-gateway service)
export VANUS_GATEWAY=192.168.49.2:30001
- Create an eventbus
vsctl eventbus create --name quick-start
- Update the target config of the HTTP Source
target: http://192.168.49.2:30001/gateway/quick-start
- Run the HTTP Source
kubectl apply -f source-http.yaml