Mercurial > hg > mercurial-crew-with-dirclash
comparison mercurial/hgweb/hgweb_mod.py @ 3262:3207e30bf468
hgweb: support for generating and parsing NWI URLs
author | Brendan Cully <brendan@kublai.com> |
---|---|
date | Wed, 04 Oct 2006 17:04:40 -0700 |
parents | 329ac0c0c0e8 |
children | b4f16bf59a5d |
comparison
equal
deleted
inserted
replaced
3261:1e322b44b366 | 3262:3207e30bf468 |
---|---|
646 del form[k] | 646 del form[k] |
647 | 647 |
648 def rewrite_request(req): | 648 def rewrite_request(req): |
649 '''translate new web interface to traditional format''' | 649 '''translate new web interface to traditional format''' |
650 | 650 |
651 def spliturl(req): | |
652 def firstitem(query): | |
653 return query.split('&', 1)[0].split(';', 1)[0] | |
654 | |
655 base = '' | |
656 if req.env.has_key('REPO_NAME'): | |
657 base = '/' + req.env['REPO_NAME'] | |
658 elif req.env.get('SCRIPT_NAME'): | |
659 base = req.env['SCRIPT_NAME'] | |
660 | |
661 pi = req.env.get('PATH_INFO') | |
662 if pi: | |
663 if pi.startswith(base): | |
664 if len(pi) > len(base): | |
665 base += '/' | |
666 query = pi[len(base):] | |
667 else: | |
668 if req.env.has_key('REPO_NAME'): | |
669 # We are using hgwebdir | |
670 base += '/' | |
671 else: | |
672 base += '?' | |
673 query = firstitem(req.env['QUERY_STRING']) | |
674 else: | |
675 base += '/' | |
676 query = pi[1:] | |
677 else: | |
678 base += '?' | |
679 query = firstitem(req.env['QUERY_STRING']) | |
680 | |
681 return (base, query) | |
682 | |
683 req.url, query = spliturl(req) | |
684 | |
651 if req.form.has_key('cmd'): | 685 if req.form.has_key('cmd'): |
652 # old style | 686 # old style |
653 return | 687 return |
654 if req.env.has_key('SCRIPT_URL'): | |
655 # run through web server | |
656 base = req.env['SCRIPT_URL'] | |
657 # strip repo and leading '/' or '?' | |
658 query = req.env['REQUEST_URI'][len(base)+1:] | |
659 else: | |
660 query = req.env['PATH_INFO'][1:] | |
661 | 688 |
662 args = query.split('/', 2) | 689 args = query.split('/', 2) |
663 if not args or not args[0]: | 690 if not args or not args[0]: |
664 return | 691 return |
665 | 692 |
666 cmd = args.pop(0) | 693 cmd = args.pop(0) |
667 style = cmd.rfind('-') | 694 style = cmd.rfind('-') |
668 if style != -1: | 695 if style != -1: |
669 req.form['style'] = [cmd[:style]] | 696 req.form['style'] = [cmd[:style]] |
670 cmd = cmd[style+1:] | 697 cmd = cmd[style+1:] |
671 req.form['cmd'] = [cmd] | 698 # avoid accepting e.g. style parameter as command |
699 if hasattr(self, 'do_' + cmd): | |
700 req.form['cmd'] = [cmd] | |
672 | 701 |
673 if args and args[0]: | 702 if args and args[0]: |
674 node = args.pop(0) | 703 node = args.pop(0) |
675 req.form['node'] = [node] | 704 req.form['node'] = [node] |
676 if args: | 705 if args: |
699 b = os.path.basename("map-" + style) | 728 b = os.path.basename("map-" + style) |
700 p = os.path.join(self.templatepath, b) | 729 p = os.path.join(self.templatepath, b) |
701 if os.path.isfile(p): | 730 if os.path.isfile(p): |
702 m = p | 731 m = p |
703 | 732 |
704 port = req.env["SERVER_PORT"] | 733 if not req.url: |
705 port = port != "80" and (":" + port) or "" | 734 port = req.env["SERVER_PORT"] |
706 uri = req.env["REQUEST_URI"] | 735 port = port != "80" and (":" + port) or "" |
707 if "?" in uri: | 736 uri = req.env["REQUEST_URI"] |
708 uri = uri.split("?")[0] | 737 if "?" in uri: |
709 url = "http://%s%s%s" % (req.env["SERVER_NAME"], port, uri) | 738 uri = uri.split("?")[0] |
739 req.url = "http://%s%s%s" % (req.env["SERVER_NAME"], port, uri) | |
740 | |
710 if not self.reponame: | 741 if not self.reponame: |
711 self.reponame = (self.repo.ui.config("web", "name") | 742 self.reponame = (self.repo.ui.config("web", "name") |
712 or uri.strip('/') or self.repo.root) | 743 or req.env.get('REPO_NAME') |
744 or req.url.strip('/') or self.repo.root) | |
713 | 745 |
714 self.t = templater.templater(m, templater.common_filters, | 746 self.t = templater.templater(m, templater.common_filters, |
715 defaults={"url": url, | 747 defaults={"url": req.url, |
716 "repo": self.reponame, | 748 "repo": self.reponame, |
717 "header": header, | 749 "header": header, |
718 "footer": footer, | 750 "footer": footer, |
719 "rawfileheader": rawfileheader, | 751 "rawfileheader": rawfileheader, |
720 }) | 752 }) |