diff --git a/package-lock.json b/package-lock.json index 7be7c78..75ec7db 100644 --- a/package-lock.json +++ b/package-lock.json @@ -19,6 +19,7 @@ }, "devDependencies": { "@types/node": "^18.0.6", + "@types/pem": "^1.9.6", "@typescript-eslint/eslint-plugin": "^5.30.7", "@typescript-eslint/parser": "^5.30.7", "eslint": "^8.20.0", @@ -239,6 +240,15 @@ "integrity": "sha512-/xUq6H2aQm261exT6iZTMifUySEt4GR5KX8eYyY+C4MSNPqSh9oNIP7tz2GLKTlFaiBbgZNxffoR3CVRG+cljw==", "dev": true }, + "node_modules/@types/pem": { + "version": "1.9.6", + "resolved": "https://registry.npmjs.org/@types/pem/-/pem-1.9.6.tgz", + "integrity": "sha512-IC67SxacM9fxEi/w7hf98dTun83OwUMeLMo1NS2gE0wdM9MHeg73iH/Pp9nB02OUCQ7Zb2UuKE/IpFCmQw9jxw==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@typescript-eslint/eslint-plugin": { "version": "5.30.7", "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.30.7.tgz", @@ -2590,6 +2600,15 @@ "integrity": "sha512-/xUq6H2aQm261exT6iZTMifUySEt4GR5KX8eYyY+C4MSNPqSh9oNIP7tz2GLKTlFaiBbgZNxffoR3CVRG+cljw==", "dev": true }, + "@types/pem": { + "version": "1.9.6", + "resolved": "https://registry.npmjs.org/@types/pem/-/pem-1.9.6.tgz", + "integrity": "sha512-IC67SxacM9fxEi/w7hf98dTun83OwUMeLMo1NS2gE0wdM9MHeg73iH/Pp9nB02OUCQ7Zb2UuKE/IpFCmQw9jxw==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, "@typescript-eslint/eslint-plugin": { "version": "5.30.7", "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.30.7.tgz", diff --git a/package.json b/package.json index 1b8103c..78d3421 100644 --- a/package.json +++ b/package.json @@ -26,6 +26,7 @@ "homepage": "https://github.com/ubarilan/mockpox#readme", "devDependencies": { "@types/node": "^18.0.6", + "@types/pem": "^1.9.6", "@typescript-eslint/eslint-plugin": "^5.30.7", "@typescript-eslint/parser": "^5.30.7", "eslint": "^8.20.0", diff --git a/src/mock/mock.ts b/src/mock/mock.ts index cefb8a6..4fe6599 100644 --- a/src/mock/mock.ts +++ b/src/mock/mock.ts @@ -8,6 +8,7 @@ import ReadConfig from '../lib/readconfig'; import { MockConf } from '../lib/types/mockTypes'; import { logger } from '../lib/utils/logger'; import handler from './handler'; +import { createCertificate } from 'pem'; export default class Mock { private server: httpServer | httpsServer; // Implement HTTPS @@ -26,24 +27,45 @@ export default class Mock { this.initServer(); } - private initServer() { - if (!this.conf.ssl) { - this.server = createHttpServer(); - } else { - this.server = createHttpsServer(); - throw new Error('Not implemented'); - } - + private startWebServer() { try { this.server.listen(this.conf.port, this.conf.address, () => { this.logger.info( - `Listening on ${this.conf.address}:${this.conf.port}` + `Mock server listening on ${this.conf.address}:${this.conf.port}` ); }); - } catch (error) { - throw new Error(`An error occured: ${error}`); + } catch (err: unknown) { + if (err instanceof Error) { + this.logger.crit( + `Error when trying to listen on port ${this.conf.port}: ${err.message}` + ); + } + process.exit(1); } - this.server.on('request', this.handler.bind(this)); } + + private initServer() { + if (!this.conf.ssl) { + this.server = createHttpServer(); + this.startWebServer(); + } else { + createCertificate( + { + days: 1, + selfSigned: true, + }, + (err, keys) => { + if (err) { + throw err; + } + this.server = createHttpsServer({ + key: keys.serviceKey, + cert: keys.certificate, + }); + this.startWebServer(); + } + ); + } + } } diff --git a/src/record/handler.ts b/src/record/handler.ts index 1a460ff..720aba9 100644 --- a/src/record/handler.ts +++ b/src/record/handler.ts @@ -24,22 +24,31 @@ export default async function handler( const sortedUrl = sortUrlQueryStrings(req.url); - const rex = await axios.request({ - url: sortedUrl, - method: req.method, - headers: Object.fromEntries(headerMap), - maxRedirects: 0, - validateStatus: null, - }); + try { + const rex = await axios.request({ + url: sortedUrl, + method: req.method, + headers: Object.fromEntries(headerMap), + maxRedirects: 0, + validateStatus: null, + }); + res.writeHead(rex.status, rex.headers); + res.end(rex.data); - res.writeHead(rex.status, rex.headers); - res.end(rex.data); + this.logger.info(`${req.method} - ${sortedUrl} - ${rex.status}`); - this.logger.info(`${req.method} - ${sortedUrl} - ${rex.status}`); - - this.writeConfig.addEndpointData( - getUrlWithoutOrigin(sortedUrl), - req.method as Method, - rex - ); + this.writeConfig.addEndpointData( + getUrlWithoutOrigin(sortedUrl), + req.method as Method, + rex + ); + } catch (err: unknown) { + if (err instanceof Error) { + res.writeHead(500); + res.end(err.message); + } else { + res.writeHead(500); + res.end('Unknown error'); + } + } }