Changeset 908
- Timestamp:
- 01/02/06 02:29:42
- Files:
-
- branches/multiapp/cherrypy/__init__.py (modified) (3 diffs)
- branches/multiapp/cherrypy/_cphttpserver.py (modified) (11 diffs)
- branches/multiapp/cherrypy/_cphttptools.py (modified) (7 diffs)
- branches/multiapp/cherrypy/_cpserver.py (modified) (7 diffs)
- branches/multiapp/cherrypy/_cputil.py (modified) (5 diffs)
- branches/multiapp/cherrypy/_cpwsgi.py (modified) (5 diffs)
- branches/multiapp/cherrypy/config.py (modified) (8 diffs)
- branches/multiapp/cherrypy/filters/__init__.py (modified) (2 diffs)
- branches/multiapp/cherrypy/filters/cachefilter.py (modified) (1 diff)
- branches/multiapp/cherrypy/lib/covercp.py (modified) (1 diff)
- branches/multiapp/cherrypy/lib/cptools.py (modified) (2 diffs)
- branches/multiapp/cherrypy/lib/httptools.py (modified) (2 diffs)
- branches/multiapp/cherrypy/lib/profiler.py (modified) (1 diff)
- branches/multiapp/cherrypy/test/__init__.py (modified) (1 diff)
- branches/multiapp/cherrypy/test/custom_filters.py (added)
- branches/multiapp/cherrypy/test/helper.py (modified) (7 diffs)
- branches/multiapp/cherrypy/test/test.py (modified) (3 diffs)
- branches/multiapp/cherrypy/test/test_baseurl_filter.py (modified) (2 diffs)
- branches/multiapp/cherrypy/test/test_cache_filter.py (modified) (1 diff)
- branches/multiapp/cherrypy/test/test_combinedfilters.py (modified) (1 diff)
- branches/multiapp/cherrypy/test/test_config.py (modified) (3 diffs)
- branches/multiapp/cherrypy/test/test_core.py (modified) (23 diffs)
- branches/multiapp/cherrypy/test/test_custom_filters.py (modified) (5 diffs)
- branches/multiapp/cherrypy/test/test_decodingencoding_filter.py (modified) (1 diff)
- branches/multiapp/cherrypy/test/test_gzip_filter.py (modified) (1 diff)
- branches/multiapp/cherrypy/test/test_logdebuginfo_filter.py (modified) (2 diffs)
- branches/multiapp/cherrypy/test/test_noserver.py (modified) (2 diffs)
- branches/multiapp/cherrypy/test/test_objectmapping.py (modified) (1 diff)
- branches/multiapp/cherrypy/test/test_response_headers_filter.py (modified) (2 diffs)
- branches/multiapp/cherrypy/test/test_session_filter.py (modified) (1 diff)
- branches/multiapp/cherrypy/test/test_sessionauthenticate_filter.py (modified) (2 diffs)
- branches/multiapp/cherrypy/test/test_states.py (modified) (3 diffs)
- branches/multiapp/cherrypy/test/test_static_filter.py (modified) (2 diffs)
- branches/multiapp/cherrypy/test/test_tutorials.py (modified) (3 diffs)
- branches/multiapp/cherrypy/test/test_virtualhost_filter.py (modified) (2 diffs)
- branches/multiapp/cherrypy/test/test_xmlrpc_filter.py (modified) (3 diffs)
- branches/multiapp/cherrypy/tutorial/bonus-sqlobject.py (modified) (1 diff)
- branches/multiapp/cherrypy/tutorial/tut01_helloworld.py (modified) (1 diff)
- branches/multiapp/cherrypy/tutorial/tut02_expose_methods.py (modified) (1 diff)
- branches/multiapp/cherrypy/tutorial/tut03_get_and_post.py (modified) (1 diff)
- branches/multiapp/cherrypy/tutorial/tut04_complex_site.py (modified) (1 diff)
- branches/multiapp/cherrypy/tutorial/tut05_derived_objects.py (modified) (1 diff)
- branches/multiapp/cherrypy/tutorial/tut06_default_method.py (modified) (1 diff)
- branches/multiapp/cherrypy/tutorial/tut07_sessions.py (modified) (1 diff)
- branches/multiapp/cherrypy/tutorial/tut08_generators_and_yield.py (modified) (1 diff)
- branches/multiapp/cherrypy/tutorial/tut09_files.py (modified) (1 diff)
- branches/multiapp/cherrypy/tutorial/tut10_http_errors.py (modified) (1 diff)
- branches/multiapp/cherrypy/tutorial/tutorial.conf (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
branches/multiapp/cherrypy/__init__.py
r887 r908 4 4 5 5 import datetime 6 import os 6 7 import sys 7 8 import types … … 19 20 from cherrypy._cpthreadinglocal import local 20 21 21 # Create a threadlocal object to hold the request and response22 # objects. In this way, we can easily dump those objects when22 # Create a threadlocal object to hold the app, request and response 23 # references. In this way, we can easily dump those objects when 23 24 # we stop/start a new HTTP conversation, yet still refer to 24 25 # them as module-level globals in a thread-safe way. 25 serving = local() 26 class _Serving(local): 27 28 def __init__(self): 29 # Called each time the local object is used in a separate thread. 30 # When those threads are HTTP conversation threads, the 31 # cherrypy.server object will re-assign these attributes asap. 32 # When the local thread is a main thread (not part of an HTTP 33 # request), only self.app should be re-assigned. Call 34 # cherrypy.use(app) to set it more easily in app code. 35 self.app = None 36 self.request = None 37 self.response = None 38 39 serving = _Serving() 40 41 42 class Application(object): 43 44 def __init__(self, root=None): 45 self.root = root 46 self.config = { 47 'global': { 48 'server.environment': "development", 49 }, 50 '/favicon.ico': { 51 'static_filter.on': True, 52 'static_filter.file': os.path.join(os.path.dirname(__file__), 53 "favicon.ico"), 54 }, 55 } 56 57 def mount_point(self): 58 return self.config["global"].get("http.mount_point", "/") 59 60 def dispatch_path(self, mounted_path): 61 path = mounted_path[len(self.mount_point()):] 62 if not path.startswith("/"): 63 path = "/" + path 64 return path 65 66 67 apps = [] 68 69 def use(app): 70 """Use the given Application object in the current thread.""" 71 serving.app = app 72 if app not in apps: 73 apps.append(app) 74 75 def new(root=None): 76 """Return a new Application object and use it in the current thread.""" 77 app = Application(root) 78 use(app) 79 return app 80 81 def dispatch(path): 82 """Return and use() an Application object based on the given path.""" 83 matches = [] 84 for app in apps: 85 mount = app.mount_point() 86 if path.startswith(mount): 87 matches.append((mount, app)) 88 89 if not matches: 90 raise NotFound(path) 91 92 # Use the longest matching mount point 93 matches.sort() 94 mount, app = matches[-1] 95 96 use(app) 97 return app 98 26 99 27 100 class _ThreadLocalProxy: … … 42 115 delattr(childobject, name) 43 116 44 # Create request and response object (the same objects will be used117 # Create app, request and response object (the same objects will be used 45 118 # throughout the entire life of the webserver, but will redirect 46 119 # to the "serving" object) 120 app = _ThreadLocalProxy('app') 47 121 request = _ThreadLocalProxy('request') 48 122 response = _ThreadLocalProxy('response') branches/multiapp/cherrypy/_cphttpserver.py
r887 r908 20 20 def address_string(self): 21 21 """ Try to do a reverse DNS based on server.reverse_dns in the config file """ 22 if cherrypy.config. get('server.reverse_dns'):22 if cherrypy.config.serverconf.get('server.reverse_dns'): 23 23 return BaseHTTPRequestHandler.address_string(self) 24 24 else: … … 42 42 43 43 def parse_request(self): 44 conf = cherrypy.config.serverconf.get 44 45 # Extended to provide header and body length limits. 45 mhs = int(cherrypy.config.get('server.max_request_header_size', 46 500 * 1024)) 46 mhs = int(conf('server.max_request_header_size', 500 * 1024)) 47 47 self.rfile = httptools.SizeCheckWrapper(self.rfile, mhs) 48 48 try: … … 60 60 if path == "*": 61 61 path = "global" 62 mbs = int(cherrypy.config.get('server.max_request_body_size', 63 100 * 1024 * 1024, path=path)) 62 mbs = int(conf('server.max_request_body_size', 100 * 1024 * 1024)) 64 63 self.rfile.maxlen = mbs 65 64 return presult … … 67 66 def handle_one_request(self): 68 67 """Handle a single HTTP request.""" 68 conf = cherrypy.config.serverconf.get 69 69 70 70 self.raw_requestline = self.rfile.readline() … … 79 79 request = cherrypy.server.request(self.client_address, 80 80 self.address_string(), "http") 81 request.multithread = c herrypy.config.get("server.thread_pool") > 181 request.multithread = conf("server.thread_pool") > 1 82 82 request.multiprocess = False 83 83 response = request.run(self.raw_requestline, self._headerlist(), … … 88 88 raise 89 89 except: 90 tb = _cputil.formatExc() 91 cherrypy.log(tb) 92 if cherrypy.config.get("server.throw_errors", False): 90 cherrypy.log(traceback=True) 91 if conf("server.throw_errors", False): 93 92 msg = "THROWN ERROR: %s" % sys.exc_info()[0].__name__ 94 93 s = "500 Internal Server Error" … … 97 96 b = [msg] 98 97 else: 99 if not cherrypy.config.get("server.show_tracebacks", False): 100 tb = "" 101 s, h, b = _cputil.bareError(tb) 98 s, h, b = _cputil.bareError() 102 99 103 100 try: … … 181 178 # but we have to in order to implement SSL and IPv6 support! 182 179 180 conf = cherrypy.config.serverconf.get 181 183 182 # Set protocol_version 184 httpproto = c herrypy.config.get('server.protocol_version') or "HTTP/1.0"183 httpproto = conf('server.protocol_version') or "HTTP/1.0" 185 184 self.RequestHandlerClass.protocol_version = httpproto 186 185 187 self.request_queue_size = c herrypy.config.get('server.socket_queue_size')186 self.request_queue_size = conf('server.socket_queue_size') 188 187 189 188 # Select the appropriate server based on config options 190 sockFile = c herrypy.config.get('server.socket_file')189 sockFile = conf('server.socket_file') 191 190 if sockFile: 192 191 # AF_UNIX socket … … 206 205 else: 207 206 # AF_INET or AF_INET6 socket 208 host = c herrypy.config.get('server.socket_host')209 port = c herrypy.config.get('server.socket_port')207 host = conf('server.socket_host') 208 port = conf('server.socket_port') 210 209 self.server_address = (host, port) 211 210 … … 314 313 315 314 def __init__(self): 316 self.numThreads = cherrypy.config. get('server.thread_pool')315 self.numThreads = cherrypy.config.serverconf.get('server.thread_pool') 317 316 self.ThreadClass = ServerThread 318 317 self.requestQueue = Queue.Queue() … … 399 398 400 399 # Select the appropriate server based on config options 401 if cherrypy.config. get('server.thread_pool', 1) > 1:400 if cherrypy.config.serverconf.get('server.thread_pool', 1) > 1: 402 401 ServerClass = PooledThreadServer 403 402 else: branches/multiapp/cherrypy/_cphttptools.py
r904 r908 9 9 from cherrypy import _cputil, _cpcgifs 10 10 from cherrypy.filters import applyFilters 11 from cherrypy.lib import cptools, httptools 11 from cherrypy.lib import cptools, httptools, profiler 12 12 13 13 … … 65 65 self.simpleCookie = Cookie.SimpleCookie() 66 66 67 if cherrypy.profiler: 68 cherrypy.profiler.run(self._run) 67 # Set up the profiler if requested. 68 if cherrypy.config.serverconf.get("profiling.on", False): 69 ppath = cherrypy.config.serverconf.get("profiling.path", "") 70 profiler.Profiler(ppath).run(self._run) 69 71 else: 70 72 self._run() … … 122 124 raise 123 125 except: 124 if cherrypy.config. get("server.throw_errors", False):126 if cherrypy.config.serverconf.get("server.throw_errors", False): 125 127 raise 126 128 cherrypy.response.handleError(sys.exc_info()) … … 129 131 rl = self.requestLine 130 132 method, path, qs, proto = httptools.parseRequestLine(rl) 131 if path == "*":132 path = "global"133 133 134 134 self.method = method … … 141 141 # Change object_path in filters to change 142 142 # the object that will get rendered 143 self.object_path = path 143 cherrypy.dispatch(path) 144 self.object_path = cherrypy.app.dispatch_path(path) 144 145 145 146 # Compare request and server HTTP versions, in case our server does … … 159 160 # cherrypy.request.version == request.protocol in a Version instance. 160 161 self.version = httptools.Version.from_http(self.protocol) 161 server_v = cherrypy.config. get("server.protocol_version", "HTTP/1.0")162 server_v = cherrypy.config.serverconf.get("server.protocol_version", "HTTP/1.0") 162 163 server_v = httptools.Version.from_http(server_v) 163 164 … … 372 373 self.headers = httptools.HeaderMap() 373 374 self.headerMap = self.headers # Backward compatibility 374 content_type = cherrypy.config.get('server.default_content_type', 'text/html') 375 content_type = cherrypy.config.serverconf.get('server.default_content_type', 376 'text/html') 375 377 self.headers.update({ 376 378 "Content-Type": content_type, branches/multiapp/cherrypy/_cpserver.py
r905 r908 9 9 import cherrypy 10 10 from cherrypy import _cphttptools, filters 11 from cherrypy.lib import autoreload, profiler,cptools11 from cherrypy.lib import autoreload, cptools 12 12 13 13 # Use a flag to indicate the state of the application server. … … 52 52 self.interrupt = None 53 53 54 conf = cherrypy.config. get54 conf = cherrypy.config.serverconf.get 55 55 56 56 if serverClass is _missing: … … 93 93 94 94 def _start(self): 95 conf = cherrypy.config.serverconf.get 95 96 # Output config options to log 96 if c herrypy.config.get("server.log_config_options", True):97 if conf("server.log_config_options", True): 97 98 cherrypy.config.outputConfigMap() 98 99 99 100 try: 100 configure() 101 if cherrypy.codecoverage: 102 from cherrypy.lib import covercp 103 covercp.start() 104 105 # set cgi.maxlen which will limit the size of POST request bodies 106 cgi.maxlen = conf('server.max_request_size') 107 108 # Initialize the built in filters 109 filters.init() 101 110 102 111 for func in cherrypy.server.on_start_server_list + cherrypy.server.onStartServerList: … … 134 143 return 135 144 136 if cherrypy.config.get('server.socket_port'): 137 host = cherrypy.config.get('server.socket_host') 138 port = cherrypy.config.get('server.socket_port') 145 conf = cherrypy.config.serverconf.get 146 if conf('server.socket_port'): 147 host = conf('server.socket_host') 148 port = conf('server.socket_port') 139 149 140 150 wait_for_free_port(host, port) … … 144 154 on_what = "http://%s:%s/" % (host, port) 145 155 else: 146 on_what = "socket file: %s" % c herrypy.config.get('server.socket_file')156 on_what = "socket file: %s" % conf('server.socket_file') 147 157 148 158 # Instantiate the server. … … 171 181 172 182 # Wait for port to be occupied 173 if cherrypy.config.get('server.socket_port'): 174 host = cherrypy.config.get('server.socket_host') 175 port = cherrypy.config.get('server.socket_port') 183 conf = cherrypy.config.serverconf.get 184 if conf('server.socket_port'): 185 host = conf('server.socket_host') 186 port = conf('server.socket_port') 176 187 wait_for_occupied_port(host, port) 177 188 … … 276 287 def check_config(): 277 288 err = cherrypy.WrongConfigValue 278 for name, section in cherrypy.config.configs.iteritems(): 279 for k, v in section.iteritems(): 280 if k == "server.environment": 281 if v and v not in cherrypy.config.environments: 282 raise err("'%s' is not a registered environment." % v) 283 284 285 def configure(): 286 """Perform one-time actions to prepare the CherryPy core.""" 287 if cherrypy.codecoverage: 288 from cherrypy.lib import covercp 289 covercp.start() 290 291 conf = cherrypy.config.get 292 # TODO: config.checkConfigOptions() 293 294 # If sessions are stored in files and we 295 # use threading, we need a lock on the file 296 if (conf('server.thread_pool') > 1 297 and conf('session.storage_type') == 'file'): 298 cherrypy._sessionFileLock = threading.RLock() 299 300 # set cgi.maxlen which will limit the size of POST request bodies 301 cgi.maxlen = conf('server.max_request_size') 302 303 # Set up the profiler if requested. 304 if conf("profiling.on", False): 305 ppath = conf("profiling.path", "") 306 cherrypy.profiler = profiler.Profiler(ppath) 307 else: 308 cherrypy.profiler = None 309 310 # Initialize the built in filters 311 filters.init() 289 for app in cherrypy.apps: 290 for name, section in app.config.iteritems(): 291 for k, v in section.iteritems(): 292 if k == "server.environment": 293 if v and v not in cherrypy.config.environments: 294 raise err("'%s' is not a registered environment." % v) 312 295 313 296 314 297 def check_port(host, port): 315 298 """Raise an error if the given port is not free on the given host.""" 316 sock_file = cherrypy.config. get('server.socket_file')299 sock_file = cherrypy.config.serverconf.get('server.socket_file') 317 300 if sock_file: 318 301 return branches/multiapp/cherrypy/_cputil.py
r901 r908 33 33 if nameList == ['global']: 34 34 # Special-case a Request-URI of * to allow for our default handler. 35 root = getattr(cherrypy , 'root', None)35 root = getattr(cherrypy.app, 'root', None) 36 36 if root is None: 37 37 return [('root', None), ('global_', None), ('index', None)] 38 38 gh = getattr(root, 'global_', _cpGlobalHandler) 39 return [('root', cherrypy. root), ('global_', gh), ('index', None)]39 return [('root', cherrypy.app.root), ('global_', gh), ('index', None)] 40 40 41 41 nameList = ['root'] + nameList + ['index'] 42 42 43 43 # Convert the list of names into a list of objects 44 node = cherrypy 44 node = cherrypy.app 45 45 objectTrail = [] 46 46 for name in nameList: … … 117 117 } 118 118 119 if cherrypy.config. get('server.log_to_screen', True):119 if cherrypy.config.serverconf.get('server.log_to_screen', True): 120 120 print s 121 121 122 fname = cherrypy.config. get('server.log_access_file', '')122 fname = cherrypy.config.serverconf.get('server.log_access_file', '') 123 123 if fname: 124 124 f = open(fname, 'ab') … … 140 140 s = ' '.join((logtime(), context, level, msg)) 141 141 142 if cherrypy.config. get('server.log_to_screen', True):142 if cherrypy.config.serverconf.get('server.log_to_screen', True): 143 143 print s 144 144 145 fname = cherrypy.config. get('server.log_file', '')145 fname = cherrypy.config.serverconf.get('server.log_file', '') 146 146 #logdir = os.path.dirname(fname) 147 147 #if logdir and not os.path.exists(logdir): … … 232 232 logmsg = "" 233 233 234 if cherrypy.config. get('server.log_tracebacks', True):234 if cherrypy.config.serverconf.get('server.log_tracebacks', True): 235 235 logmsg = tb 236 if cherrypy.config. get('server.log_request_headers', True):236 if cherrypy.config.serverconf.get('server.log_request_headers', True): 237 237 h = [" %s: %s" % (k, v) for k, v in cherrypy.request.header_list] 238 238 logmsg += 'Request Headers:\n' + '\n'.join(h) … … 352 352 """ Default _cp_on_error method """ 353 353 # Allow logging of only *unexpected* HTTPError's. 354 if (not cherrypy.config. get('server.log_tracebacks', True)355 and cherrypy.config. get('server.log_unhandled_tracebacks', True)):354 if (not cherrypy.config.serverconf.get('server.log_tracebacks', True) 355 and cherrypy.config.serverconf.get('server.log_unhandled_tracebacks', True)): 356 356 cherrypy.log(traceback=True) 357 357 branches/multiapp/cherrypy/_cpwsgi.py
r887 r908 55 55 56 56 # Trap screen output from BaseHTTPRequestHandler.log_message() 57 if not cherrypy.config. get('server.log_to_screen'):57 if not cherrypy.config.serverconf.get('server.log_to_screen'): 58 58 sys.stderr = NullWriter() 59 59 … … 78 78 raise 79 79 except: 80 if cherrypy.config. get("server.throw_errors", False):80 if cherrypy.config.serverconf.get("server.throw_errors", False): 81 81 raise 82 tb = _cputil.formatExc() 83 cherrypy.log(tb) 84 if not cherrypy.config.get("server.show_tracebacks", False): 85 tb = "" 86 s, h, b = _cputil.bareError(tb) 82 cherrypy.log(traceback=True) 83 s, h, b = _cputil.bareError() 87 84 exc = sys.exc_info() 88 85 … … 126 123 def __init__(self, socket, addr, server): 127 124 _cpwsgiserver.HTTPRequest.__init__(self, socket, addr, server) 128 mhs = int(cherrypy.config. get('server.max_request_header_size',129 500 * 1024))125 mhs = int(cherrypy.config.serverconf.get('server.max_request_header_size', 126 500 * 1024)) 130 127 self.rfile = httptools.SizeCheckWrapper(self.rfile, mhs) 131 128 … … 149 146 self.rfile.bytes_read = 0 150 147 path = self.environ["SCRIPT_NAME"] 151 if path == "*": 152 path = "global" 153 else: 154 path = "/" + path 155 mbs = int(cherrypy.config.get('server.max_request_body_size', 156 100 * 1024 * 1024, path=path)) 148 mbs = int(cherrypy.config.serverconf.get('server.max_request_body_size', 149 100 * 1024 * 1024)) 157 150 self.rfile.maxlen = mbs 158 151 … … 171 164 172 165 def __init__(self, app=wsgiApp): 173 conf = cherrypy.config. get166 conf = cherrypy.config.serverconf.get 174 167 175 sockFile = c herrypy.config.get('server.socket_file')168 sockFile = conf('server.socket_file') 176 169 if sockFile: 177 170 bind_addr = sockFile branches/multiapp/cherrypy/config.py
r892 r908 9 9 10 10 11 # This configs dict holds the settings metadata for all cherrypy objects. 12 # Keys are URL paths, and values are dicts. 13 configs = {} 14 configMap = configs # Backward compatibility 15 16 default_global = { 11 default_serverconf = { 17 12 'server.socket_port': 8080, 18 13 'server.socket_host': '', 19 14 'server.socket_file': '', 20 15 'server.socket_queue_size': 5, 16 'server.reverse_dns': False, 17 'autoreload.on': False, 18 'autoreload.frequency': 1, 21 19 'server.protocol_version': 'HTTP/1.0', 20 'server.thread_pool': 0, 22 21 'server.log_to_screen': True, 23 22 'server.log_tracebacks': True, 24 23 'server.log_file': '', 25 'server.reverse_dns': False, 26 'server.thread_pool': 0, 27 'server.environment': "development", 28 29 '/favicon.ico': { 30 'static_filter.on': True, 31 'static_filter.file': os.path.join(os.path.dirname(__file__), "favicon.ico"),} 24 'server.log_config_options': False, 25 'server.log_file_not_found': False, 26 'server.log_request_headers': False, 32 27 } 28 serverconf = default_serverconf.copy() 33 29 34 30 environments = { … … 36 32 'autoreload.on': True, 37 33 'log_debug_info_filter.on': True, 38 'server.log_file_not_found': True,39 34 'server.show_tracebacks': True, 40 'server.log_request_headers': True,41 35 }, 42 36 "staging": { 43 37 'autoreload.on': False, 44 38 'log_debug_info_filter.on': False, 45 'server.log_file_not_found': False,46 39 'server.show_tracebacks': False, 47 'server.log_request_headers': False,48 40 }, 49 41 "production": { 50 42 'autoreload.on': False, 51 43 'log_debug_info_filter.on': False, 52 'server.log_file_not_found': False,53 44 'server.show_tracebacks': False, 54 'server.log_request_headers': False,55 45 }, 56 46 } … … 62 52 already defined in the configs. 63 53 """ 54 55 appconf = cherrypy.app.config 56 64 57 if updateMap is None: 65 58 updateMap = {} … … 71 64 updateMap.update(dict_from_config_file(file)) 72 65 73 # Load new conf into cherrypy .configs66 # Load new conf into cherrypy configs 74 67 for section, valueMap in updateMap.iteritems(): 75 68 # Handle shortcut syntax for "global" section 76 # example: update({' server.socket_port': 80})69 # example: update({'http.show_tracebacks': True}) 77 70 if not isinstance(valueMap, dict): 78 71 valueMap = {section: valueMap} 79 72 section = 'global' 80 73 81 bucket = configs.setdefault(section, {}) 74 if section == "server": 75 bucket = serverconf 76 else: 77 bucket = appconf.setdefault(section, {}) 78 82 79 if overwrite: 83 80 bucket.update(valueMap) … … 86 83 bucket.setdefault(key, value) 87 84 88 def reset(useDefaults=True):89 """Clear configuration and restore defaults"""90 configs.clear()91 if useDefaults:92 update(default_global)93 reset()94 85 95 86 def get(key, default_value=None, return_section=False, path = None): … … 98 89 specified, return the path to the value, instead of the value itself. 99 90 """ 91 92 configs = cherrypy.app.config 100 93 101 94 if path is None: … … 156 149 """ 157 150 # Needed by the session filter 151 152 configs = cherrypy.app.config 158 153 159 154 try: … … 233 228 """Log server configuration parameters""" 234 229 cherrypy.log("Server parameters:", 'CONFIG') 235 236 serverVars = [ 237 'server.environment', 238 'server.log_to_screen', 239 'server.log_file', 240 'server.log_tracebacks', 241 'server.log_request_headers', 242 'server.protocol_version', 243 'server.socket_host', 244 'server.socket_port', 245 'server.socket_file', 246 'server.reverse_dns', 247 'server.socket_queue_size', 248 'server.thread_pool', 249 ] 250 251 for var in serverVars: 252 cherrypy.log(" %s: %s" % (var, get(var)), 'CONFIG') 253 230 for k, v in serverconf.iteritems(): 231 cherrypy.log(" %s: %s" % (k, v), 'CONFIG') 232 branches/multiapp/cherrypy/filters/__init__.py
r903 r908 56 56 inputs, outputs = [], [] 57 57 58 conf = cherrypy.config. get58 conf = cherrypy.config.serverconf.get 59 59 60 60 for filtercls in input_filters + conf('server.input_filters', []): … … 106 106 if method: 107 107 special_methods.append(method) 108 108 109 109 if method_name in _input_methods: 110 110 # Run special filters after defaults. branches/multiapp/cherrypy/filters/cachefilter.py
r906 r908 103 103 104 104 def __init__(self): 105 cache_class = cherrypy.config.get("cache_filter.cacheClass", MemoryCache) 105 cache_class = cherrypy.config.serverconf.get("cache_filter.cacheClass", 106 MemoryCache) 106 107 cherrypy._cache = cache_class() 107 108 branches/multiapp/cherrypy/lib/covercp.py
r856 r908 345 345 346 346 import cherrypy 347 cherrypy.root = CoverStats() 348 cherrypy.config.update({'server.socket_port': port, 349 'server.thread_pool': 10, 350 'server.environment': "production", 351 }) 347 cherrypy.new(root = CoverStats()) 348 cherrypy.config.update({ 349 'server': { 350 'server.socket_port': port, 351 'server.thread_pool': 10, 352 }, 353 'global': { 354 'server.environment': "production", 355 }, 356 }) 352 357 cherrypy.server.start() 353 358 branches/multiapp/cherrypy/lib/cptools.py
r896 r908 52 52 from cherrypy.lib.cptools import ExposeItems 53 53 ... 54 cherrypy. root.foo = ExposeItems(mylist)55 cherrypy. root.bar = ExposeItems(mydict)54 cherrypy.app.root.foo = ExposeItems(mylist) 55 cherrypy.app.root.bar = ExposeItems(mydict) 56 56 """ 57 57 exposed = True … … 76 76 response = cherrypy.response 77 77 78 # If path is relative, make absolute using cherrypy. root's module.79 # If there is no cherrypy. root, or it doesn't have a __module__78 # If path is relative, make absolute using cherrypy.app.root's module. 79 # If there is no cherrypy.app.root, or it doesn't have a __module__ 80 80 # attribute, then users should fix the issue by making path absolute. 81 81 # That is, CherryPy should not guess where the application root is 82 # any further than trying cherrypy. root.__module__, and it certainly82 # any further than trying cherrypy.app.root.__module__, and it certainly 83 83 # should *not* use cwd (since CP may be invoked from a variety of 84 84 # paths). If using static_filter, you can make your relative paths 85 85 # become absolute by supplying a value for "static_filter.root". 86 86 if not os.path.isabs(path): 87 root = os.path.dirname(sys.modules[cherrypy. root.__module__].__file__)87 root = os.path.dirname(sys.modules[cherrypy.app.root.__module__].__file__) 88 88 path = os.path.join(root, path) 89 89 branches/multiapp/cherrypy/lib/httptools.py
r899 r908 299 299 def parseRequestLine(requestLine): 300 300 """Return (method, path, querystring, protocol) from a requestLine.""" 301 method, path, protocol = requestLine.split() 302 303 # path may be an abs_path (including "http://host.domain.tld"); 301 method, url, protocol = requestLine.split() 302 path, qs = parse_request_url(url) 303 return method, path, qs, protocol 304 305 def parse_request_url(url): 306 """Return (relative path, querystring) from a requestline url.""" 307 308 # url may be an abs_path (including "http://host.domain.tld"); 304 309 # Ignore scheme, location, and fragments (so config lookups work). 305 310 # [Therefore, this assumes all hosts are valid for this server.] 306 scheme, location, path, params, qs, frag = urlparse( path)311 scheme, location, path, params, qs, frag = urlparse(url) 307 312 if path == "*": 308 313 # "...the request does not apply to a particular resource, … … 325 330 atoms = [urllib.unquote(x) for x in re.split("(?i)%2F", path)] 326 331 path = "%2F".join(atoms) 327 328 return method, path, qs, protocol 332 return path, qs 333 329 334 330 335 def parseQueryString(queryString, keep_blank_values=True): branches/multiapp/cherrypy/lib/profiler.py
r882 r908 131 131 import cherrypy 132 132 cherrypy.root = Profiler(path) 133 cherrypy.config.update({'server.socket_port': int(port), 134 'server.thread_pool': 10, 135 'server.environment': "production", 136 'session.storageType': "ram", 137 }) 133 cherrypy.config.update({ 134 'server': { 135 'server.socket_port': int(port), 136 'server.thread_pool': 10, 137 }, 138 'global': { 139 'server.environment': "production", 140 'session.storageType': "ram", 141 }, 142 }) 138 143 cherrypy.server.start() 139 144 branches/multiapp/cherrypy/test/__init__.py
r762 r908 7 7 # - test if tabs and whitespaces are handled correctly in source file (option -W) 8 8 # - test if absolute pathnames work fine on windows 9 # - test sessions10 # - test threading server11 9 # - test forking server 12 10 # - test process pooling server branches/multiapp/cherrypy/test/helper.py
r893 r908 30 30 import cherrypy 31 31 from cherrypy import _cpwsgi 32 from cherrypy.lib import httptools 32 33 import webtest 33 34 … … 43 44 if not handled: 44 45 cherrypy._cputil._cp_on_error() 45 46 47 class VirtualRootFilter:48 49 def __init__(self, prefix):50 self.prefix = prefix51 52 def on_start_resource(self):53 path = cherrypy.request.object_path54 if path.startswith(self.prefix):55 cherrypy.request.object_path = path[len(self.prefix):]56 vroot = ""57 ##vroot = "/vpath"58 test_vrf = VirtualRootFilter(vroot)59 46 60 47 … … 140 127 def getPage(self, url, headers=None, method="GET", body=None): 141 128 """Open the url with debugging support. Return status, headers, body.""" 129 cherrypy.dispatch(httptools.parse_request_url(url)[0]) 130 142 131 # Install a custom error handler, so errors in the server will: 143 132 # 1) show server tracebacks in the test output, and 144 133 # 2) stop the HTTP request (if any) and ignore further assertions. 145 cherrypy. root._cp_on_error = onerror134 cherrypy.app.root._cp_on_error = onerror 146 135 # Backward compatibility: 147 cherrypy.root._cpOnError = onerror 148 149 if vroot: 150 if url != "*": 151 url = vroot + url 152 filters = getattr(cherrypy.root, "_cp_filters", None) 153 if filters is None: 154 cherrypy.root._cp_filters = filters = [] 155 if test_vrf not in filters: 156 filters.append(test_vrf) 136 cherrypy.app.root._cpOnError = onerror 157 137 158 138 if cherrypy.server.httpserver is None: … … 196 176 CPTestRunner = webtest.TerseTestRunner(verbosity=2) 197 177 198 def setConfig(conf):199 """Set the config using a copy of conf."""200 if isinstance(conf, basestring):201 # assume it's a filename202 cherrypy.config.update(file=conf)203 else:204 cherrypy.config.update(conf.copy())205 206 178 207 179 def run_test_suite(moduleNames, server, conf): … … 211 183 of test modules. The config, however, is reset for each module. 212 184 """ 213 setConfig(conf) 185 cherrypy.apps = [] 186 cherrypy.config.serverconf = cherrypy.config.default_serverconf.copy() 187 cherrypy.config.serverconf.update(conf) 214 188 cherrypy.server.start_with_callback(_run_test_suite_thread, 215 189 args=(moduleNames, conf), … … 220 194 # Must run each module in a separate suite, 221 195 # because each module uses/overwrites cherrypy globals. 222 cherrypy.config.reset() 223 setConfig(conf) 196 cherrypy.apps = [] 197 cherrypy.config.serverconf = cherrypy.config.default_serverconf.copy() 198 cherrypy.config.serverconf.update(conf) 224 199 225 200 suite = CPTestLoader.loadTestsFromName(testmod) 201 for app in cherrypy.apps: 202 app.config['global'].update({"server.environment": "production"}) 203 226 204 CPTestRunner.run(suite) 227 205 thread.interrupt_main() … … 230 208 """Run __main__ as a test module, with webtest debugging.""" 231 209 if conf is None: 232 conf = {} 233 setConfig(conf) 210 conf = {'server.log_to_screen': False, 211 'server.log_tracebacks': False, 212 'server.log_file': '', 213 } 214 cherrypy.config.serverconf.update(conf) 215 if getattr(cherrypy.app, "config", None) is not None: 216 cherrypy.config.update({"server.environment": "production"}) 234 217 cherrypy.server.start_with_callback(_test_main_thread, serverClass=server) 235 218 236 219 def _test_main_thread(): 237 220 try: 238 webtest.WebCase.PORT = cherrypy.config. get('server.socket_port')221 webtest.WebCase.PORT = cherrypy.config.serverconf.get('server.socket_port') 239 222 webtest.main() 240 223 finally: branches/multiapp/cherrypy/test/test.py
r891 r908 240 240 'server.thread_pool': 10, 241 241 'server.log_to_screen': False, 242 'server.environment': "production",243 'server.show_tracebacks': True,244 242 } 245 243 elif isinstance(conf, basestring): … … 288 286 # would stick a second instance of webtest in sys.modules, 289 287 # and we wouldn't be able to globally override the port anymore. 290 import helper, test_states288 import cherrypy, helper, test_states 291 289 s = [self.available_servers[name] for name in self.servers] 292 290 s.sort() … … 295 293 print 296 294 print "Running tests:", name 295 cherrypy.apps = [] 296 cherrypy.config.serverconf = cherrypy.config.default_serverconf.copy() 297 cherrypy.config.serverconf.update(conf) 297 298 reload(test_states) 298 299 test_states.run(cls, conf) branches/multiapp/cherrypy/test/test_baseurl_filter.py
r856 r908 10 10 index.exposed = True 11 11 12 cherrypy. root = Root()12 cherrypy.new(root = Root()) 13 13 cherrypy.config.update({ 14 'server.environment': 'production',15 'server.log_to_screen': False,16 14 'base_url_filter.on': True, 17 15 'base_url_filter.base_url': 'http://www.mydomain.com' … … 24 22 def testBaseUrlFilter(self): 25 23 self.getPage("/") 26 self.assertHeader('Location', 27 "http://www.mydomain.com%s/dummy" % helper.vroot) 24 self.assertHeader('Location', "http://www.mydomain.com/dummy") 28 25 29 26 branches/multiapp/cherrypy/test/test_cache_filter.py
r906 r908 16 16 index.exposed = True 17 17 18 cherrypy. root = Root()18 cherrypy.new(root = Root()) 19 19 cherrypy.config.update({ 20 'server.log_to_screen': False,21 'server.environment': 'production',22 20 'cache_filter.on': True, 23 21 }) branches/multiapp/cherrypy/test/test_combinedfilters.py
r856 r908 14 14 index.exposed = True 15 15 16 cherrypy. root = Root()16 cherrypy.new(root = Root()) 17 17 cherrypy.config.update({ 18 'server.log_to_screen': False,19 'server.environment': 'production',20 18 'gzip_filter.on': True, 21 19 'encoding_filter.on': True, branches/multiapp/cherrypy/test/test_config.py
r856 r908 5 5 import StringIO 6 6 import cherrypy 7 7 8 8 9 class Root: … … 26 27 prod = index 27 28 28 cherrypy. root = Root()29 cherrypy. root.foo = Foo()30 cherrypy. root.env = Env()29 cherrypy.new(root = Root()) 30 cherrypy.app.root.foo = Foo() 31 cherrypy.app.root.env = Env() 31 32 cherrypy.config.update({ 32 'global': {'server.log_to_screen': False, 33 'server.environment': 'production', 34 'server.show_tracebacks': True, 33 'global': {'server.show_tracebacks': True, 35 34 }, 36 35 '/': { … … 59 58 def testConfig(self): 60 59 tests = [ 61 ('*', 'luxuryyacht', 'throatwobblermangrove'),62 60 ('/', 'nex', 'None'), 63 61 ('/', 'foo', 'this'), branches/multiapp/cherrypy/test/test_core.py
r894 r908 25 25 global_.exposed = True 26 26 27 cherrypy. root = Root()27 cherrypy.new(root = Root()) 28 28 29 29 … … 37 37 if isinstance(value, types.FunctionType): 38 38 value.exposed = True 39 setattr(cherrypy. root, name.lower(), cls())39 setattr(cherrypy.app.root, name.lower(), cls()) 40 40 class Test(object): 41 41 __metaclass__ = TestType … … 295 295 get.exposed = True 296 296 297 cherrypy. root.divorce = Divorce()297 cherrypy.app.root.divorce = Divorce() 298 298 299 299 … … 330 330 331 331 cherrypy.config.update({ 332 'global': {'server.log_to_screen': False, 333 'server.environment': 'production', 334 'server.show_tracebacks': True, 332 'global': {'server.show_tracebacks': True, 335 333 }, 336 '/flatten': {337 'server.log_file': log_file,338 'server.log_access_file': log_access_file,339 },340 334 '/params': { 341 335 'server.log_file': log_file, … … 343 337 '/internalredirect/secure': { 344 338 'auth.on': True, 345 },346 '/error': {347 'server.log_file': log_file,348 'server.log_tracebacks': True,349 339 }, 350 340 '/error/page_streamed': { … … 360 350 'error_page.404': "nonexistent.html", 361 351 }, 362 '/error/log_unhandled': {363 'server.log_tracebacks': False,364 'server.log_unhandled_tracebacks': True,365 },366 '/error/rethrow': {367 'server.throw_errors': True,368 },369 352 }) 370 371 353 372 354 import helper … … 431 413 open(log_access_file, "wb").write("") 432 414 415 cherrypy.config.serverconf.update({ 416 'server.log_file': log_file, 417 'server.log_access_file': log_access_file, 418 }) 433 419 self.getPage("/flatten/as_string") 434 420 self.assertBody('content') … … 438 424 self.assertBody('content') 439 425 self.assertStatus('200 OK') 426 427 cherrypy.config.serverconf.update({ 428 'server.log_file': '', 429 'server.log_access_file': '', 430 }) 440 431 441 432 data = open(log_access_file, "rb").readlines() … … 446 437 haslength = True 447 438 if haslength: 448 self.assert_(data[0].endswith('] "GET %s/flatten/as_string HTTP/1.1" 200 7\n' 449 % helper.vroot)) 439 self.assert_(data[0].endswith('] "GET /flatten/as_string HTTP/1.1" 200 7\n')) 450 440 else: 451 self.assert_(data[0].endswith('] "GET %s/flatten/as_string HTTP/1.1" 200 -\n' 452 % helper.vroot)) 441 self.assert_(data[0].endswith('] "GET /flatten/as_string HTTP/1.1" 200 -\n')) 453 442 454 443 self.assertEqual(data[1][:15], '127.0.0.1 - - [') … … 458 447 haslength = True 459 448 if haslength: 460 self.assert_(data[1].endswith('] "GET %s/flatten/as_yield HTTP/1.1" 200 7\n' 461 % helper.vroot)) 449 self.assert_(data[1].endswith('] "GET /flatten/as_yield HTTP/1.1" 200 7\n')) 462 450 else: 463 self.assert_(data[1].endswith('] "GET %s/flatten/as_yield HTTP/1.1" 200 -\n' 464 % helper.vroot)) 451 self.assert_(data[1].endswith('] "GET /flatten/as_yield HTTP/1.1" 200 -\n')) 465 452 466 453 data = open(log_file, "rb").readlines() … … 471 458 try: 472 459 # Test that tracebacks get written to the error log. 460 cherrypy.config.serverconf.update({ 461 'server.log_file': log_file, 462 'server.log_tracebacks': True, 463 }) 473 464 self.getPage("/error/page_method") 474 465 self.assertInBody("raise ValueError()") … … 477 468 self.assertEqual(data[6], ' raise ValueError()\n') 478 469 470 cherrypy.config.serverconf.update({ 471 'server.log_tracebacks': False, 472 'server.log_unhandled_tracebacks': True, 473 }) 479 474 # Test that unhandled tracebacks get written to the error log 480 475 # if log_tracebacks is False but log_unhandled_tracebacks is True. … … 488 483 finally: 489 484 ignore.pop() 485 cherrypy.config.serverconf.update({ 486 'server.log_file': '', 487 'server.log_tracebacks': False, 488 'server.log_unhandled_tracebacks': False, 489 }) 490 490 491 491 def testRedirect(self): … … 499 499 self.getPage("/redirect?id=3") 500 500 self.assertStatus(('302 Found', '303 See Other')) 501 self.assertInBody("<a href='http://127.0.0.1:%s%s/redirect/?id=3'>" 502 "http://127.0.0.1:%s%s/redirect/?id=3</a>" % 503 (self.PORT, helper.vroot, self.PORT, helper.vroot)) 504 505 if helper.vroot: 506 # Corner case: the "trailing slash" redirect could be tricky if 507 # we're using a virtual root and the URI is "/vroot" (no slash). 508 self.getPage("") 509 self.assertStatus(('302 Found', '303 See Other')) 510 self.assertInBody("<a href='http://127.0.0.1:%s%s/'>" 511 "http://127.0.0.1:%s%s/</a>" % 512 (self.PORT, helper.vroot, self.PORT, helper.vroot)) 501 self.assertInBody("<a href='http://127.0.0.1:%s/redirect/?id=3'>" 502 "http://127.0.0.1:%s/redirect/?id=3</a>" % 503 (self.PORT, self.PORT)) 513 504 514 505 self.getPage("/redirect/by_code?code=300") … … 569 560 self.getPage("/redirect/stringify") 570 561 self.assertStatus('200 OK') 571 protocol = cherrypy.config. get('server.protocol_version')562 protocol = cherrypy.config.serverconf.get('server.protocol_version') 572 563 if protocol == "HTTP/1.1": 573 564 self.assertBody("(['http://127.0.0.1:%s/'], 303)" % self.PORT) … … 598 589 599 590 import cherrypy 600 # streamResponse should be True for this path.591 # http.streamResponse should be True for this path. 601 592 if cherrypy.server.httpserver is None: 602 593 self.assertRaises(ValueError, self.getPage, … … 632 623 633 624 # Test server.throw_errors (ticket #186). 625 cherrypy.config.serverconf.update({'server.throw_errors': True}) 634 626 httpcls = cherrypy.server.httpserverclass 635 627 if httpcls: … … 638 630 else: 639 631 self.assertRaises(ValueError, self.getPage, "/error/rethrow") 632 cherrypy.config.serverconf.update({'server.throw_errors': False}) 640 633 641 634 def testRanges(self): 642 protocol = cherrypy.config. get('server.protocol_version')635 protocol = cherrypy.config.serverconf.get('server.protocol_version') 643 636 if protocol == "HTTP/1.1": 644 637 self.getPage("/ranges/get_ranges", [('Range', 'bytes=3-6')]) … … 787 780 self.assertStatus("501 Not Implemented") 788 781 789 # Request the OPTIONS method with a Request-URI of "*".790 self.getPage("*", method="OPTIONS")791 self.assertStatus("200 OK")792 # Content-Length header required for OPTIONS with no response body.793 # See http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html#sec9.2794 self.assertHeader("Content-Length", "0")795 796 # Now be really dastardly and delete our custom global_ handler,797 # to see if the default one works.798 del Root.global_799 self.getPage("*", method="OPTIONS")800 self.assertStatus("200 OK")801 self.assertHeader("Allow", 'HEAD, GET, POST, PUT, OPTIONS')802 803 782 # For method dispatchers: make sure that an HTTP method doesn't 804 783 # collide with a virtual path atom. If you build HTTP-method … … 821 800 self.getPage("/favicon.ico") 822 801 self.assertBody(data) 823 824 self.getPage("/favicon.ico")825 self.assertBody(data)826 802 827 803 def testCookies(self): … … 842 818 httpcls = cherrypy.server.httpserverclass 843 819 if httpcls: 844 cherrypy.config. update({'server.max_request_header_size': 10})820 cherrypy.config.serverconf.update({'server.max_request_header_size': 10}) 845 821 self.getPage("/maxrequestsize/index") 846 822 self.assertStatus("413 Request Entity Too Large") 847 823 self.assertInBody("Request Entity Too Large") 848 cherrypy.config. update({'server.max_request_header_size': 0})824 cherrypy.config.serverconf.update({'server.max_request_header_size': 0}) 849 825 850 826 # Test for http://www.cherrypy.org/ticket/421 … … 871 847 httpcls = cherrypy.server.httpserverclass 872 848 if httpcls: 873 cherrypy.config.update({ 874 '%s/maxrequestsize' % helper.vroot: {'server.max_request_body_size': 3}}) 849 cherrypy.config.serverconf.update({'server.max_request_body_size': 3}) 875 850 self.getPage('/maxrequestsize/upload', h, "POST", b) 876 851 self.assertStatus("413 Request Entity Too Large") … … 888 863 self.assertHeader('Content-Type', 'text/html') 889 864 890 cherrypy.config. update({'server.default_content_type': 'text/plain'})865 cherrypy.config.serverconf.update({'server.default_content_type': 'text/plain'}) 891 866 self.getPage('/') 892 867 self.assertHeader('Content-Type', 'text/plain') branches/multiapp/cherrypy/test/test_custom_filters.py
r903 r908 7 7 import cherrypy 8 8 from cherrypy import filters 9 from cherrypy.filters.basefilter import BaseFilter 10 11 12 class Numerify(BaseFilter): 13 14 def before_finalize(self): 15 if not cherrypy.config.get("numerify_filter.on", False): 16 return 17 18 def number_it(body): 19 for chunk in body: 20 chunk = chunk.replace("pie", "3.14159") 21 yield chunk 22 cherrypy.response.body = number_it(cherrypy.response.body) 23 24 25 class AccessFilter(BaseFilter): 26 27 def before_request_body(self): 28 if not cherrypy.config.get("access_filter.on", False): 29 return 30 31 if not getattr(cherrypy.request, "login", None): 32 raise cherrypy.HTTPError(401) 33 34 35 # It's not mandatory to inherit from BaseFilter. 36 class NadsatFilter: 37 38 def before_finalize(self): 39 self.ended = False 40 def nadsat_it_up(body): 41 for chunk in body: 42 chunk = chunk.replace("good", "horrorshow") 43 chunk = chunk.replace("piece", "lomtick") 44 yield chunk 45 cherrypy.response.body = nadsat_it_up(cherrypy.response.body) 46 47 def on_end_request(self): 48 # This runs after the request has been completely written out. 49 cherrypy.response.body = "razdrez" 50 self.ended = True 51 9 from custom_filters import NadsatFilter, Numerify 52 10 53 11 … … 57 15 index.exposed = True 58 16 59 cherrypy. root = Root()17 cherrypy.new(root = Root()) 60 18 61 19 … … 69 27 if isinstance(value, types.FunctionType): 70 28 value.exposed = True 71 setattr(cherrypy. root, name.lower(), cls())29 setattr(cherrypy.app.root, name.lower(), cls()) 72 30 class Test(object): 73 31 __metaclass__ = TestType … … 95 53 96 54 cherrypy.config.update({ 97 ' global': {55 'server': { 98 56 # METHOD TWO: 99 57 # Declare a classname in server.input_filters. 100 'server.input_filters': ["cherrypy.test. test_custom_filters.AccessFilter"],101 'server.log_to_screen': False,102 'server.environment': 'production',58 'server.input_filters': ["cherrypy.test.custom_filters.AccessFilter"], 59 }, 60 'global': { 103 61 'server.show_tracebacks': True, 104 62 }, … … 133 91 def testCPFilterList(self): 134 92 # Lazily import _nf, since filters.__init__ will reimport this module. 135 _nf = cherrypy. root.cpfilterlist._cp_filters[0]93 _nf = cherrypy.apps[0].root.cpfilterlist._cp_filters[0] 136 94 137 95 self.getPage("/cpfilterlist/") branches/multiapp/cherrypy/test/test_decodingencoding_filter.py
r876 r908 15 15 mao_zedong.exposed = True 16 16 17 cherrypy. root = Root()17 cherrypy.new(root = Root()) 18 18 cherrypy.config.update({ 19 'server.log_to_screen': False,20 'server.environment': 'production',21 19 'encoding_filter.on': True, 22 20 'decoding_filter.on': True branches/multiapp/cherrypy/test/test_gzip_filter.py
r856 r908 24 24 noshow_stream.exposed = True 25 25 26 cherrypy. root = Root()26 cherrypy.new(root = Root()) 27 27 cherrypy.config.update({ 28 'global': {'server.log_to_screen': False, 29 'server.environment': 'production', 30 'server.show_tracebacks': True, 28 'global': {'server.show_tracebacks': True, 31 29 'gzip_filter.on': True, 32 30 }, branches/multiapp/cherrypy/test/test_logdebuginfo_filter.py
r856 r908 13 13 bug326.exposed = True 14 14 15 cherrypy. root = Root()15 cherrypy.new(root = Root()) 16 16 17 17 cherrypy.config.update({ 18 'server.log_to_screen': False,19 'server.environment': 'production',20 18 'log_debug_info_filter.on': True, 21 19 }) … … 47 45 """ 48 46 cherrypy.config.update({ 49 ('%s/bug326' % helper.vroot): {47 '/bug326': { 50 48 'server.max_request_body_size': 3, 51 49 'server.environment': 'development', branches/multiapp/cherrypy/test/test_noserver.py
r778 r908 16 16 17 17 import cherrypy 18 from cherrypy import _cpwsgi 18 19 19 20 20 class HelloWorld: … … 24 24 wsgi_asp = index 25 25 26 cherrypy.root = HelloWorld() 27 cherrypy.root.test = HelloWorld() 26 r = HelloWorld() 27 cherrypy.new(r) 28 r.test = HelloWorld() 28 29 29 30 cherrypy.config.update({"server.environment": "production"}) branches/multiapp/cherrypy/test/test_objectmapping.py
r886 r908 88 88 return "index for dir4, not exposed" 89 89 90 cherrypy.root = Root() 91 cherrypy.root.exposing = Exposing() 92 cherrypy.root.exposingnew = ExposingNewStyle() 93 cherrypy.root.dir1 = Dir1() 94 cherrypy.root.dir1.dir2 = Dir2() 95 cherrypy.root.dir1.dir2.dir3 = Dir3() 96 cherrypy.root.dir1.dir2.dir3.dir4 = Dir4() 90 def get_tree(): 91 root = Root() 92 root.exposing = Exposing() 93 root.exposingnew = ExposingNewStyle() 94 root.dir1 = Dir1() 95 root.dir1.dir2 = Dir2() 96 root.dir1.dir2.dir3 = Dir3() 97 root.dir1.dir2.dir3.dir4 = Dir4() 98 return root 99 100 app = cherrypy.Application() 101 cherrypy.use(app) 102 app.root = get_tree() 103 # config.update will inspect cherrypy.app (a threadlocal) 104 # to update the appropriate app's config. 97 105 cherrypy.config.update({ 98 'server.log_to_screen': False, 99 'server.environment': "production", 106 'http.mount_point': "/", 100 107 }) 101 108 109 cherrypy.new(root=get_tree()) 110 cherrypy.config.update({ 111 'http.mount_point': "/app2", 112 }) 113 102 114 103 115 import helper 104 116 117 def urljoin(*atoms): 118 url = "/".join(atoms) 119 while "//" in url: 120 url = url.replace("//", "/") 121 return url 122 123 105 124 class ObjectMappingTest(helper.CPWebCase): 106 125 107 126 def testObjectMapping(self): 108 self.getPage('/') 109 self.assertBody('world') 110 111 self.getPage("/dir1/myMethod") 112 self.assertBody("myMethod from dir1, object Path is:'/dir1/myMethod'") 113 114 self.getPage("/this/method/does/not/exist") 115 self.assertBody("default:('this', 'method', 'does', 'not', 'exist')") 116 117 self.getPage("/extra/too/much") 118 self.assertBody("('too', 'much')") 119 120 self.getPage("/other") 121 self.assertBody('other') 122 123 self.getPage("/notExposed") 124 self.assertBody("default:('notExposed',)") 125 126 self.getPage("/dir1/dir2/") 127 self.assertBody('index for dir2, path is:%s/dir1/dir2/' % helper.vroot) 128 129 self.getPage("/dir1/dir2") 130 self.assert_(self.status in ('302 Found', '303 See Other')) 131 self.assertHeader('Location', 'http://%s:%s%s/dir1/dir2/' 132 % (self.HOST, self.PORT, helper.vroot)) 133 134 self.getPage("/dir1/dir2/dir3/dir4/index") 135 self.assertBody("default for dir1, param is:('dir2', 'dir3', 'dir4', 'index')") 136 137 self.getPage("/redirect") 138 self.assertStatus('302 Found') 139 self.assertHeader('Location', 'http://%s:%s%s/dir1/' 140 % (self.HOST, self.PORT, helper.vroot)) 141 142 # Test that we can use URL's which aren't all valid Python identifiers 143 # This should also test the %XX-unquoting of URL's. 144 self.getPage("/Von%20B%fclow?ID=14") 145 self.assertBody("ID is 14") 146 147 # Test that %2F in the path doesn't get unquoted too early; 148 # that is, it should not be used to separate path components. 149 # See ticket #393. 150 self.getPage("/page%2Fname") 151 self.assertBody("default:('page/name',)") 127 def getPage(path): 128 return self.getPage(urljoin(mount_point, path)) 129 130 for mount_point in ("/", "/app2"): 131 getPage('/') 132 self.assertBody('world') 133 134 getPage("/dir1/myMethod") 135 self.assertBody("myMethod from dir1, object Path is:'/dir1/myMethod'") 136 137 getPage("/this/method/does/not/exist") 138 self.assertBody("default:('this', 'method', 'does', 'not', 'exist')") 139 140 getPage("/extra/too/much") 141 self.assertBody("('too', 'much')") 142 143 getPage("/other") 144 self.assertBody('other') 145 146 getPage("/notExposed") 147 self.assertBody("default:('notExposed',)") 148 149 d1d2 = "/dir1/dir2/" 150 getPage(d1d2) 151 self.assertBody('index for dir2, path is:%s' % 152 urljoin(mount_point, d1d2)) 153 154 getPage("/dir1/dir2") 155 self.assert_(self.status in ('302 Found', '303 See Other')) 156 self.assertHeader('Location', 'http://%s:%s%s' 157 % (self.HOST, self.PORT, 158 urljoin(mount_point, d1d2))) 159 160 getPage("/dir1/dir2/dir3/dir4/index") 161 self.assertBody("default for dir1, param is:('dir2', 'dir3', 'dir4', 'index')") 162 163 getPage("/redirect") 164 self.assertStatus('302 Found') 165 self.assertHeader('Location', 'http://%s:%s%s' 166 % (self.HOST, self.PORT, 167 urljoin(mount_point, "/dir1/"))) 168 169 # Test that we can use URL's which aren't all valid Python identifiers 170 # This should also test the %XX-unquoting of URL's. 171 getPage("/Von%20B%fclow?ID=14") 172 self.assertBody("ID is 14") 173 174 # Test that %2F in the path doesn't get unquoted too early; 175 # that is, it should not be used to separate path components. 176 # See ticket #393. 177 getPage("/page%2Fname") 178 self.assertBody("default:('page/name',)") 152 179 153 180 def testPositionalParams(self): branches/multiapp/cherrypy/test/test_response_headers_filter.py
r872 r908 15 15 return "salut" 16 16 other.exposed = True 17 18 cherrypy.root = Root() 17 18 cherrypy.new(root = Root()) 19 cherrypy.config.update({ 20 '/other': { 21 'response_headers_filter.on': True, 22 'response_headers_filter.headers': [("Content-Language", "fr"), 23 ('Content-Type', 'text/plain')] 24 }, 25 }) 26 19 27 20 28 import helper … … 28 36 29 37 def testResponseHeadersFilter(self): 30 cherrypy.config.update({'/other': {31 'response_headers_filter.on': True,32 'response_headers_filter.headers': [("Content-Language", "fr"),33 ('Content-Type', 'text/plain')]34 }})35 38 self.getPage('/other') 36 39 self.assertHeader("Content-Language", "fr") branches/multiapp/cherrypy/test/test_session_filter.py
r856 r908 16 16 testStr.exposed = True 17 17 18 cherrypy. root = Root()18 cherrypy.new(root = Root()) 19 19 cherrypy.config.update({ 20 'server.log_to_screen': False,21 'server.environment': 'production',22 20 'session_filter.on': True, 23 21 'session_filter.storage_type' : 'file', branches/multiapp/cherrypy/test/test_sessionauthenticate_filter.py
r871 r908 9 9 index.exposed = True 10 10 11 cherrypy.root = Test() 11 cherrypy.new(root = Test()) 12 cherrypy.config.update({ 13 'session_filter.on': True, 14 'session_authenticate_filter.on': True, 15 }) 12 16 13 cherrypy.config.update({14 'server.log_to_screen': False,15 'server.environment': 'production',16 'session_filter.on': True,17 })18 17 19 cherrypy.config.update({'/':20 {'session_authenticate_filter.on':True,21 }22 })23 18 import helper 24 19 … … 26 21 27 22 def testSessionAuthenticateFilter(self): 28 protocol = cherrypy.config. get('server.protocol_version')23 protocol = cherrypy.config.serverconf.get('server.protocol_version') 29 24 # request a page and check for login form 30 25 self.getPage('/') branches/multiapp/cherrypy/test/test_states.py
r897 r908 21 21 restart.exposed = True 22 22 23 cherrypy. root = Root()23 cherrypy.new(root = Root()) 24 24 cherrypy.config.update({ 25 'global': { 26 'server.log_to_screen': False, 27 'server.environment': 'production', 28 }, 29 }) 25 'server': {'server.log_to_screen': False}, 26 'server.environment': 'production', 27 }) 30 28 31 29 class Dependency: … … 69 67 70 68 if self.serverClass: 71 host = cherrypy.config. get('server.socket_host')72 port = cherrypy.config. get('server.socket_port')69 host = cherrypy.config.serverconf.get('server.socket_host') 70 port = cherrypy.config.serverconf.get('server.socket_port') 73 71 self.assertRaises(IOError, cherrypy._cpserver.check_port, host, port) 74 72 … … 176 174 177 175 def run(server, conf): 178 helper.setConfig(conf) 176 cherrypy.config.serverconf.update(conf) 177 cherrypy.config.update({'server.environment': 'production'}) 179 178 ServerStateTests.serverClass = server 180 179 suite = helper.CPTestLoader.loadTestsFromTestCase(ServerStateTests) branches/multiapp/cherrypy/test/test_static_filter.py
r900 r908 23 23 24 24 25 cherrypy. root = Root()26 cherrypy. root.static = Static()25 cherrypy.new(root = Root()) 26 cherrypy.app.root.static = Static() 27 27 28 28 cherrypy.config.update({ 29 29 'global': { 30 30 'static_filter.on': False, 31 'server.log_to_screen': False,32 'server.environment': 'production',33 31 }, 34 32 '/static': { … … 51 49 }, 52 50 }) 51 53 52 54 53 import helper branches/multiapp/cherrypy/test/test_tutorials.py
r899 r908 12 12 def load_tut_module(self, tutorialName): 13 13 """Import or reload tutorial module as needed.""" 14 cherrypy.config.reset() 14 15 cherrypy.apps = [] 15 16 16 17 target = "cherrypy.tutorial." + tutorialName … … 20 21 module = __import__(target, globals(), locals(), ['']) 21 22 22 cherrypy.config.update({'server.socket_host': self.HOST, 23 'server.socket_port': self.PORT, 24 'server.thread_pool': 10, 25 'server.log_to_screen': False, 26 'server.environment': "production", 27 }) 23 cherrypy.config.update({'server.environment': 'production'}) 28 24 29 25 def test01HelloWorld(self): … … 160 156 self.getPage("/toggleTracebacks") 161 157 self.assertEqual(cherrypy.config.get('server.show_tracebacks'), not tracebacks) 162 self.assertStatus( "302 Found")158 self.assertStatus(('302 Found', '303 See Other')) 163 159 164 160 self.getPage("/error?code=500") branches/multiapp/cherrypy/test/test_virtualhost_filter.py
r883 r908 23 23 24 24 25 cherrypy.root = Root() 26 cherrypy.root.mydom2 = VHost("Domain 2") 27 cherrypy.root.mydom3 = VHost("Domain 3") 25 r = Root() 26 cherrypy.new(r) 27 r.mydom2 = VHost("Domain 2") 28 r.mydom3 = VHost("Domain 3") 28 29 29 30 cherrypy.config.update({ 30 'server.logToScreen': False,31 'server.environment': 'production',32 31 'virtual_host_filter.on': True, 33 32 'virtual_host_filter.www.mydom2.com': '/mydom2', … … 35 34 'virtual_host_filter.www.mydom4.com': '/dom4', 36 35 }) 36 37 37 38 38 import helper branches/multiapp/cherrypy/test/test_xmlrpc_filter.py
r856 r908 52 52 test_argument_passing.exposed = True 53 53 54 cherrypy.root = Root() 55 cherrypy.root.xmlrpc = XmlRpc() 54 r = Root() 55 cherrypy.new(r) 56 r.xmlrpc = XmlRpc() 56 57 57 58 … … 59 60 60 61 cherrypy.config.update({ 61 'global': {'server.log_to_screen': False, 62 'server.environment': 'production', 63 'server.show_tracebacks': True, 64 'server.socket_host': helper.CPWebCase.HOST, 65 'server.socket_port': helper.CPWebCase.PORT, 66 }, 67 '/xmlrpc': {'xmlrpc_filter.on':True}, 62 'server': { 63 'server.socket_host': helper.CPWebCase.HOST, 64 'server.socket_port': helper.CPWebCase.PORT, 65 }, 66 'global': {'server.show_tracebacks': True}, 67 '/xmlrpc': {'xmlrpc_filter.on': True}, 68 68 }) 69 69 … … 136 136 137 137 if __name__ == '__main__': 138 from cherrypy import _cpwsgi 139 serverClass = _cpwsgi.WSGIServer 140 helper.testmain(serverClass) 138 helper.testmain("cherrypy._cpwsgi.WSGIServer") 141 139 branches/multiapp/cherrypy/tutorial/bonus-sqlobject.py
r762 r908 166 166 print "If you're running this application for the first time, please go to http://localhost:8080/reset once in order to create the database!" 167 167 168 cherrypy. root = ContactManager()168 cherrypy.new(root = ContactManager()) 169 169 cherrypy.server.start() branches/multiapp/cherrypy/tutorial/tut01_helloworld.py
r762 r908 25 25 # to objects, so we need to mount a request handler object here. A request 26 26 # to '/' will be mapped to cherrypy.root.index(). 27 cherrypy. root = HelloWorld()27 cherrypy.new(root = HelloWorld()) 28 28 29 29 if __name__ == '__main__': branches/multiapp/cherrypy/tutorial/tut02_expose_methods.py
r762 r908 20 20 showMessage.exposed = True 21 21 22 cherrypy. root = HelloWorld()22 cherrypy.new(root = HelloWorld()) 23 23 24 24 if __name__ == '__main__': branches/multiapp/cherrypy/tutorial/tut03_get_and_post.py
r762 r908 41 41 42 42 43 cherrypy. root = WelcomePage()43 cherrypy.new(root = WelcomePage()) 44 44 45 45 branches/multiapp/cherrypy/tutorial/tut04_complex_site.py
r762 r908 75 75 76 76 # Of course we can also mount request handler objects right here! 77 cherrypy. root = HomePage()78 cherrypy. root.joke = JokePage()79 cherrypy. root.links = LinksPage()77 cherrypy.new(root = HomePage()) 78 cherrypy.app.root.joke = JokePage() 79 cherrypy.app.root.links = LinksPage() 80 80 81 81 # Remember, we don't need to mount ExtraLinksPage here, because branches/multiapp/cherrypy/tutorial/tut05_derived_objects.py
r762 r908 70 70 71 71 72 cherrypy. root = HomePage()72 cherrypy.new(root = HomePage()) 73 73 74 74 branches/multiapp/cherrypy/tutorial/tut06_default_method.py
r762 r908 51 51 52 52 53 cherrypy. root = UsersPage()53 cherrypy.new(root = UsersPage()) 54 54 55 55 branches/multiapp/cherrypy/tutorial/tut07_sessions.py
r856 r908 28 28 29 29 30 cherrypy. root = HitCounter()30 cherrypy.new(root = HitCounter()) 31 31 cherrypy.config.update({'session_filter.on': True}) 32 32 branches/multiapp/cherrypy/tutorial/tut08_generators_and_yield.py
r762 r908 33 33 index.exposed = True 34 34 35 cherrypy. root = GeneratorDemo()35 cherrypy.new(root = GeneratorDemo()) 36 36 37 37 branches/multiapp/cherrypy/tutorial/tut09_files.py
r762 r908 87 87 88 88 89 cherrypy. root = FileDemo()89 cherrypy.new(root = FileDemo()) 90 90 91 91 if __name__ == '__main__': branches/multiapp/cherrypy/tutorial/tut10_http_errors.py
r856 r908 62 62 63 63 64 cherrypy. root = HTTPErrorDemo()64 cherrypy.new(root = HTTPErrorDemo()) 65 65 66 66 # Set a custom response for 403 errors. branches/multiapp/cherrypy/tutorial/tutorial.conf
r650 r908 1 [ global]1 [server] 2 2 server.socketPort = 8080 3 3 server.threadPool = 10 4 5 [global] 4 6 server.environment = "production" 5 7 # server.showTracebacks = True

