from flask import Flask, request, jsonify import logging app = Flask(__name__) # Configure logging to print to stdout (visible in docker logs) logging.basicConfig( level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s' ) logger = logging.getLogger(__name__) @app.route('/') def index(): """Main route that logs headers and returns HTML.""" x_forwarded_for = request.headers.get('X-Forwarded-For', 'Not set') x_real_ip = request.headers.get('X-Real-IP', 'Not set') # Log to console logger.info(f"--- Request to / ---") logger.info(f"X-Forwarded-For: {x_forwarded_for}") logger.info(f"X-Real-IP: {x_real_ip}") return f""" Header Test

Headers Received

X-Forwarded-For: {x_forwarded_for}

X-Real-IP: {x_real_ip}

/testheaders - JSON output

/allheaders - All headers

Check docker logs for detailed output.

""" @app.route('/testheaders') def testheaders(): """ Dedicated route for testing header propagation. Returns all headers as JSON for easy programmatic verification. """ # Capture all headers all_headers = dict(request.headers) # Specifically extract the ones we care about x_forwarded_for = request.headers.get('X-Forwarded-For', 'MISSING') x_real_ip = request.headers.get('X-Real-IP', 'MISSING') # Log the specific values logger.info(f"--- Request to /testheaders ---") logger.info(f"X-Forwarded-For: {x_forwarded_for}") logger.info(f"X-Real-IP: {x_real_ip}") # Return JSON response return jsonify({ "status": "success", "headers_received": { "X-Forwarded-For": x_forwarded_for, "X-Real-IP": x_real_ip, "Host": request.headers.get('Host'), "User-Agent": request.headers.get('User-Agent') }, "all_headers": all_headers }), 200 @app.route('/allheaders') def allheaders(): """ Route that displays ALL headers received. Useful for debugging what Nginx is actually forwarding. """ # Get all headers as a dictionary all_headers = dict(request.headers) # Log each header for debugging logger.info("--- Request to /allheaders ---") for key, value in all_headers.items(): logger.info(f"{key}: {value}") # Create HTML table for readability header_rows = ''.join([ f'{key}{value}' for key, value in sorted(all_headers.items()) ]) return f""" All Headers

All Headers Received

Total Headers: {len(all_headers)}

{header_rows}
Header NameValue

← Back to Home

Check docker logs for timestamped output.

""" if __name__ == '__main__': app.run(host='0.0.0.0', port=8080)