Xavante : Handler de type fonction Lua simple

Objectif

xavante

J’ai présenté dans un précédant billet comment mettre en œuvre un serveur web WSAPI-Xavante. L’objectif de ce billet est de présenter plus en détail la mise en œuvre d’une fonction permettant de répondre à une requête de type GET ou POST sans utiliser la librairie WSAPI.

Site web du tutoriel

----------------------------------------------------------------
-- Exemple de mise en oeuvre de WSAPI et Xavante (tuto02.lua) --
----------------------------------------------------------------
 
local xavante = require("xavante")
 
-- Formatage sous forme de chaîne de caractères du contenu d'une variable
local function tostr(variable, indent)
  local str = ""
  indent = indent or ""
  local incindent = "    "
  if (type(variable) ~= "table") then
    if (type(variable) == "string") then 
      str = string.format("%q", variable)
    else 
      str = tostring(variable)
    end
  else
    local separateur = ""
    for i, v in pairs(variable) do
      str = str .. separateur
      separateur = ", \n"
      if(type(i) == "number") then 
        str = str .. indent .. incindent .. tostr(v, indent .. incindent)
      else
        str = str .. indent .. incindent .. tostr(i, indent .. incindent) .. " = " .. tostr(v, indent .. incindent)
      end
    end
    str = "{\n" .. str .. "\n" .. indent .. "}"
  end
  return str
end
 
-- La fonction permettant de répondre à des requêtes GET ou POST
function fonctionSimple(req, res)
  local post = nil
  res.headers["Content-type"] = "text"
  if (req["headers"]["content-length"]) then
    post = req.socket:receive( tonumber(req["headers"]["content-length"]) )
  end
  res.content = string.format('\nreq = \n%s\nreq["cmd_mth"] = %s\nreq["parsed_url"]["path"] = "%s"\nreq["parsed_url"]["query"] = "%s"\npost = %s\n\n', 
    tostring(tostr(req)), tostring(req["cmd_mth"]), tostring(req["parsed_url"]["path"]), tostring(req["parsed_url"]["query"]), tostring(post))
  return res
end
 
local mesRegles = {
    { -- Gestionnaire de fonction (http://localhost:8080/fsimple)
      match = { "/fsimple$", "/fsimple/" },
      with = fonctionSimple
    },
}
 
-- Message de départ
xavante.start_message(
  function(ports)
    local date = os.date("[%Y-%m-%d %H:%M:%S]")
    print(string.format("%s Xavante started on port(s) %s", date, table.concat(ports, ", ")))
  end
)
 
-- Configuration
xavante.HTTP{
    server = { host = "*", port = 8080 },
    defaultHost = { rules = mesRegles },
}
 
-- Démarrage (Dans un terminal : wsapi -c tuto02.lua -p 8080)
xavante.start()
 
-- Test de requête GET : curl "http://localhost:8080/fsimple/sec1/sec2?name1=value1&name2=value2"
-- Test de requête POST : ccurl --data "Données en POST" "http://localhost:8080/fsimple/sec1/sec2?name1=value1&name2=value2"

Le résultat

Bien entendu, la première étape consiste à lancer le serveur web : wsapi -c tuto02.lua -p 8080

Dans le code ci-dessus, la fonction fonctionSimple(req, res) traite les informations des requêtes GET ou POST.

On peut tester une requête GET sur cette fonction en saisissant dans un terminal la commande suivante :

curl "http://localhost:8080/fsimple/sec1/sec2?name1=value1&name2=value2"
req = 
{
    "serversoftware" = "Xavante 2.2.0", 
    "socket" = {
        "socket" = tcp{client}: 0x14864b8
    }, 
    "relpath" = "/fsimple/sec1/sec2", 
    "parsed_url" = {
        "host" = "localhost", 
        "path" = "/fsimple/sec1/sec2", 
        "query" = "name1=value1&name2=value2", 
        "scheme" = "http", 
        "port" = "8080", 
        "authority" = "localhost:8080"
    }, 
    "srv" = "127.0.0.1", 
    "cmdline" = "GET /fsimple/sec1/sec2?name1=value1&name2=value2 HTTP/1.1", 
    "handler" = function: 0x143e590, 
    "copasskt" = {
        "socket" = tcp{client}: 0x14864b8
    }, 
    "rawskt" = tcp{client}: 0x14864b8, 
    "built_url" = "http://localhost:8080/fsimple/sec1/sec2?name1=value1&name2=value2", 
    "cmd_version" = "HTTP/1.1", 
    "cmd_mth" = "GET", 
    "cmd_url" = "/fsimple/sec1/sec2?name1=value1&name2=value2", 
    "port" = "8080", 
    "headers" = {
        "host" = "localhost:8080", 
        "user-agent" = "curl/7.35.0", 
        "accept" = "*/*"
    }
}
req["cmd_mth"] = GET
req["parsed_url"]["path"] = "/fsimple/sec1/sec2"
req["parsed_url"]["query"] = "name1=value1&name2=value2"
post = nil

On peut tester une requête POST sur cette fonction en saisissant dans un terminal la commande suivante :

ccurl --data "Données en POST" "http://localhost:8080/fsimple/sec1/sec2?name1=value1&name2=value2"
req = 
{
    "serversoftware" = "Xavante 2.2.0", 
    "socket" = {
        "socket" = tcp{client}: 0x147d868
    }, 
    "relpath" = "/fsimple/sec1/sec2", 
    "parsed_url" = {
        "host" = "localhost", 
        "path" = "/fsimple/sec1/sec2", 
        "query" = "name1=value1&name2=value2", 
        "scheme" = "http", 
        "port" = "8080", 
        "authority" = "localhost:8080"
    }, 
    "srv" = "127.0.0.1", 
    "cmdline" = "POST /fsimple/sec1/sec2?name1=value1&name2=value2 HTTP/1.1", 
    "handler" = function: 0x143e590, 
    "copasskt" = {
        "socket" = tcp{client}: 0x147d868
    }, 
    "rawskt" = tcp{client}: 0x147d868, 
    "built_url" = "http://localhost:8080/fsimple/sec1/sec2?name1=value1&name2=value2", 
    "cmd_version" = "HTTP/1.1", 
    "cmd_mth" = "POST", 
    "cmd_url" = "/fsimple/sec1/sec2?name1=value1&name2=value2", 
    "port" = "8080", 
    "headers" = {
        "host" = "localhost:8080", 
        "content-type" = "application/x-www-form-urlencoded", 
        "accept" = "*/*", 
        "user-agent" = "curl/7.35.0", 
        "content-length" = "15"
    }
}
req["cmd_mth"] = POST
req["parsed_url"]["path"] = "/fsimple/sec1/sec2"
req["parsed_url"]["query"] = "name1=value1&name2=value2"
post = Données en POST

Références

Cette entrée a été publiée dans Domotique, Tutoriels, Eloise and taguée . Placez un signet sur le permalien.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *