X-Git-Url: https://git.piment-noir.org/?a=blobdiff_plain;f=src%2Fcharging-station%2Fui-server%2FUIHttpServer.ts;h=eafea59ad3ec2398be9f1e4c2c526e829c7e98d2;hb=3000c1258ccda0c8828f4e4fffb988e5ffaa84da;hp=27b9e8458fbe19bd1e3822f60f57fea7d9c84645;hpb=68220b423c52da387fdf41967dd8c738da0ff52e;p=e-mobility-charging-stations-simulator.git diff --git a/src/charging-station/ui-server/UIHttpServer.ts b/src/charging-station/ui-server/UIHttpServer.ts index 27b9e845..eafea59a 100644 --- a/src/charging-station/ui-server/UIHttpServer.ts +++ b/src/charging-station/ui-server/UIHttpServer.ts @@ -1,4 +1,4 @@ -import type { IncomingMessage, RequestListener, ServerResponse } from 'node:http' +import type { IncomingMessage, ServerResponse } from 'node:http' import { StatusCodes } from 'http-status-codes' @@ -16,7 +16,14 @@ import { ResponseStatus, type UIServerConfiguration } from '../../types/index.js' -import { Constants, generateUUID, isNotEmptyString, logPrefix, logger } from '../../utils/index.js' +import { + Constants, + JSONStringifyWithMapSupport, + generateUUID, + isNotEmptyString, + logPrefix, + logger +} from '../../utils/index.js' const moduleName = 'UIHttpServer' @@ -24,7 +31,7 @@ enum HttpMethods { GET = 'GET', PUT = 'PUT', POST = 'POST', - PATCH = 'PATCH', + PATCH = 'PATCH' } export class UIHttpServer extends AbstractUIServer { @@ -33,7 +40,7 @@ export class UIHttpServer extends AbstractUIServer { } public start (): void { - this.httpServer.on('request', this.requestListener.bind(this) as RequestListener) + this.httpServer.on('request', this.requestListener.bind(this)) this.startHttpServer() } @@ -54,7 +61,7 @@ export class UIHttpServer extends AbstractUIServer { .writeHead(this.responseStatusToStatusCode(payload.status), { 'Content-Type': 'application/json' }) - .end(JSON.stringify(payload)) + .end(JSONStringifyWithMapSupport(payload)) } else { logger.error( `${this.logPrefix(moduleName, 'sendResponse')} Response for unknown request id: ${uuid}` @@ -80,7 +87,7 @@ export class UIHttpServer extends AbstractUIServer { } private requestListener (req: IncomingMessage, res: ServerResponse): void { - this.authenticate(req, (err) => { + this.authenticate(req, err => { if (err != null) { res .writeHead(StatusCodes.UNAUTHORIZED, { @@ -96,7 +103,7 @@ export class UIHttpServer extends AbstractUIServer { const [protocol, version, procedureName] = req.url?.split('/').slice(1) as [ Protocol, ProtocolVersion, - ProcedureName, + ProcedureName ] const uuid = generateUUID() this.responseHandlers.set(uuid, res) @@ -106,7 +113,7 @@ export class UIHttpServer extends AbstractUIServer { throw new BaseError(`Unsupported UI protocol version: '${fullProtocol}'`) } this.registerProtocolVersionUIService(version) - req.on('error', (error) => { + req.on('error', error => { logger.error( `${this.logPrefix(moduleName, 'requestListener.req.onerror')} Error on HTTP request:`, error @@ -119,10 +126,22 @@ export class UIHttpServer extends AbstractUIServer { bodyBuffer.push(chunk) }) .on('end', () => { - const body = JSON.parse(Buffer.concat(bodyBuffer).toString()) as RequestPayload + let requestPayload: RequestPayload | undefined + try { + requestPayload = JSON.parse(Buffer.concat(bodyBuffer).toString()) as RequestPayload + } catch (error) { + this.sendResponse( + this.buildProtocolResponse(uuid, { + status: ResponseStatus.FAILURE, + errorMessage: (error as Error).message, + errorStack: (error as Error).stack + }) + ) + return + } this.uiServices .get(version) - ?.requestHandler(this.buildProtocolRequest(uuid, procedureName, body)) + ?.requestHandler(this.buildProtocolRequest(uuid, procedureName, requestPayload)) .then((protocolResponse?: ProtocolResponse) => { if (protocolResponse != null) { this.sendResponse(protocolResponse)