quetz-mod_python-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Graham Dumpleton <graham.dumple...@gmail.com>
Subject Re: Bizarre behaviour in util.FieldStorage
Date Tue, 02 Mar 2010 09:28:03 GMT
On 2 March 2010 19:32, Anders Blomdell <anders.blomdell@control.lth.se> wrote:
> Graham Dumpleton wrote:
>> Please log a bug report at:
>>
>>   https://issues.apache.org/jira/browse/MODPYTHON
> Done
>
>> No one else has likely found this because deleting stuff out of
>> FieldStorage is not the norm. People would normally translate the
>> contents into some other data structure and manipulate it there.
> If this is really the case, the interface is bloated :-)

It likely was originally meant to mirror cgi.FieldStorage used for CGI
scripts and so carried across same level of functionality.

Graham

>> Do note that there has been no active development on mod_python for
>> quite a long time, so don't expect to see any updated version until
>> someone new decides to take ownership of the project.
> The age of last version hinted that...
>
> /Anders
>
>
>>
>> Graham
>>
>> On 2 March 2010 02:04, Anders Blomdell <anders.blomdell@control.lth.se> wrote:
>>> Anders Blomdell wrote:
>>>> Hi,
>>>>
>>>> When a FieldStorage has two (or more) Filed instances with the same value
but
>>>> different names, the behaviour of programs like this is (more or less) undefined:
>>>>
>>>>   fs = util.FieldStorage(req)
>>>>   fs['id1'] = 'New value'
>>>>   del fs['id2']
>>>>
>>>> The reason for the undefinedness, is this code in __delitem__ (and the similar
>>>> in __setitem__):
>>>>
>>>>         table = self.list.table()
>>>>         values = table[key]
>>>>         for value in values:
>>>>             self.list.remove(value)
>>>>
>>>> What happens is that the self.list.remove(value) will remove the first field
>>>> with a matching value, regardless of that fields name. Here is an example
from
>>>> real life:
>>>>
>>>>     form.clear()
>>>>     form['id1'] = 'x'
>>>>     form['id2'] = 'x'
>>>>     form['id3'] = 'x'
>>>>     # Form now contains {'id2': [Field('id2', 'x')],
>>>>     #                    'id3': [Field('id3', 'x')],
>>>>     #                    'id1': [Field('id1', 'x')]}
>>>>     form['id2'] = 'y'
>>>>     # Form now contains {'id2': [Field('id2', 'x'), Field('id2', 'y')],
>>>>     #                    'id3': [Field('id3', 'x')]}
>>>>     # which is not what I would have expected
>>>>
>>>>
>>>> In my simple example, one solution, is to add the following method to StringField:
>>>>
>>>>     def __eq__(self, other):
>>>>         return self.value == other.value and self.name == other.name
>>>>
>>>> but this does not properly handle mixing Field and StringField. Anybody has
a
>>>> better solution?
>>> Some more thinking made me come up with the patch below.
>>>
>>> Regards
>>>
>>> Anders
>>>
>>> --- /usr/lib/python2.6/site-packages/mod_python/util.py.orig        2006-11-22
>>> 12:15:54.000000000 +0100
>>> +++ /usr/lib/python2.6/site-packages/mod_python/util.py 2010-03-01
>>> 16:00:30.000000000 +0100
>>> @@ -145,6 +145,12 @@
>>>                     self.__table[item.name] = [item]
>>>         return self.__table
>>>
>>> +    def delete_name(self, name):
>>> +        self.__table = None
>>> +        for i in range(len(self) - 1, -1, -1):
>>> +            if self[i].name == name:
>>> +                self.pop(i)
>>> +
>>>     def __delitem__(self, *args):
>>>         self.__table = None
>>>         return list.__delitem__(self, *args)
>>> @@ -348,11 +354,8 @@
>>>         self.list.append(item)
>>>
>>>     def __setitem__(self, key, value):
>>> -        table = self.list.table()
>>> -        if table.has_key(key):
>>> -            items = table[key]
>>> -            for item in items:
>>> -                self.list.remove(item)
>>> +        if self.list.table().has_key(key):
>>> +            self.list.delete_name(key)
>>>         item = StringField(value)
>>>         item.name = key
>>>         self.list.append(item)
>>> @@ -460,10 +463,8 @@
>>>         return [(item.name, item) for item in self.list]
>>>
>>>     def __delitem__(self, key):
>>> -        table = self.list.table()
>>> -        values = table[key]
>>> -        for value in values:
>>> -            self.list.remove(value)
>>> +        if self.list.table().has_key(key):
>>> +            self.list.delete_name(key)
>>>
>>>     def clear(self):
>>>         self.list = FieldList()
>>>
>>>
>>>
>>> --
>>> Anders Blomdell                  Email: anders.blomdell@control.lth.se
>>> Department of Automatic Control
>>> Lund University                  Phone:    +46 46 222 4625
>>> P.O. Box 118                     Fax:      +46 46 138118
>>> SE-221 00 Lund, Sweden
>>>
>
>
> --
> Anders Blomdell                  Email: anders.blomdell@control.lth.se
> Department of Automatic Control
> Lund University                  Phone:    +46 46 222 4625
> P.O. Box 118                     Fax:      +46 46 138118
> SE-221 00 Lund, Sweden
>

Mime
View raw message