annotate roundup/cgi/TAL/XMLParser.py @ 8180:d02ce1d14acd

feat: issue2551068 - Provide way to retrieve file/msg data via rest endpoint. Use Allow header to change format of /binary_content endpoint. If Allow header for endpoint is not application/json, it will be matched against the mime type for the file. */*, text/* are supported and will return the native mime type if present. Changes: move */* mime type from static dict of supported types. It was hardcoded to return json only. Now it can return a matching non-json mime type for the /binary_content endpoint. Edited some errors to explicitly add */* mime type. Cleanups to use ', ' separation in lists of valid mime types rather than just space separated. Remove ETag header when sending raw content. See issue 2551375 for background. Doc added to rest.txt. Small format fix up (add dash) in CHANGES.txt. Make passing an unset/None/False accept_mime_type to format_dispatch_output a 500 error. This used to be the fallback to produce a 406 error after all processing had happened. It should no longer be possible to take that code path as all 406 errors (with valid accept_mime_types) are generated before processing takes place. Make format_dispatch_output handle output other than json/xml so it can send back binary_content data. Removed a spurious client.response_code = 400 that seems to not be used. Tests added for all code paths. Database setup for tests msg and file entry. This required a file upload test to change so it doesn't look for file1 as the link returned by the upload. Download the link and verify the data rather than verifying the link. Multiple formatting changes to error messages to make all lists of valid mime types ', ' an not just space separated.
author John Rouillard <rouilj@ieee.org>
date Sun, 08 Dec 2024 17:22:33 -0500
parents 14a61eabcea8
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1049
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1 ##############################################################################
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
2 #
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
3 # Copyright (c) 2001, 2002 Zope Corporation and Contributors.
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
4 # All Rights Reserved.
2348
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
5 #
1049
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
6 # This software is subject to the provisions of the Zope Public License,
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
7 # Version 2.0 (ZPL). A copy of the ZPL should accompany this distribution.
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
8 # THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
9 # WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
10 # WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
11 # FOR A PARTICULAR PURPOSE
2348
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
12 #
1049
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
13 ##############################################################################
2348
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
14 # Modifications for Roundup:
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
15 # 1. commented out zLOG references
5402
88dbacd11cd1 Python 3 preparation: update urllib / urllib2 / urlparse imports.
Joseph Myers <jsm@polyomino.org.uk>
parents: 2348
diff changeset
16 # 2. use roundup.anypy.urllib_
2348
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
17 """
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
18 Generic expat-based XML parser base class.
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
19 """
1071
c08b3820edd1 Adhering to ZPL
Richard Jones <richard@users.sourceforge.net>
parents: 1049
diff changeset
20
2348
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
21 #import zLOG
1049
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
22
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
23 class XMLParser:
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
24
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
25 ordered_attributes = 0
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
26
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
27 handler_names = [
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
28 "StartElementHandler",
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
29 "EndElementHandler",
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
30 "ProcessingInstructionHandler",
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
31 "CharacterDataHandler",
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
32 "UnparsedEntityDeclHandler",
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
33 "NotationDeclHandler",
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
34 "StartNamespaceDeclHandler",
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
35 "EndNamespaceDeclHandler",
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
36 "CommentHandler",
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
37 "StartCdataSectionHandler",
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
38 "EndCdataSectionHandler",
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
39 "DefaultHandler",
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
40 "DefaultHandlerExpand",
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
41 "NotStandaloneHandler",
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
42 "ExternalEntityRefHandler",
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
43 "XmlDeclHandler",
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
44 "StartDoctypeDeclHandler",
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
45 "EndDoctypeDeclHandler",
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
46 "ElementDeclHandler",
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
47 "AttlistDeclHandler"
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
48 ]
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
49
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
50 def __init__(self, encoding=None):
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
51 self.parser = p = self.createParser()
5519
14a61eabcea8 Fixed unicode issues for XML template with Python 2
Christof Meerwald <cmeerw@cmeerw.org>
parents: 5402
diff changeset
52 # Make sure we don't get fed unicode strings in Python 2 as we
14a61eabcea8 Fixed unicode issues for XML template with Python 2
Christof Meerwald <cmeerw@cmeerw.org>
parents: 5402
diff changeset
53 # can't handle those
14a61eabcea8 Fixed unicode issues for XML template with Python 2
Christof Meerwald <cmeerw@cmeerw.org>
parents: 5402
diff changeset
54 if hasattr(self.parser, 'returns_unicode'):
14a61eabcea8 Fixed unicode issues for XML template with Python 2
Christof Meerwald <cmeerw@cmeerw.org>
parents: 5402
diff changeset
55 self.parser.returns_unicode = False
1049
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
56 if self.ordered_attributes:
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
57 try:
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
58 self.parser.ordered_attributes = self.ordered_attributes
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
59 except AttributeError:
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
60 #zLOG.LOG("TAL.XMLParser", zLOG.INFO,
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
61 # "Can't set ordered_attributes")
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
62 self.ordered_attributes = 0
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
63 for name in self.handler_names:
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
64 method = getattr(self, name, None)
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
65 if method is not None:
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
66 try:
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
67 setattr(p, name, method)
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
68 except AttributeError:
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
69 #zLOG.LOG("TAL.XMLParser", zLOG.PROBLEM,
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
70 # "Can't set expat handler %s" % name)
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
71 pass
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
72
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
73 def createParser(self, encoding=None):
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
74 global XMLParseError
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
75 try:
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
76 from Products.ParsedXML.Expat import pyexpat
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
77 XMLParseError = pyexpat.ExpatError
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
78 return pyexpat.ParserCreate(encoding, ' ')
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
79 except ImportError:
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
80 from xml.parsers import expat
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
81 XMLParseError = expat.ExpatError
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
82 return expat.ParserCreate(encoding, ' ')
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
83
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
84 def parseFile(self, filename):
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
85 self.parseStream(open(filename))
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
86
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
87 def parseString(self, s):
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
88 self.parser.Parse(s, 1)
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
89
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
90 def parseURL(self, url):
5402
88dbacd11cd1 Python 3 preparation: update urllib / urllib2 / urlparse imports.
Joseph Myers <jsm@polyomino.org.uk>
parents: 2348
diff changeset
91 import roundup.anypy.urllib_
88dbacd11cd1 Python 3 preparation: update urllib / urllib2 / urlparse imports.
Joseph Myers <jsm@polyomino.org.uk>
parents: 2348
diff changeset
92 self.parseStream(roundup.anypy.urllib_.urlopen(url))
1049
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
93
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
94 def parseStream(self, stream):
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
95 self.parser.ParseFile(stream)
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
96
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
97 def parseFragment(self, s, end=0):
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
98 self.parser.Parse(s, end)

Roundup Issue Tracker: http://roundup-tracker.org/