#!/usr/bin/env python3 from http.server import HTTPServer, BaseHTTPRequestHandler import json from datetime import datetime from urllib.parse import urlparse, parse_qs class WebhookHandler(BaseHTTPRequestHandler): def log_message(self, format, *args): # Override to add timestamp timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S") print(f"[{timestamp}] {format % args}") def do_POST(self): self.handle_request() def do_GET(self): self.handle_request() def do_PUT(self): self.handle_request() def do_DELETE(self): self.handle_request() def handle_request(self): print("=" * 80) print(f"šŸ“§ WEBHOOK RECEIVED - {self.command} {self.path}") print("=" * 80) # Log basic info print(f"Method: {self.command}") print(f"Path: {self.path}") print(f"Remote IP: {self.client_address[0]}") # Log headers print("\nšŸ“‹ HEADERS:") for header, value in self.headers.items(): print(f" {header}: {value}") # Read and log body content_length = int(self.headers.get('Content-Length', 0)) if content_length > 0: body = self.rfile.read(content_length) print(f"\nšŸ“„ RAW BODY:") print(f" {body.decode('utf-8', errors='replace')}") # Try to parse JSON try: if self.headers.get('Content-Type', '').startswith('application/json'): json_data = json.loads(body) print(f"\nšŸŽÆ JSON PAYLOAD:") print(json.dumps(json_data, indent=2)) # Highlight specific fields if isinstance(json_data, dict): for key in ['email', 'event', 'subject', 'sender', 'timestamp']: if key in json_data: print(f" {key.upper()}: {json_data[key]}") except: pass print("=" * 80) print() # Send response self.send_response(200) self.send_header('Content-Type', 'application/json') self.end_headers() response = { "status": "received", "method": self.command, "path": self.path, "timestamp": datetime.now().isoformat() } self.wfile.write(json.dumps(response).encode()) if __name__ == '__main__': print("šŸš€ Starting Simple Webhook Echo Server...") print("šŸ“” Listening on http://localhost:8080") print("⚔ Press Ctrl+C to stop") print("=" * 80) server = HTTPServer(('0.0.0.0', 8080), WebhookHandler) try: server.serve_forever() except KeyboardInterrupt: print("\n\nšŸ‘‹ Shutting down server...") server.server_close()