#!/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 <<EOF
HTTP/1.1 200 OK
Content-Type: text/html; charset=UTF-8
Connection: close
<!DOCTYPE html>
<html>
<head><title>Simple HTTP Server</title></head>
<body>
<h1>Welcome to Bash HTTP/HTTPS Server!</h1>
<p>Current time: $(date)</p>
</body>
</html>
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