Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

add http server test #134

Open
wants to merge 2 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
36 changes: 34 additions & 2 deletions http-filter-example/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -48,12 +48,44 @@ http_filters:
- name: sample # before envoy.router because order matters!
typed_config:
"@type": type.googleapis.com/sample.Decoder
key: via
key: Via
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

nit: keep this lowercase

Copy link
Author

@helight helight Sep 30, 2020

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is just for testing this function
http_filter.cc

const LowerCaseString HttpSampleDecoderFilter::headerKey() const {
  return LowerCaseString(config_->key());
}

val: sample-filter
- name: envoy.router
typed_config: {}
```

or you can just use this demo yaml file [config.yaml](config.yaml).
- Run envoy with this cmd:
```sh
./bazel-bin/envoy --config-path ./http-filter-example/config.yaml -l trace
```
- Run an http server
```sh
python ./http-filter-example/httpserver.py
```
- Access the http server with curl cmd:
```sh
curl http://127.0.0.1:8080
```
You can find there is an kv string in the request header to the http server,
and the key value `Via` has become to `via`, you can see the request header
in the http server stdout.
```sh
$ python httpserver.py
Started httpserver on port 8081
127.0.0.1 - - [29/Sep/2020 11:30:03] "GET / HTTP/1.1" 200 -
host: 127.0.0.1:8080
user-agent: curl/7.58.0
accept: */*
x-forwarded-proto: http
x-request-id: b7a8d227-77a0-4985-a121-5e0f70bd16f2
via: sample-filter
x-envoy-expected-rq-timeout-ms: 15000
content-length: 0
```
- Start service and verify with shell script

1. `bash ./http-filter-example/start_service.sh`
2. `bash ./http-filter-example/verify.sh`

[StreamDecoderFilter]: https://github.com/envoyproxy/envoy/blob/b2610c84aeb1f75c804d67effcb40592d790e0f1/include/envoy/http/filter.h#L300
[StreamEncoderFilter]: https://github.com/envoyproxy/envoy/blob/b2610c84aeb1f75c804d67effcb40592d790e0f1/include/envoy/http/filter.h#L413
Expand Down
51 changes: 51 additions & 0 deletions http-filter-example/config.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
admin:
access_log_path: /dev/null
address:
socket_address:
address: 127.0.0.1
port_value: 0
static_resources:
clusters:
name: cluster_0
connect_timeout: 0.25s
load_assignment:
cluster_name: cluster_0
endpoints:
- lb_endpoints:
- endpoint:
address:
socket_address:
address: 127.0.0.1
port_value: 8081
listeners:
- name: listener_0
address:
socket_address:
address: 127.0.0.1
port_value: 8080
filter_chains:
- filters:
- name: envoy.http_connection_manager
typed_config:
"@type": type.googleapis.com/envoy.config.filter.network.http_connection_manager.v2.HttpConnectionManager
stat_prefix: ingress_http
codec_type: auto
route_config:
name: local_route
virtual_hosts:
- name: local_service
domains:
- "*"
routes:
- match:
prefix: "/"
route:
cluster: cluster_0
http_filters:
- name: sample # before envoy.router because order matters!
typed_config:
"@type": type.googleapis.com/sample.Decoder
key: vIa
val: sample-filter
- name: envoy.router
typed_config: {}
30 changes: 30 additions & 0 deletions http-filter-example/httpserver.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
#!/usr/bin/python3
from http.server import BaseHTTPRequestHandler,HTTPServer

HTTP_PORT = 8081

# This class will handles any incoming request
class doHandler(BaseHTTPRequestHandler):

# Handler for the GET requests
def do_GET(self):
self.send_response(200)
self.send_header('Content-type','text/html')
self.end_headers()
print(self.headers)
# Send the message
self.wfile.write(b"Hello World !\r\n")
self.wfile.write(self.headers.as_bytes())
return

try:
# Create a http server and define the handler to manage the request
server = HTTPServer(('', HTTP_PORT), doHandler)
print('Started httpserver on port ' , HTTP_PORT)

# Wait forever for incoming http requests
server.serve_forever()

except KeyboardInterrupt:
print('^C received, shutting down the web server')
server.socket.close()
3 changes: 3 additions & 0 deletions http-filter-example/start_service.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
#!/bin/sh
python3 ./http-filter-example/httpserver.py&
./bazel-bin/envoy --config-path ./http-filter-example/config.yaml
32 changes: 32 additions & 0 deletions http-filter-example/verify.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
#!/bin/bash -e

export NAME=http-filter-example

_curl () {
local arg curl_command
curl_command=(curl -s)
if [[ ! "$*" =~ "-X" ]]; then
curl_command+=(-X GET)
fi
for arg in "${@}"; do
curl_command+=("$arg")
done
"${curl_command[@]}" || {
echo "ERROR: curl (${curl_command[*]})" >&2
return 1
}
}

responds_with () {
local expected
expected="$1"
shift
_curl "${@}" | grep "$expected" || {
echo "ERROR: curl expected (${*}): $expected" >&2
return 1
}
}

responds_with \
"via: sample-filter" \
"http://localhost:8080"