예제 #1
0
파일: webui.py 프로젝트: ylafon/redbot
    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
예제 #2
0
파일: red_fetcher.py 프로젝트: acdha/redbot
    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()
예제 #3
0
파일: unicorn_ui.py 프로젝트: nunnun/redbot
    def done(self):
#        self.formatter.finish_output()
        nbhttp.stop()
예제 #4
0
파일: webui.py 프로젝트: ylafon/redbot
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()
예제 #5
0
파일: webui.py 프로젝트: BigBlueHat/redbot
 def timeoutError(self):
     """ Max runtime reached."""
     self.output(error_template % ("RED timeout."))
     nbhttp.stop() # FIXME: not appropriate for standalone server