1
0
mirror of https://github.com/kellyjonbrazil/jc.git synced 2025-07-17 01:32:37 +02:00

add encoded fields

This commit is contained in:
Kelly Brazil
2022-07-20 21:46:06 -07:00
parent c4fc5409e3
commit 55ae836a43

View File

@ -24,52 +24,55 @@ Usage (module):
Schema:
{
"quoted": string,
'unquoted": string,
"scheme": string,
"netloc": string,
"path": string or null,
"path_list": [ array or null
string
"url": string,
'url_encoded": string,
"scheme": string,
"scheme_encoded": string,
"netloc": string,
"netloc_encoded": string,
"path": string or null,
"path_encoded": string or null,
"path_list": [ array or null
string
],
"query": { object or null
<query-key>: [ array or null
<query-value> string # [0]
"query": string or Null,
"query_encoded": string or Null,
"query_obj": { object or null
<query-key>: [ array or null
<query-value> string # [0]
]
},
"query_list": [ array or null
[
<query-key> string, # [1]
<query-value> string
]
],
"fragment": string or null,
"username": string or null,
"password": string or null,
"hostname": string or null,
"port": integer or null
"fragment": string or null,
"fragment_encoded": string or null,
"username": string or null,
"password": string or null,
"hostname": string or null,
"port": integer or null,
}
[0] Duplicate query-keys will have their values consolidated into the
array of query-values
[1] The first array value is the query-key and the second value is the
query-value
Examples:
% echo "http://example.com/test/path?q1=foo&q1=bar&q2=baz#frag" \\
| jc --url -p
{
"quoted": "http://example.com/test/path?q1%3Dfoo%26q1%3Dbar%26q2%3Dbaz#frag",
"unquoted": "http://example.com/test/path?q1=foo&q1=bar&q2=baz#frag",
"url": "http://example.com/test/path?q1=foo&q1=bar&q2=baz#frag",
"url_encoded": "http://example.com/test/path?q1%3Dfoo%26q1%3Dbar%26q2%3Dbaz#frag",
"scheme": "http",
"scheme_encoded": "http",
"netloc": "example.com",
"netloc_encoded": "example.com",
"path": "/test/path",
"path_encoded": "/test/path",
"path_list": [
"test",
"path"
],
"query": {
"query": "q1=foo&q1=bar&q2=baz",
"query_encoded": "q1%3Dfoo%26q1%3Dbar%26q2%3Dbaz",
"query_obj": {
"q1": [
"foo",
"bar"
@ -78,21 +81,8 @@ Examples:
"baz"
]
},
"query_list": [
[
"q1",
"foo"
],
[
"q1",
"bar"
],
[
"q2",
"baz"
]
],
"fragment": "frag",
"fragment_encoded": "frag",
"username": null,
"password": null,
"hostname": "example.com",
@ -101,17 +91,22 @@ Examples:
$ echo "ftp://localhost/filepath" | jc --url -p
{
"quoted": "ftp://localhost/filepath",
"unquoted": "ftp://localhost/filepath",
"url": "ftp://localhost/filepath",
"url_encoded": "ftp://localhost/filepath",
"scheme": "ftp",
"scheme_encoded": "ftp",
"netloc": "localhost",
"netloc_encoded": "localhost",
"path": "/filepath",
"path_encoded": "/filepath",
"path_list": [
"filepath"
],
"query": null,
"query_list": null,
"query_encoded": null,
"query_obj": null,
"fragment": null,
"fragment_encoded": null,
"username": null,
"password": null,
"hostname": "localhost",
@ -181,46 +176,59 @@ def parse(
parts = urlsplit(unwrap(data))
normalized = urlsplit(urlunsplit(parts))
quoted = normalized._replace(path=quote(normalized.path),
query=quote_plus(normalized.query, safe='+')).geturl()
quoted = normalized._replace(scheme=quote_plus(normalized.scheme),
netloc=quote_plus(normalized.netloc),
path=quote(normalized.path),
query=quote_plus(normalized.query, safe='+'),
fragment=quote_plus(normalized.fragment)).geturl()
unquoted = normalized._replace(path=unquote(normalized.path),
query=unquote_plus(normalized.query)).geturl()
unquoted = normalized._replace(scheme=unquote_plus(normalized.scheme),
netloc=unquote_plus(normalized.netloc),
path=unquote(normalized.path),
query=unquote_plus(normalized.query),
fragment=unquote_plus(normalized.fragment)).geturl()
quoted_parts = urlsplit(quoted)
unquoted_parts = urlsplit(unquoted)
my_path = None
encoded_path = None
path_list = None
query_obj = None
query_list = None
if unquoted_parts.path:
# normalize the path by removing any duplicate `/` chars
my_path = re.sub(r'/+', '/', unquoted_parts.path)
encoded_path = re.sub(r'/+', '/', quoted_parts.path)
# remove first '/' and split
path_list = my_path.replace('/', '', 1).split('/')
if path_list == ['']:
path_list = None
if unquoted_parts.query:
query_obj = parse_qs(unquoted_parts.query)
query_list = parse_qsl(unquoted_parts.query)
raw_output = {
'quoted': quoted or None,
'unquoted': unquoted or None,
'scheme': parts.scheme or None,
'netloc': parts.netloc or None,
'url': unquoted or None,
'url_encoded': quoted or None,
'scheme': unquoted_parts.scheme or None,
'scheme_encoded': quoted_parts.scheme or None,
'netloc': unquoted_parts.netloc or None,
'netloc_encoded': quoted_parts.netloc or None,
'path': my_path or None,
'path_encoded': encoded_path or None,
'path_list': path_list or None,
'query': query_obj or None,
'query_list': query_list or None,
'fragment': parts.fragment or None,
'username': parts.username,
'password': parts.password,
'hostname': parts.hostname,
'port': parts.port
'query': unquoted_parts.query or None,
'query_encoded': quoted_parts.query or None,
'query_obj': query_obj or None,
'fragment': unquoted_parts.fragment or None,
'fragment_encoded': quoted_parts.fragment or None,
'username': unquoted_parts.username or None,
'password': unquoted_parts.password or None,
'hostname': unquoted_parts.hostname or None,
'port': unquoted_parts.port or None,
}
return raw_output if raw else _process(raw_output)