From 9bbfdd9441e17e37c49f61c3580e829a97c4e104 Mon Sep 17 00:00:00 2001 From: Marchandise Rudy Date: Thu, 21 May 2020 14:26:33 +0200 Subject: [PATCH] Customize Responses Headers (#47) --- README.md | 23 +++++++- docs/index.md | 4 +- docs/pages/includes/section-configuration.md | 2 +- docs/pages/includes/section-tests.md | 19 +++++++ src/app.js | 1 + src/global.json | 7 ++- .../customHttpHeadersMiddleware.js | 24 ++++++++ test/custom.headers.js | 57 +++++++++++++++++++ 8 files changed, 133 insertions(+), 4 deletions(-) create mode 100644 src/middlewares/customHttpHeadersMiddleware.js create mode 100644 test/custom.headers.js diff --git a/README.md b/README.md index ad61ef4..14ece1d 100644 --- a/README.md +++ b/README.md @@ -14,9 +14,10 @@ Available: - GET / POST / PUT / PATCH / DELETE - Request (Query, Body, IPs, Host, Urls...) -- Headers +- Request Headers / Response Headers - Environment variables - Control via Headers/Query +- Folders and Files Docker OS/ARCH : @@ -46,6 +47,7 @@ Docker OS/ARCH : | ENABLE__REQUEST | application.enable.request | --enable:request | `true` | | ENABLE__ENVIRONMENT | application.enable.environment | --enable:environment | `true` | | ENABLE__FILE | application.enable.file | --enable:file | `true` | +| ENABLE__HEADER | application.enable.header | --enable:header | `true` | ## Use Echo-Server @@ -128,6 +130,25 @@ HTTP/1.1 500 Internal Server Error "c53a9ed79fa2" ``` +#### Custom Headers + +```bash +➜ curl --header 'X-ECHO-HEADER: One:1' $ECHO_HOST +➜ curl $ECHO_HOST/?echo_header=One:1 + +HTTP/1.1 200 OK +One: 1 +``` + +```bash +➜ curl --header 'X-ECHO-HEADER: One:1, Two:2' $ECHO_HOST +➜ curl "$ECHO_HOST/?echo_header=One:1,%20Two:2" + +HTTP/1.1 200 OK +One: 1 +Two: 2 +``` + #### Custom response latency ```bash diff --git a/docs/index.md b/docs/index.md index 5a6dbdd..2860522 100644 --- a/docs/index.md +++ b/docs/index.md @@ -11,7 +11,7 @@ nav_order: 1 [![GitHub stars](https://img.shields.io/github/stars/Ealenn/Echo-Server?style=for-the-badge&logo=github)](https://github.com/Ealenn/Echo-Server/stargazers) [![GitHub issues](https://img.shields.io/github/issues/Ealenn/Echo-Server?style=for-the-badge&logo=github)](https://github.com/Ealenn/Echo-Server/issues) [![DockerHub](https://img.shields.io/docker/pulls/ealen/echo-server.svg?style=for-the-badge&logo=docker)](https://hub.docker.com/repository/docker/ealen/echo-server) -[![DockerHub](https://img.shields.io/badge/SIZE-%3C%2013%20MB-1488C6?style=for-the-badge&logo=docker)](https://hub.docker.com/repository/docker/ealen/echo-server) +[![DockerHub](https://img.shields.io/badge/SIZE-%3C%2030%20MB-1488C6?style=for-the-badge&logo=docker)](https://hub.docker.com/repository/docker/ealen/echo-server) An echo server is a server that replicates the request sent by the client and sends it back. @@ -25,6 +25,8 @@ Available: - Environment variables - Control via Headers/Query +Docker OS/ARCH : linux/amd64 - linux/arm/v6 - linux/arm/v7 - linux/arm64 - linux/386 + ## Table of contents - [Docker](/pages/docker.html) : Use docker container diff --git a/docs/pages/includes/section-configuration.md b/docs/pages/includes/section-configuration.md index 21bdb1b..5da6c7f 100644 --- a/docs/pages/includes/section-configuration.md +++ b/docs/pages/includes/section-configuration.md @@ -14,4 +14,4 @@ nav_exclude: true | ENABLE__REQUEST | application.enable.request | --enable:request | `true` | | ENABLE__ENVIRONMENT | application.enable.environment | --enable:environment | `true` | | ENABLE__FILE | application.enable.file | --enable:file | `true` | -| COMMANDS__HTTPCODE__HEADERRESPONSE | commands.httpCode.headerResponse | --commands:httpCode:headerResponse | `true` | +| ENABLE__HEADER | application.enable.header | --enable:header | `true` | diff --git a/docs/pages/includes/section-tests.md b/docs/pages/includes/section-tests.md index 45e68fe..2e9a8f7 100644 --- a/docs/pages/includes/section-tests.md +++ b/docs/pages/includes/section-tests.md @@ -84,6 +84,25 @@ HTTP/1.1 500 Internal Server Error "c53a9ed79fa2" ``` +#### Custom Headers + +```bash +➜ curl --header 'X-ECHO-HEADER: One:1' $ECHO_HOST +➜ curl $ECHO_HOST/?echo_header=One:1 + +HTTP/1.1 200 OK +One: 1 +``` + +```bash +➜ curl --header 'X-ECHO-HEADER: One:1, Two:2' $ECHO_HOST +➜ curl "$ECHO_HOST/?echo_header=One:1,%20Two:2" + +HTTP/1.1 200 OK +One: 1 +Two: 2 +``` + #### Custom response latency ```bash diff --git a/src/app.js b/src/app.js index 5cdf975..df98a15 100644 --- a/src/app.js +++ b/src/app.js @@ -19,6 +19,7 @@ app.use(require('./middlewares/logMiddleware')); app.use(require('./middlewares/showFileMiddleware')); app.use(require('./middlewares/customResponseTime')); app.use(require('./middlewares/customHttpCodeMiddleware')); +app.use(require('./middlewares/customHttpHeadersMiddleware')); app.use(require('./middlewares/customHttpEnvBodyMiddleware')); app.use(require('./middlewares/customHttpBodyMiddleware')); diff --git a/src/global.json b/src/global.json index bf7332f..bc4d77a 100644 --- a/src/global.json +++ b/src/global.json @@ -10,7 +10,8 @@ "http": true, "request": true, "environment": true, - "file": true + "file": true, + "header": true }, "commands": { "httpBody": { @@ -26,6 +27,10 @@ "header": "x-echo-code", "headerResponse": true }, + "httpHeaders": { + "query": "echo_header", + "header": "x-echo-header" + }, "time": { "query": "echo_time", "header": "x-echo-time" diff --git a/src/middlewares/customHttpHeadersMiddleware.js b/src/middlewares/customHttpHeadersMiddleware.js new file mode 100644 index 0000000..62f652a --- /dev/null +++ b/src/middlewares/customHttpHeadersMiddleware.js @@ -0,0 +1,24 @@ +const config = require('../nconf'); + +const setupHttpHeaders = (value, res) => { + if (value) { + var elements = value.split(', '); + elements.forEach(customHeader => { + var array = customHeader.split(':'); + res.header(array[0], array.slice(1, array.length).join(':')); + }); + } +} + +module.exports = (req, res, next) => { + if (config.get('enable:header')) { + try { + setupHttpHeaders(req.headers[config.get('commands:httpHeaders:header')], res); + setupHttpHeaders(req.query[config.get('commands:httpHeaders:query')], res); + } finally { + next(); + } + } else { + next(); + } +} \ No newline at end of file diff --git a/test/custom.headers.js b/test/custom.headers.js new file mode 100644 index 0000000..4263f29 --- /dev/null +++ b/test/custom.headers.js @@ -0,0 +1,57 @@ +const assert = require('assert'); +const request = require('supertest'); + +describe('Custom Headers', function () { + var server; + beforeEach(function () { + server = require('../src/app'); + }); + afterEach(function () { + server.close(); + }); + it('Simple Header', (done) => { + request(server) + .get('/') + .set('X-ECHO-HEADER', 'Accept-Language: en-US') + .expect(function (res) { + assert.equal(res.header['accept-language'], 'en-US') + }) + .expect(200, done); + }); + it('Complexe Header', (done) => { + request(server) + .get('/') + .set('X-ECHO-HEADER', 'Host: en.echo-server.local:3000') + .expect(function (res) { + assert.equal(res.header['host'], 'en.echo-server.local:3000') + }) + .expect(200, done); + }); + it('Multiple Headers', (done) => { + request(server) + .get('/') + .set('X-ECHO-HEADER', 'One: 1, Two: 2') + .expect(function (res) { + assert.equal(res.header['one'], '1') + assert.equal(res.header['two'], '2') + }) + .expect(200, done); + }); + it('Simple Query', (done) => { + request(server) + .get('/?echo_header=Accept-Language: en-US') + .expect(function (res) { + assert.equal(res.header['accept-language'], 'en-US') + }) + .expect(200, done); + }); + it('Complexe Query', (done) => { + request(server) + .get('/?echo_header=One:1, Two:2') + .expect(function (res) { + assert.equal(res.header['one'], '1') + assert.equal(res.header['two'], '2') + }) + .expect(200, done); + }); +}); \ No newline at end of file