def post_tiddler_to_container(environ, start_response): """ entry point for recipes/foo/tiddlers or bags/foo/tiddlers we have included the tiddler name in the form, so get that and carry on as normal """ form = environ['tiddlyweb.query'] def get_name(): if 'title' in form: return retrieve_item(form, 'title') else: files = environ['tiddlyweb.input_files'] return files[0].filename try: tiddler_name = get_name() except (KeyError, IndexError): tiddler_name = str(uuid4()) Serialization.form = form try: redirect = environ['tiddlyweb.query'].pop('redirect') except KeyError: redirect = None if redirect: redirect = redirect[0] if '?' in redirect and not redirect.endswith('?'): redirect += '&' else: redirect += '?' redirect += '.no-cache=%s' % uuid4() # Extra safe characters used to preserve query strings. redirect = quote(redirect.encode('utf-8'), safe="/?&=:.!~*'()") #mock up some objects that tiddlyweb.web.handler.tiddler.put requires environ['wsgiorg.routing_args'][1]['tiddler_name'] = tiddler_name environ['REQUEST_METHOD'] = 'PUT' environ['wsgi.input'] = StringIO('dummy input') def dummy_start_response(response_code, *args): """ start_response may only be called once. We may need it to be a redirect instead of a 204 """ if not response_code.startswith('204'): start_response(response_code, *args) elif redirect: response = [('Location', redirect)] start_response('303 See Other', response) else: start_response(response_code, *args) return put(environ, dummy_start_response)
def post_tiddler_to_container(environ, start_response): """ entry point for recipes/foo/tiddlers or bags/foo/tiddlers we have included the tiddler name in the form, so get that and carry on as normal """ try: form = get_form(environ) except timeout: return [] def get_name(): if 'title' in form: return retrieve_item(form, 'title') else: return form['file'].filename try: tiddler_name = urllib.quote(get_name()) except KeyError: tiddler_name = str(uuid4()) Serialization.form = form try: redirect = environ['tiddlyweb.query'].pop('redirect') if '?' in redirect[0] and not redirect[0].endswith('?'): redirect[0] += '&' else: redirect[0] += '?' redirect[0] += '.no-cache=%s' % uuid4() except KeyError: redirect = None #mock up some objects that tiddlyweb.web.handler.tiddler.put requires environ['wsgiorg.routing_args'][1]['tiddler_name'] = tiddler_name environ['REQUEST_METHOD'] = 'PUT' environ['wsgi.input'] = StringIO('dummy input') def dummy_start_response(response_code, *args): """ start_response may only be called once. We may need it to be a redirect instead of a 204 """ if not response_code.startswith('204'): start_response(response_code, *args) elif redirect: response = [('Location', redirect[0].encode('UTF-8', 'replace'))] start_response('303 See Other', response) else: start_response(response_code, *args) return put(environ, dummy_start_response)
def handler(environ, start_response): if bag: environ['wsgiorg.routing_args'][1]['bag_name'] = bag elif recipe: environ['wsgiorg.routing_args'][1]['recipe_name'] = recipe else: return selector.not_found(environ, start_response) if environ['REQUEST_METHOD'] == 'GET': return get(environ, start_response) elif environ['REQUEST_METHOD'] == 'PUT': return put(environ, start_response) elif environ['REQUEST_METHOD'] == 'DELETE': return delete(environ, start_response) else: return selector.method_not_allowed(environ, start_response)