# Methoden fuer die einzelnen HTTP requests gibt es bereits (allerdins ohne exception handling) # moegliche aufrufe: # normaler aufruf: http_REQ(http_GET, someurl) # aufruf mit eigenem error handler: hdl = HTTPError_Handler('404', 'not found', some_method, some_arguments) f = http_REQ(http_GET, someurl, hdl) def http_REQ(kind, url, custom_handlers = None, text = True, run = True, debug = False): """ do safe HTTP request kind: kind of request (e.g. GET, PUT, POST...); has to be passed a method-object url: url custom_handlers: custom error handles (optional) text, run, debug: print text, run method, print debug output """ try: return kind(url) except urllib2.HTTPError, e: err = HTTPError(e) if custom_handlers: #TODO: support for more handlers... err.setHandler(custom_handlers) print err if text: print err.current.text if run: err.current.runerr() if debug: print err.errObj print err.errObj.read() return None class HTTPError: """handle HTTP Errors""" def __init__(self, errObj): self.errObj = errObj self.current = None self.handlers = {} # create some standard error handlers: self.handlers['403'] = HTTPError_Handler('403', 'permission denied', None) self.handlers['404'] = HTTPError_Handler('404', 'no such file or package or project', None) self.handlers['500'] = HTTPError_Handler('500', 'internal server error', None) self.handlers['unknown'] = HTTPError_Handler(str(self.errObj.code), 'unknown error', None) self.findHandler() def findHandler(self): """check if we can handle the current error""" if self.handlers.has_key(str(self.errObj.code)): self.current = self.handlers[str(self.errObj.code)] else: self.current = self.handlers['unknown'] def setHandler(self, hdl): """set a custom handler""" self.handlers[hdl.errCode] = hdl self.findHandler() def __str__(self): r = [] r.append('HTTPError: %d' % self.errObj.code) r.append(' active handlers: %d' % len(self.handlers)) r.append(' self.current: %s' % self.current) return '\n'.join(r) class HTTPError_Handler: def __init__(self, errCode, text, method, *args): """ errCode: the HTTP error code text: description of the error (which can be printed to the user) method: method which should be invoked *args: arguments which should be passed to the method """ self.errCode = errCode self.text = text self.run = method self.run_args = args def runerr(self): if self.run != None: self.run(*self.run_args) def __str__(self): return 'HTTPError_Handler for \'' + self.errCode + '\' errors'