Fix error handling at OCPP message sending
[e-mobility-charging-stations-simulator.git] / src / charging-station / ui-server / UIHttpServer.ts
index 6ae03d5d90ce2ace0a903db63ce24f8b101d6842..37c579dc56a552dc26dbd57ae515378820e9e2d9 100644 (file)
@@ -39,17 +39,26 @@ export default class UIHttpServer extends AbstractUIServer {
 
   public sendResponse(response: ProtocolResponse): void {
     const [uuid, payload] = response;
-    if (this.responseHandlers.has(uuid) === true) {
-      const res = this.responseHandlers.get(uuid) as ServerResponse;
-      res.writeHead(this.responseStatusToStatusCode(payload.status), {
-        'Content-Type': 'application/json',
-      });
-      res.end(JSON.stringify(payload));
-      this.responseHandlers.delete(uuid);
-    } else {
+    try {
+      if (this.responseHandlers.has(uuid) === true) {
+        const res = this.responseHandlers.get(uuid) as ServerResponse;
+        res
+          .writeHead(this.responseStatusToStatusCode(payload.status), {
+            'Content-Type': 'application/json',
+          })
+          .end(JSON.stringify(payload));
+      } else {
+        logger.error(
+          `${this.logPrefix(moduleName, 'sendResponse')} Response for unknown request id: ${uuid}`
+        );
+      }
+    } catch (error) {
       logger.error(
-        `${this.logPrefix(moduleName, 'sendResponse')} Response for unknown request id: ${uuid}`
+        `${this.logPrefix(moduleName, 'sendResponse')} Error at sending response id '${uuid}':`,
+        error
       );
+    } finally {
+      this.responseHandlers.delete(uuid);
     }
   }
 
@@ -63,12 +72,14 @@ export default class UIHttpServer extends AbstractUIServer {
   private requestListener(req: IncomingMessage, res: ServerResponse): void {
     this.authenticate(req, (err) => {
       if (err) {
-        res.setHeader('Content-Type', 'text/plain');
-        res.setHeader('WWW-Authenticate', 'Basic realm=users');
-        res.writeHead(StatusCodes.UNAUTHORIZED);
-        res.end(`${StatusCodes.UNAUTHORIZED} Unauthorized`);
+        res
+          .writeHead(StatusCodes.UNAUTHORIZED, {
+            'Content-Type': 'text/plain',
+            'WWW-Authenticate': 'Basic realm=users',
+          })
+          .end(`${StatusCodes.UNAUTHORIZED} Unauthorized`)
+          .destroy();
         req.destroy();
-        res.destroy();
       }
     });
     // Expected request URL pathname: /ui/:version/:procedureName
@@ -102,9 +113,7 @@ export default class UIHttpServer extends AbstractUIServer {
               .get(version)
               .requestHandler(this.buildProtocolRequest(uuid, procedureName, body ?? {}))
               .catch(() => {
-                this.sendResponse(
-                  this.buildProtocolResponse(uuid, { status: ResponseStatus.FAILURE })
-                );
+                /* Error caught by AbstractUIService */
               });
           });
       } else {