Webbol A minimal static web server written in COBOL using GnuCOBOL. Features Serves static files from the current directory Automatic MIME type detection for common file types HTTP status codes: 200 (OK), 403 (Forbidden), 404 (Not Found) Path traversal attack prevention Clean request logging with full HTTP headers Defaults to index.html for root path requests Requirements GnuCOBOL (cobc) compiler POSIX-compatible operating system (Linux, macOS, BSD) make Installing GnuCOBOL macOS: brew install gnucobol Ubuntu/Debian: sudo apt-get install gnucobol Fedora/RHEL: sudo dnf install gnucobol Building Clone or download the repository, then compile: make This will compile all modules and create the webserver executable. To clean build artifacts: make clean Usage Start the server from the directory you want to serve: ./webserver The server will start on port 8080 and serve files from the current directory. Example # Create a test HTML file echo "

Hello from COBOL!

" > index.html # Start the server ./webserver # In another terminal, test it curl http://localhost:8080/ Accessing the Server Once running, you can access files via: http://localhost:8080/ - serves index.html from the current directory - serves from the current directory http://localhost:8080/filename.html - serves the specified file - serves the specified file http://localhost:8080/path/to/file.txt - serves files from subdirectories Press Ctrl+C to stop the server. Configuration To change the server port, edit config.cpy and modify the SERVER-PORT value: 01 SERVER-PORT PIC 9 ( 5 ) VALUE 8080 . Then recompile with make . Project Structure webbol/ ├── Makefile # Build configuration ├── README.md # This file ├── config.cpy # Server configuration ├── socket-defs.cpy # Socket structure definitions ├── http-structs.cpy # HTTP data structures ├── file-structs.cpy # File handling structures ├── path-utils.cbl # Path validation and sanitization ├── mime-types.cbl # MIME type detection ├── file-ops.cbl # File reading operations ├── http-handler.cbl # HTTP request/response handling └── webserver.cbl # Main server program Supported MIME Types HTML: text/html CSS: text/css JavaScript: application/javascript JSON: application/json XML: application/xml Plain text: text/plain PNG: image/png JPEG: image/jpeg GIF: image/gif SVG: image/svg+xml ICO: image/x-icon PDF: application/pdf Additional MIME types can be added by editing mime-types.cbl . Security Features Path traversal prevention: Blocks requests containing .. sequences sequences Directory access restriction: Only serves files from the current directory and subdirectories Safe file handling: Validates all paths before file system access Limitations Single-threaded: Handles one request at a time No SSL/TLS support Maximum file size: 64KB Line sequential file organization only (text files) No caching or compression No range requests or partial content support Troubleshooting Port already in use: Bind failed - check if port is in use Another process is using port 8080. Either stop that process or change the port in config.cpy . Permission denied: Ensure the files you're trying to serve have read permissions and the current user can access them. File not found (404): Verify the file exists in the current directory where the server is running. File paths are case-sensitive. License This project is released into the public domain. Use it however you'd like. Acknowledgments Built with GnuCOBOL, demonstrating that COBOL can still be used for modern systems programming tasks.