build(deps-dev): apply updates
[e-mobility-charging-stations-simulator.git] / src / charging-station / ui-server / UIHttpServer.ts
index 27e8d7ba9051654d777f904b7e5ff16c884b0a47..5bcae7beff6ed84fc6d0e202437361bc7f1c3725 100644 (file)
@@ -2,11 +2,10 @@ import type { IncomingMessage, ServerResponse } from 'node:http'
 
 import { StatusCodes } from 'http-status-codes'
 
-import { AbstractUIServer } from './AbstractUIServer.js'
-import { UIServerUtils } from './UIServerUtils.js'
 import { BaseError } from '../../exception/index.js'
 import {
   ApplicationProtocolVersion,
+  MapStringifyFormat,
   type ProcedureName,
   type Protocol,
   type ProtocolRequest,
@@ -18,12 +17,14 @@ import {
 } from '../../types/index.js'
 import {
   Constants,
-  JSONStringifyWithMapSupport,
   generateUUID,
   isNotEmptyString,
-  logPrefix,
-  logger
+  JSONStringify,
+  logger,
+  logPrefix
 } from '../../utils/index.js'
+import { AbstractUIServer } from './AbstractUIServer.js'
+import { isProtocolAndVersionSupported } from './UIServerUtils.js'
 
 const moduleName = 'UIHttpServer'
 
@@ -61,7 +62,7 @@ export class UIHttpServer extends AbstractUIServer {
           .writeHead(this.responseStatusToStatusCode(payload.status), {
             'Content-Type': 'application/json'
           })
-          .end(JSONStringifyWithMapSupport(payload))
+          .end(JSONStringify(payload, undefined, MapStringifyFormat.object))
       } else {
         logger.error(
           `${this.logPrefix(moduleName, 'sendResponse')} Response for unknown request id: ${uuid}`
@@ -95,7 +96,7 @@ export class UIHttpServer extends AbstractUIServer {
             'WWW-Authenticate': 'Basic realm=users'
           })
           .end(`${StatusCodes.UNAUTHORIZED} Unauthorized`)
-          .destroy()
+        res.destroy()
         req.destroy()
       }
     })
@@ -109,7 +110,7 @@ export class UIHttpServer extends AbstractUIServer {
     this.responseHandlers.set(uuid, res)
     try {
       const fullProtocol = `${protocol}${version}`
-      if (!UIServerUtils.isProtocolAndVersionSupported(fullProtocol)) {
+      if (!isProtocolAndVersionSupported(fullProtocol)) {
         throw new BaseError(`Unsupported UI protocol version: '${fullProtocol}'`)
       }
       this.registerProtocolVersionUIService(version)
@@ -126,10 +127,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)