diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/sessions/SessionReader.java b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/sessions/SessionReader.java index 78ffbfd..4d5e353 100644 --- a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/sessions/SessionReader.java +++ b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/sessions/SessionReader.java @@ -21,6 +21,7 @@ import ch.unibas.dmi.dbis.cs108.casono.server.network.transport.RawPacket; import ch.unibas.dmi.dbis.cs108.casono.server.network.transport.TransportLayer; import java.io.EOFException; import java.io.IOException; +import java.net.SocketException; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; @@ -50,29 +51,21 @@ public class SessionReader implements Runnable { RawRequest rawRequest = null; RequestContext requestContext = null; try { - // Step 1: Read from transport rawPacket = transport.read(); session.updateLastInboundActivity(); logger.debug("Recieved: {}", rawPacket); - requestContext = new RequestContext(session.getId(), rawPacket.requestId()); - - // Step 2: Syntax validation and conversion into transport object - rawRequest = ProtocolParser.parse(rawPacket.payload()); - logger.debug("Parsed request to {}", rawRequest); - - PrimitiveRequest primitiveRequest = - new PrimitiveRequest( - requestContext, rawRequest.command(), rawRequest.parameters()); - logger.debug("Converted to {}", primitiveRequest); - - // Step 3: Parse into Request and execute Request - Request request = dispatcher.parse(primitiveRequest); - router.execute(request); + processRawPacket(rawPacket); } catch (EOFException e) { logger.info("Client disconnected"); eventBus.publish(new DisconnectEvent(session.getId())); break; + } catch (SocketException e) { + // Connection reset or other socket-level error — treat as client disconnect + logger.info("Client socket error / connection reset: {}", e.getMessage()); + eventBus.publish(new DisconnectEvent(session.getId())); + break; + } catch (TokenizerException | ProtocolParserException e) { logger.error("Error occured while parsing request. RawPacket: {}", rawPacket, e); @@ -117,6 +110,26 @@ public class SessionReader implements Runnable { } } + private void processRawPacket(RawPacket rawPacket) + throws TokenizerException, + ProtocolParserException, + UnknownCommandException, + ResponseDispatchException, + MissingParameterException, + IOException { + RawRequest rawRequest = ProtocolParser.parse(rawPacket.payload()); + logger.debug("Parsed request to {}", rawRequest); + + RequestContext requestContext = new RequestContext(session.getId(), rawPacket.requestId()); + + PrimitiveRequest primitiveRequest = + new PrimitiveRequest(requestContext, rawRequest.command(), rawRequest.parameters()); + logger.debug("Converted to {}", primitiveRequest); + + Request request = dispatcher.parse(primitiveRequest); + router.execute(request); + } + /** * Helperfunction to send ErrorResponse to client *