def rewrite_uri(self, uri, force_rewrite=False): """Pass on extended Draco URI components.""" if callable(uri): extension = self.m_api.options['extension'] uri = dracouri.uri_from_method(uri, extension) scheme, host, path, query = urimod.parse_uri(uri) if scheme and scheme != 'http': return uri docroot = self.m_request.docroot() extension = self.m_api.options['extension'] servername = self.m_request.servername() parts = dracouri.parse_draco_uri(uri, docroot) if not force_rewrite and (parts[1] and parts[1] != servername) \ or not parts[3].endswith('.' + extension): return uri locale = self.m_request.locale() if hasattr(self.m_api, 'session'): sessionid = self.m_api.session.sessionid() else: sessionid = None if sessionid: sessionid = list(sessionid) # subsession if not default if self.m_rewrite_link_level == 0: sessionid[0] = None if sessionid[1] == 0: sessionid[1] = None # subsession unconditionally elif self.m_rewrite_link_level == 1: sessionid[0] = None session = dump_sessionid(sessionid) else: session = None uri = self.paste_uri(uri, locale=locale, session=session) return uri
def _create(cls, api): """Factory function.""" uri = api.iface.uri() docroot = api.options['documentroot'] scheme, host, path, args = urilib.parse_uri(uri) directory, filename, pathinfo = urilib.resolve_path_uri(path, docroot) dirname = directory.replace('/', os.sep) relname = os.path.join(dirname, '__handler__.py') cls = api.loader.load_class(relname, Handler, scope='__docroot__', default=cls) handler = cls() return handler
def parse_draco_uri(uri, docroot): """Decompose an URI into Draco specific components. The return value is the 8-tuple: (protocol, host, path, filename, locale, session, pathinfo, args) """ protocol, host, path, args = urimod.parse_uri(uri) directory, filename, pathinfo = urimod.resolve_path_uri(path, docroot) parts = pathinfo.split('/') if parts and islocale(parts[0]): locale = parts[0] parts = parts[1:] else: locale = '' if parts and issessionid(parts[0]): session = parts[0] parts = parts[1:] else: session = '' pathinfo = '/'.join(parts) return (protocol, host, directory, filename, locale, session, pathinfo, args)
def _parse_uri(self): """Parse the request URI.""" uri = self.m_iface.uri() docroot = self.m_iface.options()['documentroot'] protocol, host, path, args = urilib.parse_uri(uri) directory, filename, pathinfo = urilib.resolve_path_uri(path, docroot) self.m_docroot = docroot self.m_directory = directory self.m_filename = filename self.m_pathinfo = [ pi for pi in pathinfo.split('/') if pi ] self.m_args = {} args = urilib.parse_query(args) self._add_args(args) if self.m_iface.method() == 'POST': ctype = self.header('content-type') if ctype is not None: value, options = http.parse_header_options(ctype) if value in ('application/x-www-form-urlencoded', 'multipart/form-data'): args = http.parse_post(self.headers(), self) self._add_args(args) self.m_basename, self.m_extension = os.path.splitext(self.filename()) self.m_extension = self.m_extension[1:]
def test_parse_uri(self): for uri,parts in self.data: assert urimod.parse_uri(uri) == parts