Changeset 1116
- Timestamp:
- 06/01/06 18:58:48
- Files:
-
- trunk/cherrypy/_cpwsgiserver.py (modified) (7 diffs)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
trunk/cherrypy/_cpwsgiserver.py
r1113 r1116 5 5 import Queue 6 6 import mimetools # todo: use email 7 import os 7 8 import sys 8 9 import time … … 175 176 self.wfile.close() 176 177 self.socket.close() 178 self.socket = None 177 179 178 180 … … 225 227 RequestHandlerClass = HTTPRequest 226 228 229 # UNIX allows us to pass the socket file descriptor 230 # from one process to another via os.environ. 231 preserve_socket = hasattr(socket, "fromfd") 232 227 233 def __init__(self, bind_addr, wsgi_app, numthreads=10, server_name=None, 228 234 max=-1, request_queue_size=5, timeout=10): … … 258 264 # If you're using this server with another framework, you should 259 265 # trap those exceptions in whatever code block calls start(). 266 267 def bind(family, type, proto=0): 268 """Create (or recreate) the actual socket object.""" 269 if self.preserve_socket: 270 socketfd = int(os.environ.get('CPWSGI_SOCKET', -1)) 271 if socketfd >= 0: 272 self.socket = socket.fromfd(socketfd, family, type, proto) 273 return 274 275 self.socket = socket.socket(family, type, proto) 276 self.socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) 277 self.socket.bind(self.bind_addr) 260 278 261 279 # Select the appropriate socket … … 271 289 except: pass 272 290 273 self.socket = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) 274 self.socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) 275 self.socket.bind(self.bind_addr) 291 info = [(socket.AF_UNIX, socket.SOCK_STREAM, 0, "", self.bind_addr)] 276 292 else: 277 293 # AF_INET or AF_INET6 socket … … 283 299 except socket.gaierror: 284 300 # Probably a DNS issue. Assume IPv4. 285 self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 286 self.socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) 287 self.socket.bind(self.bind_addr) 288 else: 301 info = [(socket.AF_INET, socket.SOCK_STREAM, 0, "", self.bind_addr)] 302 303 self.socket = None 304 msg = "No socket could be created" 305 for res in info: 306 af, socktype, proto, canonname, sa = res 307 try: 308 bind(af, socktype, proto) 309 except socket.error, msg: 310 if self.socket: 311 self.socket.close() 289 312 self.socket = None 290 msg = "No socket could be created" 291 for res in info: 292 af, socktype, proto, canonname, sa = res 293 try: 294 self.socket = socket.socket(af, socktype, proto) 295 self.socket.setsockopt(socket.SOL_SOCKET, 296 socket.SO_REUSEADDR, 1) 297 self.socket.bind(self.bind_addr) 298 except socket.error, msg: 299 if self.socket: 300 self.socket.close() 301 self.socket = None 302 continue 303 break 304 if not self.socket: 305 raise socket.error, msg 313 continue 314 break 315 if not self.socket: 316 raise socket.error, msg 306 317 307 318 # Timeout so KeyboardInterrupt can be caught on Win32 … … 341 352 """Gracefully shutdown a server that is serving forever.""" 342 353 self.ready = False 354 343 355 s = getattr(self, "socket", None) 344 if s and hasattr(s, "close"): 345 s.close() 356 if s: 357 if self.preserve_socket: 358 os.environ['CPWSGI_SOCKET'] = str(s.fileno()) 359 else: 360 if hasattr(s, "close"): 361 s.close() 362 self.socket = None 346 363 347 364 # Must shut down threads here so the code that calls

