#3783 fakehub --pdb option
Merged 11 months ago by tkopecek. Opened 11 months ago by mikem.
mikem/koji fakehub-debug  into  master

file modified
+38 -11
@@ -4,6 +4,7 @@ 

  

  import ast

  import io

+ import optparse

  import os

  import os.path

  import pprint
@@ -12,12 +13,27 @@ 

  from urllib.parse import quote

  

  sys.path.insert(0, os.getcwd())

- sys.path.insert(1, os.path.join(os.getcwd(), 'kojihub'))

  import koji

- import kojixmlrpc

+ from kojihub import kojixmlrpc

  import koji.xmlrpcplus

  

  

+ # alternate handle_rpc, used when --pdb is given

+ original_handle_rpc = kojixmlrpc.ModXMLRPCRequestHandler.handle_rpc

+ 

+ def handle_rpc(self, environ):

+     try:

+         return original_handle_rpc(self, environ)

+     except Exception:

+         import pdb

+         import traceback

+         etype, e, tb = sys.exc_info()

+         traceback.print_exc()

+         pdb.post_mortem(tb)

+         # re-raise or the app handler will commit

+         raise

+ 

+ 

  def get_url(environ):

      url = environ['wsgi.url_scheme']+'://'

  
@@ -47,20 +63,27 @@ 

          return value

  

  

- def get_request():

-     method = sys.argv[1]

-     args = []

+ def get_options():

+     parser = optparse.OptionParser(usage='%prog [options] <policy_file>')

+     parser.add_option('--pdb', action='store_true',

+                       help='drop into pdb on error')

+     opts, args = parser.parse_args()

+ 

+     # parse request from args

+     method = args[0]

+     callargs = []

      kwargs = {}

-     for s in sys.argv[2:]:

+     for s in args[1:]:

          if '=' in s:

              k, v = s.split('=', 1)

              v = nice_literal(v)

              kwargs[k] = v

          else:

-             args.append(nice_literal(s))

-     args = koji.encode_args(*args, **kwargs)

-     request = koji.xmlrpcplus.dumps(args, method, allow_none=1)

-     return request

+             callargs.append(nice_literal(s))

+     callargs = koji.encode_args(*callargs, **kwargs)

+     opts.request = koji.xmlrpcplus.dumps(callargs, method, allow_none=1)

+ 

+     return opts

  

  

  def start_response(status, headers):
@@ -88,13 +111,17 @@ 

  

  

  def main():

+     options = get_options()

+     if options.pdb:

+         kojixmlrpc.ModXMLRPCRequestHandler.handle_rpc = handle_rpc

+ 

      environ = {}

      environ['SCRIPT_FILENAME'] = kojixmlrpc.__file__

      environ['wsgi.url_scheme'] = 'https'

      environ['SERVER_NAME'] = 'myserver'

      environ['SERVER_PORT'] = '443'

      environ['REQUEST_URI'] = get_url(environ)

-     environ['wsgi.input'] = io.StringIO(get_request())

+     environ['wsgi.input'] = io.StringIO(options.request)

      environ['REQUEST_METHOD'] = 'POST'

      environ['CONTENT_TYPE'] = 'text/xml'

      set_config(environ)

This option is convenient for debugging hub code during development. If the option is given and the call handler errors, it will drop into the debugger right there.

Metadata Update from @tkopecek:
- Pull-request tagged with: no_qe

11 months ago

Commit 8e0fcc5 fixes this pull-request

Pull-Request has been merged by tkopecek

11 months ago
Metadata