#!/bin/bash # Port configuration PORT=8080 USE_HTTPS=false CERT_FILE="server.crt" KEY_FILE="server.key" # Create a self-signed certificate if it doesn't exist generate_certificate() { if [ ! -f "$CERT_FILE" ] || [ ! -f "$KEY_FILE" ]; then echo "Generating self-signed certificate..." openssl req -x509 -newkey rsa:2048 -keyout "$KEY_FILE" -out "$CERT_FILE" -days 365 -nodes \ -subj "/CN=localhost" fi } # Start server start_server() { echo "Starting server on port $PORT (HTTPS: $USE_HTTPS)..." while true; do if [ "$USE_HTTPS" = true ]; then # HTTPS handling using openssl openssl s_server -quiet -accept "$PORT" -cert "$CERT_FILE" -key "$KEY_FILE" 2>/dev/null | handle_request else # HTTP handling using nc nc -l -p "$PORT" -c handle_request fi done } # Request handler handle_request() { while read -r line; do # Log the request echo "$line" | grep -qE "^GET|^POST" && echo "Request: $line" # End of headers [ "$line" = $'\r' ] && break done # Respond with a simple HTML page cat < Simple HTTP Server

Welcome to Bash HTTP/HTTPS Server!

Current time: $(date)

EOF } # Parse arguments while getopts ":p:s" opt; do case $opt in p) PORT=$OPTARG ;; s) USE_HTTPS=true ;; *) echo "Usage: $0 [-p port] [-s (enable HTTPS)]" && exit 1 ;; esac done # Generate certificate if HTTPS is enabled [ "$USE_HTTPS" = true ] && generate_certificate # Run the server start_server