Http Server in R Programming Language

Here’s the translation of the HTTP Server example from Go to R, formatted in Markdown for Hugo:

# Writing a basic HTTP server is easy using the 'httpuv' package.

library(httpuv)

# A fundamental concept in HTTP servers is handlers. In R, we can define
# handler functions that take a request and return a response.

hello <- function(req) {
  # Functions serving as handlers take a request as an argument
  # and return a list containing the response. Here our simple
  # response is just "hello\n".
  list(
    status = 200,
    headers = list(
      'Content-Type' = 'text/plain'
    ),
    body = "hello\n"
  )
}

headers <- function(req) {
  # This handler does something a little more sophisticated by
  # reading all the HTTP request headers and echoing them into
  # the response body.
  body <- paste(names(req$HTTP_HEADERS), req$HTTP_HEADERS, sep = ": ", collapse = "\n")
  list(
    status = 200,
    headers = list(
      'Content-Type' = 'text/plain'
    ),
    body = body
  )
}

# We set up our server routes using a list of path-handler pairs.
router <- list(
  '/hello' = hello,
  '/headers' = headers
)

# Finally, we start the server with the port and our router.
runServer("0.0.0.0", 8090, list(
  call = function(req) {
    if (req$PATH_INFO %in% names(router)) {
      return(router[[req$PATH_INFO]](req))
    } else {
      return(list(status = 404, headers = list(), body = "Not Found"))
    }
  }
))

To run the server:

# Run the script in R
Rscript http_server.R

Access the /hello route:

$ curl localhost:8090/hello
hello

This R code uses the httpuv package to create a simple HTTP server. The structure is similar to the original example, with handler functions for different routes. The main differences are:

  1. We use httpuv instead of net/http.
  2. Handler functions in R take a request object and return a list containing the response details.
  3. We manually set up routing using a list of path-handler pairs.
  4. The server is started using runServer from httpuv.

Note that R doesn’t have built-in concurrency like Go, so this server will handle requests sequentially. For more complex applications, you might need to consider other packages or approaches for concurrent request handling in R.