A dummy HTTP server that responds whatever you told it to.
Testing URL: https://mirror-http-server.web.app
Built to play with HTTP or test your API. Make a HTTP call to the dummy server with the specified headers you want the server responds with.
Pull the Docker container:
docker pull eexit/mirror-http-server
Start the container:
$ docker run -itp 8080:8080 eexit/mirror-http-server
2015-11-05T20:59:57.353Z] INFO: mirror-http-server/17 on ccc867df5980: Listening on http://0.0.0.0:8080
For this README examples, I use the great HTTPie tool.
Send request against it:
http :8080
HTTP/1.1 200 OK
Connection: keep-alive
Content-Length: 0
Date: Wed, 13 Mar 2019 12:38:07 GMT
X-Powered-By: ExpressYou can use any HTTP verbs with any path, any request body and any header.
You can change the server response code and body by setting specific X-Mirror-* headers to your request.
Change the server response status code.
Examples that simulates a 301 redirection and a Content-Type change:
http :8080 \
X-Mirror-Code:301 \
X-Mirror-Location:http://www.eexit.net \
X-Mirror-Content-Type:"text/plain; charset=ISO-8859-1"
HTTP/1.1 301 Moved Permanently
Connection: keep-alive
Content-Length: 0
Content-Type: text/plain; charset=ISO-8859-1
Date: Wed, 13 Mar 2019 12:41:35 GMT
Location: http://www.eexit.net
X-Powered-By: ExpressIf you add the --follow option, it will output my website HTML source.
If you check the container logs:
[2019-03-13T12:41:35.567Z] INFO: mirror-http-server/18 on f9c1a773d75a:
request: {
"ip": "172.17.0.1",
"ips": [],
"method": "GET",
"url": "/",
"headers": {
"host": "localhost",
"user-agent": "HTTPie/1.0.2",
"accept-encoding": "gzip, deflate",
"accept": "*/*",
"connection": "keep-alive",
"x-mirror-code": "301",
"x-mirror-location": "http://www.eexit.net",
"x-mirror-content-type": "text/plain; charset=ISO-8859-1"
},
"body": {}
}If you need to test timeouts or errors handling like 503 HTTP responses, you can pass the
X-Mirror-Delay header with a number in milliseconds before the server responds.
time http :8080 X-Mirror-Code:503 X-Mirror-Delay:2000
HTTP/1.1 503 Service Unavailable
Connection: keep-alive
Content-Length: 0
Date: Fri, 20 May 2022 09:52:04 GMT
Keep-Alive: timeout=5
X-Powered-By: Express
http :8080 X-Mirror-Code:503 X-Mirror-Delay:2000 0.12s user 0.03s system 7% cpu 2.163 totalIf you can't access to the container log or want to exploit what's logged under the hood, set the X-Mirror-Request to receive the logged entry (as JSON):
$ http POST :80/resource \
X-Mirror-Code:201 \
X-Mirror-Request:true \
key1=value1 key2=value2
HTTP/1.1 201 Created
Connection: keep-alive
Content-Length: 371
Content-Type: application/json; charset=utf-8
Date: Wed, 13 Mar 2019 12:43:02 GMT
ETag: W/"173-rgXpQ/N7aKeAq+URc1y3vQypNZk"
X-Powered-By: Express
{
"request": {
"body": {
"key1": "value1",
"key2": "value2"
},
"headers": {
"accept": "application/json, */*",
"accept-encoding": "gzip, deflate",
"connection": "keep-alive",
"content-length": "36",
"content-type": "application/json",
"host": "localhost",
"user-agent": "HTTPie/1.0.2",
"x-mirror-code": "201",
"x-mirror-request": "true"
},
"ip": "172.17.0.1",
"ips": [],
"method": "POST",
"url": "/resource"
}
}Note: if you don't specify the true value for the header, it'll ignored.
Instead, if you wish the dummy server to return you the body you sent to it, set the X-Mirror-Body header.
Note: the X-Mirror-Request header will override X-Mirror-Body header.
$ http PUT :80/resource \
X-Mirror-Code:400 \
X-Mirror-Body:true \
key1=value1 key2=value2
HTTP/1.1 400 Bad Request
Connection: keep-alive
Content-Length: 33
Content-Type: application/json; charset=utf-8
Date: Wed, 13 Mar 2019 12:43:45 GMT
ETag: W/"21-SWsq4vawbQc/koBuf3CC1L6ssws"
X-Powered-By: Express
{
"key1": "value1",
"key2": "value2"
}Note: if you don't specify the true value for the header, it'll ignored.
Aside to the previous three special headers, you can set your wanted response header by prepending your header name by X-Mirror-.
In the request:
Content-Type: application/json
X-Mirror-Content-Type: text/htmlYou'll get in your response:
Content-Type: text/htmlYou can even override Express headers or any other default header:
X-Mirror-X-Powered-By: eexit-engine
X-Mirror-Date: some dateWill turn into:
X-Powered-By: eexit-engine
Date: some dateYou can either use Docker to run the server locally or emulate the function using Firebase CLI:
In one terminal, run this command:
cd functions
yarn
firebase emulators:start --only functions
In another terminal, test it:
http http://localhost:5001/mirror-http-server/us-central1/mirror X-Mirror-Body:true message="Hello world\!"
HTTP/1.1 200 OK
connection: keep-alive
content-length: 26
content-type: application/json; charset=utf-8
date: Sun, 06 Nov 2022 10:56:21 GMT
etag: W/"1a-T7vCLEZV7pLSyUzkr9XBdG32YU8"
keep-alive: timeout=5
x-powered-by: Express
{
"message": "Hello world!"
}
This service is host as Google Clound Platform Cloud Function.
firebase deploy --only functions
- Functional testing
