|
20 | 20 | from gunicorn.uwsgi.errors import UWSGIParseException |
21 | 21 |
|
22 | 22 |
|
| 23 | +def _normalize_sockaddr(sockaddr): |
| 24 | + """Normalize socket address to ASGI-compatible (host, port) tuple. |
| 25 | +
|
| 26 | + ASGI spec requires server/client to be (host, port) tuples. |
| 27 | + IPv6 sockets return 4-tuples (host, port, flowinfo, scope_id), |
| 28 | + so we extract just the first two elements. |
| 29 | + """ |
| 30 | + return tuple(sockaddr[:2]) if sockaddr else None |
| 31 | + |
| 32 | + |
23 | 33 | class ASGIResponseInfo: |
24 | 34 | """Simple container for ASGI response info for access logging.""" |
25 | 35 |
|
@@ -438,11 +448,8 @@ def _build_http_scope(self, request, sockname, peername): |
438 | 448 | for name, value in request.headers: |
439 | 449 | headers.append((name.lower().encode("latin-1"), value.encode("latin-1"))) |
440 | 450 |
|
441 | | - # ASGI spec requires server/client to be (host, port) tuples |
442 | | - # IPv6 sockname/peername can be 4-tuples (host, port, flowinfo, scope_id) |
443 | | - # so we extract just the first two elements |
444 | | - server = tuple(sockname[:2]) if sockname else None |
445 | | - client = tuple(peername[:2]) if peername else None |
| 451 | + server = _normalize_sockaddr(sockname) |
| 452 | + client = _normalize_sockaddr(peername) |
446 | 453 |
|
447 | 454 | scope = { |
448 | 455 | "type": "http", |
@@ -506,9 +513,8 @@ def _build_websocket_scope(self, request, sockname, peername): |
506 | 513 | subprotocols = [s.strip() for s in value.split(",")] |
507 | 514 | break |
508 | 515 |
|
509 | | - # ASGI spec requires server/client to be (host, port) tuples |
510 | | - server = tuple(sockname[:2]) if sockname else None |
511 | | - client = tuple(peername[:2]) if peername else None |
| 516 | + server = _normalize_sockaddr(sockname) |
| 517 | + client = _normalize_sockaddr(peername) |
512 | 518 |
|
513 | 519 | scope = { |
514 | 520 | "type": "websocket", |
@@ -889,9 +895,8 @@ def _build_http2_scope(self, request, sockname, peername): |
889 | 895 | value.encode("latin-1") |
890 | 896 | )) |
891 | 897 |
|
892 | | - # ASGI spec requires server/client to be (host, port) tuples |
893 | | - server = tuple(sockname[:2]) if sockname else None |
894 | | - client = tuple(peername[:2]) if peername else None |
| 898 | + server = _normalize_sockaddr(sockname) |
| 899 | + client = _normalize_sockaddr(peername) |
895 | 900 |
|
896 | 901 | scope = { |
897 | 902 | "type": "http", |
|
0 commit comments