Is it possible to control the HTTP response behavior in openCPU?

108 views Asked by At

According to the openCPU documentation, there are some default HTTP status codes and return types for a few situations. For example, when R raises an error, openCPU returns code 400 with a response type of text/plain.

While I believe it should be possible to control those things, is it possible to customize any of those things directly from R? For example, what if I wanted to return a JSON for a specific error in my R function, with a status code 503?

1

There are 1 answers

2
Siddharth Bhatia On BEST ANSWER

You can change their R package behavior by forking opencpu or via a local copy i.e. not sure if package allows this like a functionality but the responses are configured in res.R

For e.g. this method in the link above uses 400 for error.

error <- function(msg, status=400){
    setbody(msg);
    finish(status);
  }

I will update the answer if I can confirm this is available without changing package code.

UPDATE 17-04-2021

You can write your serving html i.e. index.html which uses opencpu.js to call the corresponding R functions from your app, the return type can be requested to be json in the opencpu.js call. And in the R function , you can tryCatch() errors to send appropriate error code as a json argument.

For e.g. in the stock example app you can see the file stock.js which calls the functions from R folder i.e.

//this function gets a list of stocks to populate the tree panel
  function loadtree(){
    var req = ocpu.rpc("listbyindustry", {}, function(data){
      Ext.getCmp("tree-panel").getStore().setProxy({
        type : "memory",
        data : data,
        reader : {
          type: "json"
        }
      });
      Ext.getCmp("tree-panel").getStore().load();
    }).fail(function(){
      alert("Failed to load stocks: " + req.responseText);
    });
  }

The corresponding R code being called is in listbyindustry.R, inside which you can tryCatch() and send custom json.