🔗 API - Endpoints /hix-*¶
Referencia completa de los endpoints del panel admin de HIX. Para el detalle conceptual (sesión, cookie firmada, configuración inicial) ver sistema/hix-admin.
Resumen¶
| Endpoint | Método | Auth | Función |
|---|---|---|---|
/hix-ping |
GET |
- | Health check público |
/hix-slow |
GET |
- | Endpoint lento (3s) - debug latencia |
/hix-status |
GET |
✅ | Métricas en JSON |
/hix-monitor |
GET |
✅ | Dashboard HTML en vivo |
/hix-index |
GET |
✅ | Listado HTML de rutas registradas |
/hix-trace |
GET POST |
✅ | Estado/toggle de trazas por módulo |
/hix-cache-clear |
GET |
✅ | Borra cache de views compiladas |
/hix-stop |
GET |
✅ | Detiene HIX de forma ordenada |
/hix-bench-start |
GET |
✅ | Resetea métricas (bench) |
/hix-bench-stop |
GET |
✅ | Volcado JSON del bench |
/hix-routes/add |
POST |
✅ | Añade ruta dinámica |
/hix-routes/delete |
POST |
✅ | Elimina ruta por nombre |
/hix-routes/reload |
GET |
✅ | Recarga routes/*.json |
/hix-routes/list |
GET |
✅ | Listado HTML - solo rutas de app |
/hix-routes/listall |
GET |
✅ | Listado HTML - todas las rutas |
/hix-login |
GET POST |
- | Login del admin |
/hix-logout |
GET |
- | Cierra la sesión admin |
/hix-setup |
GET POST |
- | Configuración inicial de credenciales |
Auth = requiere
HIX_AdminCheck(oReq)antes de ejecutar el handler. Enenv=devla auth se desactiva automáticamente - todos los endpoints responden sin cookie. Enenv=prodse exige cookiehix_adminválida.
Endpoints públicos¶
GET /hix-ping¶
Health check ligero - pensado para balanceadores y monitorización externa.
Respuesta 200 OK (JSON):
GET /hix-slow¶
Igual que ping pero con hb_idleSleep(3). Útil para probar timeouts de
clientes, balanceadores o front proxy.
Respuesta 200 OK tras 3 segundos:
Métricas y monitor¶
GET /hix-status¶
Vuelca el estado del servidor (conexiones activas, requests totales,
errores, uso de pools, alerta de saturación, etc.) como JSON. Lo genera
HIX_MetricsJson().
Respuesta 200 OK (extracto):
{
"uptime_s": 12345,
"requests": { "total": 9876, "errors": 12 },
"pool_http": { "workers": 64, "queue": 5, "alert": false },
"pool_ws": { "workers": 100, "active": 42 },
"pool_rest": { "sse": 3, "longpoll": 1 }
}
Ver sistema/metricas para el detalle completo del schema.
GET /hix-monitor¶
Sirve html/monitor.html - dashboard HTML que consume /hix-status cada
[monitor] interval_s segundos y renderiza gráficos. Útil para inspección
visual.
GET /hix-index¶
Página HTML autocontenida con la lista de todas las rutas registradas (nombre, métodos, patrón, botón "Abrir"). Útil para descubrir qué tiene el servidor sin acceder al código.
Cada fila muestra:
- Name - nombre lógico (
hix.status,users.list, ...) - Methods - badges coloreados por método (
GET,POST, ...) - Pattern - URL pattern (
/users/:id) - Action - botón "Abrir" si la ruta acepta
GET
Trazas¶
GET /hix-trace¶
Sin parámetros: devuelve el estado actual de todas las trazas por módulo en JSON.
Con ?mod=<modulo>&on=<0|1>: activa o desactiva la traza para ese
módulo y devuelve el estado actualizado.
| Query | Efecto |
|---|---|
?mod=worker_http&on=1 |
Activa traza del módulo worker_http |
?mod=worker_http&on=0 |
Desactiva traza del módulo |
?mod=all&on=1 |
Activa todos los módulos |
?mod=all&on=0 |
Desactiva todos |
Módulos disponibles: app, server, worker_http, worker_ws,
worker_otros, pool, pool_detector, metrics, config, socket,
monitor, response, logger, error.
WARN/ERROR/FATALsiempre se loguean, independientemente del trace.
Cache¶
GET /hix-cache-clear¶
Borra recursivamente la cache de views compiladas en
.cached/views/ (ficheros .hrb y __*.prg). Útil tras un deploy donde
los .view.html cambian pero cache_disk = true mantiene los HRB
viejos.
Respuesta 200 OK:
No afecta a la cache RAM (
cache_ram); esa se invalida sola pormtime.
Bench¶
GET /hix-bench-start¶
Resetea todos los contadores del módulo de métricas (HIX_MetricsReset())
y deja el servidor listo para una nueva medición.
Respuesta 200 OK:
GET /hix-bench-stop¶
Cierra el bench y devuelve un volcado completo de HIX_MetricsJson().
Respuesta 200 OK:
Parada ordenada¶
GET /hix-stop¶
Marca el servidor para detener (HIX_ServerRequestStop()), cierra el
keep-alive del request actual y deja que los workers terminen sus tareas en
curso antes de salir.
Respuesta 200 OK:
Equivale a un
Ctrl+Ccontrolado por HTTP. El loop principal sale cuando la cola de cada pool se vacía.
API de gestión de rutas dinámicas¶
Permite añadir, eliminar y recargar rutas en caliente sin reiniciar
HIX. Las rutas creadas por esta API son volátiles (se pierden al
reiniciar) salvo que las persistas en routes/*.json antes.
Reservado: los nombres con prefijo
hix.*son del sistema y no se pueden registrar por esta API (responde400).
POST /hix-routes/add¶
Añade una ruta nueva. Body JSON:
{
"name": "users.list",
"url": "/users",
"action": "/controllers/users/list.prg",
"method": "GET",
"middleware": "HIX_MwJwt",
"scope": ""
}
| Campo | Tipo | Obligatorio | Notas |
|---|---|---|---|
name |
string | ✅ | No puede empezar por hix. |
url |
string | ✅ | URL pattern (admite :var). Alias: pattern |
action |
string | ✅ | Ruta del PRG/HRB/HTML a ejecutar |
method |
string | ❌ | Default * (todos). Coma-separado: GET,POST |
middleware |
string | ❌ | MW(s) separados por coma |
scope |
string | ❌ | Metadata libre (ej. admin) |
Respuesta 200 OK si se añadió:
Respuesta 409 Conflict si la ruta ya existe (no sobrescribe):
Respuesta 400 Bad Request si el JSON es inválido o el nombre está
reservado:
POST /hix-routes/delete¶
Elimina una ruta por nombre. Body JSON:
Respuesta 200 OK:
Respuesta 400 Bad Request si falta name:
GET /hix-routes/reload¶
Borra todas las rutas de aplicación (las que no son hix.*) y vuelve
a cargar las definidas en www/routes/*.json con HIX_LoadRoutes().
Respuesta 200 OK:
Útil en flujos de deploy: copias el nuevo routes/users.json al servidor
y disparas /hix-routes/reload desde tu pipeline.
GET /hix-routes/list¶
Página HTML con las rutas de aplicación (excluye las del sistema
hix.*). Columnas: name, methods, pattern, middleware, action.
GET /hix-routes/listall¶
Igual que /hix-routes/list pero incluye todas las rutas (sistema +
aplicación).
Autenticación¶
GET /hix-login¶
Página HTML con el formulario de login (usuario + contraseña). Autocontenida - no usa CDN ni assets externos.
Acepta ?next=<url> para redirigir tras un login exitoso (default:
/hix-status).
POST /hix-login¶
Procesa el login. Body form-urlencoded:
| Campo | Tipo | Notas |
|---|---|---|
user |
string | Usuario admin |
password |
string | Contraseña en claro (se MD5 en el servidor) |
next |
string | URL a la que redirigir tras login |
Si las credenciales son válidas:
- Emite cookie
hix_admin = <ts>:<sign>firmada conoCfg:cAdminSecret, válidasession.lifetimeminutos. - Redirige a
next(o/hix-statussi está vacío).
Si fallan: responde 401 Unauthorized con el formulario y un mensaje de
error.
GET /hix-logout¶
Elimina la cookie hix_admin (la expira inmediatamente) y redirige a
/hix-login.
GET /hix-setup¶
Página HTML con el formulario de creación inicial de credenciales.
Solo se muestra si oCfg:cAdminUser o oCfg:cAdminPassword están vacíos.
Si ya existen credenciales: redirige a /hix-login.
POST /hix-setup¶
Crea las credenciales por primera vez. Body form-urlencoded:
| Campo | Tipo | Validación |
|---|---|---|
user |
string | No vacío |
password |
string | Longitud mínima 6 |
password2 |
string | Debe coincidir con password |
Si validan:
- Guarda
oCfg:cAdminUser = user - Guarda
oCfg:cAdminPassword = MD5(password) - Genera y guarda
oCfg:cAdminSecret = MD5(timestamp + user + password) - Persiste todo en
hix.jsonconoCfg:Generate() - Redirige a
/hix-login
Si hay errores: responde 422 Unprocessable Entity con el formulario y
el mensaje de error correspondiente.
Cookie de sesión hix_admin¶
Formato del valor de la cookie:
Donde:
timestamp_unix= momento en segundos en que se emitió la cookiemd5_sign=MD5(secret + "|" + timestamp_unix)
Verificación en cada request:
- Tokenizar por
: - Recalcular
MD5(secret + "|" + ts)y comparar contrasign - Si
nMinutes > 0: comprobar quenow - ts <= session.lifetime * 60
Si cualquier paso falla → redirige a /hix-login?next=<path_actual>.
La firma usa
cAdminSecretque debe mantenerse enhix.json. Si lo rotas, todas las sesiones admin activas se invalidan.
Códigos HTTP¶
| Código | Cuándo |
|---|---|
200 OK |
Petición exitosa |
302 Found |
Redirect a /hix-login, /hix-setup o next= |
400 Bad Request |
JSON inválido o nombre de ruta reservado (hix.*) |
401 Unauthorized |
Login fallido |
409 Conflict |
/hix-routes/add con nombre ya existente |
422 Unprocessable |
/hix-setup con validación fallida (pass corto, etc.) |
Recetas comunes¶
Recargar rutas tras deploy¶
# 1. Subir el nuevo JSON
scp www/routes/users.json prod:/srv/hix/www/routes/
# 2. Recargar
curl --cookie-jar /tmp/c.txt --cookie /tmp/c.txt \
-d 'user=admin&password=secret' \
https://miapp.com/hix-login
curl --cookie /tmp/c.txt https://miapp.com/hix-routes/reload
Activar trace de WebSocket en caliente¶
Parar HIX desde un script de despliegue¶
curl --cookie /tmp/c.txt https://miapp.com/hix-stop
# El servidor responde {"status":"stopping"} y sale tras vaciar colas.
Health check público (sin auth)¶
Errores típicos¶
302redirigiendo a/hix-setupy nunca llego al panel -hix.jsontieneadmin.usery/opasswordvacíos. Visita/hix-setupdesde el navegador para crearlos.302redirigiendo a/hix-logincon cookie correcta - la cookie expiró (session.lifetimeagotados) ocAdminSecretcambió.409 duplicateen/hix-routes/add- la ruta ya existe. Bórrala antes con/hix-routes/deleteo cambia de nombre.400 reserved name- intentas registrarhix.algo. Renómbrala./hix-statusdevuelve HTML en vez de JSON -admin.enabled = falseo no estás autenticado enenv = "prod"(te redirige al login HTML).
Buenas prácticas¶
- En producción protege
/hix-*también a nivel de proxy (apache/nginx) con allow-list por IP para minimizar superficie. - No registres tus rutas con prefijo
hix.*- está reservado y HIX rechaza. - Las rutas creadas por
/hix-routes/addson volátiles: si quieres que sobrevivan al reinicio, persístelas enwww/routes/*.json. cAdminSecretes secreto: no lo subas a git. Para rotarlo, regenera con/hix-setup(tras borraruser/passworddehix.json).- Usa
/hix-cache-cleardespués de cualquier deploy que toque.view.htmlsi tienescache_disk = true. - Activa trazas (
/hix-trace?mod=X&on=1) solo el tiempo justo para diagnosticar - el coste de log puede ser alto en módulos calientes (worker_http,socket).
Recursos relacionados¶
- Configuración
hix.json - Panel admin (visión general)
- Métricas
- Logger
- Errores HTTP
- Trazas