Catalog · How the catalog works
stackdriver
Permite cargar bibliotecas compartidas (.so) como controladores que procesan solicitudes HTTP según rutas específicas definidas en archivos de configuración JSON.
Anyone may press Interesting, signed in or not. It helps others find this project.
README
.?????? ?? ??????????????? ??????????? ???????? ??? ?????? ?????????????? ????????? ??? ??? ?????????????? .?????????
?????? ???. ????????? ?????? ?????? ?????? ?????????????????????????????? ?????? ?????? ??????????? ????????????????????.??????????? ?????
?????????????????? ??????.?????????????????? ?????? ???????????????????????????? ????????????????????? ??????????????????????????????????????????????????
?????????????????? ????????????????? ??????????????????????????????.????????????. ?????? ???????????????????????? ????????? ??????????????????????????????
???????????? ????????? ??? ??? ??????????? ????? ????????????????????? .??? ????????????. ??? ????????? .??? ???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:
fpc -Fu/usr/lib/x86_64-linux-gnu/fpc/3.2.2/units/x86_64-linux/* lwasp_types.pasLuego, compila StackDriver:
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 -XRCreació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:
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:
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 -XRO usando el Makefile:
make controllers-only3. Crear archivo de configuración JSON
Crea un archivo JSON en el directorio /home/bds/lwasp/stackdriver/controllers/ con la siguiente estructura:
{
"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:
{
"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/123llamará a la funciónexported_function_users - La ruta
/my/test1/test2llamará a la funciónexported_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 defectoprocess_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:
{
"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_pagecon contenido HTMLlibjson_controller.so: Responde a la ruta/api/datacon 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
