quetz-mod_python-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Grisha Trubetskoy <gri...@apache.org>
Subject Re: Bizarre behaviour in util.FieldStorage
Date Mon, 01 Mar 2010 22:56:07 GMT
I agree with Graham on all points.

And may be this is a good chance for us to start checking some stuff in
after this long while.... :)

Grisha


On Mon, Mar 1, 2010 at 5:41 PM, Graham Dumpleton <graham.dumpleton@gmail.com
> wrote:

> Please log a bug report at:
>
>  https://issues.apache.org/jira/browse/MODPYTHON
>
> 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.
>
> 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.
>
> 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
> >
>
>

Mime
View raw message