Sign in Join

Live chat for Free Pascal, Lazarus, Delphi and every Pascal programmer.

Catalog · How the catalog works

Random project

stackdriver

Permite cargar bibliotecas compartidas (.so) como controladores que procesan solicitudes HTTP según rutas específicas definidas en archivos de configuración JSON.

View on GitLab

Anyone may press Interesting, signed in or not. It helps others find this project.

Member rating

No ratings yet.

Sign in to rate this project.

README

pascal
.?????? ?? ??????????????? ???????????  ???????? ??? ?????? ??????????????  ?????????  ???   ??? ?????????????? .?????????
?????? ???. ?????????  ?????? ?????? ?????? ?????????????????????????????? ?????? ?????? ??????????? ????????????????????.??????????? ?????
?????????????????? ??????.?????????????????? ?????? ???????????????????????????? ????????????????????? ??????????????????????????????????????????????????
?????????????????? ????????????????? ??????????????????????????????.????????????. ?????? ???????????????????????? ????????? ??????????????????????????????
 ????????????  ?????????  ???  ??? ??????????? ?????  ????????????????????? .???  ????????????. ???   ????????? .???  ???

StackDriver

StackDriver es un plugin dinámico para LWAS (Light Web Application Server) que implementa un sistema de enrutamiento basado en controladores dinámicos. Permite cargar bibliotecas compartidas (.so) como controladores que procesan solicitudes HTTP según rutas específicas definidas en archivos de configuración JSON.

Características

  • Carga dinámica de bibliotecas .so como controladores
  • Enrutamiento basado en archivos JSON de configuración
  • Soporte para múltiples controladores concurrentes
  • Cumplimiento con el contrato ABI v1 de LWASP
  • Sistema de logs para depuración

Requisitos

  • Free Pascal Compiler (fpc) 3.2.2 o superior
  • Bibliotecas de desarrollo de fpc
  • Paquete fcl-json para manejo de JSON

Compilación de StackDriver

Primero, compila la unidad de tipos compartidos:

