Skip to content

Commit

Permalink
json rpc server in progress
Browse files Browse the repository at this point in the history
  • Loading branch information
fireduck64 committed Jul 17, 2018
1 parent f03f20c commit f4d4165
Show file tree
Hide file tree
Showing 4 changed files with 194 additions and 0 deletions.
30 changes: 30 additions & 0 deletions WORKSPACE
Expand Up @@ -55,3 +55,33 @@ maven_jar(
sha1 = "bd47ad3bd14b8e82595c7adaa143501e60842a84",
)

maven_jar(
name = "jsonrpc2_server",
artifact = "com.thetransactioncompany:jsonrpc2-server:1.11",
sha1 = "3f5866109d05f036bd12c7998d0b20166c656033",
)

maven_jar(
name = "jsonrpc2_base",
artifact = "com.thetransactioncompany:jsonrpc2-base:1.38.1",
sha1 = "ba8da1486587870aa0eb2820b731e3ed6f8fa8a2",
)

maven_jar(
name = "json_smart",
artifact = "net.minidev:json-smart:2.3",
sha1 = "007396407491352ce4fa30de92efb158adb76b5b",
)

maven_jar(
name = "accessors_smart",
artifact = "net.minidev:accessors-smart:1.2",
sha1 = "c592b500269bfde36096641b01238a8350f8aa31",
)

maven_jar(
name = "asm",
artifact = "org.ow2.asm:asm:6.2",
sha1 = "1b6c4ff09ce03f3052429139c2a68e295cae6604",
)

5 changes: 5 additions & 0 deletions client/BUILD
Expand Up @@ -13,6 +13,11 @@ java_library(
"@org_rocksdb_rocksdbjni//jar",
"@duckutil//:duckutil_lib",
"@duckutil//:lobstack_lib",
"@jsonrpc2_server//jar",
"@jsonrpc2_base//jar",
"@json_smart//jar",
"@accessors_smart//jar",
"@asm//jar",
],
)

Expand Down
151 changes: 151 additions & 0 deletions client/src/JsonRpcServer.java
@@ -0,0 +1,151 @@
package snowblossom.client;


import com.sun.net.httpserver.HttpExchange;
import com.sun.net.httpserver.HttpHandler;
import com.sun.net.httpserver.HttpServer;
import duckutil.Config;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.PrintStream;
import java.io.OutputStream;

import duckutil.TaskMaster;
import java.net.InetSocketAddress;
import com.sun.net.httpserver.BasicAuthenticator;
import com.sun.net.httpserver.Authenticator;
import com.thetransactioncompany.jsonrpc2.server.Dispatcher;
import com.thetransactioncompany.jsonrpc2.JSONRPC2Request;
import com.thetransactioncompany.jsonrpc2.JSONRPC2Response;
import com.thetransactioncompany.jsonrpc2.server.RequestHandler;
import com.thetransactioncompany.jsonrpc2.server.MessageContext;

import java.util.Scanner;


public class JsonRpcServer
{
private final HttpServer http_server;
private final Config config;

private final AuthAgent auth;

private final Dispatcher dispatcher;



public JsonRpcServer(Config config)
throws Exception
{
this.config = config;

config.require("rpc_port");
config.require("rpc_username");
config.require("rpc_password");

auth = new AuthAgent();

int listen_port = config.getInt("rpc_port");
String listen_host = config.getWithDefault("rpc_host", "localhost");

http_server = HttpServer.create(new InetSocketAddress(listen_host, listen_port), 0);
http_server.createContext("/", new RootHandler());
http_server.setExecutor(TaskMaster.getBasicExecutor(8,"json_rpc_server"));
http_server.start();

dispatcher = new Dispatcher();

register(new EchoHandler());

}

public void register(RequestHandler handler)
{
dispatcher.register(handler);
}


public class RootHandler implements HttpHandler
{
@Override
public void handle(HttpExchange t) throws IOException {
ByteArrayOutputStream b_out = new ByteArrayOutputStream();
PrintStream print_out = new PrintStream(b_out);

int code = 200;
if (!(auth.authenticate(t) instanceof Authenticator.Success))
{
code=401;
print_out.println("http basic auth required");
}
else
{

try
{
Scanner scan = new Scanner(t.getRequestBody());
String line = scan.nextLine();
scan.close();

JSONRPC2Request req = JSONRPC2Request.parse(line);
JSONRPC2Response resp = dispatcher.process(req, null);

print_out.println(resp.toJSONString());

}
catch(Throwable e)
{
code=500;
print_out.println(e);

}

}

byte[] data = b_out.toByteArray();
t.sendResponseHeaders(code, data.length);
OutputStream out = t.getResponseBody();
out.write(data);
out.close();

}
}

public class AuthAgent extends BasicAuthenticator
{
public AuthAgent()
{
super("SnowblossomClient");
}

@Override
public boolean checkCredentials(String username, String password)
{
if (username == null) return false;
if (password == null) return false;

if (!username.equals(config.get("rpc_username"))) return false;
if (!password.equals(config.get("rpc_password"))) return false;

return true;
}

}

public class EchoHandler implements RequestHandler
{
public String[] handledRequests()
{
return new String[]{"echo"};
}

public JSONRPC2Response process(JSONRPC2Request req, MessageContext ctx)
{
return new JSONRPC2Response(req.getID());
}


}

}
8 changes: 8 additions & 0 deletions client/src/SnowBlossomClient.java
Expand Up @@ -128,6 +128,14 @@ else if (command.equals("monitor"))
Thread.sleep(60000);
}
}
else if (command.equals("rpcserver"))
{
new JsonRpcServer(config);
while(true)
{
Thread.sleep(1000);
}
}
else if (command.equals("loadtest"))
{
client.runLoadTest();
Expand Down

0 comments on commit f4d4165

Please sign in to comment.