From 4b9a4491112513d45bf7f6521f583b3c90fd8329 Mon Sep 17 00:00:00 2001 From: dsavvinov Date: Wed, 31 Aug 2016 20:28:20 +0300 Subject: [PATCH] Server: updated protocol of interaction with UI according to latest changes; removed exceptions throws for cases when client tries to do something bad --- server/src/main/java/web/server/Handler.kt | 121 +++++++++++---------- server/src/main/java/web/server/Server.kt | 1 + 2 files changed, 63 insertions(+), 59 deletions(-) diff --git a/server/src/main/java/web/server/Handler.kt b/server/src/main/java/web/server/Handler.kt index 433fcfa8c80..6d5b353fba4 100644 --- a/server/src/main/java/web/server/Handler.kt +++ b/server/src/main/java/web/server/Handler.kt @@ -6,6 +6,8 @@ import DirectionRequest import GenericResponse import ModeChange import Result +import Waypoints +import DebugResponse import algorithm.RoomModel import io.netty.buffer.Unpooled import io.netty.channel.ChannelHandlerContext @@ -20,58 +22,80 @@ class Handler : SimpleChannelInboundHandler() { var url: String? = null var method: HttpMethod? = null + fun encodeProtoInHttpResponse(outs: CodedOutputStream): DefaultHttpResponse { + val response = DefaultFullHttpResponse( + HttpVersion.HTTP_1_1, + HttpResponseStatus.OK, + Unpooled.copiedBuffer(Base64.getEncoder().encodeToString(outs.buffer), CharsetUtil.UTF_8) + ) + response.headers().setInt(HttpHeaderNames.CONTENT_LENGTH, response.content().readableBytes()) + response.headers().add("Access-Control-Allow-Origin", "*") + response.headers().add("Access-Control-Allow-Methods", "GET,POST,PUT,DELETE,OPTIONS") + response.headers().add("Access-Control-Allow-Headers", "X-Requested-With, Content-Direction, Content-Length") + return response + } + + fun respondWith(ctx: ChannelHandlerContext, msg: GenericResponse) { + val outs = CodedOutputStream(ByteArray(msg.getSizeNoTag())) + msg.writeTo(outs) + val response = encodeProtoInHttpResponse(outs) + ctx.writeAndFlush(response).addListener(io.netty.channel.ChannelFutureListener.CLOSE) + } + + fun respondWith(ctx: ChannelHandlerContext, msg: Waypoints) { + val outs = CodedOutputStream(ByteArray(msg.getSizeNoTag())) + msg.writeTo(outs) + val response = encodeProtoInHttpResponse(outs) + ctx.writeAndFlush(response).addListener(io.netty.channel.ChannelFutureListener.CLOSE) + } + + fun respondWith(ctx: ChannelHandlerContext, msg: DebugResponse) { + val outs = CodedOutputStream(ByteArray(msg.getSizeNoTag())) + msg.writeTo(outs) + val response = encodeProtoInHttpResponse(outs) + ctx.writeAndFlush(response).addListener(io.netty.channel.ChannelFutureListener.CLOSE) + } + override fun channelReadComplete(ctx: ChannelHandlerContext) { when (url) { Constants.changeModeURL -> { - if (Server.serverMode != Server.ServerMode.IDLE && Server.serverMode != Server.ServerMode.MANUAL_MODE) { - throw IllegalStateException("Can't change server mode in algorithm execution mode!") - } - // Parse mode change request val ins = CodedInputStream(Base64.getDecoder().decode(contentBytes)) - val request = ModeChange.BuilderModeChange(ModeChange.Mode.ManualControl).parseFrom(ins) + val request = ModeChange.BuilderModeChange(ModeChange.Mode.fromIntToMode(0)).parseFrom(ins) + val requestedMode = Server.ServerMode.fromProtoMode(request.newMode) + + if (Server.serverMode != Server.ServerMode.IDLE && requestedMode != Server.ServerMode.IDLE) { + println("Can't change server mode from ${Server.serverMode.toString()} to ${requestedMode.toString()}") + val protoResponse = GenericResponse.BuilderGenericResponse(Result.BuilderResult(1).build()).build() + respondWith(ctx, protoResponse) + return + } // Change server mode - Server.changeMode(Server.ServerMode.fromProtoMode(request.newMode)) + Server.changeMode(requestedMode) // Respond with "OK"-protobuf - val protoResponse = GenericResponse.BuilderGenericResponse(Result.BuilderResult(0).build()) - val outs = CodedOutputStream(ByteArray(protoResponse.getSizeNoTag())) - protoResponse.writeTo(outs) - val response = DefaultFullHttpResponse( - HttpVersion.HTTP_1_1, - HttpResponseStatus.OK, - Unpooled.copiedBuffer(Base64.getEncoder().encodeToString(outs.buffer), CharsetUtil.UTF_8) - ) - response.headers().setInt(HttpHeaderNames.CONTENT_LENGTH, response.content().readableBytes()) - response.headers().add("Access-Control-Allow-Origin", "*") - response.headers().add("Access-Control-Allow-Methods", "GET,POST,PUT,DELETE,OPTIONS") - response.headers().add("Access-Control-Allow-Headers", "X-Requested-With, Content-Direction, Content-Length") - ctx.writeAndFlush(response).addListener(io.netty.channel.ChannelFutureListener.CLOSE) + val protoResponse = GenericResponse.BuilderGenericResponse(Result.BuilderResult(0).build()).build() + respondWith(ctx, protoResponse) } Constants.getWaypointsURL -> { if (Server.serverMode != Server.ServerMode.PERIMETER_BUILDING) { - throw IllegalStateException("Can't get waypoints when in not Permiter Building mode") + println("Can't get waypoints when in not Permiter Building mode") + val protoResponse = GenericResponse.BuilderGenericResponse(Result.BuilderResult(1).build()).build() + respondWith(ctx, protoResponse) + return } - // Build update for UI + // Send update for UI val msg = RoomModel.getUpdate() - val outs = CodedOutputStream(ByteArray(msg.getSizeNoTag())) - msg.writeTo(outs) - val response = DefaultFullHttpResponse( - HttpVersion.HTTP_1_1, - HttpResponseStatus.OK, - Unpooled.copiedBuffer(Base64.getEncoder().encodeToString(outs.buffer), CharsetUtil.UTF_8) - ) - response.headers().setInt(HttpHeaderNames.CONTENT_LENGTH, response.content().readableBytes()) - response.headers().add("Access-Control-Allow-Origin", "*") - response.headers().add("Access-Control-Allow-Methods", "GET,POST,PUT,DELETE,OPTIONS") - response.headers().add("Access-Control-Allow-Headers", "X-Requested-With, Content-Direction, Content-Length") - ctx.writeAndFlush(response).addListener(io.netty.channel.ChannelFutureListener.CLOSE) + respondWith(ctx, msg) } Constants.directionOrderURL -> { if (Server.serverMode != Server.ServerMode.MANUAL_MODE) { - throw IllegalStateException("Can't execute move order when not in manual mode") + println("Can't execute move order when not in manual mode") + val protoResponse = GenericResponse.BuilderGenericResponse(Result.BuilderResult(1).build()).build() + respondWith(ctx, protoResponse) + return } // Parse direction order @@ -79,6 +103,8 @@ class Handler : SimpleChannelInboundHandler() { val order = DirectionRequest.BuilderDirectionRequest(DirectionRequest.Command.FORWARD, 0, false).parseFrom(ins) if (order.stop) { web.server.Server.changeMode(Server.ServerMode.IDLE) + val protoResponse = GenericResponse.BuilderGenericResponse(Result.BuilderResult(1).build()).build() + respondWith(ctx, protoResponse) return } @@ -87,34 +113,11 @@ class Handler : SimpleChannelInboundHandler() { // TODO: should be done as callback after sending car order // Send update back val msg = RoomModel.getUpdate() - val outs = CodedOutputStream(ByteArray(msg.getSizeNoTag())) - msg.writeTo(outs) - val response = DefaultFullHttpResponse( - HttpVersion.HTTP_1_1, - HttpResponseStatus.OK, - Unpooled.copiedBuffer(Base64.getEncoder().encodeToString(outs.buffer), CharsetUtil.UTF_8) - ) - response.headers().setInt(HttpHeaderNames.CONTENT_LENGTH, response.content().readableBytes()) - response.headers().add("Access-Control-Allow-Origin", "*") - response.headers().add("Access-Control-Allow-Methods", "GET,POST,PUT,DELETE,OPTIONS") - response.headers().add("Access-Control-Allow-Headers", "X-Requested-With, Content-Direction, Content-Length") - ctx.writeAndFlush(response).addListener(io.netty.channel.ChannelFutureListener.CLOSE) + respondWith(ctx, msg) } Constants.getDebug -> { val msg = RoomModel.getDebugInfo() - val outs = CodedOutputStream(ByteArray(msg.getSizeNoTag())) - msg.writeTo(outs) - - val response = DefaultFullHttpResponse( - HttpVersion.HTTP_1_1, - HttpResponseStatus.OK, - Unpooled.copiedBuffer(Base64.getEncoder().encodeToString(outs.buffer), CharsetUtil.UTF_8) - ) - response.headers().setInt(HttpHeaderNames.CONTENT_LENGTH, response.content().readableBytes()) - response.headers().add("Access-Control-Allow-Origin", "*") - response.headers().add("Access-Control-Allow-Methods", "GET,POST,PUT,DELETE,OPTIONS") - response.headers().add("Access-Control-Allow-Headers", "X-Requested-With, Content-Direction, Content-Length") - ctx.writeAndFlush(response).addListener(io.netty.channel.ChannelFutureListener.CLOSE) + respondWith(ctx, msg) } } } diff --git a/server/src/main/java/web/server/Server.kt b/server/src/main/java/web/server/Server.kt index 721c471c7d1..392adedb1d4 100644 --- a/server/src/main/java/web/server/Server.kt +++ b/server/src/main/java/web/server/Server.kt @@ -18,6 +18,7 @@ object Server { ModeChange.Mode.ManualControl -> MANUAL_MODE ModeChange.Mode.PerimeterBuilding -> PERIMETER_BUILDING ModeChange.Mode.PerimeterDebug -> PERIMETER_DEBUG + ModeChange.Mode.Idle -> IDLE else -> throw IllegalArgumentException("Illegal argument when parsing ServerMode from Protobuf Mode") } }