def _process_field_storage(fields, get=None, post=None, files=None): if not get: get = MultiDict() if not post: post = MultiDict() if not files: files = MultiDict() with ignored(Exception): for name in fields: field = fields[name] if isinstance(name, str) else name if isinstance(field, list): _process_field_storage(field, get, post, files) elif field.filename: # An uploaded file, create a new File tuple to resolve the # not indexable issue. files[field.name] = File(field.file, field.filename, field.name, field.type, field.type_options, field.disposition, field.disposition_options, field.headers) elif field.disposition or field.name not in get: post[field.name] = field.value else: if field.name not in get: get[field.name] = field.value return get, post, files
def __init__(self, method, get=None, post=None, files=None, headers=None, server=None, cookies=None, body=''): """Creates a new instance of the Request object. Args: method: The Http request method get: A watson.datastructures.MultiDict containing GET variables post: A watson.datastructures.MultiDict containing POST variables files: A watson.datastructures.MultiDict containing FieldStorage objects headers: A watson.http.headers.HeaderDict containing valid Http headers server: A watson.datastructures.MultiDict containing server variables cookies: A watson.http.cookies.CookieDict containing watson.http.cookies.TastyMorsel objects body: The content of the request """ super(Request, self).__init__(body=body, headers=headers) self._method = str(method).upper() if self.method not in REQUEST_METHODS: raise TypeError('Not a valid Http Request method.') self._get = get or MultiDict() self._post = post or MultiDict() self._files = files or MultiDict() self._server = server or MultiDict() self._cookies = cookies or CookieDict() self.headers = headers or HeaderDict()
def test_add_key(self): d = MultiDict({'test': 'blah', 'something': '2'}) d['test'] = 'something' d['another'] = ['b'] d['another'] = 'c' assert len(d['test']) == 2 assert len(d.get('test')) == 2 assert d.get('something') == '2'
def _process_field_storage(fields, get=None, post=None, files=None): if not get: get = MultiDict() if not post: post = MultiDict() if not files: files = MultiDict() with ignored(Exception): for name in fields: field = fields[name] if isinstance(name, str) else name if isinstance(field, list): _process_field_storage(field, get, post, files) elif field.filename: files[field.name] = field elif field.disposition or field.name not in get: post[field.name] = field.value else: if field.name not in get: get[field.name] = field.value return get, post, files
def get_form_vars(environ): """Convert environ vars into GET/POST/FILES objects. Process all get and post vars from a <form> and return MultiDict of each. """ if environ['REQUEST_METHOD'] == 'PUT' and not environ.get('CONTENT_TYPE'): environ['CONTENT_TYPE'] = 'application/x-www-form-urlencoded' field_storage = FieldStorage(fp=environ['wsgi.input'], environ=environ, keep_blank_values=True) get = MultiDict() for name, value in parse_qsl(environ.get('QUERY_STRING')): get[name] = value return _process_field_storage(field_storage, get=get)
def data(self, data): """Sets the data for the form. Iterates through all the fields on the form and injects the value. Args: data (dict|watson.http.messages.Request): A dict of key/value pairs to populate the form with. """ self.invalidate() if hasattr(data, 'post'): raw_data = MultiDict() raw_data.update(data.post.items()) try: raw_data.update(data.json_body) except: pass for key, value in data.files.items(): # need to do this rather than .update due to File objects # being named tuples raw_data[key] = value else: raw_data = data self._set_data_on_fields(raw_data)
def split_headers_server_vars(environ): """Splits the environ into headers and server pairs. """ headers = HeaderDict() server = MultiDict() cookies = CookieDict() for key in environ: if is_header(key): headers.add(http_header(key), environ[key]) if key == 'HTTP_COOKIE': cookies = CookieDict(environ[key]) cookies.modified = False else: server[key] = environ[key] return headers, server, cookies
def data(self, data): """Sets the data for the form. Iterates through all the fields on the form and injects the value. Args: dict|watson.http.messages.Request data: A dict of key/value pairs to populate the form with. """ self.invalidate() if hasattr(data, 'post'): raw_data = MultiDict() for key, value in data.post.items(): raw_data[key] = value for key, value in data.files.items(): raw_data[key] = value else: raw_data = data self._set_data_on_fields(raw_data)
def data(self, data): """Sets the data for the form. Override the existing set data method and inject the csrf token into the form. """ token_name = '{0}_csrf_token'.format(self.name) if hasattr(data, 'post'): raw_data = MultiDict() for key, value in data.files.items(): raw_data[key] = value for key, value in data.post.items(): if key.endswith('_csrf_token'): raw_data['csrf_token'] = value else: raw_data[key] = value else: if token_name in data: data['csrf_token'] = data[token_name] del data[token_name] raw_data = data self._set_data_on_fields(raw_data)
def test_add_key(self): d = MultiDict({'test': 'blah', 'something': '2'}) d['test'] = 'something' d['another'] = ['b'] d['another'] = 'c' assert d['test'].__len__() == 2
def test_set_replace(self): d = MultiDict({'test': 'blah'}) assert d['test'] == 'blah' d.set('test', 'testing', replace=True) assert d['test'] == 'testing'
def test_update(self): d = MultiDict() d.update({'test': 'test'}) assert 'test' in d
def test_get_value(self): d = MultiDict() d['list'] = [] assert d.get('empty') is None assert d.get('list') is not None