>
> "N.G.Smith" writes:
> > I have been using the cgi.py stuff that you posted recently in response
> > to a request I made on the python list. I have found a bug in the
> > unquoting code. It seems to me that it assumes that hex digits will be
> > uppercase. In fact the urllib module escapes using lowercase hex
> > digits. My fix was to replace all the conversion code with a call to
> > urllib.unquote.
>
> Thanks for the bug report. The fix also eliminated some ugly code. I've
> incorporated your suggestion and attached the update.
>
[...]
> nv = string.splitfields(name_value, '=')
> name = nv[0]
> value = urllib.unquote(nv[1])
Unquoting the "%" hex escapes in the string before unescaping the
additional space to "+" that FORMS adds make it impossible to
later disambiguate escaped spaces ( "+" ) from the character "+"
(i.e. The FORM value "Tristan + Dan" was unquoting to "Tristan+++Dan")
So I added the functions:
def enspace( str ):
r = ''
for c in str:
if c == '+' : c = ' '
r = r + c
return r
def unescape( str ):
return urllib.unquote( enspace( str ) )
And replaced the line:
> value = urllib.unquote(nv[1])
with:
value = unescape( str )
Which seems to make it work correctly.
I also added the useful utility routine:
def wrap( co, s ):
return "<" + co + ">\n" + s + "\n</" + co + ">\n"
called as in:
print wrap( 'HD2', "The Query: " )
------
Some other questions that come to mind that I won't be able
to get to for a couple of weeks:
A printlist() that formats python lists as HTML LISTS and
python dictionaries as HTML DEFINITION LISTS would also be
useful
>>> a='<sdm7g@Virginia.EDU>'
>>> print regsub.gsub( '>', '>', regsub.gsub( '<','<',a))
<sdm7g@Virginia.EDU>
Works find if you already have a string, but can anyone thing
of a way to globally change ALL the repr's so that all expressions
printed would be globally changed ? The you could print lists,
dictionaries, ( <Class instances> ), etc. in a python CGI script
without worry!
( Come to think of it, this might be a good job for one of my
"fake file" classes or 'tofile()' functions! i.e. put everything
that produces any output into a main() function, and call
tofile() with 'main' and a file-like Class that filters out
the unallowed characters! -- convert newlines to '<BR>', etc. )
Anybody else have any good Python WWW utilities ?
( besides, of course, the stuff in the library already: urllib &
httplib, plus Michael's cgi.py )
- Steve Majewski (804-982-0831) <sdm7g@Virginia.EDU>
- UVA Department of Molecular Physiology and Biological Physics