package com.msgilligan.bitcoinj.proxy;
import com.msgilligan.bitcoinj.rpc.JsonRpcRequest;
import ratpack.handling.Context;
import ratpack.handling.Handler;
import static ratpack.jackson.Jackson.fromJson;
import static ratpack.jackson.Jackson.json;
import javax.inject.Inject;
import javax.inject.Singleton;
import java.util.Arrays;
import java.util.List;
/**
* JsonRPC proxy handler
* Relay allowed RPC methods to a URI
*/
@Singleton
public class RpcProxyHandler implements Handler {
private final List<String> allowedMethods = Arrays.asList("getblockcount", "setgenerate");
private final JsonRpcClient rpcClient;
@Inject
public RpcProxyHandler(JsonRpcClient jsonRpcClient) {
rpcClient = jsonRpcClient;
}
@Override
public void handle(Context ctx) {
ctx.parse(fromJson(JsonRpcRequest.class)).then(rpcReq -> {
if (allowedMethods.contains(rpcReq.getMethod())) {
rpcClient.call(rpcReq).then(rpcResponse -> ctx.render(json(rpcResponse)));
} else {
// Should we send a JsonRpcResponse here?
ctx.getResponse().status(403).send("JSON-RPC method not allowed by proxy");
}
});
}
}