diff -r 0b2d4089180c Lib/urllib/request.py --- a/Lib/urllib/request.py Wed Apr 10 17:01:38 2013 -0400 +++ b/Lib/urllib/request.py Sat Apr 13 17:16:51 2013 -0400 @@ -371,42 +371,40 @@ raise TypeError("expected BaseHandler instance, got %r" % type(handler)) + action_lookup = { + 'open': self.handle_open, + 'response': self.process_response, + 'request': self.process_request, + 'error': self.handle_error + } + added = False - for meth in dir(handler): - if meth in ["redirect_request", "do_open", "proxy_open"]: + for method in dir(handler): + if method in ["redirect_request", "do_open", "proxy_open"]: # oops, coincidental match continue - i = meth.find("_") - protocol = meth[:i] - condition = meth[i+1:] + split_method_name = method.split('_') + protocol = split_method_name[0] + event = split_method_name[1] if len(split_method_name) > 1 else '' + + if event not in action_lookup: + continue + else: + if event == 'error': + kind = split_method_name[2] if len(split_method_name) > 2 else '' + try: + kind = int(kind) + except ValueError: + pass + action = action_lookup[event].get(protocol, {}) + self.handle_error[protocol] = action + else: + kind = protocol + action = action_lookup[event] - if condition.startswith("error"): - j = condition.find("_") + i + 1 - kind = meth[j+1:] - try: - kind = int(kind) - except ValueError: - pass - lookup = self.handle_error.get(protocol, {}) - self.handle_error[protocol] = lookup - elif condition == "open": - kind = protocol - lookup = self.handle_open - elif condition == "response": - kind = protocol - lookup = self.process_response - elif condition == "request": - kind = protocol - lookup = self.process_request - else: - continue - - handlers = lookup.setdefault(kind, []) - if handlers: - bisect.insort(handlers, handler) - else: - handlers.append(handler) + handlers = action.setdefault(kind, []) + bisect.insort(handlers, handler) added = True if added: