@@ -768,6 +768,45 @@ cdef class Loop:
768
768
sys_set_coroutine_wrapper(None )
769
769
self ._coroutine_wrapper_set = False
770
770
771
+ cdef _create_server(self , system.sockaddr * addr,
772
+ object protocol_factory,
773
+ Server server,
774
+ object ssl,
775
+ bint reuse_port,
776
+ object backlog):
777
+ cdef:
778
+ TCPServer tcp
779
+ int bind_flags
780
+
781
+ tcp = TCPServer.new(self , protocol_factory, server, ssl,
782
+ addr.sa_family)
783
+
784
+ if reuse_port:
785
+ self ._sock_set_reuseport(tcp._fileno())
786
+
787
+ if addr.sa_family== uv.AF_INET6:
788
+ # Disable IPv4/IPv6 dual stack support (enabled by
789
+ # default on Linux) which makes a single socket
790
+ # listen on both address families.
791
+ bind_flags = uv.UV_TCP_IPV6ONLY
792
+ else :
793
+ bind_flags = 0
794
+
795
+ try :
796
+ tcp.bind(addr, bind_flags)
797
+ tcp.listen(backlog)
798
+ except OSError as err:
799
+ pyaddr = __convert_sockaddr_to_pyaddr(addr)
800
+ tcp._close()
801
+ raise OSError (err.errno, ' error while attempting '
802
+ ' to bind on address %r : %s '
803
+ % (pyaddr, err.strerror.lower()))
804
+ except :
805
+ tcp._close()
806
+ raise
807
+
808
+ return tcp
809
+
771
810
IF DEBUG:
772
811
def print_debug_info (self ):
773
812
cdef:
@@ -1170,7 +1209,6 @@ cdef class Loop:
1170
1209
TCPServer tcp
1171
1210
system.addrinfo * addrinfo
1172
1211
Server server = Server(self )
1173
- int bind_flags
1174
1212
1175
1213
if ssl is not None and not isinstance (ssl, ssl_SSLContext):
1176
1214
raise TypeError (' ssl argument must be an SSLContext or None' )
@@ -1206,36 +1244,11 @@ cdef class Loop:
1206
1244
if addrinfo.ai_family == uv.AF_UNSPEC:
1207
1245
raise RuntimeError (' AF_UNSPEC in DNS results' )
1208
1246
1209
- tcp = TCPServer.new(
1210
- self , protocol_factory, server, ssl,
1211
- addrinfo.ai_family)
1212
-
1213
- if reuse_port:
1214
- self ._sock_set_reuseport(tcp._fileno())
1247
+ tcp = self ._create_server(
1248
+ addrinfo.ai_addr, protocol_factory, server,
1249
+ ssl, reuse_port, backlog)
1215
1250
1216
- if addrinfo.ai_family == uv.AF_INET6:
1217
- # Disable IPv4/IPv6 dual stack support (enabled by
1218
- # default on Linux) which makes a single socket
1219
- # listen on both address families.
1220
- bind_flags = uv.UV_TCP_IPV6ONLY
1221
- else :
1222
- bind_flags = 0
1223
-
1224
- try :
1225
- tcp.bind(addrinfo.ai_addr, bind_flags)
1226
- tcp.listen(backlog)
1227
- except OSError as err:
1228
- pyaddr = __convert_sockaddr_to_pyaddr(
1229
- < system.sockaddr* > addrinfo.ai_addr)
1230
- tcp._close()
1231
- raise OSError (err.errno, ' error while attempting '
1232
- ' to bind on address %r : %s '
1233
- % (pyaddr, err.strerror.lower()))
1234
- except :
1235
- tcp._close()
1236
- raise
1237
-
1238
- server._add_server(tcp)
1251
+ server._add_server(< TCPServer> tcp)
1239
1252
1240
1253
addrinfo = addrinfo.ai_next
1241
1254
0 commit comments