def test_escape_longsep(self): items = RequestItems.from_args([ self.key_value_arg(r'bob\:==foo'), ]) assert items.params == { 'bob:': 'foo' }
def test_valid_items(self): items = RequestItems.from_args([ self.key_value_arg('string=value'), self.key_value_arg('Header:value'), self.key_value_arg('Unset-Header:'), self.key_value_arg('Empty-Header;'), self.key_value_arg('list:=["a", 1, {}, false]'), self.key_value_arg('obj:={"a": "b"}'), self.key_value_arg(r'nested\[2\][a][]=1'), self.key_value_arg('nested[2][a][]:=1'), self.key_value_arg('ed='), self.key_value_arg('bool:=true'), self.key_value_arg('file@' + FILE_PATH_ARG), self.key_value_arg('query==value'), self.key_value_arg('string-embed=@' + FILE_PATH_ARG), self.key_value_arg('param-embed==@' + FILE_PATH_ARG), self.key_value_arg('raw-json-embed:=@' + JSON_FILE_PATH_ARG), ]) # Parsed headers # `HTTPHeadersDict` => `dict` headers = dict(items.headers) assert headers == { 'Header': 'value', 'Unset-Header': None, 'Empty-Header': '' } # Parsed data raw_json_embed = items.data.pop('raw-json-embed') assert raw_json_embed == load_json_preserve_order_and_dupe_keys(JSON_FILE_CONTENT) items.data['string-embed'] = items.data['string-embed'].strip() assert dict(items.data) == { 'ed': '', 'string': 'value', 'bool': True, 'list': ['a', 1, load_json_preserve_order_and_dupe_keys('{}'), False], 'nested[2]': {'a': ['1']}, 'nested': [None, None, {'a': [1]}], 'obj': load_json_preserve_order_and_dupe_keys('{"a": "b"}'), 'string-embed': FILE_CONTENT } # Parsed query string parameters assert items.params == { 'query': 'value', 'param-embed': FILE_CONTENT.rstrip('\n') } # Parsed file fields assert 'file' in items.files assert (items.files['file'][1].read().strip(). decode() == FILE_CONTENT)
def test_multiple_text_fields_with_same_field_name(self): items = RequestItems.from_args( request_item_args=[ self.key_value_arg('text_field=a'), self.key_value_arg('text_field=b') ], as_form=True, ) assert items.data['text_field'] == ['a', 'b'] assert list(items.data.items()) == [ ('text_field', 'a'), ('text_field', 'b'), ]
def test_multiple_text_fields_with_same_field_name(self): items = RequestItems.from_args( request_item_args=[ self.key_value_arg('text_field=a'), self.key_value_arg('text_field=b') ], request_type=constants.RequestType.FORM, ) assert items.data['text_field'] == ['a', 'b'] assert list(items.data.items()) == [ ('text_field', 'a'), ('text_field', 'b'), ]
def test_valid_items(self): items = RequestItems.from_args([ self.key_value_arg('string=value'), self.key_value_arg('Header:value'), self.key_value_arg('Unset-Header:'), self.key_value_arg('Empty-Header;'), self.key_value_arg('list:=["a", 1, {}, false]'), self.key_value_arg('obj:={"a": "b"}'), self.key_value_arg('ed='), self.key_value_arg('bool:=true'), self.key_value_arg('file@' + FILE_PATH_ARG), self.key_value_arg('query==value'), self.key_value_arg('string-embed=@' + FILE_PATH_ARG), self.key_value_arg('raw-json-embed:=@' + JSON_FILE_PATH_ARG), ]) # Parsed headers # `requests.structures.CaseInsensitiveDict` => `dict` headers = dict(items.headers._store.values()) assert headers == { 'Header': 'value', 'Unset-Header': None, 'Empty-Header': '' } # Parsed data raw_json_embed = items.data.pop('raw-json-embed') assert raw_json_embed == json.loads(JSON_FILE_CONTENT) items.data['string-embed'] = items.data['string-embed'].strip() assert dict(items.data) == { "ed": "", "string": "value", "bool": True, "list": ["a", 1, {}, False], "obj": { "a": "b" }, "string-embed": FILE_CONTENT, } # Parsed query string parameters assert items.params == { 'query': 'value' } # Parsed file fields assert 'file' in items.files assert (items.files['file'][1].read().strip(). decode('utf8') == FILE_CONTENT)
def test_escape_separator(self): items = RequestItems.from_args([ # headers self.key_value_arg(r'foo\:bar:baz'), self.key_value_arg(r'jack\@jill:hill'), # data self.key_value_arg(r'baz\=bar=foo'), # files self.key_value_arg(fr'bar\@baz@{FILE_PATH_ARG}'), ]) # `RequestHeadersDict` => `dict` headers = dict(items.headers) assert headers == { 'foo:bar': 'baz', 'jack@jill': 'hill', } assert items.data == {'baz=bar': 'foo'} assert 'bar@baz' in items.files
def test_escape_separator(self): items = RequestItems.from_args([ # headers self.key_value_arg(r'foo\:bar:baz'), self.key_value_arg(r'jack\@jill:hill'), # data self.key_value_arg(r'baz\=bar=foo'), # files self.key_value_arg(r'bar\@baz@%s' % FILE_PATH_ARG), ]) # `requests.structures.CaseInsensitiveDict` => `dict` headers = dict(items.headers._store.values()) assert headers == { 'foo:bar': 'baz', 'jack@jill': 'hill', } assert items.data == {'baz=bar': 'foo'} assert 'bar@baz' in items.files
def _parse_items(self): """ Parse `args.request_items` into `args.headers`, `args.data`, `args.params`, and `args.files`. """ try: request_items = RequestItems.from_args( request_item_args=self.args.request_items, as_form=self.args.form, ) except ParseError as e: if self.args.traceback: raise self.error(e.args[0]) else: self.args.headers = request_items.headers self.args.data = request_items.data self.args.files = request_items.files self.args.params = request_items.params self.args.multipart_data = request_items.multipart_data if self.args.files and not self.args.form: # `http url @/path/to/file` file_fields = list(self.args.files.keys()) if file_fields != ['']: self.error( 'Invalid file fields (perhaps you meant --form?): %s' % ','.join(file_fields)) fn, fd, ct = self.args.files[''] self.args.files = {} self._body_from_file(fd) if 'Content-Type' not in self.args.headers: content_type = get_content_type(fn) if content_type: self.args.headers['Content-Type'] = content_type
def test_multiple_file_fields_with_same_field_name(self): items = RequestItems.from_args([ self.key_value_arg('file_field@' + FILE_PATH_ARG), self.key_value_arg('file_field@' + FILE_PATH_ARG), ]) assert len(items.files['file_field']) == 2