|
27 | 27 | from http.server import BaseHTTPRequestHandler, HTTPServer
|
28 | 28 | from io import TextIOBase
|
29 | 29 | import re
|
| 30 | +import socket |
| 31 | +import socketserver |
30 | 32 | from textwrap import dedent
|
31 | 33 | from typing import Literal, Optional
|
32 | 34 | from typing_extensions import override
|
@@ -343,6 +345,26 @@ def handle_error(self, request, client_address):
|
343 | 345 | # Print to stderr a message starting with
|
344 | 346 | # 'Exception occurred during processing of request from'
|
345 | 347 | return super().handle_error(request, client_address)
|
| 348 | + |
| 349 | + @override |
| 350 | + def server_bind(self): |
| 351 | + """ |
| 352 | + Overrides server_bind to assume the server name is "localhost" |
| 353 | + when bound to 127.0.0.1. |
| 354 | + |
| 355 | + The default implementation of HTTPServer.server_bind() uses |
| 356 | + `socket.getfqdn(host)` to determine the server name, which shows an |
| 357 | + unwanted 'Allow "Crystal" to find devices on local networks?' |
| 358 | + security prompt on macOS. |
| 359 | + """ |
| 360 | + socketserver.TCPServer.server_bind(self) |
| 361 | + host, port = self.server_address[:2] |
| 362 | + if host == '127.0.0.1': |
| 363 | + # Avoid mDNS lookup on macOS |
| 364 | + self.server_name = 'localhost' |
| 365 | + else: |
| 366 | + self.server_name = socket.getfqdn(host) |
| 367 | + self.server_port = port |
346 | 368 |
|
347 | 369 |
|
348 | 370 | class _RequestHandler(BaseHTTPRequestHandler):
|
|
0 commit comments