Commit ea0cdd5a authored by 's avatar

Many changes to fix PUT handling.

parent d5519d7e
...@@ -102,7 +102,7 @@ ...@@ -102,7 +102,7 @@
############################################################################## ##############################################################################
"""DTML Document objects.""" """DTML Document objects."""
__version__='$Revision: 1.1 $'[11:-2] __version__='$Revision: 1.2 $'[11:-2]
from ZPublisher.Converters import type_converters from ZPublisher.Converters import type_converters
from Globals import HTML, HTMLFile, MessageDialog from Globals import HTML, HTMLFile, MessageDialog
from DTMLMethod import DTMLMethod, decapitate from DTMLMethod import DTMLMethod, decapitate
...@@ -153,13 +153,10 @@ class DTMLDocument(DTMLMethod, PropertyManager): ...@@ -153,13 +153,10 @@ class DTMLDocument(DTMLMethod, PropertyManager):
state[k]=v state[k]=v
return state return state
do_post_processing=1 def on_update(self):
# This is just experimental!
def post_process(self, data): if 1: return
if not self.do_post_processing: try: meta=hp(self.raw)
return
# Set properties based on html meta tags.
try: meta=hp(data)
except: return except: return
for key, val in meta.metavars.items(): for key, val in meta.metavars.items():
if not self.hasProperty(key): if not self.hasProperty(key):
...@@ -190,7 +187,7 @@ class DTMLDocument(DTMLMethod, PropertyManager): ...@@ -190,7 +187,7 @@ class DTMLDocument(DTMLMethod, PropertyManager):
return self._er(data,title,SUBMIT,dtpref_cols,dtpref_rows,REQUEST) return self._er(data,title,SUBMIT,dtpref_cols,dtpref_rows,REQUEST)
self.title=title self.title=title
self.munge(data) self.munge(data)
self.post_process(data) self.on_update()
if REQUEST: return MessageDialog( if REQUEST: return MessageDialog(
title ='Success!', title ='Success!',
message='Your changes have been saved', message='Your changes have been saved',
...@@ -201,18 +198,19 @@ class DTMLDocument(DTMLMethod, PropertyManager): ...@@ -201,18 +198,19 @@ class DTMLDocument(DTMLMethod, PropertyManager):
self._validateProxy(REQUEST) self._validateProxy(REQUEST)
data=file.read() data=file.read()
self.munge(data) self.munge(data)
self.post_process(data) self.on_update()
if REQUEST: return MessageDialog( if REQUEST: return MessageDialog(
title ='Success!', title ='Success!',
message='Your changes have been saved', message='Your changes have been saved',
action ='manage_main') action ='manage_main')
def PUT(self, BODY, REQUEST): def PUT(self, BODY, REQUEST, RESPONSE):
"""Handle HTTP PUT requests.""" """Handle HTTP PUT requests."""
self._validateProxy(REQUEST) self._validateProxy(REQUEST)
self.munge(BODY) self.munge(BODY)
self.post_process(BODY) self.on_update()
return 'OK' RESPONSE.setStatus(204)
return RESPONSE
def __call__(self, client=None, REQUEST={}, RESPONSE=None, **kw): def __call__(self, client=None, REQUEST={}, RESPONSE=None, **kw):
"""Render the document given a client object, REQUEST mapping, """Render the document given a client object, REQUEST mapping,
...@@ -305,7 +303,7 @@ def add(self, id, title='', file='', REQUEST=None, submit=None): ...@@ -305,7 +303,7 @@ def add(self, id, title='', file='', REQUEST=None, submit=None):
if not file: file=default_dd_html if not file: file=default_dd_html
ob=DTMLDocument(file, __name__=id) ob=DTMLDocument(file, __name__=id)
ob.title=title ob.title=title
ob.post_process(file) ob.on_update()
self._setObject(id, ob) self._setObject(id, ob)
if REQUEST is not None: if REQUEST is not None:
u=REQUEST['URL1'] u=REQUEST['URL1']
......
...@@ -102,7 +102,7 @@ ...@@ -102,7 +102,7 @@
############################################################################## ##############################################################################
"""DTML Method objects.""" """DTML Method objects."""
__version__='$Revision: 1.1 $'[11:-2] __version__='$Revision: 1.2 $'[11:-2]
from Globals import HTML, HTMLFile, MessageDialog from Globals import HTML, HTMLFile, MessageDialog
from string import join,split,strip,rfind,atoi,lower from string import join,split,strip,rfind,atoi,lower
...@@ -216,7 +216,6 @@ class DTMLMethod(cDocument, HTML, Explicit, RoleManager, Item_w__name__): ...@@ -216,7 +216,6 @@ class DTMLMethod(cDocument, HTML, Explicit, RoleManager, Item_w__name__):
manage=manage_main=manage_editDocument=manage_editForm manage=manage_main=manage_editDocument=manage_editForm
manage_proxyForm=HTMLFile('documentProxy', globals()) manage_proxyForm=HTMLFile('documentProxy', globals())
_size_changes={ _size_changes={
'Bigger': (5,5), 'Bigger': (5,5),
'Smaller': (-5,-5), 'Smaller': (-5,-5),
...@@ -270,11 +269,7 @@ class DTMLMethod(cDocument, HTML, Explicit, RoleManager, Item_w__name__): ...@@ -270,11 +269,7 @@ class DTMLMethod(cDocument, HTML, Explicit, RoleManager, Item_w__name__):
message='Your changes have been saved', message='Your changes have been saved',
action ='manage_main') action ='manage_main')
def PUT(self, BODY, REQUEST):
"""Handle HTTP PUT requests."""
self._validateProxy(REQUEST)
self.munge(BODY)
return 'OK'
def manage_haveProxy(self,r): return r in self._proxy_roles def manage_haveProxy(self,r): return r in self._proxy_roles
...@@ -311,64 +306,21 @@ class DTMLMethod(cDocument, HTML, Explicit, RoleManager, Item_w__name__): ...@@ -311,64 +306,21 @@ class DTMLMethod(cDocument, HTML, Explicit, RoleManager, Item_w__name__):
return self.read() return self.read()
## Protocol handlers
def PUT(self, BODY, REQUEST, RESPONSE):
"""Handle HTTP PUT requests."""
self._validateProxy(REQUEST)
self.munge(BODY)
RESPONSE.setStatus(204)
return RESPONSE
def manage_FTPget(self): def manage_FTPget(self):
"Get source for FTP download" "Get source for FTP download"
return self.read() return self.read()
from sgmllib import SGMLParser
done='done'
class hp(SGMLParser):
from htmlentitydefs import entitydefs
def __init__(self, data):
SGMLParser.__init__(self, verbose=0)
self.metavars={}
self.headers={}
self.data=None
self.title=''
try: self.feed(data)
except done: pass
def handle_data(self, data):
if self.data is not None:
self.data=self.data + data
else: pass
def save_bgn(self):
self.data=''
def save_end(self):
data=self.data
self.data=None
return data
def start_head(self, attrs):
pass
def end_head(self):
# avoid parsing whole file!
raise done, done
def start_title(self, attrs):
self.save_bgn()
def end_title(self):
self.title=self.save_end()
def do_meta(self, attrs):
dict={}
for key, val in attrs:
dict[key]=val
if dict.has_key('http-equiv'):
self.headers[dict['http-equiv']]=dict['content']
elif dict.has_key('name'):
self.metavars[dict['name']]=dict['content']
......
...@@ -105,23 +105,20 @@ ...@@ -105,23 +105,20 @@
Folders are the basic container objects and are analogous to directories. Folders are the basic container objects and are analogous to directories.
$Id: Folder.py,v 1.58 1999/01/27 20:30:28 brian Exp $""" $Id: Folder.py,v 1.59 1999/01/29 15:41:39 brian Exp $"""
__version__='$Revision: 1.58 $'[11:-2]
__version__='$Revision: 1.59 $'[11:-2]
import Globals, SimpleItem, Acquisition, mimetypes, content_types
from Globals import HTMLFile from Globals import HTMLFile
from ObjectManager import ObjectManager from ObjectManager import ObjectManager
from PropertyManager import PropertyManager from PropertyManager import PropertyManager
from AccessControl.Role import RoleManager
from CopySupport import CopyContainer from CopySupport import CopyContainer
from FindSupport import FindSupport from FindSupport import FindSupport
from Image import Image, File from Image import Image, File
from AccessControl.Role import RoleManager
import SimpleItem
from string import rfind, lower from string import rfind, lower
from content_types import content_type, find_binary, text_type
import Globals
import Acquisition
manage_addFolderForm=HTMLFile('folderAdd', globals()) manage_addFolderForm=HTMLFile('folderAdd', globals())
...@@ -258,45 +255,43 @@ class Folder(ObjectManager, PropertyManager, RoleManager, SimpleItem.Item, ...@@ -258,45 +255,43 @@ class Folder(ObjectManager, PropertyManager, RoleManager, SimpleItem.Item,
self._setObject(id,o) self._setObject(id,o)
return 'OK, I imported %s' % id return 'OK, I imported %s' % id
class PUTer(Acquisition.Explicit): class PUTer(Acquisition.Explicit):
"""Class to support the HTTP PUT protocol.""" """Class to support the HTTP PUT protocol."""
def __init__(self, parent, key): def __init__(self, parent, id):
self._parent=parent self.id=id
self._key=key self.__parent__=parent
self.__roles__=parent.PUT__roles__ self.__roles__ =parent.PUT__roles__
def PUT(self, REQUEST, BODY): def PUT(self, REQUEST, RESPONSE):
"""Adds a document, image or file to the folder when a PUT """Adds a document, image or file to the folder when a PUT
request is received.""" request is received."""
name=self._key name=self.id
try: type=REQUEST['CONTENT_TYPE'] type=REQUEST.get_header('content-type', None)
except KeyError: type='' body=REQUEST.get('BODY', '')
if not type: if type is None:
dot=rfind(name, '.') type, enc=mimetypes.guess_type(name)
suf=dot > 0 and lower(name[dot+1:]) or '' if type is None:
if suf: if content_types.find_binary(body) >= 0:
try: type=content_type[suf] raise 'Bad Request', 'Unknown content type'
except KeyError: else: type=content_types.text_type(body)
if find_binary(BODY) >= 0: type='application/x-%s' % suf type=lower(type)
else: type=text_type(BODY) if type in ('text/html', 'text/xml', 'text/plain'):
else: self.__parent__.manage_addDTMLDocument(name, '', body)
if find_binary(BODY) >= 0: elif type[:6]=='image/':
raise 'Bad Request', 'Could not determine file type' ob=Image(name, '', body, content_type=type)
else: type=text_type(BODY) self.__parent__._setObject(name, ob)
__traceback_info__=suf, dot, name, type
if lower(type)[:5]=='text/':
return self._parent.manage_addDTMLDocument(name,'',BODY,
REQUEST=REQUEST)
if lower(type)[:6]=='image/':
self._parent._setObject(name, Image(name, '', BODY,
content_type=type))
else: else:
self._parent._setObject(name, File(name, '', BODY, ob=File(name, '', body, content_type=type)
content_type=type)) self.__parent__._setObject(name, ob)
return 'OK' RESPONSE.setStatus(201)
RESPONSE.setBody('')
def __str__(self): return self._key return RESPONSE
def __str__(self):
return self.id
......
...@@ -102,9 +102,9 @@ ...@@ -102,9 +102,9 @@
############################################################################## ##############################################################################
"""Image object""" """Image object"""
__version__='$Revision: 1.51 $'[11:-2] __version__='$Revision: 1.52 $'[11:-2]
import Globals import Globals, string, struct, mimetypes, content_types
from Globals import HTMLFile, MessageDialog from Globals import HTMLFile, MessageDialog
from PropertyManager import PropertyManager from PropertyManager import PropertyManager
from AccessControl.Role import RoleManager from AccessControl.Role import RoleManager
...@@ -112,7 +112,7 @@ from SimpleItem import Item_w__name__ ...@@ -112,7 +112,7 @@ from SimpleItem import Item_w__name__
from Globals import Persistent from Globals import Persistent
from Acquisition import Implicit from Acquisition import Implicit
from DateTime import DateTime from DateTime import DateTime
import string, struct
manage_addFileForm=HTMLFile('imageAdd', globals(),Kind='File',kind='file') manage_addFileForm=HTMLFile('imageAdd', globals(),Kind='File',kind='file')
def manage_addFile(self,id,file,title='',precondition='',REQUEST=None): def manage_addFile(self,id,file,title='',precondition='',REQUEST=None):
...@@ -168,13 +168,13 @@ class File(Persistent,Implicit,PropertyManager, ...@@ -168,13 +168,13 @@ class File(Persistent,Implicit,PropertyManager,
self.precondition=precondition self.precondition=precondition
headers=hasattr(file, 'headers') and file.headers or None headers=hasattr(file, 'headers') and file.headers or None
if (headers is None) and (not content_type): if (headers is None) and (not content_type):
raise 'BadValue', 'No content type specified.' raise 'Bad Request', 'No content type specified.'
if headers.has_key('content-type'): if headers and headers.has_key('content-type'):
content_type=headers['content-type'] content_type=headers['content-type']
if not content_type: if not content_type:
raise 'BadValue', 'No content type specified.' raise 'Bad Request', 'No content type specified.'
data=(headers is None) and file or file.read() data=(headers is None) and file or file.read()
self.post_process(data, content_type) self.update_data(data, content_type)
def id(self): def id(self):
return self.__name__ return self.__name__
...@@ -205,7 +205,7 @@ class File(Persistent,Implicit,PropertyManager, ...@@ -205,7 +205,7 @@ class File(Persistent,Implicit,PropertyManager,
""" """
raise 'Redirect', URL1 raise 'Redirect', URL1
def post_process(self, data, content_type=None): def update_data(self, data, content_type=None):
if content_type is not None: if content_type is not None:
self.content_type=content_type self.content_type=content_type
self.data=Pdata(data) self.data=Pdata(data)
...@@ -233,7 +233,7 @@ class File(Persistent,Implicit,PropertyManager, ...@@ -233,7 +233,7 @@ class File(Persistent,Implicit,PropertyManager,
if file.headers.has_key('content-type'): if file.headers.has_key('content-type'):
content_type=file.headers['content-type'] content_type=file.headers['content-type']
else: content_type=None else: content_type=None
self.post_process(file.read(), content_type) self.update_data(file.read(), content_type)
if REQUEST: return MessageDialog( if REQUEST: return MessageDialog(
title ='Success!', title ='Success!',
message='Your changes have been saved', message='Your changes have been saved',
...@@ -246,11 +246,21 @@ class File(Persistent,Implicit,PropertyManager, ...@@ -246,11 +246,21 @@ class File(Persistent,Implicit,PropertyManager,
RESPONSE['content-length']=self.getSize() RESPONSE['content-length']=self.getSize()
return '' return ''
def PUT(self, BODY, REQUEST): def PUT(self, REQUEST, RESPONSE):
"""Handle HTTP PUT requests""" """Handle HTTP PUT requests"""
content_type=REQUEST.get('CONTENT_TYPE', None) type=REQUEST.get_header('content-type', None)
self.post_process(BODY, content_type) body=REQUEST.get('BODY', '')
if type is None:
type, enc=mimetypes.guess_type(self.id())
if type is None:
if content_types.find_binary(body) >= 0:
type='application/octet-stream'
else: type=content_types.text_type(body)
type=string.lower(type)
self.update_data(body, type)
RESPONSE.setStatus(204)
return RESPONSE
def getSize(self): def getSize(self):
"""Get the size of a file or image. """Get the size of a file or image.
...@@ -309,7 +319,7 @@ class Image(File): ...@@ -309,7 +319,7 @@ class Image(File):
kind='image') kind='image')
manage=manage_main=manage_editForm manage=manage_main=manage_editForm
def post_process(self, data, content_type=None): def update_data(self, data, content_type=None):
if content_type is not None: if content_type is not None:
self.content_type=content_type self.content_type=content_type
self.data=Pdata(data) self.data=Pdata(data)
......
...@@ -84,9 +84,9 @@ ...@@ -84,9 +84,9 @@
############################################################################## ##############################################################################
__doc__="""Object Manager __doc__="""Object Manager
$Id: ObjectManager.py,v 1.49 1999/01/06 23:20:06 brian Exp $""" $Id: ObjectManager.py,v 1.50 1999/01/29 15:41:39 brian Exp $"""
__version__='$Revision: 1.49 $'[11:-2] __version__='$Revision: 1.50 $'[11:-2]
import App.Management, Acquisition, App.Undo, Globals import App.Management, Acquisition, App.Undo, Globals
import App.FactoryDispatcher import App.FactoryDispatcher
...@@ -153,21 +153,18 @@ class ObjectManager( ...@@ -153,21 +153,18 @@ class ObjectManager(
return self.meta_types+self.dynamic_meta_types+pmt return self.meta_types+self.dynamic_meta_types+pmt
def _checkId(self,id): def _checkId(self,id):
if not id:
if not id: raise 'Bad Request', 'No <em>id</em> was specified' raise 'Bad Request', 'No <em>id</em> was specified'
if quote(id) != id: raise 'Bad Request', ( if quote(id) != id: raise 'Bad Request', (
"""The id <em>%s<em> is invalid - it """The id <em>%s<em> is invalid - it
contains characters illegal in URLs.""" % id) contains characters illegal in URLs.""" % id)
if id[:1]=='_': raise 'Bad Request', ( if id[:1]=='_': raise 'Bad Request', (
"""The id <em>%s<em> is invalid - it """The id <em>%s<em> is invalid - it
begins with an underscore character, _.""" % id) begins with an underscore character, _.""" % id)
if hasattr(self, 'aq_base'):
try: self=self.aq_base self=self.aq_base
except: return if hasattr(self, id):
raise 'Bad Request', (
if hasattr(self,id): raise 'Bad Request', (
"""The id <em>%s<em> is invalid - it """The id <em>%s<em> is invalid - it
is already in use.""" % id) is already in use.""" % id)
......
...@@ -84,7 +84,7 @@ ...@@ -84,7 +84,7 @@
############################################################################## ##############################################################################
"""Property management""" """Property management"""
__version__='$Revision: 1.4 $'[11:-2] __version__='$Revision: 1.5 $'[11:-2]
from ZPublisher.Converters import type_converters from ZPublisher.Converters import type_converters
...@@ -219,7 +219,7 @@ class PropertyManager: ...@@ -219,7 +219,7 @@ class PropertyManager:
def manage_addProperty(self, id, value, type, REQUEST=None): def manage_addProperty(self, id, value, type, REQUEST=None):
"""Add a new property via the web. Sets a new property with """Add a new property via the web. Sets a new property with
the given id, type, and value.""" the given id, type, and value."""
if type_converters.has_key(type): if type_converters.has_key(type):
value=type_converters[type](value) value=type_converters[type](value)
self._setProperty(id, value, type) self._setProperty(id, value, type)
...@@ -338,26 +338,26 @@ class PropertyManager: ...@@ -338,26 +338,26 @@ class PropertyManager:
'lines': _linesInput, 'lines': _linesInput,
'text': _textInput, 'text': _textInput,
'date': _defaultInput, 'date': _defaultInput,
'tokens': _tokensInput, 'tokens': _tokensInput
} }
propertyTypes=map(lambda key: (lower(key), key), _inputMap.keys()) propertyTypes=map(lambda key: (lower(key), key), _inputMap.keys())
propertyTypes.sort() propertyTypes.sort()
propertyTypes=map(lambda key: propertyTypes=map(lambda key:
{'id': key[1], {'id': key[1],
'selected': key[1]=='string' and 'SELECTED' or ''}, 'selected': key[1]=='string' and 'SELECTED' or ''},
propertyTypes) propertyTypes)
def propertyInputs(self): def propertyInputs(self):
imap=self._inputMap imap=self._inputMap
r=[] r=[]
for p in self._properties: for p in self._properties:
n=p['id'] n=p['id']
t=p['type'] t=p['type']
v=getattr(self,n) v=getattr(self,n)
r.append({'id': n, 'input': imap[t](None,n,t,v)}) r.append({'id': n, 'input': imap[t](None,n,t,v)})
return r return r
def aq_base(ob): def aq_base(ob):
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment