Steve Alexander wrote:
def __getitem__/__getattr__ from HTTPRequest.py:
"""Get a variable value
Return a value for the required variable name. The value will be looked up from one of the request data categories. The search order is environment variables, other variables, form data, and then cookies.
Doesn't mention URL parameters on there, does it ;-) I wonder where they figure in?
The code certainly doesn't stick exactly to its docstring. The "other" dictionary is seached first, then URLx where x is a number. Then "environ" is searched, but *only* if the key begins with 'HTTP_' or is in the following list:
This looks really messy. I bet it tallies up with what's in the Zope DTML Reference near the REQUEST description in more ways than with the docstring... Shane wrote:
I think the issue is that environ may include the Zope process environment variables, such as PATH, LD_LIBRARY_PATH, CVSROOT, USER, etc. Publish.publish_module() appears to pass in os.environ . That's just a quick analysis, though.
Hurm, there's still the order issue. And that fact that they're visible if you do <dtml-var REQUEST>. Wow, should this go in dev.zope.org or the Collector (phrased for collector, but that can change): The handling of variable in REQUEST is a bit messy. The following should all behave the same, in terms of the order variables are searched and what variables are included: - <dtml-var REQUEST> - __getitem__ in HTTPRequest.py - variables that appear in the DTML/other type of method namespace Should the patch to HTTPRequest.py below be included into Zope? """ #" + environ=self.environ + if environ.has_key(key) and (not hide_key(key)): + return environ[key] other=self.other if other.has_key(key): if key=='REQUEST': return self return other[key] if key[:1]=='U' and URLmatch(key) >= 0: path = self._script + self._steps n = len(path) - atoi(key[3:]) if n < 0: raise KeyError, key URL=join([other['SERVER_URL']] + path[:n], '/') other[key]=URL self._urls = self._urls + (key,) return URL - if isCGI_NAME(key) or key[:5] == 'HTTP_': - environ=self.environ - if environ.has_key(key) and (not hide_key(key)): - return environ[key] - return ''