- Servidor web estático minimalista escrito en COBOL, que demuestra que es posible hacer programación de sistemas moderna usando GnuCOBOL
- Ofrece funciones como servir archivos estáticos del directorio actual, detección automática de tipos MIME, manejo de códigos de estado HTTP (200/403/404/413), bloqueo de ataques de path traversal y registro de solicitudes
- Es de un solo hilo, por lo que solo puede procesar una solicitud a la vez, y admite archivos de hasta 64KB
- Funciona en entornos compatibles con POSIX (Linux/macOS/BSD) con GnuCOBOL instalado, y puede compilarse con
make y ejecutarse en el puerto 8080 con el comando ./webserver
- Como ejemplo de programa de red escrito en COBOL, es un proyecto que demuestra que también se puede implementar un servidor web moderno con un lenguaje legado
Descripción general del proyecto
- Webbol es un servidor web estático minimalista desarrollado con el lenguaje COBOL y el compilador GnuCOBOL
- Su objetivo es servir archivos estáticos simples y demostrar la utilidad moderna de COBOL
Funciones principales
- Serving de archivos estáticos del directorio actual
- Detección automática de tipos MIME para formatos de archivo comunes
- Soporte para códigos de estado HTTP 200 (OK), 403 (Forbidden), 404 (Not Found), 413 (Payload Too Large)
- Prevención de ataques de path traversal (
../, etc.)
- Registro limpio de solicitudes que incluye todos los headers HTTP
- Entrega predeterminada de index.html cuando se solicita la ruta raíz
Requisitos del sistema
- Se requiere el compilador GnuCOBOL (cobc)
- Se requiere un sistema operativo compatible con POSIX (Linux, macOS, BSD)
- Se requiere la herramienta
make
Ejemplos de funcionamiento y acceso
Estructura y composición de archivos
- Makefile: configuración de compilación
- README.md: archivo de guía y explicación
- config.cpy, socket-defs.cpy, http-structs.cpy, file-structs.cpy: definiciones de estructuras para servidor, sockets, HTTP y manejo de archivos
- path-utils.cbl: validación y limpieza de rutas
- mime-types.cbl: lógica para determinar tipos MIME
- file-ops.cbl: operaciones de lectura de archivos
- http-handler.cbl: manejo de solicitudes y respuestas HTTP
- webserver.cbl: programa principal del servidor
Tipos MIME compatibles
- HTML: text/html
- CSS: text/css
- JavaScript: application/javascript
- JSON, XML, texto plano, PNG, JPEG, GIF, SVG, ICO, PDF, etc.
- Es posible agregar tipos MIME adicionales en el archivo mime-types.cbl
Funciones de seguridad
- Prevención de path traversal: bloquea solicitudes que contienen la secuencia
..
- Restricción de acceso a directorios: solo sirve archivos del directorio actual y sus subdirectorios
- Manejo seguro de archivos: validación y verificación de rutas antes de acceder al sistema de archivos
Limitaciones
- Basado en un solo hilo: solo puede procesar una solicitud a la vez
- Sin soporte para SSL/TLS (HTTPS)
- Tamaño máximo de archivo: 64KB
- Solo admite archivos secuenciales por línea (archivos de texto)
- Sin soporte para caché, compresión ni solicitudes por rango
2 comentarios
Hasta los comentarios tienen una forma bien curiosa, jaja.
Comentarios en Hacker News
Qué gusto ver que todavía se usa el modo de formato fijo de COBOL
COBOL tiene dos modos: formato libre (
free mode) y formato fijo (fixed format mode)El formato fijo sigue la herencia de la era de las tarjetas perforadas y se divide según columnas específicas
Columnas 1~6: número de línea
Columna 7: carácter indicador (por ejemplo,
*para comentario; se puede ver en el código de ejemplo)Columnas 8~11: marcadores especiales de division, a veces ocupan más que eso (archivo de ejemplo)
Columnas 12~72: instrucciones COBOL reales
Columnas 73~80: uso libre para comentarios del programador, etc.
Como esta estructura hoy en día supone una carga para desarrolladores y herramientas, se recomienda el modo de formato libre
Aun así, el modo de formato fijo tiene su encanto propio, así que si vas a usar COBOL en 2025, recomendaría disfrutar de verdad esa vibra retro
Las columnas 73~80 también se usaban para marcar números de secuencia y así poder reordenarlas con una máquina clasificadora si las tarjetas se caían al suelo
Si quieres sentir cómo eran las tarjetas COBOL, puedes elegir tarjetas COBOL en este enlace
Si quieres una sensación todavía más antigua, primero puedes escribir el programa en una hoja de codificación y luego hacer que un asistente lo pase a keypunch (ejemplo)
El Fortran antiguo también usaba una estructura de columnas fijas, aunque con una distribución distinta
Lo que tenían en común era dejar libres las columnas 73~80 para números de secuencia y ordenamiento de tarjetas
Yo nunca usé tarjetas reales, pero como debía de ser fácil dejarlas caer o desordenarlas, imagino que la numeración y la máquina clasificadora eran increíblemente útiles
Esa parte también me impresionó
Pero me pareció curioso que en el Makefile usaran la opción
-freedecobcLa gente dice “usa la mejor herramienta para el trabajo”, pero luego no elige COBOL para los COmmon Business Oriented probLems
Eso aplica igual para MUMPS
La gente pasa por alto que puede tomar decisiones grandiosas
Más que no elegir COBOL, lo que pasa es que ni siquiera lo consideran
Me pregunto cuándo y por qué se usa la frase “la mejor herramienta para el trabajo”
Nuestra empresa tiene más de 40 o 50 años
Incluso ahora, el 90% de la operación del negocio sigue basado en COBOL
El personal operativo todavía trabaja en pantallas azules hechas con RM/COBOL y RM/PANELS
Hasta la década de 2010 también generábamos HTML con COBOL, aunque no recibíamos solicitudes HTTP directamente
En su lugar, teníamos una capa RPC detrás de Apache que convertía las solicitudes HTTP en CGI y se las pasaba a COBOL
El programa COBOL enviaba cadenas HTML por la interfaz CGIRPC, y el resultado aparecía en el navegador como una página web
Seguimos usándolo así con servicios XML y similares para complementar las webapps existentes
Sinceramente, este proyecto es una experiencia mucho más genial que eso
Me parece interesante ver que casi todas las líneas del código tienen comentarios
Hace replantearse la premisa detrás de la frase “el código debe documentarse solo”
Eso parte de la base de que quien lee el código conoce el lenguaje y de que, según el caso, sea posible que sea “autodocumentado”
Quizá quienes están acostumbrados a COBOL dirían que COBOL también puede ser suficientemente autodocumentado, pero yo no lo tengo tan claro
En el commit
d9a5e3ese puede ver que “se agregaron comentarios para que la gente curiosa entienda qué hace cada línea”Creo que la idea de que “el código lo lee alguien que conoce el lenguaje” depende del contexto
Si escribes código mientras aprendes, ya sea para ti o para otros, me parece natural comentar qué hace cada línea
En cambio, en un entorno profesional, asumir que el equipo conoce bien el lenguaje y gestionarlo de forma estructurada, por lo general sin tantos comentarios, puede ser una mejor opción
En bancos he visto gente decir que el código COBOL ya de por sí parece lenguaje natural y que por eso es autodocumentado; casi me daba risa escucharlo
Suena a broma, pero de verdad me surgió la duda y quise preguntar
Me pregunto si alguien conoce bien las garantías relacionadas con seguridad en COBOL
Por ejemplo, quisiera saber si COBOL permite accesos fuera de rango en memoria y qué tanto riesgo hay de que aparezcan agujeros de seguridad “por accidente”, como en C o Rust
En COBOL, un acceso fuera de rango en memoria normalmente hace que un compilador moderno marque error y, si llega a compilarse o ejecutarse, termine en error de runtime o en un crash inmediato
Aun así, existe la posibilidad de referenciar memoria fuera de los límites de los datos de forma intencional mediante la función de
reference modificationde COBOLNo es totalmente seguro, pero como en compilación se detectan muchos errores o malos usos, la tasa de fallos accidentales sí baja bastante
Al ver el
http handler, yo también me pregunté lo mismoParecía que si faltaba el espacio entre el método y la ruta podía haber un posible buffer overrun
No lo probé directamente, pero fue una de esas preocupaciones que me surgieron
Me dan ganas de entender mejor qué hace
CALL "socket"CALLes una llamada a subprograma, pero no veo dónde está definido"socket"Hace tiempo también pensé en intentar hacer un servidor web en COBOL, pero en el FAQ de GnuCOBOL solo vi que era posible con CGI y no avancé más (ver FAQ)
Quiero mirar este proyecto más a fondo
De verdad se siente muy interesante
"socket"podría ser una llamada al sistemaHubo una época en que COBOL se usaba como backend de sitios web de algunas agencias gubernamentales y empresas
Los sitios de esa época se reconocían fácilmente por esa forma tan particular de generar HTML en un formato de ancho fijo de 100 columnas
Yo pensaba que podía programar en cualquier lenguaje, pero viendo este proyecto en COBOL hasta Assembly me parece más limpio y elegante
¡Jms Dnns! Este proyecto de verdad expande la manera de pensar
Habiendo trabajado con pilas de código fuente de varias decenas de centímetros en ambos lenguajes, COBOL me resultaba mucho más fácil de ordenar en la cabeza
Supongo que depende de cada quien
Es un proyecto realmente genial
Si tienen consejos para empezar con COBOL, me gustaría escucharlos
Ahora estamos un paso más cerca de la visión de COBOL on Cogs
Puedes ver más en coboloncogs.org