Example #1
0
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)
Example #2
0
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)