From 4e17de909aa9c243f40bde9e51522b09d489a195 Mon Sep 17 00:00:00 2001 From: ValKmjolnir Date: Sat, 25 Mar 2023 21:26:49 +0800 Subject: [PATCH] :sparkles: update test/jsonrpc.nas --- stl/json.nas | 11 +++-- test/jsonrpc.nas | 115 ++++++++++++++++++++++++++++++++++------------- 2 files changed, 91 insertions(+), 35 deletions(-) diff --git a/stl/json.nas b/stl/json.nas index 2e2ab58..145ca01 100644 --- a/stl/json.nas +++ b/stl/json.nas @@ -66,7 +66,8 @@ var JSON=func() { var get=func(str) { init(); if(!size(str)) { - die("empty string"); + println("JSON.parse: empty string"); + str="[]"; } text=str; text_size=size(text); @@ -145,7 +146,7 @@ var JSON=func() { var match=func(type) { if(token.type!=type) - print("line ",line,": expect ",j_content[type]," but get `",token.content,"`.\n"); + println("JSON.parse: line ",line,": expect ",j_content[type]," but get `",token.content,"`."); next(); return; } @@ -213,7 +214,8 @@ var JSON=func() { return { parse:func(str) { if(typeof(str)!="str") { - die("JSON.parse: must use string"); + println("JSON.parse: must use string"); + return []; } get(str); next(); @@ -232,7 +234,8 @@ var JSON=func() { JSON.stringify=func(object) { if(typeof(object)!="hash" and typeof(object)!="vec") { - die("JSON.stringify: must use hashmap or vector"); + println("JSON.stringify: must use hashmap or vector"); + return "[]"; } var s=""; diff --git a/test/jsonrpc.nas b/test/jsonrpc.nas index 99e97f3..d4f5e0d 100644 --- a/test/jsonrpc.nas +++ b/test/jsonrpc.nas @@ -1,80 +1,133 @@ import.module.libsock; import.stl.json; -var jsonrpc=func(){ +var gettime=func(){ + return split(" ",os.time())[1]; +} + +var jsonRPC=func(){ var sd=nil; return { establish:func(ip,port) { sd=socket.socket(socket.AF_INET,socket.SOCK_STREAM,socket.IPPROTO_IP); if(socket.bind(sd,ip,port)<0) { - println("failed to bind socket "~sd~" at "~ip~":"~port~"."); + println("[",gettime(),"] failed to bind socket ",sd," at ",ip,":",port); return 0; } socket.listen(sd,1); - println("[",os.time(),"] start connection at [",ip,":",port,"]"); + println("[",gettime(),"] start connection at [",ip,":",port,"]"); return 1; }, connect:func(ip,port) { sd=socket.socket(socket.AF_INET,socket.SOCK_STREAM,socket.IPPROTO_IP); while(socket.connect(sd,ip,port)<0) { - println("[",os.time(),"] failed to connect socket "~sd~" to "~ip~":"~port~", retrying."); - unix.sleep(1); + println("[",gettime(),"] failed to connect socket ",sd," to ",ip,":",port); + unix.sleep(5); } - println("[",os.time(),"] start connection at [",ip,":",port,"]"); + println("[",gettime(),"] start connection at [",ip,":",port,"]"); return {ip:ip,sd:sd}; # get server ip and sd }, shutdown:func() { - println("[",os.time(),"] shutdown"); + println("[",gettime(),"] shutdown"); socket.closesocket(sd); }, accept:func() { + println("[",gettime(),"] accpet sd ",sd); return socket.accept(sd); }, disconnect:func(client) { - println("[",os.time(),"] [",client.ip,"] disconnected"); + println("[",gettime(),"] disconnected"); return socket.closesocket(client.sd); }, recv:func(client){ var data=socket.recv(client.sd,2048); if(data.size<=0){ - println("[",os.time(),"] [",client.ip,"] closed connection"); + println("[",gettime(),"] closed connection, recv failed"); return nil; } - println("[",os.time(),"] [",client.ip,"] receive ",data.str); + println("[",gettime(),"] receive ",data.str); return data.str; }, send:func(client,content){ - println("[",os.time(),"] [",client.ip,"] sending ",content); + println("[",gettime(),"] sending ",content); return socket.send(client.sd,content); } }; }(); -var id=1; -var args=runtime.argv(); -if (size(args)!=0) { - if (args[0]=="--server") { - jsonrpc.establish("127.0.0.1",8080); - var client=jsonrpc.accept(); - jsonrpc.send(client, JSON.stringify({jsonrpc:2.0, id:1, result:{info:"from server: first info"}})); +var server=func(ip,port) { + var methods={ + callHello:func(vec) { + var res="hello "; + foreach(var i;vec) { + res~=i~" "; + } + return res; + }, + onRandom:func(vec) { + return "rand: "~str(rand()); + } + }; + + jsonRPC.establish(ip,port); + while(1) { + var client=jsonRPC.accept(); while(1) { - var data=jsonrpc.recv(client); + var data=jsonRPC.recv(client); if (data!=nil) { data=JSON.parse(data); } else { break; } - jsonrpc.send(client, JSON.stringify({jsonrpc:2.0, id:data.id+1, result:{info:"from server"}})); + if (contains(methods,data.method)) { + jsonRPC.send(client, JSON.stringify({ + jsonrpc:2.0, + id:data.id, + error:"null", + result:methods[data.method](data.params) + })); + } else { + jsonRPC.send(client, JSON.stringify({ + jsonrpc:2.0, + id:data.id, + error:"no such method \\\""~data.method~"\\\"", + result:"null" + })); + } + } - jsonrpc.disconnect(client); - } elsif (args[0]=="--client") { - var server=jsonrpc.connect("127.0.0.1",8080); - while(1) { - unix.sleep(1); - var respond=JSON.parse(jsonrpc.recv(server)); - var data=JSON.stringify({jsonrpc:2.0, id:respond.id+1, result:{info:"from client"}}); - jsonrpc.send(server, data); - } - jsonrpc.disconnect(server); } -} \ No newline at end of file + jsonRPC.disconnect(client); +} + +var client=func(ip,port) { + srand(); + var call_id=1; + var methods=["callHello","notExist","onRandom"]; + var params=[["a","b"],["1","2"]]; + + var server=jsonRPC.connect(ip,port); + while(1) { + unix.sleep(5); + var data=JSON.stringify({jsonrpc:2.0, id:call_id, method:methods[rand()*size(methods)],params:params[rand()*size(params)]}); + jsonRPC.send(server, data); + var respond=jsonRPC.recv(server); + if (respond==nil) { + break; + } + println("[",gettime(),"] result: ",JSON.parse(respond).result); + call_id+=1; + } + jsonRPC.disconnect(server); +} + +func() { + var args=runtime.argv(); + if (size(args)!=0) { + if (args[0]=="--server") { + server("127.0.0.1",5007); + } elsif (args[0]=="--client") { + client("127.0.0.1",5007); + } + } +}(); \ No newline at end of file