Echo server will echo the requests detail into response.
For api testing or benchmarking for your proxies like APIGateway/ReverseProxy/nginx/traefik.
Build on chi with simple logical, so the performance is good enough.
make build
./echo 9001
- AllowedMethods: all
- return 200 with pong
$ curl -XPOST http://127.0.0.1:9001/ping/
> POST /ping/ HTTP/1.1
> Host: 127.0.0.1:9001
> User-Agent: curl/7.54.0
> Accept: */*
>
< HTTP/1.1 200 OK
< Date: Sun, 02 Jun 2019 00:19:19 GMT
< Content-Length: 4
< Content-Type: text/plain; charset=utf-8
pong
- AllowedMethods: all
- will sleep for
{sleep}
ms - return 200 with ok
$ curl -XPOST http://127.0.0.1:9001/sleep/10/
> POST /sleep/10/ HTTP/1.1
> Host: 127.0.0.1:9001
> User-Agent: curl/7.54.0
> Accept: */*
>
< HTTP/1.1 200 OK
< Date: Sun, 02 Jun 2019 00:20:16 GMT
< Content-Length: 2
< Content-Type: text/plain; charset=utf-8
ok
and do the benchmark
$ wrk -t8 -c1000 -d10s http://127.0.0.1:9000/sleep/10/
Running 10s test @ http://127.0.0.1:9000/sleep/10/
8 threads and 1000 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 11.84ms 18.96ms 266.92ms 91.97%
Req/Sec 8.79k 2.04k 14.77k 64.38%
699458 requests in 10.04s, 117.40MB read
Socket errors: connect 0, read 916, write 0, timeout 0
Non-2xx or 3xx responses: 699458
Requests/sec: 69640.30
Transfer/sec: 11.69MB
- AllowedMethods: all
- return
{status}
$ curl -XPOST http://127.0.0.1:9001/status/500/
> POST /status/500/ HTTP/1.1
> Host: 127.0.0.1:9001
> User-Agent: curl/7.54.0
> Accept: */*
>
< HTTP/1.1 500 Internal Server Error
< Content-Type: text/plain; charset=utf-8
< X-Content-Type-Options: nosniff
< Date: Sun, 02 Jun 2019 00:21:01 GMT
< Content-Length: 22
Internal Server Error
- AllowedMethods: all
- return 200, with the request contents in json
$ curl -XPOST http://127.0.0.1:9001/echo/\?a\=1\&b\=2
> POST /echo/?a=1&b=2 HTTP/1.1
> Host: 127.0.0.1:9001
> User-Agent: curl/7.54.0
> Accept: */*
>
< HTTP/1.1 200 OK
< Content-Type: application/json; charset=UTF-8
< Date: Sun, 02 Jun 2019 00:17:57 GMT
< Content-Length: 140
{
"body": "",
"form":
{},
"headers":
{
"Accept": ["*/*"],
"User-Agent": ["curl/7.54.0"]
},
"method": "POST",
"query":
{
"a": ["1"],
"b": ["2"]
},
"url": "/echo/"
}
- /ws/index/ the websocket test page
- /ws/ the websocket api, will broadcast the message to all client
- /file/download/{size}/ the size unit is KB
$ curl -XGET http://127.0.0.1:9001/file/download/1024/ -vv > a.txt
> GET /file/download/1024/ HTTP/1.1
> Host: 127.0.0.1:3000
> User-Agent: curl/7.54.0
> Accept: */*
>
< HTTP/1.1 200 OK
< Accept-Ranges: bytes
< Content-Control: private, no-transform, no-store, must-revalidate
< Content-Disposition: attachment; filename=data.txt
< Content-Length: 1048576
< Content-Transfer-Encoding: binary
< Content-Type: text/plain; charset=utf-8
< Expires: 0
< Last-Modified: Tue, 02 Jul 2019 08:23:20 GMT
< Date: Tue, 02 Jul 2019 08:23:20 GMT
$ du -h a.txt
1M
- /file/upload/{filename}/
$ curl -XPOST \
'http://127.0.0.1:9001/file/upload/data.txt/' \
-H 'Content-Type: multipart/form-data' \
-F data.txt=@/Downloads/data.txt -v
> POST /file/upload/data.txt/ HTTP/1.1
> Host: 127.0.0.1:3000
> User-Agent: curl/7.54.0
> Accept: */*
> Content-Length: 10430
> Expect: 100-continue
> Content-Type: multipart/form-data; boundary=------------------------1fb40c77823315c2
>
< HTTP/1.1 100 Continue
< HTTP/1.1 204 No Content
< Date: Tue, 02 Jul 2019 08:25:48 GMT
- httpbin apis