mercurial/hgweb/hgweb_mod.py
changeset 3263 3207e30bf468
parent 3261 329ac0c0c0e8
child 3267 b4f16bf59a5d
equal deleted inserted replaced
3262:1e322b44b366 3263: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                                                })