Download Install Tutorial Docs FAQ Tools WikiLicense Team IRC Planet Involvement Shop Book

Changeset 242

Show
Ignore:
Timestamp:
06/05/05 03:44:08
Author:
fumanchu
Message:

1. Still fixing tests. All now pass except testObjectMapping.
2. Fixed misnamed _start in _cpserver.py.
3. _cpwsgiserver.WorkerThread? now blocks on Queue.get().
4. _cpwsgiserver.socket now has timeout to allow shutdown on Win32.
5. Test suite now checks for a free port upon each test.

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/cherrypy/_cphttpserver.py

    r237 r242  
    146146            return 1 
    147147        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") 
    149149            self.shutdown() 
    150150     
     
    250250        for worker in self._workerThreads: 
    251251            self._requestQueue.put(_SHUTDOWNREQUEST) 
     252        current = threading.currentThread() 
    252253        for worker in self._workerThreads: 
    253             worker.join() 
     254            if worker is not current: 
     255                worker.join() 
    254256        self._workerThreads = [] 
    255257    stop = shutdown 
  • trunk/cherrypy/_cpserver.py

    r236 r242  
    5656    _start(initOnly, serverClass) 
    5757 
    58 def start(initOnly=False, serverClass=None): 
     58def _start(initOnly=False, serverClass=None): 
    5959    """ 
    6060        Main function. All it does is this: 
  • trunk/cherrypy/_cpwsgiserver.py

    r238 r242  
    3636import mimetools # todo: use email 
    3737import sys 
    38 import StringIO 
    3938import time 
    4039import traceback 
     
    127126 
    128127 
     128_SHUTDOWNREQUEST = None 
     129 
    129130class WorkerThread(threading.Thread): 
    130131     
     
    135136    def run(self): 
    136137        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             
    140142            try: 
    141143                try: 
     
    145147                    for line in response: 
    146148                        request.write(line) 
    147                 except (KeyboardInterrupt, SystemExit): 
    148                     self.server.stop(callingThread=self) 
    149                     raise 
    150149                except: 
    151                     self.server.handle_exception() 
     150                    traceback.print_exc() 
    152151            finally: 
    153152                request.terminate() 
     
    177176        run the server forever 
    178177        ''' 
     178        # We don't have to trap KeyboardInterrupt or SystemExit here, 
     179        # because _cpserver already does so, calling self.stop() for us. 
    179180        self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM, socket.IPPROTO_TCP) 
    180181        self.socket.bind(self.bind_addr) 
     182        self.socket.settimeout(1) 
    181183        self.socket.listen(5) 
    182184         
     
    189191            worker.start() 
    190192         
    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): 
    199197        """Gracefully shutdown a server that is serving forever.""" 
    200198        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         
    206200        # Must shut down threads here so the code that calls 
    207201        # this method can know when all threads are stopped. 
    208202        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: 
    210208                worker.join() 
    211209        self._workerThreads = [] 
    212210     
    213211    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  
    5353            sys.exit(restart_with_reloader()) 
    5454        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  
    4747    for trial in xrange(10): 
    4848        try: 
    49             conn = httplib.HTTPConnection('127.0.0.1:8000'
     49            conn = httplib.HTTPConnection('127.0.0.1:%s' % PORT
    5050            conn.putrequest("GET", url) 
    5151##            conn.putheader("Host", "127.0.0.1") 
     
    8181    return cpg, cookies 
    8282 
    83 def shutdownServer(pid, mode): 
    84     urllib.urlopen("http://127.0.0.1:8000/shutdown/all"
     83def shutdownServer(mode): 
     84    urllib.urlopen("http://127.0.0.1:%s/shutdown/all" % PORT
    8585    if mode.startswith('tp'): 
    8686        # In thread-pool mode, it can take up to 1 sec for the server 
     
    141141    f.close() 
    142142 
     143PORT = 8000 
     144def 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 
    143153def checkPageResult(testName, infoMap, code, testList, failedList, extraConfig = '', extraRequestHeader = []): 
    144154    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) 
    145159     
    146160    # Try it in all 4 modes (regular, threadPooling x normal, WSGI) 
     
    158172[/] 
    159173session.storageType = "ram" 
    160 server.socketPort = 8000 
     174server.socketPort = %s 
    161175server.environment = "production" 
    162176server.logToScreen = False 
    163 '''
     177''' % PORT
    164178            f.write(modeConfig + "\n") 
    165179            f.close() 
    166  
     180             
    167181            pid = startServer(infoMap) 
    168182            passed=True 
     
    176190                    print "*** FAILED ***" 
    177191                    break 
     192            shutdownServer(mode) 
    178193            if passed: 
    179194                sys.stdout.write("ok ") 
    180195                sys.stdout.flush() 
    181             shutdownServer(pid, mode) 
    182196            if not passed: 
    183197                break 
  • trunk/cherrypy/test/test.py

    r229 r242  
    3232sys.path.insert(0,os.path.normpath(os.path.join(os.getcwd(),'../../'))) 
    3333if not os.path.exists(os.path.join(os.curdir,'buildInfoMap.py')): 
    34     print "Run the test form the test directory (cherrypy/test)from the cherrypy you wish to test." 
    35     print "In no 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" 
    3636    sys.exit(1) 
    3737if len(sys.argv) == 2 and sys.argv[1] in ('-h', '--help'): 
     
    5151    python2[3]['path']="python2.3" 
    5252    python2[4]['path']="python2.4" 
    53  
    54 print "Checking that port 8000 is free...", 
    55 try: 
    56     import socket 
    57     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" 
    6453 
    6554print 
  • trunk/cherrypy/test/testCore.py

    r230 r242  
    122122    '/': { 
    123123        'server.socketPort': 8000, 
     124        'server.environment': 'production', 
    124125    } 
    125126}) 
  • trunk/cherrypy/tutorial/tutorial.conf

    r229 r242  
    22server.socketPort = 8080 
    33server.threadPool = 10 
     4server.environment = "production" 
    45session.storageType= "ram" 

Hosted by WebFaction

Log in as guest/cpguest to create tickets