Changeset 242
- Timestamp:
- 06/05/05 03:44:08
- Files:
-
- trunk/cherrypy/_cphttpserver.py (modified) (2 diffs)
- trunk/cherrypy/_cpserver.py (modified) (1 diff)
- trunk/cherrypy/_cpwsgiserver.py (modified) (6 diffs)
- trunk/cherrypy/lib/autoreload.py (modified) (1 diff)
- trunk/cherrypy/test/helper.py (modified) (5 diffs)
- trunk/cherrypy/test/test.py (modified) (2 diffs)
- trunk/cherrypy/test/testCore.py (modified) (1 diff)
- trunk/cherrypy/tutorial/tutorial.conf (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
trunk/cherrypy/_cphttpserver.py
r237 r242 146 146 return 1 147 147 except (KeyboardInterrupt, SystemExit): 148 _cputil.getSpecialFunction('_cpLogMessage')("<Ctrl-C> hit: shutting down ", "HTTP")148 _cputil.getSpecialFunction('_cpLogMessage')("<Ctrl-C> hit: shutting down http server", "HTTP") 149 149 self.shutdown() 150 150 … … 250 250 for worker in self._workerThreads: 251 251 self._requestQueue.put(_SHUTDOWNREQUEST) 252 current = threading.currentThread() 252 253 for worker in self._workerThreads: 253 worker.join() 254 if worker is not current: 255 worker.join() 254 256 self._workerThreads = [] 255 257 stop = shutdown trunk/cherrypy/_cpserver.py
r236 r242 56 56 _start(initOnly, serverClass) 57 57 58 def start(initOnly=False, serverClass=None):58 def _start(initOnly=False, serverClass=None): 59 59 """ 60 60 Main function. All it does is this: trunk/cherrypy/_cpwsgiserver.py
r238 r242 36 36 import mimetools # todo: use email 37 37 import sys 38 import StringIO39 38 import time 40 39 import traceback … … 127 126 128 127 128 _SHUTDOWNREQUEST = None 129 129 130 class WorkerThread(threading.Thread): 130 131 … … 135 136 def run(self): 136 137 while self.server._running: 137 request = self.server.requests.get() #(block=False, timeout=1) 138 if request is None: 139 continue 138 request = self.server.requests.get() 139 if request == _SHUTDOWNREQUEST: 140 return 141 140 142 try: 141 143 try: … … 145 147 for line in response: 146 148 request.write(line) 147 except (KeyboardInterrupt, SystemExit):148 self.server.stop(callingThread=self)149 raise150 149 except: 151 self.server.handle_exception()150 traceback.print_exc() 152 151 finally: 153 152 request.terminate() … … 177 176 run the server forever 178 177 ''' 178 # We don't have to trap KeyboardInterrupt or SystemExit here, 179 # because _cpserver already does so, calling self.stop() for us. 179 180 self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM, socket.IPPROTO_TCP) 180 181 self.socket.bind(self.bind_addr) 182 self.socket.settimeout(1) 181 183 self.socket.listen(5) 182 184 … … 189 191 worker.start() 190 192 191 try: 192 while self._running: 193 self.tick() 194 except (KeyboardInterrupt, SystemExit): 195 self.stop() 196 raise 197 198 def stop(self, callingThread=None): 193 while self._running: 194 self.tick() 195 196 def stop(self): 199 197 """Gracefully shutdown a server that is serving forever.""" 200 198 self._running = False 201 202 # insert a bunch of None requests that signal 203 # the threads to shut down 204 for i in range(0, len(self._workerThreads)): 205 self.requests.put(None) 199 206 200 # Must shut down threads here so the code that calls 207 201 # this method can know when all threads are stopped. 208 202 for worker in self._workerThreads: 209 if worker is not callingThread and worker is not threading.currentThread(): 203 self.requests.put(_SHUTDOWNREQUEST) 204 205 current = threading.currentThread() 206 for worker in self._workerThreads: 207 if worker is not current: 210 208 worker.join() 211 209 self._workerThreads = [] 212 210 213 211 def tick(self): 214 s, addr = self.socket.accept() 215 request = HTTPRequest(s, addr, self) 216 self.requests.put(request) 217 # optimized version follows 218 #self.requests.put(HTTPRequest(*self.socket.accept())) 219 220 def handle_exception(self): 221 traceback.print_exc() 222 212 try: 213 s, addr = self.socket.accept() 214 if hasattr(s, 'setblocking'): 215 s.setblocking(1) 216 request = HTTPRequest(s, addr, self) 217 self.requests.put(request) 218 # optimized version follows 219 #self.requests.put(HTTPRequest(*self.socket.accept())) 220 except socket.timeout: 221 # The only reason for the timeout in start() is so we can 222 # notice keyboard interrupts on Win32, which don't interrupt 223 # accept() by default 224 return trunk/cherrypy/lib/autoreload.py
r229 r242 53 53 sys.exit(restart_with_reloader()) 54 54 except KeyboardInterrupt: 55 _cputil.getSpecialFunction('_cpLogMessage')("<Ctrl-C> hit: shutting down ", "HTTP")55 _cputil.getSpecialFunction('_cpLogMessage')("<Ctrl-C> hit: shutting down autoreloader", "HTTP") trunk/cherrypy/test/helper.py
r237 r242 47 47 for trial in xrange(10): 48 48 try: 49 conn = httplib.HTTPConnection('127.0.0.1: 8000')49 conn = httplib.HTTPConnection('127.0.0.1:%s' % PORT) 50 50 conn.putrequest("GET", url) 51 51 ## conn.putheader("Host", "127.0.0.1") … … 81 81 return cpg, cookies 82 82 83 def shutdownServer( pid,mode):84 urllib.urlopen("http://127.0.0.1: 8000/shutdown/all")83 def shutdownServer(mode): 84 urllib.urlopen("http://127.0.0.1:%s/shutdown/all" % PORT) 85 85 if mode.startswith('tp'): 86 86 # In thread-pool mode, it can take up to 1 sec for the server … … 141 141 f.close() 142 142 143 PORT = 8000 144 def port_is_free(): 145 try: 146 s=socket.socket(socket.AF_INET, socket.SOCK_STREAM) 147 s.connect(('127.0.0.1', PORT)) 148 s.close() 149 return False 150 except socket.error: 151 return True 152 143 153 def checkPageResult(testName, infoMap, code, testList, failedList, extraConfig = '', extraRequestHeader = []): 144 154 response = None 155 156 if not port_is_free(): 157 print "\n### Error: port", PORT, "is busy. The previous server did not shut down properly." 158 sys.exit(-1) 145 159 146 160 # Try it in all 4 modes (regular, threadPooling x normal, WSGI) … … 158 172 [/] 159 173 session.storageType = "ram" 160 server.socketPort = 8000174 server.socketPort = %s 161 175 server.environment = "production" 162 176 server.logToScreen = False 163 ''' )177 ''' % PORT) 164 178 f.write(modeConfig + "\n") 165 179 f.close() 166 180 167 181 pid = startServer(infoMap) 168 182 passed=True … … 176 190 print "*** FAILED ***" 177 191 break 192 shutdownServer(mode) 178 193 if passed: 179 194 sys.stdout.write("ok ") 180 195 sys.stdout.flush() 181 shutdownServer(pid, mode)182 196 if not passed: 183 197 break trunk/cherrypy/test/test.py
r229 r242 32 32 sys.path.insert(0,os.path.normpath(os.path.join(os.getcwd(),'../../'))) 33 33 if not os.path.exists(os.path.join(os.curdir,'buildInfoMap.py')): 34 print "Run the test f orm the test directory (cherrypy/test)from the cherrypy you wish to test."35 print "I nno python executables are found, change this file (test.py) near line 31"34 print "Run the test from the test directory (cherrypy/test) from the cherrypy you wish to test." 35 print "If no python executables are found, change this file (test.py) near line 31" 36 36 sys.exit(1) 37 37 if len(sys.argv) == 2 and sys.argv[1] in ('-h', '--help'): … … 51 51 python2[3]['path']="python2.3" 52 52 python2[4]['path']="python2.4" 53 54 print "Checking that port 8000 is free...",55 try:56 import socket57 s=socket.socket(socket.AF_INET, socket.SOCK_STREAM)58 s.connect(('127.0.0.1', 8000))59 s.close()60 print "\n### Error: port 8000 is busy. This port must be free to run this test script"61 sys.exit(-1)62 except socket.error:63 print "OK"64 53 65 54 print trunk/cherrypy/test/testCore.py
r230 r242 122 122 '/': { 123 123 'server.socketPort': 8000, 124 'server.environment': 'production', 124 125 } 125 126 }) trunk/cherrypy/tutorial/tutorial.conf
r229 r242 2 2 server.socketPort = 8080 3 3 server.threadPool = 10 4 server.environment = "production" 4 5 session.storageType= "ram"

