Differences from ``zope.server`` -------------------------------- - Has no non-stdlib dependencies. - No support for non-WSGI servers (no FTP, plain-HTTP, etc); refactorings and slight interface changes as a result. Non-WSGI-supporting code removed. - Slight cleanup in the way application response headers are handled (no more "accumulated headers"). - Supports the HTTP 1.1 "expect/continue" mechanism (required by WSGI spec). - Calls "close()" on the app_iter object returned by the WSGI application. - Allows trusted proxies to override ``wsgi.url_scheme`` for particular requests by supplying the ``X_FORWARDED_PROTO`` header. - Supports an explicit ``wsgi.url_scheme`` parameter for ease of deployment behind SSL proxies. - Different adjustment defaults (less conservative). - Python 3 compatible. - More test coverage (unit tests added, functional tests refactored and more added). - Supports convenience ``waitress.serve`` function (e.g. ``from waitress import serve; serve(app)`` and convenience ``server.run()`` function. - Returns a "real" write method from start_response. - Provides a getsockname method of the server FBO figuring out which port the server is listening on when it's bound to port 0. - Warns when app_iter bytestream numbytes less than or greater than specified Content-Length. - Set content-length header if len(app_iter) == 1 and none provided. - Raise an exception if start_response isnt called before any body write. - channel.write does not accept non-byte-sequences. - Put maintenance check on server rather than channel to avoid a class of DOS. - wsgi.multiprocess set (correctly) to False. - Ensures header total can not exceed a maximum size. - Ensures body total can not exceed a maximum size. - Broken chunked encoding request bodies don't crash the server. - Handles keepalive/pipelining properly (no out of order responses, no premature channel closes). - Send a 500 error to the client when a task raises an uncaught exception (with optional traceback rendering via "expose_traceback" adjustment). - Supports HTTP/1.1 chunked responses when application doesn't set a Content-Length header. - Dont hang a thread up trying to send data to slow clients. - Supports ``wsgi.file_wrapper`` protocol.