Rook: A web server interface and package for R
This help page defines the Rook specification. It borrows heavily from Ruby's Rack project: https://github.com/rack/rack.
After reading this document, read the Rhttpd
help file as it will get you familiar with installing and running Rook
applications. Then explore the example applications located in:
system.file('exampleApps',package='Rook')
.
class
A Rook application is an R reference class object that implements a 'call' method or an R closure that takes exactly one argument, an environment, and returns a list with three named elements: 'status'
, 'headers'
, and 'body'
.
Here is a basic Rook application as a closure that implements 'hello world':
function(env){
body = paste('<h1>Hello World! This is Rook',env$rook.version,'.</h1>')
list(
status = 200L,
headers = list(
'Content-Type' = 'text/html'
),
body = body
)
}
And the equivalent reference class example:
setRefClass(
'HelloWorld',
methods = list(
call = function(env){
list(
status = 200L,
headers = list(
'Content-Type' = 'text/html'
),
body = paste('<h1>Hello World! This is Rook',env$rook.version,'.</h1>')
)
}
)
)
The environment argument is a true R environment object which the application is free to modify. It is required to contain the following variables:
In addition, the environment must include the following Rook-specific variables:
The rook.input variable must contain an object created from a reference class that implements read_lines()
, read()
, and rewind()
:
read_lines(l=-1L)
:: takes one argument, the number of lines to read. Includes partial ending line.read(l=-1L)
:: takes one argument, the number of bytes to read. Returns a raw vector.rewind()
:: Rewinds the input stream back to the beginning.The rook.error variable must contain an object created from a reference class that implements flush()
and cat()
:
flush()
:: called with no arguments and makes the error stream immediately appear.cat(...,sep=" ",fill=FALSE,labels=NULL)
:: called with the same arguments as R's "cat"
without the file
and append argument
.Rook applications return a list with three named elements: 'status'
, 'headers'
, and 'body'
.
'status'
An HTTP status value as integer and must be greater than or equal to 100.
'headers'
A named list that contains only character values corresponding to valid HTTP headers.
'body'
Either a character or raw vector. If the character vector is named with value 'file'
then value of the vector is interpreted as the location of a file.
Jeffrey Horner jeffrey.horner@gmail.com