bash
fpc -Fu/usr/lib/x86_64-linux-gnu/fpc/3.2.2/units/x86_64-linux/* lwasp_types.pas

Luego, compila StackDriver:

bash
fpc -Fu. -Fu/usr/lib/x86_64-linux-gnu/fpc/3.2.2/units/x86_64-linux/* -Fu/usr/share/fpcsrc/3.2.2/packages/fcl-json/src stackdriver.pas -o./libstackdriver.so -Xc -XR

Creación de Controladores

Para crear un nuevo controlador, sigue estos pasos:

1. Crear el archivo fuente del controlador

Crea un archivo Pascal (por ejemplo, mi_controlador.pas) con la siguiente estructura:

pascal
library mi_controlador;

{$mode objfpc}{$H+}
{$PACKRECORDS 1}  // Garantiza empaquetamiento estricto de 1 byte

uses
  ctypes, sysutils, lwasp_types;

// Función principal del controlador
function process_request(const req: PSoRequest): TSoResponse; cdecl; export;
var
  response: TSoResponse;
  content: string;
  content_ptr: PAnsiChar;
  content_type_ptr: PAnsiChar;
begin
  // Verificar si req es NULL
  if req = nil then
  begin
    // Inicializar toda la estructura
    response.status_code := 500;
    response.content_type := nil;
    response.body := nil;
    response.raw_response := nil;
    response.free_fn := nil;

    // Asignar mensaje de error
    content := 'Internal Server Error: Invalid request';
    content_ptr := create_string_copy(content);
    content_type_ptr := create_string_copy('text/plain');

    response.body := content_ptr;
    response.content_type := content_type_ptr;
    response.free_fn := @free_mem;

    Result := response;
    exit;
  end;

  // Inicializar toda la estructura para evitar valores basura
  response.status_code := 0;
  response.content_type := nil;
  response.body := nil;
  response.raw_response := nil;
  response.free_fn := nil;

  // Crear contenido personalizado
  content := 'Respuesta de mi controlador personalizado';

  // Asignar memoria para el contenido
  content_ptr := create_string_copy(content);

  // Asignar memoria para el content-type
  content_type_ptr := create_string_copy('text/plain');

  // Configurar la respuesta según ABI exacta
  response.status_code := 200;
  response.content_type := content_type_ptr;
  response.body := content_ptr;
  response.raw_response := nil;
  response.free_fn := @free_mem;

  Result := response;
end;

exports
  process_request;

begin
end.

2. Compilar el controlador

Compila tu controlador como una biblioteca compartida (asegurándote de tener lwasp_types.pas en el mismo directorio o en la ruta de unidades):

Usando el compilador directamente:

bash
fpc -Fu. -Fu/usr/lib/x86_64-linux-gnu/fpc/3.2.2/units/x86_64-linux/* mi_controlador.pas -o./libmi_controlador.so -Xc -XR

O usando el Makefile:

bash
make controllers-only

3. Crear archivo de configuración JSON

Crea un archivo JSON en el directorio /home/bds/lwasp/stackdriver/controllers/ con la siguiente estructura:

json
{
  "description": "Descripción de tu controlador",
  "controller": "/home/bds/lwasp/stackdriver/libmi_controlador.so",
  "url": "/ruta/personalizada"
}

Controladores con Múltiples Funciones Exportadas

StackDriver soporta controladores que exponen múltiples funciones exportadas. Puedes definir entradas específicas que apunten a diferentes funciones en tu controlador:

json
{
  "description": "Controlador multi entradas con parametros",
  "controller": "/home/bds/lwasp/stackdriver/libmulti_controller.so",
  "url": "/my/{$1}",
  "entry":{
    "/web/usuarios/{$1}":"exported_function_users",
    "/my/{$1}/{$2}":"exported_function_two_params"
  }
}

En este ejemplo:

  • La ruta /web/usuarios/123 llamará a la función exported_function_users
  • La ruta /my/test1/test2 llamará a la función exported_function_two_params
  • Las rutas que coincidan con el patrón base /my/{$1} pero no con las entradas específicas usarán la función por defecto process_request

Los parámetros variables se indican con {$1}, {$2}, etc., y pueden ser capturados en las funciones del controlador.

Configuración de LWAS

Para usar StackDriver con LWAS, asegúrate de que tu archivo de configuración de LWAS tenga la siguiente estructura:

json
{
  "server": {
    "port": 8080,
    "host": "0.0.0.0",
    "max_connections": 1000,
    "buffer_size": 8192,
    "request_timeout": 30,
    "keep_alive_timeout": 5,
    "max_request_size": 10485760
  },
  "module": {
    "type": "middleware"
  },
  "workers": {
    "binary_path": "/home/bds/lwasp/stackdriver/libstackdriver.so",
    "worker_path": "process_request",
    "io_adapter_type": "so"
  },
  "multipart": {
    "enabled": false,
    "upload_dir": "/tmp/uploads",
    "max_file_size": 10485760,
    "max_total_size": 52428800
  },
  "logging": {
    "worker_lifecycle": true,
    "worker_lifecycle_path": "./logs/worker_lifecycle.log",
    "tcp_server": true,
    "tcp_server_path": "./logs/tcp_server.log",
    "waf": true,
    "waf_path": "./logs/waf.log",
    "multipart": true,
    "multipart_path": "./logs/multipart.log",
    "socketpair": true,
    "socketpair_path": "./logs/socketpair.log",
    "dos": true,
    "dos_path": "./logs/DoS.log",
    "http": true,
    "http_path": "./logs/http.log",
    "generic": true,
    "generic_path": "./logs/generic.log"
  }
}

Uso

Una vez configurado, LWAS cargará StackDriver y este a su vez cargará dinámicamente los controladores definidos en los archivos JSON del directorio /home/bds/lwasp/stackdriver/controllers/. Las solicitudes HTTP se enrutarán según las rutas definidas en los archivos de configuración de los controladores.

Ejemplos

Este proyecto incluye dos controladores de ejemplo:

  • libhtml_controller.so: Responde a la ruta /web_page con contenido HTML
  • libjson_controller.so: Responde a la ruta /api/data con contenido JSON

Contribución

Las contribuciones son bienvenidas. Por favor, asegúrate de seguir las siguientes pautas:

  • Sigue el contrato ABI v1 de LWASP
  • Implementa correctamente la gestión de memoria
  • Usa empaquetamiento estricto ({$PACKRECORDS 1})
  • Proporciona archivos de configuración JSON válidos