def red_handler (method, uri, req_hdrs, res_start, req_pause): p_uri = urlsplit(uri) if static_files.has_key(p_uri.path): res_body, res_done = res_start("200", "OK", [], nbhttp.dummy) res_body(static_files[p_uri.path]) res_done(None) elif p_uri.path == "/": query_string = cgi.parse_qs(p_uri.query) def output_hdrs (status, hdrs): code, phrase = status.split(None, 1) return res_start(code, phrase, hdrs, nbhttp.dummy) try: RedWebUi('/', method, query_string, output_hdrs) except: sys.stderr.write(""" *** FATAL ERROR RED has encountered a fatal error which it really, really can't recover from in standalone server mode. Details follow. """) except_handler_factory(sys.stderr.write)() sys.stderr.write("\n") nbhttp.stop() sys.exit(1) else: res_body, res_done = res_start( "404", "Not Found", [], nbhttp.dummy ) res_done(None) return nbhttp.dummy, nbhttp.dummy
def _response_done(self, err): "Finish anaylsing the response, handling any parse errors." global outstanding_requests self.res_complete = True self.res_error = err if self.status_cb and self.type: self.status_cb("fetched %s (%s)" % (self.uri, self.type)) self.res_body_md5 = self._md5_processor.digest() if err == None: pass elif err['desc'] == nbhttp.error.ERR_BODY_FORBIDDEN['desc']: self.setMessage('header-none', rs.BODY_NOT_ALLOWED) elif err['desc'] == nbhttp.error.ERR_EXTRA_DATA['desc']: self.res_body_len += len(err.get('detail', '')) elif err['desc'] == nbhttp.error.ERR_CHUNK['desc']: self.setMessage('header-transfer-encoding', rs.BAD_CHUNK, chunk_sample=e(err.get('detail', '')[:20])) elif err['desc'] == nbhttp.error.ERR_CONNECT['desc']: self.res_complete = False elif err['desc'] == nbhttp.error.ERR_LEN_REQ['desc']: pass # FIXME: length required elif err['desc'] == nbhttp.error.ERR_URL['desc']: self.res_complete = False elif err['desc'] == nbhttp.error.ERR_READ_TIMEOUT['desc']: self.res_complete = False else: raise AssertionError, "Unknown response error: %s" % err if self.res_complete: # check payload basics if self.parsed_hdrs.has_key('content-length'): if self.res_body_len == self.parsed_hdrs['content-length']: self.setMessage('header-content-length', rs.CL_CORRECT) else: self.setMessage('header-content-length', rs.CL_INCORRECT, body_length=self.res_body_len) if self.parsed_hdrs.has_key('content-md5'): c_md5_calc = base64.encodestring(self.res_body_md5)[:-1] if self.parsed_hdrs['content-md5'] == c_md5_calc: self.setMessage('header-content-md5', rs.CMD5_CORRECT) else: self.setMessage('header-content-md5', rs.CMD5_INCORRECT, calc_md5=c_md5_calc) # analyse, check to see if we're done self.done() outstanding_requests.remove(self) if self.status_cb: self.status_cb("%s outstanding requests" % len(outstanding_requests)) if len(outstanding_requests) == 0: nbhttp.stop()
def done(self): # self.formatter.finish_output() nbhttp.stop()
def standalone_main(port, static_dir): """Run RED as a standalone Web server.""" # load static files static_files = {} def static_walker(arg, dirname, names): for name in names: try: path = os.path.join(dirname, name) if os.path.isdir(path): continue uri = os.path.relpath(path, static_dir) static_files["/static/%s" % uri] = open(path).read() except IOError: sys.stderr.write( "* Problem loading %s\n" % path ) os.path.walk(static_dir, static_walker, "") sys.stderr.write("* Static files loaded.\n") def red_handler (method, uri, req_hdrs, res_start, req_pause): p_uri = urlsplit(uri) if static_files.has_key(p_uri.path): res_body, res_done = res_start("200", "OK", [], nbhttp.dummy) res_body(static_files[p_uri.path]) res_done(None) elif p_uri.path == "/": query_string = cgi.parse_qs(p_uri.query) def output_hdrs (status, hdrs): code, phrase = status.split(None, 1) return res_start(code, phrase, hdrs, nbhttp.dummy) try: RedWebUi('/', method, query_string, output_hdrs) except: sys.stderr.write(""" *** FATAL ERROR RED has encountered a fatal error which it really, really can't recover from in standalone server mode. Details follow. """) except_handler_factory(sys.stderr.write)() sys.stderr.write("\n") nbhttp.stop() sys.exit(1) else: res_body, res_done = res_start( "404", "Not Found", [], nbhttp.dummy ) res_done(None) return nbhttp.dummy, nbhttp.dummy nbhttp.Server("", port, red_handler) try: nbhttp.run() except KeyboardInterrupt: sys.stderr.write("Stopping...\n") nbhttp.stop()
def timeoutError(self): """ Max runtime reached.""" self.output(error_template % ("RED timeout.")) nbhttp.stop() # FIXME: not appropriate for standalone server