[Zope-CMF] script crashing zope
Dan Keshet
dkesh@channel1.com
Fri, 21 Dec 2001 14:05:59 -0500 (EST)
Hi Tres,
I applied the patch you sent, and everything works like a charm.
Thanks!
--Dan
On Fri, 21 Dec 2001, Tres Seaver wrote:
> Dan Keshet wrote:
>
> > I've written an external python script to convert plain old html documents
> > (stored as DTML documents) to CMF Documents. It works on small documents,
> > but anything moderately large and it crashes the server. I'm not quite
> > sure what moderately large is b/c I wasn't keen to keep crashing the
> > server, but it's between 1709 bytes and 5094 bytes.
> >
> > So...
> >
> > 1) Is this a general Zope bug (well, clearly it shouldn't be crashing) or
> > a CMF-specific bug?
> >
> > 2) Does anybody have a workaround or a script that they've written for the
> > same purpose?
> >
> > Thanks,
> >
> > Dan
> >
> >
> > Setup: CMF1.1, Zope 2.4.3, python 2.1.1, freebsd4.1:
> >
> > ---Begin script----
> > def convert(self):
> > from Products.CMFDefault.Document import addDocument
> >
> > text = self.document_src()
> > title = self.title_or_id()
> > id = self.getId()
> > self.manage_renameObject(id, id + '.dtml')
> > self.manage_addProduct['CMFDefault'].addDocument( id, title, '',
> > "html", text)
> > ---- End Script----
>
> Dan,
>
> There was a bug in CMF 1.1 which had similar symptoms. Can you
> try either CMF 1.2 beta1 or a CVS checkout and let us know if the
> problem persists?
>
> You could also apply the fix yourself. Here is the diff between
> CMF-1_1-release and the fix for the bug::
>
> --- CMF/CMFDefault/Document.py 2001/06/05 18:23:53 1.24
> +++ CMF/CMFDefault/Document.py 2001/08/13 21:00:18 1.28
> @@ -239,10 +243,8 @@
> security.declarePrivate('guessFormat')
> def guessFormat(self, text):
> """ Simple stab at guessing the inner format of the text """
> - if bodyfinder.search(text) is not None:
> - return 'html'
> - else:
> - return 'structured-text'
> + if utils.html_headcheck(text): return 'html'
> + else: return 'structured-text'
>
> security.declarePrivate('handleText')
> def handleText(self, text, format=None, stx_level=None):
> @@ -260,9 +262,9 @@
> headers.update(parser.metatags)
> if parser.title:
> headers['Title'] = parser.title
> - bodyfound = bodyfinder.search(text)
> + bodyfound = bodyfinder(text)
> if bodyfound:
> - cooked = body = bodyfound.group('bodycontent')
> + cooked = body = bodyfound
> else:
> headers, body = parseHeadersBody(text, headers)
> cooked = _format_stx(text=body, level=level)
>
>
> and here is the diff to CMFDefault.utils::
>
> --- CMF/CMFDefault/utils.py 2001/06/05 23:01:12 1.6
> +++ CMF/CMFDefault/utils.py 2001/08/13 21:08:00 1.8
> @@ -141,10 +141,18 @@
> self.setliteral()
>
>
> -bodyfinder = re.compile(r'<body.*?>(?P<bodycontent>.*?)</body>',
> - re.DOTALL|re.I)
> -htfinder = re.compile(r'<html', re.DOTALL|re.I)
> +_bodyre = re.compile(r'<body.*?>', re.DOTALL|re.I)
> +_endbodyre = re.compile(r'</body', re.DOTALL|re.I)
> +
> +def bodyfinder(text):
> + bod = _bodyre.search(text)
> + if not bod: return text
>
> + end = _endbodyre.search(text)
> + if not end: return text
> + else: return text[bod.end():end.start()]
> +
> +htfinder = re.compile(r'<html', re.DOTALL|re.I)
> def html_headcheck(html):
> """ Returns 'true' if document looks HTML-ish enough """
> if not htfinder.search(html):
> @@ -156,5 +164,5 @@
> continue
> elif lower(line[:5]) == '<html':
> return 1
> - elif line[:2] not in ('<!', '<?'):
> + elif line[0] != '<':
> return 0
>
>
> Tres.
> --
> ===============================================================
> Tres Seaver tseaver@zope.com
> Zope Corporation "Zope Dealers" http://www.zope.com
>