Merge lp:~openerp-dev/openobject-server/trunk-werkzeug_debugger-rga into lp:openobject-server

Proposed by Ravi Gadhia (OpenERP)
Status: Needs review
Proposed branch: lp:~openerp-dev/openobject-server/trunk-werkzeug_debugger-rga
Merge into: lp:openobject-server
Diff against target: 98 lines (+59/-1)
2 files modified
openerp/service/wsgi_server.py (+58/-1)
openerp/tools/config.py (+1/-0)
To merge this branch: bzr merge lp:~openerp-dev/openobject-server/trunk-werkzeug_debugger-rga
Reviewer Review Type Date Requested Status
Vo Minh Thu Pending
Review via email: mp+169808@code.launchpad.net

Description of the change

Hello,
     Integrate OpenERP server with werkzeug debugger tool, start server with --debug-werkzeug which start werkzeug debug tools, catch openerp internal server error and return interactive trackback page to client.
relevant client branch ==> https://code.launchpad.net/~openerp-dev/openerp-web/trunk-werkzeug_debugger-rga

http://werkzeug.pocoo.org/docs/debug/

To post a comment you must log in.
4903. By RGA(OpenERP)

Merge with trunk

4904. By RGA(OpenERP)

Merge with trunk

4905. By RGA(OpenERP)

Merge with trunk

4906. By RGA(OpenERP)

Merge with trunk

Unmerged revisions

4906. By RGA(OpenERP)

Merge with trunk

4905. By RGA(OpenERP)

Merge with trunk

4904. By RGA(OpenERP)

Merge with trunk

4903. By RGA(OpenERP)

Merge with trunk

4902. By RGA(OpenERP)

[ADD] werkzeug debugger

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'openerp/service/wsgi_server.py'
2--- openerp/service/wsgi_server.py 2013-06-06 12:42:59 +0000
3+++ openerp/service/wsgi_server.py 2013-08-02 09:01:31 +0000
4@@ -40,10 +40,12 @@
5
6 import werkzeug.serving
7 import werkzeug.contrib.fixers
8-
9+from werkzeug.debug import DebuggedApplication
10+from werkzeug.debug.tbtools import get_current_traceback
11 import openerp
12 import openerp.tools.config as config
13 import websrv_lib
14+from lxml import etree
15
16 _logger = logging.getLogger(__name__)
17
18@@ -422,6 +424,60 @@
19 else:
20 return application_unproxied(environ, start_response)
21
22+class WerkzeugDebugger(DebuggedApplication):
23+ def debug_application(self, environ, start_response):
24+ """Run the application and conserve the traceback frames."""
25+ app_iter = None
26+ try:
27+ app_iter = self.app(environ, start_response)
28+ for item in app_iter:
29+ yield item
30+ if hasattr(app_iter, 'close'):
31+ app_iter.close()
32+ except Exception:
33+ if hasattr(app_iter, 'close'):
34+ app_iter.close()
35+ traceback = get_current_traceback(skip=1, show_hidden_frames=
36+ self.show_hidden_frames,
37+ ignore_system_exceptions=True)
38+ for frame in traceback.frames:
39+ self.frames[frame.id] = frame
40+ self.tracebacks[traceback.id] = traceback
41+
42+ try:
43+ start_response('500 INTERNAL SERVER ERROR', [
44+ ('Content-Type', 'text/html; charset=utf-8')
45+ ])
46+ except Exception:
47+ # if we end up here there has been output but an error
48+ # occurred. in that situation we can do nothing fancy any
49+ # more, better log something into the error log and fall
50+ # back gracefully.
51+ environ['wsgi.errors'].write(
52+ 'Debugging middleware caught exception in streamed '
53+ 'response at a point where response headers were already '
54+ 'sent.\n')
55+ else:
56+ debug_page = traceback.render_full(evalex=self.evalex,
57+ lodgeit_url=self.lodgeit_url,
58+ secret=self.secret) \
59+ .encode('utf-8', 'replace')
60+ page_tree = etree.HTML(debug_page)
61+ script = page_tree.findall(".//script")
62+ if script:
63+ script[-1].text = "$.noConflict();\n" + script[-1].text
64+ debug_page = etree.tostring(page_tree, pretty_print=True, method="html")
65+ yield debug_page
66+
67+ traceback.log(environ['wsgi.errors'])
68+
69+def debug_application():
70+ if 'werkzeug:DEBUG' in config['log_handler']:
71+ return WerkzeugDebugger(application, evalex=True)
72+ else:
73+ return application
74+
75+
76 # The WSGI server, started by start_server(), stopped by stop_server().
77 httpd = None
78
79@@ -433,6 +489,7 @@
80 """
81
82 global httpd
83+ application = debug_application();
84 if not openerp.evented:
85 httpd = werkzeug.serving.make_server(interface, port, application, threaded=threaded)
86 else:
87
88=== modified file 'openerp/tools/config.py'
89--- openerp/tools/config.py 2013-03-28 09:50:06 +0000
90+++ openerp/tools/config.py 2013-08-02 09:01:31 +0000
91@@ -177,6 +177,7 @@
92 group.add_option('--log-response', action="append_const", dest="log_handler", const="openerp.netsvc.rpc.response:DEBUG", help='shortcut for --log-handler=openerp.netsvc.rpc.response:DEBUG')
93 group.add_option('--log-web', action="append_const", dest="log_handler", const="openerp.addons.web.http:DEBUG", help='shortcut for --log-handler=openerp.addons.web.http:DEBUG')
94 group.add_option('--log-sql', action="append_const", dest="log_handler", const="openerp.sql_db:DEBUG", help='shortcut for --log-handler=openerp.sql_db:DEBUG')
95+ group.add_option('--debug-werkzeug', action="append_const", dest="log_handler", const="werkzeug:DEBUG", help='Werkzeug debug mode. shortcut for --log-handler=werkzeug:DEBUG')
96 # For backward-compatibility, map the old log levels to something
97 # quite close.
98 levels = ['info', 'debug_rpc', 'warn', 'test', 'critical',