Server: updated protocol of interaction with UI according to latest changes; removed exceptions throws for cases when client tries to do something bad
This commit is contained in:
@@ -6,6 +6,8 @@ import DirectionRequest
|
|||||||
import GenericResponse
|
import GenericResponse
|
||||||
import ModeChange
|
import ModeChange
|
||||||
import Result
|
import Result
|
||||||
|
import Waypoints
|
||||||
|
import DebugResponse
|
||||||
import algorithm.RoomModel
|
import algorithm.RoomModel
|
||||||
import io.netty.buffer.Unpooled
|
import io.netty.buffer.Unpooled
|
||||||
import io.netty.channel.ChannelHandlerContext
|
import io.netty.channel.ChannelHandlerContext
|
||||||
@@ -20,58 +22,80 @@ class Handler : SimpleChannelInboundHandler<Any>() {
|
|||||||
var url: String? = null
|
var url: String? = null
|
||||||
var method: HttpMethod? = 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) {
|
override fun channelReadComplete(ctx: ChannelHandlerContext) {
|
||||||
when (url) {
|
when (url) {
|
||||||
Constants.changeModeURL -> {
|
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
|
// Parse mode change request
|
||||||
val ins = CodedInputStream(Base64.getDecoder().decode(contentBytes))
|
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
|
// Change server mode
|
||||||
Server.changeMode(Server.ServerMode.fromProtoMode(request.newMode))
|
Server.changeMode(requestedMode)
|
||||||
|
|
||||||
// Respond with "OK"-protobuf
|
// Respond with "OK"-protobuf
|
||||||
val protoResponse = GenericResponse.BuilderGenericResponse(Result.BuilderResult(0).build())
|
val protoResponse = GenericResponse.BuilderGenericResponse(Result.BuilderResult(0).build()).build()
|
||||||
val outs = CodedOutputStream(ByteArray(protoResponse.getSizeNoTag()))
|
respondWith(ctx, protoResponse)
|
||||||
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)
|
|
||||||
}
|
}
|
||||||
Constants.getWaypointsURL -> {
|
Constants.getWaypointsURL -> {
|
||||||
if (Server.serverMode != Server.ServerMode.PERIMETER_BUILDING) {
|
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 msg = RoomModel.getUpdate()
|
||||||
val outs = CodedOutputStream(ByteArray(msg.getSizeNoTag()))
|
respondWith(ctx, msg)
|
||||||
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)
|
|
||||||
}
|
}
|
||||||
Constants.directionOrderURL -> {
|
Constants.directionOrderURL -> {
|
||||||
if (Server.serverMode != Server.ServerMode.MANUAL_MODE) {
|
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
|
// Parse direction order
|
||||||
@@ -79,6 +103,8 @@ class Handler : SimpleChannelInboundHandler<Any>() {
|
|||||||
val order = DirectionRequest.BuilderDirectionRequest(DirectionRequest.Command.FORWARD, 0, false).parseFrom(ins)
|
val order = DirectionRequest.BuilderDirectionRequest(DirectionRequest.Command.FORWARD, 0, false).parseFrom(ins)
|
||||||
if (order.stop) {
|
if (order.stop) {
|
||||||
web.server.Server.changeMode(Server.ServerMode.IDLE)
|
web.server.Server.changeMode(Server.ServerMode.IDLE)
|
||||||
|
val protoResponse = GenericResponse.BuilderGenericResponse(Result.BuilderResult(1).build()).build()
|
||||||
|
respondWith(ctx, protoResponse)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -87,34 +113,11 @@ class Handler : SimpleChannelInboundHandler<Any>() {
|
|||||||
// TODO: should be done as callback after sending car order
|
// TODO: should be done as callback after sending car order
|
||||||
// Send update back
|
// Send update back
|
||||||
val msg = RoomModel.getUpdate()
|
val msg = RoomModel.getUpdate()
|
||||||
val outs = CodedOutputStream(ByteArray(msg.getSizeNoTag()))
|
respondWith(ctx, msg)
|
||||||
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)
|
|
||||||
}
|
}
|
||||||
Constants.getDebug -> {
|
Constants.getDebug -> {
|
||||||
val msg = RoomModel.getDebugInfo()
|
val msg = RoomModel.getDebugInfo()
|
||||||
val outs = CodedOutputStream(ByteArray(msg.getSizeNoTag()))
|
respondWith(ctx, msg)
|
||||||
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)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -18,6 +18,7 @@ object Server {
|
|||||||
ModeChange.Mode.ManualControl -> MANUAL_MODE
|
ModeChange.Mode.ManualControl -> MANUAL_MODE
|
||||||
ModeChange.Mode.PerimeterBuilding -> PERIMETER_BUILDING
|
ModeChange.Mode.PerimeterBuilding -> PERIMETER_BUILDING
|
||||||
ModeChange.Mode.PerimeterDebug -> PERIMETER_DEBUG
|
ModeChange.Mode.PerimeterDebug -> PERIMETER_DEBUG
|
||||||
|
ModeChange.Mode.Idle -> IDLE
|
||||||
else -> throw IllegalArgumentException("Illegal argument when parsing ServerMode from Protobuf Mode")
|
else -> throw IllegalArgumentException("Illegal argument when parsing ServerMode from Protobuf Mode")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user