Fix missing id in sendError, report error on wrong json version

This commit is contained in:
coffeepots 2018-06-13 19:08:16 +01:00
parent 8781bbbf4e
commit 4a164c026e

View File

@ -70,7 +70,7 @@ proc checkJsonErrors*(line: string,
return some((rjeInvalidJson, res[1])) return some((rjeInvalidJson, res[1]))
if not node.hasKey("id"): if not node.hasKey("id"):
return some((rjeNoId, "")) return some((rjeNoId, ""))
if not node.hasKey("jsonrpc"): if node{"jsonrpc"} != %"2.0":
return some((rjeVersionError, "")) return some((rjeVersionError, ""))
if not node.hasKey("method"): if not node.hasKey("method"):
return some((rjeNoMethod, "")) return some((rjeNoMethod, ""))
@ -85,7 +85,7 @@ proc wrapReply*(id: JsonNode, value: JsonNode, error: JsonNode): string =
proc sendError*(client: StreamTransport, code: int, msg: string, id: JsonNode, proc sendError*(client: StreamTransport, code: int, msg: string, id: JsonNode,
data: JsonNode = newJNull()) {.async.} = data: JsonNode = newJNull()) {.async.} =
## Send error message to client ## Send error message to client
let error = %{"code": %(code), "message": %msg, "data": data} let error = %{"code": %(code), "id": id, "message": %msg, "data": data}
debug "Error generated", error = error, id = id debug "Error generated", error = error, id = id
var res = wrapReply(id, newJNull(), error) var res = wrapReply(id, newJNull(), error)
result = client.write(res) result = client.write(res)
@ -108,7 +108,7 @@ proc processMessage(server: RpcServer, client: StreamTransport,
let errState = jsonErrorState.get let errState = jsonErrorState.get
var id = var id =
if errState.err == rjeInvalidJson or errState.err == rjeNoId: if errState.err == rjeInvalidJson or errState.err == rjeNoId:
newJNull() # TODO: On malformed json, id is lost and messes up server responses newJNull()
else: else:
node["id"] node["id"]
await errState.err.sendJsonError(client, id, %errState.msg) await errState.err.sendJsonError(client, id, %errState.msg)
@ -118,7 +118,7 @@ proc processMessage(server: RpcServer, client: StreamTransport,
id = node["id"] id = node["id"]
if not server.procs.hasKey(methodName): if not server.procs.hasKey(methodName):
await client.sendError(METHOD_NOT_FOUND, "Method not found", id, await client.sendError(METHOD_NOT_FOUND, "Method not found", %id,
%(methodName & " is not a registered method.")) %(methodName & " is not a registered method."))
else: else:
let callRes = await server.procs[methodName](node["params"]) let callRes = await server.procs[methodName](node["params"])