1
1
import sys
2
2
import types
3
- from _typeshed import Self
3
+ from _socket import _Address , _RetAddress
4
+ from _typeshed import ReadableBuffer , Self
4
5
from collections .abc import Callable
5
6
from socket import socket as _socket
6
7
from typing import Any , BinaryIO , ClassVar , Union
@@ -29,38 +30,39 @@ if sys.platform != "win32":
29
30
]
30
31
31
32
_RequestType : TypeAlias = Union [_socket , tuple [bytes , _socket ]]
32
- _AddressType : TypeAlias = Union [tuple [str , int ], str ]
33
+ _AfUnixAddress : TypeAlias = str | ReadableBuffer # adddress acceptable for an AF_UNIX socket
34
+ _AfInetAddress : TypeAlias = tuple [str | bytes | bytearray , int ] # address acceptable for an AF_INET socket
33
35
34
36
# This can possibly be generic at some point:
35
37
class BaseServer :
36
38
address_family : int
37
- server_address : tuple [ str , int ]
39
+ server_address : _Address
38
40
socket : _socket
39
41
allow_reuse_address : bool
40
42
request_queue_size : int
41
43
socket_type : int
42
44
timeout : float | None
43
45
def __init__ (
44
- self : Self , server_address : Any , RequestHandlerClass : Callable [[Any , Any , Self ], BaseRequestHandler ]
46
+ self : Self , server_address : _Address , RequestHandlerClass : Callable [[Any , _RetAddress , Self ], BaseRequestHandler ]
45
47
) -> None : ...
46
48
# It is not actually a `@property`, but we need a `Self` type:
47
49
@property
48
- def RequestHandlerClass (self : Self ) -> Callable [[Any , Any , Self ], BaseRequestHandler ]: ...
50
+ def RequestHandlerClass (self : Self ) -> Callable [[Any , _RetAddress , Self ], BaseRequestHandler ]: ...
49
51
@RequestHandlerClass .setter
50
- def RequestHandlerClass (self : Self , val : Callable [[Any , Any , Self ], BaseRequestHandler ]) -> None : ...
52
+ def RequestHandlerClass (self : Self , val : Callable [[Any , _RetAddress , Self ], BaseRequestHandler ]) -> None : ...
51
53
def fileno (self ) -> int : ...
52
54
def handle_request (self ) -> None : ...
53
55
def serve_forever (self , poll_interval : float = ...) -> None : ...
54
56
def shutdown (self ) -> None : ...
55
57
def server_close (self ) -> None : ...
56
- def finish_request (self , request : _RequestType , client_address : _AddressType ) -> None : ...
58
+ def finish_request (self , request : _RequestType , client_address : _RetAddress ) -> None : ...
57
59
def get_request (self ) -> tuple [Any , Any ]: ...
58
- def handle_error (self , request : _RequestType , client_address : _AddressType ) -> None : ...
60
+ def handle_error (self , request : _RequestType , client_address : _RetAddress ) -> None : ...
59
61
def handle_timeout (self ) -> None : ...
60
- def process_request (self , request : _RequestType , client_address : _AddressType ) -> None : ...
62
+ def process_request (self , request : _RequestType , client_address : _RetAddress ) -> None : ...
61
63
def server_activate (self ) -> None : ...
62
64
def server_bind (self ) -> None : ...
63
- def verify_request (self , request : _RequestType , client_address : _AddressType ) -> bool : ...
65
+ def verify_request (self , request : _RequestType , client_address : _RetAddress ) -> bool : ...
64
66
def __enter__ (self : Self ) -> Self : ...
65
67
def __exit__ (
66
68
self , exc_type : type [BaseException ] | None , exc_val : BaseException | None , exc_tb : types .TracebackType | None
@@ -72,32 +74,35 @@ class BaseServer:
72
74
class TCPServer (BaseServer ):
73
75
if sys .version_info >= (3 , 11 ):
74
76
allow_reuse_port : bool
77
+ server_address : _AfInetAddress # type: ignore[assignment]
75
78
def __init__ (
76
79
self : Self ,
77
- server_address : tuple [ str , int ] ,
78
- RequestHandlerClass : Callable [[Any , Any , Self ], BaseRequestHandler ],
80
+ server_address : _AfInetAddress ,
81
+ RequestHandlerClass : Callable [[Any , _RetAddress , Self ], BaseRequestHandler ],
79
82
bind_and_activate : bool = ...,
80
83
) -> None : ...
81
- def get_request (self ) -> tuple [_socket , Any ]: ...
84
+ def get_request (self ) -> tuple [_socket , _RetAddress ]: ...
82
85
83
86
class UDPServer (TCPServer ):
84
87
max_packet_size : ClassVar [int ]
85
- def get_request (self ) -> tuple [tuple [bytes , _socket ], Any ]: ... # type: ignore[override]
88
+ def get_request (self ) -> tuple [tuple [bytes , _socket ], _RetAddress ]: ... # type: ignore[override]
86
89
87
90
if sys .platform != "win32" :
88
91
class UnixStreamServer (BaseServer ):
92
+ server_address : _AfUnixAddress # type: ignore[assignment]
89
93
def __init__ (
90
94
self : Self ,
91
- server_address : str | bytes ,
92
- RequestHandlerClass : Callable [[Any , Any , Self ], BaseRequestHandler ],
95
+ server_address : _AfUnixAddress ,
96
+ RequestHandlerClass : Callable [[Any , _RetAddress , Self ], BaseRequestHandler ],
93
97
bind_and_activate : bool = ...,
94
98
) -> None : ...
95
99
96
100
class UnixDatagramServer (BaseServer ):
101
+ server_address : _AfUnixAddress # type: ignore[assignment]
97
102
def __init__ (
98
103
self : Self ,
99
- server_address : str | bytes ,
100
- RequestHandlerClass : Callable [[Any , Any , Self ], BaseRequestHandler ],
104
+ server_address : _AfUnixAddress ,
105
+ RequestHandlerClass : Callable [[Any , _RetAddress , Self ], BaseRequestHandler ],
101
106
bind_and_activate : bool = ...,
102
107
) -> None : ...
103
108
@@ -110,14 +115,14 @@ if sys.platform != "win32":
110
115
def collect_children (self , * , blocking : bool = ...) -> None : ... # undocumented
111
116
def handle_timeout (self ) -> None : ... # undocumented
112
117
def service_actions (self ) -> None : ... # undocumented
113
- def process_request (self , request : _RequestType , client_address : _AddressType ) -> None : ...
118
+ def process_request (self , request : _RequestType , client_address : _RetAddress ) -> None : ...
114
119
def server_close (self ) -> None : ...
115
120
116
121
class ThreadingMixIn :
117
122
daemon_threads : bool
118
123
block_on_close : bool
119
- def process_request_thread (self , request : _RequestType , client_address : _AddressType ) -> None : ... # undocumented
120
- def process_request (self , request : _RequestType , client_address : _AddressType ) -> None : ...
124
+ def process_request_thread (self , request : _RequestType , client_address : _RetAddress ) -> None : ... # undocumented
125
+ def process_request (self , request : _RequestType , client_address : _RetAddress ) -> None : ...
121
126
def server_close (self ) -> None : ...
122
127
123
128
if sys .platform != "win32" :
@@ -132,16 +137,16 @@ if sys.platform != "win32":
132
137
class ThreadingUnixDatagramServer (ThreadingMixIn , UnixDatagramServer ): ...
133
138
134
139
class BaseRequestHandler :
135
- # Those are technically of types, respectively:
136
- # * _RequestType
137
- # * _AddressType
138
- # But there are some concerns that having unions here would cause
140
+ # `request` is technically of type _RequestType,
141
+ # but there are some concerns that having a union here would cause
139
142
# too much inconvenience to people using it (see
140
143
# https://github.com/python/typeshed/pull/384#issuecomment-234649696)
144
+ #
145
+ # Note also that _RetAddress is also just an alias for `Any`
141
146
request : Any
142
- client_address : Any
147
+ client_address : _RetAddress
143
148
server : BaseServer
144
- def __init__ (self , request : _RequestType , client_address : _AddressType , server : BaseServer ) -> None : ...
149
+ def __init__ (self , request : _RequestType , client_address : _RetAddress , server : BaseServer ) -> None : ...
145
150
def setup (self ) -> None : ...
146
151
def handle (self ) -> None : ...
147
152
def finish (self ) -> None : ...
0 commit comments