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 })